Arduinoと戯れてみる!

Arduino 入門 Lesson 10 【超音波距離センサ編】

Arduino-lesson10-00Arduino入門編
スポンサーリンク
子供と一緒に始める マイコンプログラム
Arduino 入門
Lesson 10
【超音波距離センサ編】

「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。

少しずつ、子供と一緒に楽しみながら気長にアップしてく予定です。

本日はLesson 10 超音波距離センサ編です。
※超音波を飛ばして、帰ってくるまでの時間から距離を測るモジュールを使用します。

 

本Lesson解説で使用しているのはArduino互換品です。

互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

スポンサーリンク

はじめに

超音波について学術的なことを記載しておきます。

wikipedia 超音波

超音波(ちょうおんぱ、英語: ultrasound または ultrasonic)とは人間の耳には聞こえない高い振動数をもつ弾性振動波(音波)である。超音波は可聴域の音と物理的特徴は変わらず、人が聴くことができないというだけである。広義の意味では、人が聞くこと以外の目的で利用される音を意味し、人間に聞こえるかどうかは問わない。超音波はさまざまな分野で利用されている。

超音波距離センサの原理は「やまびこ」の原理と同じです。

音が「聞こえるか」「聞こえないか」の違いと考えてもらって間違いではありません。
※超音波センサは、超音波を使うことで指向性を高め距離測定をしやすくしています。

山に向かって、「ヤッホー」と叫ぶと、遅れて「ヤッホー」と返事が返ってきますよね。

これは、自分の声が山にぶつかって跳ね返ってくるために起こります。

音の速さは決まっていますので、小学生が習う「速さ×時間=距離」で測ることができます。

やまびこの場合は、往復の時間となるので2分の1にしてあげれば、山までの距離がわかります。

 

一般的に、電子部品として入手できる距離を測定できるセンサは音波以外には「赤外線センサ」があります。※リモコンなどによく使われていますよね。
こちらに関しては、別Lessonにて解説します。

 

Lesson 10目標

「超音波距離センサモジュール」の制御方法を理解します。

また、物体までの距離を測定しシリアルモニタに表示します。

そして、距離を測定することで人間には聞こえない「やまびこ」を体感してください。

できれば、液晶ディスプレイ(LCD)のモジュールと組み合わせてパソコンではなくLCDに表示させてパソコンを使用しない形にしたいのですが、LCDの制御方法はまだ説明していません。

LCDのLessonのところで組み合わせて使うようにしようかと考えています。

 

また、超音波距離センサを利用するためにライブラリを使用することもできます。

使いやすいライブラリが提供されています。

例えば「NewPingライブラリ」などです。

ライブラリを使用したい方は、Lesson 01を参考に「NewPing」ライブラリを使える状態にしてください。

ライブラリを使用した方が、スケッチも煩雑にならず、なおかつ直観的にわかりやすいスケッチになります。

 

本Lessonではライブラリを使用しません。
超音波距離センサモジュールの動作を理解するためです。

 

最後に、本Lessonも、遊ぶというところが一番大事なところです。

 

準備

ではLessonの準備に取り掛かりましょう。

今回も部品は多くないので、すぐに実践に移ることができます。

 

必要なもの

 

使用部品説明

新たに登場した部品について説明していきます。

本Lessonで新しく登場するのは、超音波距離センサモジュールのみです。

 

超音波距離センサモジュール 実物写真

下の写真が、超音波センサモジュールです。

私が購入したELEGOO UNO キットには合わせて梱包されています。

超音波距離センサには端子が4つあります。

写真左から下記となっています。

電源、Trig、Echo、GND

Arduino-lesson10-01

Arduino-lesson10-02

 

手持ちがない方は以下からどうぞ。

 

分解能が良いこちらもあります。

使い方は、どちらも同じです。

 

超音波距離センサモジュール 原理

下記に超音波距離センサモジュールの概略図を示します。

超音波距離センサモジュールは、「超音波を送信する部品」、「超音波を受信する部品」、「制御回路」の3つから構成されています。

外部からトリガパルスを入力すると超音波パルス(8波)が送信され、出力された反射時間信号をマイコン(Arduino等)で計算することによって距離を測ることができます。

Arduino-lesson10-03

 

超音波距離センサモジュール HC-SR04仕様

超音波距離センサモジュール、HC-SR04の仕様は以下のようになっています。

項目内容
動作電圧DC 5V
待機時消費電流<2mA
動作時消費電流15mA
有効角度<15°
測定可能距離2cm~400cm
分解能0.3cm
トリガー入力パルス幅10μs
超音波周波数8×40KHz
サイズ45mm×20mm×15mm

 

距離検出のしくみ

