超音波距離センサを使ってみる (赤外線障害物検知センサも)(Arduino)
”障害物を検知して・・・”なんてよくありますね。
今回は、その障害物を検知するセンサとして、
・超音波距離センサ
・赤外線障害物検知センサ
を使ってみます。
この画像の赤外線障害物検知センサーモジュールは、IR-08Hです。
赤外線障害物検知センサーモジュールは種類が多くあります。
必ず、データシート等でピン情報を確認して配線してください。
・超音波距離センサーモジュール
¥450- 〔HC-SR04〕
秋月電子通商
http://akizukidenshi.com/catalog/g/gM-11009/
(海外サイトなら、100円台で購入出来ます)
・測距範囲:2~400cm
(センサー基板正面を中心とした15度の範囲、分解能:0.3cm)
・赤外線障害物検知センサーモジュール
¥395- 〔MOD393-3P〕
aitendo
https://www.aitendo.com/product/10278
(海外サイトなら、100円以下で購入出来ます)
・検知可能な距離範囲:20~300mm
※写真のモノとは製品が違います、互換製品?です。
超音波距離センサーモジュールから使ってみます。
このセンサは、
40kHzの周波数を超音波スピーカーから出力し、
超音波マイクで受信する仕組みで、
出力した超音波が物体に反射して、
マイクに戻ってくるまでの時間を計測します。
音の速度(m/s)は、
331.5 + ( 0.6 × 摂氏温度 )
で求められます。
では、
超音波距離センサーモジュールとLCDを組み合わせて、
センサーから取得した障害物までの距離を、
I2Cを使ったLCDに表示します。
回路は図の通りです。(LCD1602Aを使用)
この回路図の作図には fritzing を利用させて頂いております。
https://fritzing.org/home/
今回、Arduino本体は、UNOの代わりに、NANOを使ってみました。
スケッチの変更などはありません。
※UNOでも動作は確認済みです。
NANOなど、UNO以外の Arduino にスケッチ書き込む場合は、
メニューの「ツール」にある、
・ボード
・プロセッサ
・シリアルポート
の設定変更が必要になります。
ボードの設定
メニュー「ツール」→「ボード:」→「Arduino Nano」
※使用のArduino仕様に合わせて選択します。
プロセッサの設定
メニュー「ツール」→「プロセッサ:」→「Atmega328P(Old Bootloader)」
※使用のNona仕様に合わせて選択します。
シリアルポートの設定
メニュー「ツール」→「シリアルポート:」→「COM4」
※Windowsのデバイスマネージャーの画面で確認し選択します。
スケッチします。
// インクルード宣言
#include <LiquidCrystal_I2C.h> // (LiquidCrystal_I2C利用宣言)
// 超音波センサからの取得情報格納用
double arrival_t = 0.0; // 到達時間用
double distance = 0.0; // 距離計算用
// LCD+I2C利用 オブジェクト生成
LiquidCrystal_I2C lcd(0x27,16,2);
void setup() {
// put your setup code here, to run once:
lcd.init(); // LCD利用開始(初期化)
lcd.backlight(); // LCDバックライト点灯
pinMode( 6, INPUT ); // 音波受信用デジタルピン
pinMode( 7, OUTPUT ); // 音波発信用デジタルピン
}
void loop() {
// put your main code here, to run repeatedly:
// 超音波出力側処理
digitalWrite( 7, LOW); // 出力停止
delayMicroseconds( 1 ); // 待つ
digitalWrite( 7, HIGH ); // 出力
delayMicroseconds( 11 ); // 待つ
digitalWrite( 7, LOW ); // 出力停止
// 超音波入力側処理
arrival_t = pulseIn( 6, HIGH ); //センサからの時間読み取り
if ( arrival_t > 0 ) {
arrival_t = arrival_t / 2.0; // 片道時間を計算
distance = arrival_t * 343.6 * 100 / 1000000; // 気温:20℃ 音速:343.6m/s
// 計算結果をLCDの表示
lcd.clear();
lcd.setCursor(0, 0); // カーソル位置設定
lcd.print( distance ); // LCDへ表示指示
lcd.print( "cm" ); // LCDへ表示指示
}
delay(500); // 500ms停止
}
超音波センサの利用は、
1.超音波出力処理は、
digitalWrite( 7, LOW); // 出力停止
delayMicroseconds( 1 ); // 待つ
digitalWrite( 7, HIGH ); // 出力
delayMicroseconds( 11 ); // 待つ
digitalWrite( 7, LOW ); // 出力停止
・使用デジタルピンを、”LOW”出力にして
1~2ms程度待ちます。
・次に、使用デジタルピンを、”HIGH”出力にして
10~12ms程度待ちます。
・その後、使用デジタルピンを、”LOW”出力に戻します。
2.超音波入力処理は、
pulseIn( ) 関数を使用して取得します。
arrival_t = pulseIn( 6, HIGH ); //センサから読み取り
3.センサから受け取った時間を、計算します。
今回は、気温:20℃で、音速:343.6m/s として計算します。
では、Arduino に書き込んで実行してみます。
センサの前に、何かの物体を近づけたり、遠ざけるすると、
センサと物体との距離がLCDの表示されると思います。
続いて、
赤外線障害物検知センサーモジュールを使ってみます。
このモジュールは、発信部より特定周波数の赤外線を照射し、
この赤外線が、障害物に当たると反射し戻ってきます。
これを、受信部で受信します。
この受信部は、赤外線未検値の場合、(HIGH)を出力、
赤外線検値の場合、(LOW)を出力します。
・調整等が必要ですが、実効距離は20~300mm程度です。
では、
赤外線障害物検知センサーモジュールが、
障害物が検知したら、ブレッドボードのLEDを点灯させてみます。
また、受信情報を、シリアルモニタに表示します。
回路は図の通りです。
赤外線障害物検知センサーモジュールは種類が多くあります。
必ず、データシート等でピン情報を確認して配線してください。
スケッチします。
// define定義、大域変数宣言
#define LED 5 // Led用デジタルピン番号
#define SEN 6 // IR sensor用デジタルピン番号
int val; // 接近判定用
void setup() {
// put your setup code here, to run once:
pinMode( LED, OUTPUT ); // Ledデジタルピン出力
pinMode( SEN, INPUT ); // IR sensorデジタルピン入力
Serial.begin( 9600 ); // シリアルポートを初期化(9600bps)
}
void loop() {
// put your main code here, to run repeatedly:
// IR sensor 情報取得
val = digitalRead( SEN );
Serial.println( val ); // シリアルポートへ出力
// IR sensor 情報に合わせてLED点灯・消灯
digitalWrite( LED, !val );
// IR sensorが LOW なら LED には HIGH に
// IR sensorが HIGH なら LED には LOW に
// !val で 否定形を利用
delay(100); // 100ms停止
}
define定義を使ってみました。
define LED 5 と定義した場合、
このスケッチの中では、
”LED” と記述したら、”5” と記述したとみなされます。
これにより、何度も同じ記述をする場面がある場合に、
define 定義の記述のみの変更で済み、書きかえが楽になります。
スケッチの、
#define LED 5
を、
#define LED 7
と書きかえるだけで、スケッチ中の ”LED” 部分は、
7 と記述したとことになります。
digitalWrite( LED, !val );
の ”!” は、非定型の扱いとなりますから、
”!val” は、val の逆(反対)ということになります。
val が HIGH なら LOW
val が LOW なら HIGH
と記述したことになります。
では、Arduino に書き込んで実行してみます。
センサの前に、何か物体を近づけて遮ると、
ブレットボードのLEDが点灯すると思います。
このとき、シリアルモニタには、LOW(0)が表示され、
遮断されていない時は、HIGH(1)の表示が続きます。