制御工学博士の日常+備忘録

ようやく制御工学で博士を手に入れたので真っ当な人間になるべく研究以外の事とか色々と備忘録的にやっていく。そんな感じ

M5Stackを使って超音波センサで遊ぶ

目的

超音波センサで距離を測りたい。 今回は下記リンクを参考にそのままやってみることにする。

【初心者向け電子工作】超音波センサーで距離を測ってみる

超音波センサを使ってみる

使用した物品

  • 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);
}

そして実験の様子が下記画像。 お酒の缶に向けて超音波を送出し、距離を測ってみた。

DSC_0842.JPG (3.7 MB)

下画像にあるようにいい感じに8.24cmの距離が測定された。 この時の超音波の送受信した時間は485usになっている。

DSC_0843.JPG (3.8 MB)

ここで、実際に測定データから音速を求めなおしてみる。

音速[m/s] = 8.24*2*0.01/(485*1e-6) = **339.79**

すなわち、音速340 m/sが得られていることが分かる。 (データから逆算しているだけなので合っていて当然だが一応確認。)

まとめ

今回は超音波センサを使ってみました。 これも参考リンク丸パクリで実行できたので、これから原理について理解していきたいと思う。 うまいこと利用して追跡ロボット?みたいなものができないかな。。。

他気になるリンクは以下の通り。 参考リンク1 参考リンク2 等を参考に計算式の確認やモータとの組み合わせなども試してみたい。

今後の目標

mycobot-pi上で超音波センサを制御できるようにする。 そして、mycobot-piに取り付けて制御をやりたい。 Ex) - 超音波で人の手の距離を測り、ある範囲まで来たらmycobotが遠のく動きをする。 - ある距離内で反応を始めたらそれに追尾するみたいなやつ。(上の参考リンクのパクリ)