ハロー・ワールド!おもちゃ大好きエンジニアの大之助( @daivoy_x)です!
マイコンロボット工作セットの超音波センサーをプログラミングしようと思ったのですが、公式サイトの解説が難しかったので本記事で丁寧に解説します。
- マイコンロボット工作セットの超音波センサープログラムの作り方
実際にプログラミングして、超音波センサーで距離を測れるようになったので最後までご覧くださいm(_ _)m
まずは超音波センサーで距離を測定する理論の確認
まずは、超音波センサーで障害物までの距離を測定する仕組みについて確認しましょう。概要は次のとおりです。
超音波センサーは超音波を送信してから障害物にぶつかり、跳ね返ってくるまでの時間を計測することができます。
時間と速度がわかれば距離が計算できますね。なので、ロボットと障害物の距離は次の式で計算することができます。
ただし、サンプルプログラムを見ると反射時間T[μ/s]から160[μ/s]を引いてあります(理由はわかりません)ので、計算式を改めると次のようになります。
これで、超音波センサーを使って障害物までの距離を計算する理屈はわかりました。
次は実際にそれをプログラミングする方法を解説します。
次はプログラムのアルゴリズムを確認
まずは、プログラムのアルゴリズムを確認しましょう。
すみません、具体的なプログラムはまだです。どういうものを作るのか考えてからプログラムを書き出すことが大事ですからね。
大まかな流れは次のとおりです。
- 超音波センサーで反射時間T[μs]を取得する
- 反射時間T[μs]をもとに距離D[mm]を計算する
1.超音波センサーで反射時間T[μs]を取得する
まずは、「1.超音波センサーで反射時間T[μs]を取得する」方法を確認しましょう。
考え方
構成図を見てみると超音波センサーとmicro:bitはI2Cという方法で通信を行います。通信を行うとはmicro:bitと超音波センサーがデータのやり取りを行うということです。
データのやり取りを図にしたものがこちらです。
ちょっと、ややこしいですね。micro:bitから測定値の取得を指示すると、この超音波センサーは測定値を分割して送り返してきます。
具体例
分割されたデータをそれぞれ取得し、元のデータに戻す方法を具体例で解説します。
反射時間Tが500[μs]の場合で説明します。
まず、500[μs]は10進数なので2進数に変換すると理解しやすいです。500を取り扱うには2[byte]必要です。このデータは超音波センサーが計測したデータです。
次に、超音波センサーが分割したデータをmicro:bitは上位桁と下位桁にわけて変数に保存します。
micro:bitは1[byte]ずつのデータを基に元の2[byte]データに戻したいので、各データを2[byte]に変換します。
上位桁の値と下位桁の値を使って元の値に戻すには次のように計算します。
これで、micro:bit側で元の測定データ500[μs]を取得できました。
2.反射時間T[μs]をもとに距離D[mm]を計算する
これは簡単です。計算式に当てはめればいいだけです。
おさらいすると距離Dを求める計算式は次のとおりです。
先程の例ではT=500[μs]でした。それで、計算すると距離Dは53.55[mm](5.355[cm])です。
これで超音波センサーを使って距離を算出することができます!
では、以上の内容をプログラミングしてみましょう!
いよいよプログラムを書こう!
さあ、いよいよプログラムを書く作業です。
まずは、プログラムを読みやすいように変数にコマンドの設定値を代入します。
次は測定開始指示を出す部分です。I2C通信の命令を使用します。
次は測定値を分割して取得する部分です。
最後に取得した上位桁と下位桁を基に反射時間を計算する部分です。
これで実現できます。
一応、私が作ったプログラムを置いておきます。
まとめ:超音波センサーのプログラミングを楽しもう!
作ったプログラムが考えたとおりに動いたら嬉しいですよね。
少しでもプログラミングのお役に立てたら幸いです。
では、マイコンロボット工作セットを楽しんでください(^^)/~~~