先述したように、基本原理は「やまびこ」と同じです。

超音波を送信し、跳ね返ってきた超音波を受信、距離を計算という流れです。

それでは、超音波の送信方法はどうするのか?

超音波距離センサモジュールのModule Timing図を下記に示します。

  1. Trig信号に10μs以上の「Highパルス」を入れる。
  2. 8×40KHzの超音波パルスを送信。
  3. 超音波パルスの送信後に、Echo出力を「High」にする。
  4. 超音波パルスが反射され戻ってきたら、Echo出力を「Low」にする。

Arduino-lesson10-04

つまり、Trig信号を入れることで超音波を送信し、跳ね返ってきた超音波を検知します。

その送信から受信までの時間をEcho端子から「High」の期間として得られるということです。

上記内容を計算式に当てはめると以下となります。
※音速の前提:340m/s(1秒間に340m進むということです。)

「速さ×時間÷2(往復のため)=距離」にあてはめる
「音速×Echo出力のHigh期間÷2=距離」

となります。

タイミング図からもわかるように利用する信号は、「Trig」、「Echo」の2つのみです。

どちらもデジタル入出力端子のみの使用で制御することが可能です。

 

実践 回路作成とコード作成

最初に回路図を確認してください。

次に、回路図に合わせて部品を接続します。

最後にコードを書いて、超音波センサモジュールを動かしていきましょう。

どんなふうに動くのか楽しみです。

Arduinoのピン配置を確認したい方は番外編02を参照してください。

 

回路図

回路図がこちら。

Arduino-lesson10-05

 

こちらがブレッドボード図。
※M-M jumper wireのみで結線できます。

Arduino-lesson10-06

 

回路図は「fritzing」を利用しています。

「fritzing」の使い方は下記を参照してください。

 

接続

下図に示すように、用意した部品を使用して接続しましょう。

部品は超音波距離センサモジュールのみです。

ブレッドボードを使用していますが、F-M Wireを利用すればブレッドボードなしでも接続できます。

ただし、距離を測定するために安定した場所にセンサーモジュールを置きたいためブレッドボードに挿して使った方が後々良いです。

M-M jumper wireを使用してUNOと接続しましょう。

使用するポートは、Digital IOの「10」、「11」、電源の「5V」、「GND」です。

穴に挿入しづらいときは、ラジオペンチなどを使用してください。

距離を測定するときに長さを確かめやすいように、ブレッドボードの淵に合わせて超音波距離センサを配置すると良いです。

Arduino-lesson10-07

 

コードの書き込み

接続が終わったら、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図通りに動かしてみます。

//超音波距離センサモジュールを使って距離を測定するスケッチ

#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、50cm、200cm、400cm

を測定してみます。

結果はこちら。
※IDEの「ツール」⇒「シリアルモニタ」を開いて確認してください。

測定距離[cm]センサ測定値[cm]
2Arduino-lesson10-08
30Arduino-lesson10-09
100Arduino-lesson10-10
200Arduino-lesson10-11

測定値にはばらつきがあります。
※測定環境に依存します。

Lessonとしては近い値が取れたので成功ではないでしょうか。

また、音速の340m/sは温度の影響を受けます。

正確な測定には、温度を測定して補正する必要があります。

温度センサなどを使えばよさそうです。

温度センサに関しては、またの機会にしたいと思います。

音速に関しては下記のサイトがわかりやすいです。

 

まとめ

今回は以下の内容について理解してもらいました。

今回も項目4の遊ぶことが一番の目標でした。

1.超音波距離センサモジュールの制御方法を理解する。
2.物体までの距離を測定しシリアルモニタに表示する。
3.距離を測定することで人間には聞こえない「やまびこ」を体感する。
4.楽しんで遊ぶ。

 

いかがだったでしょうか。

Lesson 10 超音波距離センサ編はここまで。

ぜひ、みなさんも子供と一緒にやられてみることをお勧めします。

目に見えないもので距離を測るって意外と楽しいですよ!

疑問点、質問などありましたら気軽にコメントください。

 

次回、Lesson11は「温湿度センサ編」です。

センサで測定する、そして何かを動かす。

最終的な目標に向かって遊びながら学習していきましょう!

Arduino 入門 Lesson 11 【温湿度センサ編】
「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。本日はLesson 11 温湿度センサ編です。温湿度センサモジュールを利用して温度と湿度を測定します。今回は、安価なDHT11を利用します。さっそく遊んでみましょ…

 

本Lessonで使用しているUNOはAmazonにて購入可能です。

Amazon ベストセラーNo.1
ELEGOO UNO キット レベルアップ  チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用

 

上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。

コメント

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