目的
超音波センサで距離を測りたい。 今回は下記リンクを参考にそのままやってみることにする。
超音波センサを使ってみる
使用した物品
- M5stack gray
- HC-SR04(超音波センサ)
この超音波センサは最近では突然データ取得できなくなる問題が発生しているため、生産が中止になった商品らしい
細かい式の意味については下記リンク 超音波距離センサーの使い方(HC-SR04)
次節でプログラムを示すが、0.017は1/58.8からきている。 ちゃんとやるなら計算式をしっかり書いた方が良い。
計算式は
距離[m] = 超音波の送信から受信までの往復時間[s]×音速[m/s]×1/2
1/2は片道分の計算にするため。
実際は2cm から 400 cmなのでcm単位で表示した方が分かりやすい。
丸パクリしたプログラム
#include <M5Stack.h> #define TRIG 2 #define ECHO 5 int times; int distance; void setup() { M5.begin(); pinMode(TRIG, OUTPUT); pinMode(ECHO, INPUT); // 文字サイズ M5.Lcd.setTextSize(10); } void loop() { // 画面を黒くする M5.Lcd.fillScreen(BLACK); // 超音波を発生させる digitalWrite(TRIG, HIGH); delayMicroseconds(10); digitalWrite(TRIG, LOW); // 超音波を受け取る times = pulseIn(ECHO, HIGH); distance = (int)(times * 0.017); // ディスプレイに表示させる M5.Lcd.setCursor(0, 0); M5.Lcd.print(distance); delay(500); }
pulseIn関数の意味はこちら
結果
写真は取っていないが、うまく実行できた。
コメントと改良を加えた実験
プログラムを下記に示すようにコメントを加えて、さらにLCD表示をわかりやすく変更した。
#include <M5Stack.h> #define TRIG 2 #define ECHO 5 float times; //超音波の往復時間 [us] float distance; //物体距離[cm] float sound_Vel = 340; //音速 340 [m/s] void setup() { M5.begin(); pinMode(TRIG, OUTPUT); pinMode(ECHO, INPUT); // 文字サイズ M5.Lcd.setTextSize(2); } void loop() { // 画面を黒くする M5.Lcd.fillScreen(BLACK); // 超音波を発生させる digitalWrite(TRIG, HIGH); delayMicroseconds(10); //Triggerを10usの間High Levelに設定, 基本はLow Level digitalWrite(TRIG, LOW); //この後に超音波モジュールから勝手に40kHzで8パルスが送出される // 超音波を受け取る times = pulseIn(ECHO, HIGH); //超音波を送信終了後から受信するまでの時間 distance = times * 0.017; //times*340/2*(1/1000000)*100でcmに変換: [us]*[m/s]*[s/us]*[cm/m]=[cm] // ディスプレイに表示させる M5.Lcd.setCursor(0, 0); M5.Lcd.print("distance="); M5.Lcd.print(distance); M5.Lcd.print("cm\n"); M5.Lcd.print("ReflectingTime="); M5.Lcd.print(times); M5.Lcd.print("us"); delay(1000); }
そして実験の様子が下記画像。 お酒の缶に向けて超音波を送出し、距離を測ってみた。
下画像にあるようにいい感じに8.24cmの距離が測定された。 この時の超音波の送受信した時間は485usになっている。
ここで、実際に測定データから音速を求めなおしてみる。
音速[m/s] = 8.24*2*0.01/(485*1e-6) = **339.79**
すなわち、音速340 m/sが得られていることが分かる。 (データから逆算しているだけなので合っていて当然だが一応確認。)
まとめ
今回は超音波センサを使ってみました。 これも参考リンク丸パクリで実行できたので、これから原理について理解していきたいと思う。 うまいこと利用して追跡ロボット?みたいなものができないかな。。。
他気になるリンクは以下の通り。 参考リンク1 参考リンク2 等を参考に計算式の確認やモータとの組み合わせなども試してみたい。
今後の目標
mycobot-pi上で超音波センサを制御できるようにする。 そして、mycobot-piに取り付けて制御をやりたい。 Ex) - 超音波で人の手の距離を測り、ある範囲まで来たらmycobotが遠のく動きをする。 - ある距離内で反応を始めたらそれに追尾するみたいなやつ。(上の参考リンクのパクリ)