超音波距離センサー

超音波距離センサーとは…

クムクムの顔についている大きな目玉は超音波距離センサーといい、電子工作部品としては多くのショップで販売されている(HC-SR04)という型番のものを使用しています。
このHC-SR04は片方の目から超音波(40KHz)を出力し、障害物に反射したその超音波を受け障害物までの距離を取得するという部品です。
計測可能な距離は2~400cmまでで、精度は3mmとデータシート上には記されています。
厳密には、周囲の温度の影響などを受けるため、温度センサーと合わせて補正せるのが良いとされています。

HC-SR04をするには、基板から出ている4ピンにVCC(5.0V)とGNDを電源ラインに、Trig・Echoをマイコンのポートに接続します。
動作は、マイコンのTrigの接続したポートから測定開始のための信号を出力すると、Echoにある信号が返されるのでこの信号をマイコンのポートの入力で受けて処理をすることで物体までの距離を得ることができます。

データシート

QumcumPROでのCPUとの接続

QumcumPROのメインボードにおいては、ESP32のIO5がHCS-R04のTrigにIO35にはHC-SR04からのEchoが接続されています。
この回路図でのポイントは、ESP32が3.3Vで動作しているにもかかわらずHC-SR04は5.0Vで動作するという電圧の違いです。
ESP32側とセンサーのTrigは電圧の差はありますがCPUを壊すことはないので直接接続し3.3Vの信号で動かしています。
逆に、センサーから送られるEchoの信号については5.0VをそのままESPに入力するとESPを壊してしまいますので3Kの抵抗を使い1/2分圧をし2.5Vの信号で入力しています。
U64については、万が一電圧不足で正しく動かない場合を想定して電圧変換のためのICが使えるように用意をしています。

サンプルプログラム

準備中

スクラッチサンプル

Pythonサンプル

準備中

Arduino Cサンプル


// Defines for Pin Assign
#define SENS_TRIGGER_PIN    ( 5)  // Pin assign for SENSOR(Trigger)
#define SENS_ECHO_PIN       (35)  // Pin assign for SENSOR(Echo)

double Duration = 0; // 受信した間隔
double Distance = 0; // 距離

void setup() {
  Serial.begin(115200);
  // ピンモードを設定する
  pinMode(SENS_ECHO_PIN, INPUT); // エコー
  pinMode(SENS_TRIGGER_PIN, OUTPUT); // トリガ
}

void loop() {
  // 超音波センサの計測準備
  digitalWrite(SENS_TRIGGER_PIN, LOW); 
  delayMicroseconds(2); 
  // 超音波センサの計測開始
  digitalWrite(SENS_TRIGGER_PIN, HIGH);
  delayMicroseconds(10);
  // 超音波センサの計測終了
  digitalWrite(SENS_TRIGGER_PIN, LOW);

  // エコーのHIGHだった時間を計測する
  Duration = pulseIn(SENS_ECHO_PIN, HIGH);
  if(Duration > 0) {
    Duration = Duration / 2; // 往復距離を半分にする
    Distance = Duration * 340 * 100 / 1000000; // 音速を340m/sに設定
    Serial.println(Distance);
  }
  delay(500);
}

開発メモ

この部品はとても一般的な部品なので沢山の方が使われていて、Arduino の標準ライブラリーを使ったサンプルプログラムが公開されています。
しかし残念なのが、この一般的なプログラムをそのまま使うと、実際のロボットや制御では動作が一瞬止まってしまいます。
そのため、QumcumPROのプログラムでは、標準ライブラリーを使わずに処理することで一瞬止まる問題を回避しています。

また、弊社では現在、このセンサーにそのまま取り付けるだけで動作を止まらないで計測できるためのモジュールも開発中です。