Arduinoで超音波センサを使用する
Arduinoを使用すると、センサにも興味がわいてきませんか?
お掃除ロボットのような衝突検知を行い自動で方向転換を行う回路を設定するためには、超音波センサが欠かせません。ここでは、Arduinoを使った超音波センサ回路を紹介します。
1.超音波センサの原理
今回はHC-SR04の超音波センサを使用します。超音波センサモジュールは超音波送信機、受信機及び制御回路から構成されています。仕組みとしては、回路にHIGH信号が入ると送信機より、40kHzのパルス信号を送信し、パルス信号が戻る時間までの時間を計測しています。計算式は音速を使用した下記式となります。
距離=(時間 / 音速(340 m/s))
モジュールには、下図のようにVcc, Trig, Echo, GNDの4つの端子から構成されており、トリガーよりパルス信号が入力されEchoに反射した超音波が返ってきます。では作ってみましょう。
2.準備するもの
下図の材料を準備しましょう。これもAmazonのスターターキットに入っており、非常に安価に購入できるので、おすすめです。
3.超音波センサ回路のシミュレーション
回路をシミュレーションしてみましょう。今回実施する回路は、物体までの 距離を測定し、距離に応じて色が変化する回路を作成します。距離については、プログラム次第で自由に設定できます。今回は、100mmまでの距離は赤、150mmまでは緑、150mm以上は青色となるように回路を製作します。
プログラム回路は下記になります。
// Define Pins
define BLUE 3
define GREEN 5
define RED 6
int Trig = 8;
int Echo = 9;
int Duration;
float Distance;
int redValue;
int greenValue;
int blueValue;
void setup()
{
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BLUE, OUTPUT);
Serial.begin(9600);
pinMode(Trig,OUTPUT);
pinMode(Echo,INPUT);
}
void loop() {
digitalWrite(Trig,LOW);
delayMicroseconds(1); //1μsプログラムを停止する
digitalWrite(Trig,HIGH);
delayMicroseconds(11);
digitalWrite(Trig,LOW); Duration = pulseIn(Echo,HIGH); if (Duration>0) { Distance = Duration/2; Distance = Distance*340*100/1000000; // ultrasonic speed is 340m/s = 34000cm/s = 0.034cm/us Serial.print(Duration); Serial.print(" μs "); Serial.print(Distance); Serial.println(" cm"); } if (100>Distance>0){ redValue=255; greenValue=0; blueValue=0; analogWrite(BLUE, blueValue); analogWrite(RED, redValue); analogWrite(GREEN, greenValue); } else if (Distance<150){ redValue=0; greenValue=255; blueValue=0; analogWrite(BLUE, blueValue); analogWrite(RED, redValue); analogWrite(GREEN, greenValue); } else{ redValue=0; greenValue=0; blueValue=255; analogWrite(BLUE, blueValue); analogWrite(RED, redValue); analogWrite(GREEN, greenValue); } delay(500);
}
シミュレーションはうまくいきましたか?
成功したら実際につくってみましょう。
4.超音波センサ回路を実際につくってみる
作ったものが下記になります。
距離を長くすると、色が変化することがわかります。これらの値もシリアルモニタを使えば確認することができます。これらを使って、今後衝突前に自動で方向を変化させるラジコンの回路を使用したいと思います。
センサが使えると、やれることが多くなり非常に楽しいですね!