走るだけ (4) タミヤ工作セット71201の超音波距離計

 連載の1回目で、超音波距離センサのスレーブ・アドレスを見つけました。市販の超音波距離センサはI2Cのインターフェースではなく、送信と受信端子、電源の4ピンの場合が一般的です。開発は、Arduino IDE 1.8.9です。

 「マイコンロボット工作 プログラミング Q&A」の
  超音波センサーmi-02を使って障害物(物体)までの距離を測定するには?

にビジュアル・プログラミング言語「MakeCode」による手順が書かれているので、スケッチで同様に記述します。

測定手順

 スレーブ・アドレスは0x2cです。

測定開始命令を送る 0x33
 ステータスを読み出す(必須)
上位バイトを要求 0x0f
 読む
下位バイトを要求 0x0e
 読む
距離を計算する

 提供されているサンプルNo.04「シンプルな超音波センサー用プログラム」04_UltrasonicProgram_v1.hexを実行し、オシロスコープでタイミングを見ます。スケッチ内のdelayMicroseconds()やdelay()は、実際の時間にほぼ合わせました。
 測定開始命令を送ったらステータス1バイトを読み出します。正常だと0x01のようです。読み出さないと、以降の命令が有効になりませんでした。0x01以外なら別の処理をしそうですが、元のプログラムでは何もしていないので、スケッチでは読み出すだけにしてあります。

#include <Wire.h>
#define UltraSonic_address 0x2c //44

void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("start");
}

void loop() {
Wire.beginTransmission(UltraSonic_address);
Wire.write(0x33); //51
Wire.endTransmission();
delayMicroseconds(60);
Wire.requestFrom(UltraSonic_address, 1);
byte buf1 = Wire.read();
delay(10);

Wire.beginTransmission(UltraSonic_address);
Wire.write(0x0f); // 15
Wire.endTransmission();
delayMicroseconds(60);
Wire.requestFrom(UltraSonic_address, 1);
byte highByte = Wire.read();
delay(4);

Wire.beginTransmission(UltraSonic_address);
Wire.write(0x0e); // 14
Wire.endTransmission();
delayMicroseconds(60);
Wire.requestFrom(UltraSonic_address, 1);
byte lowByte = Wire.read();
int data = highByte << 8 | lowByte;
// Serial.println(data);
Serial.println(String(((data-160)/2.0)*0.315) + "cm");
delay(1000);
}

 距離は約15cm以内が測れます。それを超えるとマイナス値になるので、遮蔽物からは遠いという判定に使えそうです。

 データを読み取っているときの波形です。

 超音波距離センサは黒色の4ピン・ソケットを利用しています。別の4ピンの黒いソケットにもI2Cの信号が出ています。

前へ

走るだけ (3) タミヤ工作セット71201を動かす

次へ

感震センサで揺れを記録する M5Stack編 (7) ライブラリを動かしてみる...