机の端に手を近づけるとLEDが光る、ごみ箱に手をかざすとふたが開く、ロボットが壁の前で止まる。こうした仕組みの入口になるのが、Arduino 超音波センサー 距離測定 作り方です。センサーから音を出し、その音が物に当たって戻るまでの時間を読むだけで、目に見えない距離を数値にできます。まずはシリアルモニタに距離を表示するところまで、確実に作ってみましょう。
Arduino超音波センサーで距離測定を作る準備
今回は、電子工作で定番の超音波距離センサー「HC-SR04」とArduino Unoを使います。HC-SR04には、超音波を発信する送信部と、反射して戻る音を受け取る受信部があります。Arduinoは、発信の合図を出し、戻ってくるまでの時間を計測します。
用意するものは次の4点です。
- Arduino Unoまたは互換ボード
- HC-SR04超音波距離センサー
- ブレッドボードとジャンパーワイヤー
- USBケーブルとArduino IDEを使えるパソコン
HC-SR04はおおむね2cmから400cmまでを測れます。ただし、この値は理想的な条件での目安です。布、スポンジ、毛足の長い素材のように音を吸収しやすい物や、斜めに傾いた板、細い棒などは、正しく測れないことがあります。まずは平らな本や厚紙をセンサーの正面に置いて試すと、変化を観察しやすくなります。
HC-SR04の端子とArduinoの配線
HC-SR04の端子は、正面から見て一般的に「VCC」「Trig」「Echo」「GND」の順です。製品によって印字の位置が異なるため、配線前に基板の文字を必ず確認してください。
VCCをArduinoの5V、GNDをGNDへつなぎます。Trigはデジタル8番ピン、Echoはデジタル9番ピンへ接続しましょう。今回の接続では、8番ピンが超音波を出す合図を送り、9番ピンが反射音の時間を受け取ります。
| HC-SR04 | Arduino Uno | | — | — | | VCC | 5V | | GND | GND | | Trig | D8 | | Echo | D9 |
Arduino Unoでは、このまま接続できます。一方、3.3V動作のマイコンボードに接続する場合は注意が必要です。HC-SR04のEcho端子は5Vの信号を出すため、3.3Vまでしか受けられない入力ピンに直接つなぐと故障する可能性があります。その場合は、抵抗を使った分圧回路やロジックレベル変換モジュールを使い、信号電圧を下げてください。
距離を表示するArduinoスケッチ
配線できたら、Arduino IDEを開き、次のスケッチを書き込みます。ボードとシリアルポートの設定も、書き込み前に確認しましょう。
“`cpp const int trigPin = 8; const int echoPin = 9;
void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); Serial.begin(9600); }
void loop() { digitalWrite(trigPin, LOW); delayMicroseconds(2);
digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH, 30000); float distance = duration * 0.0343 / 2;
if (duration == 0) { Serial.println(“測定できません”); } else { Serial.print(distance); Serial.println(” cm”); }
delay(200); } “`
書き込み後、Arduino IDEのシリアルモニタを開き、通信速度を「9600 baud」に合わせます。センサーの前へ本を近づけたり遠ざけたりして、「15.42 cm」のように表示値が変われば成功です。手のひらでも反応しますが、形や角度によって値が揺れやすいため、最初の動作確認には平面の物をおすすめします。
距離の計算式を理解する
スケッチの中心は、`duration * 0.0343 / 2`という計算です。`duration`には、超音波が往復するまでの時間がマイクロ秒単位で入ります。音速は常温でおよそ毎秒343m、つまり1マイクロ秒あたり0.0343cm進みます。
ただし、センサーが測っているのは片道ではなく往復の時間です。発信した音は対象物まで進み、反射してセンサーへ戻ります。そのため、時間に音速を掛けたあと、2で割ることでセンサーから対象物までの片道距離に変換できます。
`pulseIn()`の3つ目の値である`30000`は、待ち時間の上限をマイクロ秒で指定しています。反射音が返らないときにプログラムが長く止まらないようにする設定です。上限時間内に信号を受け取れない場合、`duration`は0になります。今回のスケッチでは、その場合に「測定できません」と表示します。
数値が不安定になる原因と調整方法
距離表示が数cm単位で揺れることは珍しくありません。超音波は光のようにまっすぐ進むだけでなく、対象物の角度や周囲の反射の影響も受けます。センサーを机に直置きすると、机の面からの反射を拾う場合もあります。
まず、対象物をセンサーの正面に対して垂直に置いてください。次に、センサーの前方をふさぐジャンパーワイヤーや工作部品がないか確認します。HC-SR04は近すぎる距離が苦手なので、最初は10cmから50cm程度の範囲で試すと判断しやすくなります。
値の細かな揺れを減らしたいときは、複数回測って平均を取る方法が役立ちます。ただし、平均回数を増やすほど表示や反応は遅くなります。障害物を避けるロボットなら素早い反応を優先し、距離を記録する装置なら安定した数値を優先する、と目的に合わせて調整しましょう。
また、音速は温度によって少し変化します。室内で遊ぶ作品なら定数0.0343のままで十分ですが、屋外で精度を追求する測定器では温度センサーを組み合わせ、音速を補正する方法もあります。
LEDとブザーで「距離を知らせる」作品へ
シリアルモニタで数値を確認できたら、次は出力を加えて、距離に反応する物へ育ててみましょう。たとえば、対象物が10cmより近づいたらLEDを点灯させるなら、LEDと220Ω程度の抵抗をArduinoのデジタル3番ピンにつなぎ、`loop()`内へ条件分岐を追加します。
“`cpp if (distance 0) { digitalWrite(3, HIGH); } else { digitalWrite(3, LOW); } “`
この場合は、`setup()`に`pinMode(3, OUTPUT);`も追加します。LEDの代わりに圧電ブザーを使えば、近いほど音を高くする駐車センサー風の作品も作れます。さらにサーボモーター、段ボール、3Dプリンターで出力したケースを組み合わせれば、手を近づけると動く仕掛けや、小物を検知する装置へ発展させられます。
よくあるトラブル
シリアルモニタに「測定できません」と出続けるときは、VCCとGND、TrigとEchoの配線を最初に見直します。ジャンパーワイヤーは差し込んだつもりでも、ブレッドボードの別の列に入っていることがあります。特にGNDの共通接続は、必ず確認しましょう。
値が常に0cm付近、または極端に大きいときは、センサー前面に保護フィルムや障害物がないか、対象物が近すぎないかを確認します。数値がまったく変化しないときは、コード内のピン番号と実際の配線が一致しているかも確認してください。
超音波センサーは、距離という見えない情報を、コードと回路で手触りのある仕組みに変えてくれます。まずは本を使って測定し、次はLED、ブザー、ケースへと一つずつ部品を足してみてください。測った距離をどんな動きや形に変えるかを考え始めると、電子工作はぐっと自分だけの作品になります。




