Arduino 入門
Lesson 10
【超音波距離センサ編】
「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。
少しずつ、子供と一緒に楽しみながら気長にアップしてく予定です。
本日はLesson 10 超音波距離センサ編です。
※超音波を飛ばして、帰ってくるまでの時間から距離を測るモジュールを使用します。
本Lesson解説で使用しているのはArduino互換品です。
互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
はじめに
超音波について学術的なことを記載しておきます。
超音波(ちょうおんぱ、英語: ultrasound または ultrasonic)とは人間の耳には聞こえない高い振動数をもつ弾性振動波(音波)である。超音波は可聴域の音と物理的特徴は変わらず、人が聴くことができないというだけである。広義の意味では、人が聞くこと以外の目的で利用される音を意味し、人間に聞こえるかどうかは問わない。超音波はさまざまな分野で利用されている。
超音波距離センサの原理は「やまびこ」の原理と同じです。
音が「聞こえるか」「聞こえないか」の違いと考えてもらって間違いではありません。
※超音波センサは、超音波を使うことで指向性を高め距離測定をしやすくしています。
山に向かって、「ヤッホー」と叫ぶと、遅れて「ヤッホー」と返事が返ってきますよね。
これは、自分の声が山にぶつかって跳ね返ってくるために起こります。
音の速さは決まっていますので、小学生が習う「速さ×時間=距離」で測ることができます。
やまびこの場合は、往復の時間となるので2分の1にしてあげれば、山までの距離がわかります。
Lesson 10目標
「超音波距離センサモジュール」の制御方法を理解します。
また、物体までの距離を測定しシリアルモニタに表示します。
そして、距離を測定することで人間には聞こえない「やまびこ」を体感してください。
できれば、1602 LCD ディスプレイモジュールと組み合わせてパソコンではなくLCDに表示させてパソコンを使用しない形にしたいのですが、LCDの制御方法はまだ説明していません。
LCDのLessonのところで組み合わせて使うようにしようかと考えています。
また、超音波距離センサを利用するためにライブラリを使用することもできます。
使いやすいライブラリが提供されています。
例えば「NewPingライブラリ」などです。
ライブラリを使用したい方は、Lesson 01を参考に「NewPing」ライブラリを使える状態にしてください。
ライブラリを使用した方が、スケッチも煩雑にならず、なおかつ直観的にわかりやすいスケッチになります。
超音波距離センサモジュールの動作を理解するためです。
最後に、本Lessonも、遊ぶというところが一番大事なところです。
準備
ではLessonの準備に取り掛かりましょう。
今回も部品は多くないので、すぐに実践に移ることができます。
必要なもの
- USB接続用のPC(IDE統合環境がインストールされたPC)
→管理人が勝手に比較したBTOメーカーを紹介しています。 - UNO R3(以下UNO)、おすすめUNO互換品(ELEGOO)
- PCとUNOを接続するUSBケーブル
- ブレッドボード安価(大)、ブレッドボード安価(中)
※おすすめブレッドボード(大)、おすすめブレッドボード(中) - 超音波距離センサモジュール(HC-SR04)
- M-M Jumper wire(UNOと部品をつなぐための配線)
使用部品説明
新たに登場した部品について説明していきます。
本Lessonで新しく登場するのは、超音波距離センサモジュール(HC-SR04)のみです。
超音波距離センサモジュール 実物写真
下の写真が、超音波センサモジュールです。
私が購入したELEGOO UNO キットには合わせて梱包されています。
超音波距離センサには端子が4つあります。
写真左から下記となっています。
電源、Trig、Echo、GND
手持ちがない方は以下からどうぞ。
分解能が良いこちらもあります。
使い方は、どちらも同じです。
超音波距離センサモジュール 原理
下記に超音波距離センサモジュールの概略図を示します。
超音波距離センサモジュールは、「超音波を送信する部品」、「超音波を受信する部品」、「制御回路」の3つから構成されています。
外部からトリガパルスを入力すると超音波パルス(8波)が送信され、出力された反射時間信号をマイコン(Arduino等)で計算することによって距離を測ることができます。
超音波距離センサモジュール HC-SR04仕様
超音波距離センサモジュール、HC-SR04の仕様は以下のようになっています。
項目 | 内容 |
---|---|
動作電圧 | DC 5V |
待機時消費電流 | <2mA |
動作時消費電流 | 15mA |
有効角度 | <15° |
測定可能距離 | 2cm~400cm |
分解能 | 0.3cm |
トリガー入力パルス幅 | 10μs |
超音波周波数 | 8×40KHz |
サイズ | 45mm×20mm×15mm |
距離検出のしくみ
先述したように、基本原理は「やまびこ」と同じです。
超音波を送信し、跳ね返ってきた超音波を受信、距離を計算という流れです。
それでは、超音波の送信方法はどうするのか?
超音波距離センサモジュールのModule Timing図を下記に示します。
- Trig信号に10μs以上の「Highパルス」を入れる。
- 8×40KHzの超音波パルスを送信。
- 超音波パルスの送信後に、Echo出力を「High」にする。
- 超音波パルスが反射され戻ってきたら、Echo出力を「Low」にする。
つまり、Trig信号を入れることで超音波を送信し、跳ね返ってきた超音波を検知します。
その送信から受信までの時間をEcho端子から「High」の期間として得られるということです。
上記内容を計算式に当てはめると以下となります。
※音速の前提:340m/s(1秒間に340m進むということです。)
となります。
タイミング図からもわかるように利用する信号は、「Trig」、「Echo」の2つのみです。
どちらもデジタル入出力端子のみの使用で制御することが可能です。
実践 回路作成とコード作成
最初に回路図を確認してください。
次に、回路図に合わせて部品を接続します。
最後にコードを書いて、超音波センサモジュールを動かしていきましょう。
どんなふうに動くのか楽しみです。
Arduinoのピン配置を確認したい方は番外編02を参照してください。
回路図
回路図がこちら。
こちらがブレッドボード図。
※M-M jumper wireのみで結線できます。
回路図は「fritzing」を利用しています。
「fritzing」の使い方は下記を参照してください。
接続
下図に示すように、用意した部品を使用して接続しましょう。
部品は超音波距離センサモジュールのみです。
ブレッドボードを使用していますが、F-M Wireを利用すればブレッドボードなしでも接続できます。
ただし、距離を測定するために安定した場所にセンサーモジュールを置きたいためブレッドボードに挿して使った方が後々良いです。
M-M jumper wireを使用してUNOと接続しましょう。
使用するポートは、Digital IOの「10」、「11」、電源の「5V」、「GND」です。
穴に挿入しづらいときは、ラジオペンチなどを使用してください。
コードの書き込み
接続が終わったら、USBケーブルを使用してUNOにプログラムを書き込んで行きましょう。
本記事のコードを参考に書いてみてください。
実際書いてみた方が慣れるのに良いです。
コードを書き終えたら、いつでも利用できるように「ファイル」⇒「名前を付けて保存」で保存しておきましょう。
コマンド説明
新しく出てきたコマンドの説明をしていきます。
※復習も兼ねて、一部以前に説明したコマンドもあるかもしれません。
コマンド | 説明 |
---|---|
float | 浮動小数点を持つ数値のためのデータ型。 ※小数が扱えます。 整数よりも分解能が高いアナログ的な値が必要なときに使用。 使用可能な値の範囲:3.4028235E+38~-3.4028235E+38 ※32ビット(4バイト)のサイズ 例:TrigPin変数を不動小数点のデータ型にする。 float TrigPin; |
Serial.begin(speed) | シリアル通信のデータ転送レートをbpsで指定。 ※bpsはビット/秒 speed:転送レート(int) |
delayMicroseconds(us) | プログラムを指定した時間だけ一時停止。 ※1 単位はマイクロ秒。 ※2 停止する時間が長いときはdelay()関数を使う。 例 10μs待機する。 delayMicroseconds(10); |
pulseIn(pin,value,timeout) | ピンに入力されるパルスを検出。 パルスのHigh期間またはLow期間をマイクロ秒単位で返します。 タイムアウトを指定した場合は、その時間を超えた時点で0を返します。 pin:パルスを入力するピンの番号 value:測定するパルスの種類、HIGHまたはLOW timeout:タイムアウトまでの時間(マイクロ秒)、デフォルトは1秒 、省略可 |
サンプルコード
サンプルコードを下記に示します。
コマンドを理解するために、超音波距離センサモジュールのTiming図通りに動かしてみます。
//Lesson 10 超音波距離センサモジュール //距離を測定するスケッチ //https://omoroya.com/ #define TrigPin 10 // Trig Pin定義 #define EchoPin 11 // Echo Pin定義 float ProDelay = 0; //Echo出力のHigh期間を格納する変数 float Distance = 0; //計算した距離を格納する変数 void setup() { Serial.begin( 9600 ); //シリアル通信のデータ転送レートを9600bpsで指定。bpsはビット/秒。 pinMode( TrigPin, OUTPUT ); //デジタル入出力の10番ピンをOUTPUTに指定 pinMode( EchoPin, INPUT ); //デジタル入出力の11番ピンをINPUTに指定 } void loop() { digitalWrite(TrigPin, LOW); //10番ピンからLOWを出力 delayMicroseconds(10); //10μs待機 //超音波を出力するためのトリガ信号生成 digitalWrite( TrigPin, HIGH ); //トリガ信号Highパルスエッジ delayMicroseconds( 10 ); //トリガ信号パルス幅10μsを生成 digitalWrite( TrigPin, LOW ); //トリガ信号Lowパルスエッジ ProDelay = pulseIn( EchoPin, HIGH ); //11番ピンに入力されるEchoピンのHigh期間を測定 if (ProDelay > 0) { // 0を越えていたら下記を実行 Distance = 340*ProDelay/2/10000; // 音速340m/sとして距離の計算とcmへの換算 Serial.print("Distance:"); //わかりやすくするため、シリアルモニタにDistance:を表示 Serial.print(Distance); //シリアルモニタに計算した距離を表示 Serial.println(" cm"); //表示した距離の後ろにcmを表示して改行する } delay(1000); //1000ms待機 }
動作確認
では、さっそく動作を確認していきます。
2cm、30cm、100cm、200cm
を測定してみます。
結果はこちら。
※IDEの「ツール」⇒「シリアルモニタ」を開いて確認してください。
測定距離[cm] | センサ測定値[cm] |
---|---|
2 | ![]() |
30 | ![]() |
100 | ![]() |
200 | ![]() |
測定値にはばらつきがあります。
※測定環境に依存します。
Lessonとしては近い値が取れたので成功ではないでしょうか。
また、音速の340m/sは温度の影響を受けます。
正確な測定には、温度を測定して補正する必要があります。
温度センサなどを使えばよさそうです。
温度センサに関しては、またの機会にしたいと思います。
音速に関しては下記のサイトがわかりやすいです。
まとめ
今回は以下の内容について理解してもらいました。
今回も項目4の遊ぶことが一番の目標でした。
2.物体までの距離を測定しシリアルモニタに表示する。
3.距離を測定することで人間には聞こえない「やまびこ」を体感する。
4.楽しんで遊ぶ。
いかがだったでしょうか。
Lesson 10 超音波距離センサ編はここまで。
ぜひ、みなさんも子供と一緒にやられてみることをお勧めします。
目に見えないもので距離を測るって意外と楽しいですよ!
疑問点、質問などありましたら気軽にコメントください。
次回、Lesson11は「温湿度センサ編」です。
センサで測定する、そして何かを動かす。
最終的な目標に向かって遊びながら学習していきましょう!

最後に
疑問点、質問などありましたら気軽にコメントください。
この電子部品の解説をしてほしい!などなどなんでもOKです。
リンク切れ、間違いなどあればコメントいただけると助かります。
Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。
Arduino入門編、Arduino入門編2で使用しているUNOはAmazonにて購入可能です。
Arduino入門編では互換品を使用。
Arduinoはオープンソース。
複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
学習用、遊び用、お試し用には安価な互換品がおすすめです。
ELEGOO UNO キット レベルアップ チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用
上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
Amazonでお得に買う方法
Amazonでお得に購入するならAmazon Mastercard、Amazonギフト券がおすすめです。
時期により異なりますが、様々なキャンペーンを実施しています。
\Amazonギフト券/
Amazonギフトカード キャンペーン
\Amazon Mastercard お申込み/
Amazon Mastercard 申し込み
いずれの場合もプライム会員である方がお得!!
\Amazon Prime 30日間の無料会員を試す/
無料会員登録
コメント
超音波センサで距離は二つ同時に測定することは出来ますか
コメントありがとうございます。
1つの超音波センサで同時に2つ測定することはできません。
同時でなければ可能です。