123d CircuitsとArduino実機で電子工作(3)
はじめに
今回も前回に引き続きモーターを使った電子工作について解説しますが、今回はモーターの動作を制御するための入力装置として「超音波センサ」を使用します。
超音波センサは、短い超音波を発信して、その超音波の反射時間によって距離を検出します。123d Circuitsで使用できるParallax社製のセンサでは約2cm~3mの範囲で距離を測定可能です。特徴は対象物(物体)の特性にあまり影響されずに距離を測定できることです。光センサなどは物体の色や表面の材質などによって反射率が変わるなどの影響を受けます。
超音波センサの動作を確認してみよう
それでは、さっそく超音波センサの動作を確認してみましょう。まず、123d Circuitsで壁などの障害物に一定距離近づいたらLEDを点灯するシミュレーションを行います。今回使用する部品は、以下の5点です。抵抗は忘れずに数値を設定しておきましょう。
実体配線図は、以下のとおりです。
配線が終了したら、画面上部の「Code Editor」をクリックして、以下のスケッチを記述します。
const int pingPin = 2;
const int ledPin = 13;
unsigned long duration;
int cm;
void setup()
{
pinMode(pingPin, OUTPUT);
Serial.begin(9600);
}
void loop()
{
//ピンをOUTPUTに設定(パルス送信のため)
pinMode(pingPin, OUTPUT);
//LOWパルスを送信
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
//HIGHパルスを送信
digitalWrite(pingPin, HIGH);
//5uSパルスを送信してPingSensorを起動
delayMicroseconds(5);
digitalWrite(pingPin, LOW);
//入力パルスを読み取るためにデジタルピンをINPUTに変更(シグナルピンを入力に切り替え)
pinMode(pingPin, INPUT);
//入力パルスの長さを測定
duration = pulseIn(pingPin, HIGH);
//パルスの長さを半分に分割
duration=duration/2;
//cmに変換
cm = int(duration/29);
if(cm <= 50) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(100);
}
このスケッチで使用している関数について簡単に説明します。
delayMicroseconds(μs)
パラメータとして指定された時間(マイクロ秒単位)でプログラムを一時停止する。数ミリ秒以上の停止の場合はdelay関数を使用。
【パラメータ】
μs(マイクロ秒):一時停止する時間をマイクロ秒で指定
pulseIn(pin、value)
ピンへ入力されるパルスの値を読み込む。ここでは入力されるパルスの長さを測定している。
【パラメータ】
pin:パルスを入力するピンの番号
value:測定するパルスの種類。HIGHまたはLOW
【例】valueをHIGHに指定した場合 [ pulseIn(pin, HIGH) ]
・pulseIn関数はpinへの入力がHIGHになるタイミングで時間の計測を開始
・pinの値がLOWになるタイミングで計測を停止
・LOWに戻ったらそれまでの時間をマイクロ秒単位で返すことでパルスの長さを測定
パルス入力(トリガ)は5μs(最小2µs) となっているので、delayMicroseconds(5)と指定して5マイクロ秒ほど停止させます。そのままの数値をシリアルモニタで表示させると分かりづらいので、cm(センチメートル)の単位に変換します。
duration=duration/2; //パルスの長さを半分に分割
cm = int(duration/29); //cmに変換
超音波は物体からの跳ね返り(往復)を考慮する必要があるので、検出した値を2で割ります。また音速(約340m/sec)だと1cm進むのに29μsec(マイクロ秒)かかるため、29で割るとcmが算出できます。
それではシミュレーションしてみましょう。「Code Editor」の「Upload & Run」もしくは画面上部の「Start Simulation」をクリックします。●をマウスで動かして、センサとの距離が近くなるとLEDが点灯するのを確認できると思います。
続いて、Arduino Unoの実機で動作を確認します。ただし、ここではParallax社製の超音波センサよりも安価な「HC-SR04」を使用します。
HC-SR04は2cm〜400cmの範囲で距離の測定が可能です(2cmより近い距離は検出不可)。Parallax社製の超音波センサとはピンの本数が異なります。
SIGピンはなくTrig(トリガー)とEchoピンがあります。Parallax社製の超音波センサはSIGでパルスの送受信を1つのピンで行っていましたが、HC-SR04ではそれぞれTrig(パルスの送信)とEcho(パルスの読み込み)で行っています。VccはParallax社製と同様にArduino Unoの5Vに接続します。
それでは、Arduino Unoの実機に配線してみましょう。
配線が終了したら、Arduino IDEに以下のスケッチを記述します。Arduino IDEのインストールおよび使用方法は第4回(https://thinkit.co.jp/article/10874)の解説を参照してください。
const int trigPin = 2;
const int echoPin = 4;
const int ledPin = 13;
void setup()
{
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop()
{
unsigned long duration;
int cm;
//ピンをOUTPUTに設定(パルス送信のため)
pinMode(trigPin, OUTPUT);
//LOWパルスを送信
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
//HIGHパルスを送信
digitalWrite(trigPin, HIGH);
//10uSパルスを送信してPingSensorを起動
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
//入力パルスの長さを測定
duration = pulseIn(echoPin, HIGH);
//パルスの長さを半分に分割
duration=duration/2;
//cmに変換
cm = int(duration/29);
//対象物が近づいたらHIGHで出力
if(cm <= 40){
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(100);
}
スケッチを記述できたら、設置位置を地面から少し高くしておきましょう。超音波の測定角度が15度なので、地面から少し高くしておかないと下側の対象物(地面)を検知してしまいます。
準備ができたら、Arduino IDEの画面左上にある矢印アイコン(マイコンボードに書き込み)をクリックしてみましょう。対象物を近づけるとLEDが点灯し、離すと消灯します。
Arduino IDE上で [ツール] → [シリアルモニタ]を確認すると、対象物との距離が表示されます。
おわりに
今回は超音波センサを使用しました。前回の最後にデモで紹介したDCモーターを使用したビークルに超音波センサを搭載して、障害物の検出をトリガーとしてビークルの進行方向を制御することができます。こちらの詳細は本連載の最後のほうで紹介する予定です。
次回は、省電(人感)センサとLED、100円ショップのツリーを利用してクリスマスツリーの作成をしていきたいと思います。次回もお楽しみに!
本連載で紹介した電子工作をスグに試せる電子工作キットを販売しています。
記事内の画像や説明だけではもの足りない、という方は、本キットを通してお手元で確認してみてはいかがでしょうか。きっと、電子工作の楽しさをもっと実感できるはずです!
電子工作キットは、下記のWebサイトから購入できます!
商品サイトはこちら→→https://blooomin.stores.jp/