Arduino環境で距離センサを使う(HC-SR04)

コンピュータ、組み込み

Raspberry Pi Pico で超音波距離センサ HC-SR04を使って距離を計測します。

今回紹介するもの

超音波距離センサ (HC-SR04)

特徴

超音波(40KHz)の音波を出し、音が反射して戻ってくるまでの時間を計測します。

電源電圧5V
出力(Echo)5V
往復時間
計測距離範囲2 ~ 400cm
センサー基板中心から±15°
音波周波数40kHz
トリガ信号(Trigger)10us

注意!!

HC-SR04の出力信号は5Vです。
Raspberry Pi Pico (RP2040系)の信号レベルは3.3Vなので、出力信号をRaspberry Pi Picoに入力すると故障の原因になります。
使用するマイコン基板の電圧を変換して使用する必要があります。

3.3Vへの変換方法は「使い方」に記載します。

外観
使用感

5Vでの電源と信号レベルなので、3.3V信号レベルのマイコンとの親和性がよくありません。
ロジックレベル変換モジュールを使用することで解決はできますが、すっきりしないのが難点です。

簡単な命令と知識で、誤差数%の距離測定を手軽に行うことができるので面白いモジュールだと思います。
凹凸の大きいものや、音の反響の小さい布類などには向いていませんが、平面の堅い対象物については精度が期待できます。

音に反応するセンサLM393の記事

準備

使うもの

画像名称、型番用途
超音波距離センサ
HC-SR04
対象物への音の反射時間を計測します。
Raspberry Pi PicoHC-SR04へのトリガ出力
読み取った時間から距離を計測します。
ブレッドボード配線します
双方向ロジックレベル変換モジュールHC-SR04からの電圧レベルを降圧させます。
5Vから3.3Vへ変換。

または分圧抵抗をで降圧させます。
抵抗
100Ω
200Ω
HC-SR04からの電圧レベルを降圧させます。
5Vから3.3Vへ変換。

またはロジックレベル変換モジュールを使用します。
ジャンパワイヤ数本配線します

双方向ロジックレベル変換モジュールについて

動作

説明

100msインターバルにより距離を計測します。
距離はmm単位で算出されます。

時間計測は以下の式を使用します。
距離 (mm) = 331.5m/s + 0.61t x 20degC) ÷ 2 ÷ 1000

配線

ロジックレベル変換モジュールを使用した配線

Raspberry Pi Pico配線ロジックレベル変換モジュール配線HC-SR04
VBUS(5V)5V側 LVVCC
3V33.3V側 LV
GND3.3V側GNDGND
GPIO23.3V側LV1
5V側LV1Echo
GPIO3Trig
5V側 GNDGND

ロジックレベル変換モジュールを使用した配線図

分圧抵抗を使用した配線図

スケッチ

 /**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
Raspberry Pi Pico

【スケッチの説明】
HC-SR04 超音波センサーを使用して距離を計測します。

距離の係数は
Distance(mm) = ((331.5m/s + 0.61t * 20degC) / 2) / 1000

【ライブラリ】
 Raspberry Pi Pico/RP2040 > Raspberry Pi Pico

【準備】
HC-SR04 の電源は5Vで、信号も5Vです。
Raspberry Pi PicoのGPIOに5V印加すると故障の原因になるので、3.3Vへ電圧変換します。

Raspberry Pi Pico <-> HC-SR04
VCC(5V)             <-> VCC
GND                 <-> GND
GPIO2               <-> Echo(3.3Vへ降圧する必要がある)
GPIO3               <-> Trig

降圧例1 : 分圧抵抗
(HC-SR04) Echo -> 100Ω -> (Pico) GPIO2 -> 200Ω -> (Pico) GND

降圧例2 : ロジックレベル変換モジュール (5V -> 3V)
(HC-SR04) Echo -> ロジックレベル変換モジュール -> (Pico) GPIO2

【バージョン情報】
2023/4/9 : 新規
**********************************************************************/

#define PIN_ECHO    2
#define PIN_TRIGGER 3
#define TRIGGERPULSE_US   10

#define SOUNDSPEED (331.5 + 0.61 * 20) //音速 331.5m/s, 摂氏 0.61t, 20℃

void setup() 
{
  Serial.begin(115200);

  //トリガピンと、エコーピンの設定
  pinMode(PIN_TRIGGER, OUTPUT);
  pinMode(PIN_ECHO, INPUT);

  //トリガはLOWに設定
  digitalWrite(PIN_TRIGGER, LOW );
  delay(100);
}

void loop()
{
  //距離測定、トリガ発振
  digitalWrite(PIN_TRIGGER, HIGH );
  delayMicroseconds(TRIGGERPULSE_US);
  digitalWrite(PIN_TRIGGER, LOW );

  //反射時間の読み取り (単位 us)
  double DdTwoWayTime_us = pulseIn(PIN_ECHO, HIGH);             //us
  double DdOneWayTime_us = DdTwoWayTime_us / 2;                 //往復時間の計測を片道時間にする
  double DdDistance_mm = DdOneWayTime_us * SOUNDSPEED / 1000;   // 距離(mm)を計算
  Serial.println(DdDistance_mm);

  delay(100);
}

結果

HC-SR04と壁との距離を測定することができました。
この時の測定は100mmの距離を測定したところ97.6mmでした。
(参考 : 室温 20℃)

2Mまでの距離を計測してグラフにしました。
橙線が目標値との誤差です。
近距離が若干誤差が大きく出ていますが、ほとんど 1~2%程度と精度は悪くありません。

コメント

タイトルとURLをコピーしました