はじめに
平面上を自由に移動する車両。障害物に近づいたらそれを避けて移動する。そのとき、車両に複数の超音波センサーを載せて、前後左右の障害物を検出したい。そんなときがあります。(超音波センサー1個の場合は、こちら)
シンプルな拡張
まず、2個の超音波センサーをつないだときの回路図を示します。

Arduinoのスケッチは以下のようにしました。
int TRIG1 = 3; int ECHO1 = 2;
int TRIG2 = 13; int ECHO2 = 12;
unsigned long duration1 = 0;
unsigned long duration2 = 0;
double distance1 = 0;
double distance2 = 0;
double speed_of_sound = 331.5 + 0.6 * 25;// 25°Cの気温の想定
void setup() {
Serial.begin(9600);
pinMode(TRIG1, OUTPUT); pinMode(TRIG2, OUTPUT);
pinMode(ECHO1, INPUT); pinMode(ECHO2, INPUT);
}
void loop() {
digitalWrite(TRIG1,LOW); delayMicroseconds(2);
digitalWrite(TRIG1,HIGH); delayMicroseconds(10);
digitalWrite(TRIG1,LOW);
duration1 = pulseIn(ECHO1,HIGH);
if (duration1 > 0) {
duration1 = duration1 / 2;
distance1 = (double)duration1 * speed_of_sound * 100 / 1000000;
Serial.print("Distance1:"); Serial.print(distance1); Serial.println("cm");
}
digitalWrite(TRIG2,LOW); delayMicroseconds(2);
digitalWrite(TRIG2,HIGH); delayMicroseconds(10);
digitalWrite(TRIG2,LOW);
duration2 = pulseIn(ECHO2,HIGH);
if (duration2 > 0) {
duration2 = duration2 / 2;
distance2 = (double)duration2 * speed_of_sound * 100 / 1000000;
Serial.print("Distance2:"); Serial.print(distance2); Serial.println("cm");
}
delay(200);
}
さて、実行結果ですが、distance2の値が表示されなかったり、されたりします。観察していると、duration1の値がある一定値以下のときにdistance1とdistance2の両方が表示されます。そんな処理はどこにもない。超音波センサーを最初並べて配置していたので、それを離れた場所に設置したりしましたが症状は変わりませんでした。
そこでWebを検索
そこでWebを検索し、次の記事を見つけました。([ARDUINO] 超音波SENSOR(HC-SR04)を使って距離測定。)
早速、これを参考にして、次のような回路を組みました。

この回路のすごさがわかりますか。Trig端子とEcho端子を1つにしてArduinoピンに接続されています。ピン数が半分になっています。接続できる超音波センサの数が倍になります。
では、Arduinoのスケッチです。
# include <NewPing.h>
# define SONAR1 3
# define SONAR2 13
# define MAX_DISTANCE 500
# define NUM_SONAR 2 //使うsensorの数量
int distance[NUM_SONAR];
NewPing sonar[NUM_SONAR] = {
NewPing(SONAR1, SONAR1, MAX_DISTANCE),
NewPing(SONAR2, SONAR2, MAX_DISTANCE);
};
void setup() {
Serial.begin(9600);
}
void loop() {
delay(50);
updateSonar();
Serial.print("Sonar 1: ");
Serial.print(distance[0]);
Serial.print(" Sonar 2: ");
Serial.print(distance[1]);
}
void updateSonar() {
for (int i = 0; i < NUM_SONAR; i++) {
distance[i] = sonar[i].ping_cm(); // update distance
if (distance[i] == 0)
distance[i] = MAX_DISTANCE;
}
}
これをArduinoにアップロードしたら、すんなり動きました。あの悩みまくった時間はなんだったのだろう。ちなみに、ライブラリ「NewPing」をインストールする必要があります。
最後に
最後に超音波センサーを4つに拡張した様子を示します。無事に動きました!



コメント