超音波距離センサーとは
クムクムロボットでは、HC-SR04という距離センサーを使用しています。
このセンサーは、センサーのTRIGピンに対してパルス(10μ秒)を与えると、40kHzの超音波を発生させて、その後センサーのECHOピンより8個のパルスを返します。
この8個のパルスを受信した時間の長さから障害物までの距離を計算で求めることになります。
計算式
距離=331.5 + 0.6 t (m/sec) tは摂氏温度 |
接続と関数
Arduinoとしてのポート | センサー |
D13 | TRIGGER |
A3 | ECHO |
+5V | +5V |
GND | GND |
プログラム
Arduinoにシリアルモニターを起動すると計測した距離を表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#define Trig 13 #define Echo A3 int Duration; float Distance; void setup() { Serial.begin(9600); while (!Serial) { ; } //Leonardoの場合にはこの部分が必要 pinMode(Trig,OUTPUT); pinMode(Echo,INPUT); } void loop() { digitalWrite(Trig,LOW); //まずLowにする delayMicroseconds(1); //1μ秒まつ digitalWrite(Trig,HIGH); //トリガー信号をあげる delayMicroseconds(11); //10μ秒だが念のため11μ秒HIGHを出す digitalWrite(Trig,LOW); //信号を落とす Duration = pulseIn(Echo,HIGH);//パルスがHIGHの間の時間を測る if (Duration>0) { //パルスの秒から距離を計算する Distance = Duration/2; Distance = Distance*340*100/1000000; Serial.println(Distance);//シリアルに書き出してみる } delay(1000); } |
pulseIn(pin, value, timeout)
引数[pin]からパルスがvalue(HIGHもしくはLOW)の間のパルスを読み取る。
例えばvalueをHIGHとして家いた場合、pulseIn()は、ピンがLOWからHIGHになるのを待ち、時間計測を開始します。そして、[pin]がLOWになるとそれまでの時間時間を関数の戻り値として返します。timeout時間内にパルスが開始されないとタイムアウトし、0を戻します。
引数 | [pin]uint8_t [value]uint8_t state [timeout]unsigned long |
パルスを受け取るピン番号 HIGH または LOW タイムアウト時間(マイクロ秒)デフォルト1μ秒 |
戻り値 | unsigned long | パルスが発生していた時間(マイクロ秒) タイムアウトが発生した時は0 |
シリアルモニター
Arduinoには、プログラミング中にデータがどのようになっているかを知るための方法として、SerialMonitorという方法があります。
上のプログラムでも計測した距離をSerialで表示しているコードがあります。
Serial.println(Distance)
この命令は計算した Distance値をモニター画面に表示してくれます。
printlnはデータを表示した後に自動改行をする関数で、開業したくない場合は printを使用します。