超音波距離センサを使ってみる (赤外線障害物検知センサも)(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/

回路図1
回路図1

今回、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 に書き込んで実行してみます。

Arduino IDE
Arduino IDE
実行結果
実行結果1

センサの前に、何かの物体を近づけたり、遠ざけるすると、
センサと物体との距離がLCDの表示されると思います。

続いて、
赤外線障害物検知センサーモジュールを使ってみます。

このモジュールは、発信部より特定周波数の赤外線を照射し、
この赤外線が、障害物に当たると反射し戻ってきます。
これを、受信部で受信します。
この受信部は、赤外線未検値の場合、(HIGH)を出力、
赤外線検値の場合、(LOW)を出力します。
・調整等が必要ですが、実効距離は20~300mm程度です。

では、
赤外線障害物検知センサーモジュールが、
障害物が検知したら、ブレッドボードのLEDを点灯させてみます。
また、受信情報を、シリアルモニタに表示します。

回路は図の通りです。

回路図2
回路図2

赤外線障害物検知センサーモジュールは種類が多くあります。
必ず、データシート等でピン情報を確認して配線してください。

スケッチします。

// 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 に書き込んで実行してみます。

Arduino IDE
Arduino IDE
実行結果2
実行結果2

センサの前に、何か物体を近づけて遮ると、
ブレットボードのLEDが点灯すると思います。
このとき、シリアルモニタには、LOW(0)が表示され、
遮断されていない時は、HIGH(1)の表示が続きます。