ソロでたのしむ

キャンプ、電子工作、DIY、乗り物などの趣味を紹介

赤外線(GP2Y0E02A)と超音波(HC-SR04)で距離をはかるスケッチと、性能比較

 

スポンサーリンク

arduinoで距離をはかる。赤外線モジュールGP2Y0E02Aと超音波モジュールHC-SR04

初心者でも簡単に電子工作が楽しめるarduino(アルドゥイーノ)を使って実用的な作品作りをしています。

たまには遊び心のある作品もいいじゃない!と思い、近いうちに簡単な自動走行ロボットを作ってみたいと思います。

自動走行を実現するためには、距離センサーが必要です。

まずは、安価で一般的な赤外線モジュールと超音波モジュールを、arduinoを使って実際に距離測定しながら比較して、ロボットへの搭載位置や個数を決める時に活用します。

Arduinoで距離をはかる。赤外線モジュールGP2Y0E02Aと超音波モジュールHC-SR04

赤外線モジュールGP2Y0E02A(左)と超音波モジュールHC-SR04(右)

赤外線センサー GP2Y0E02A

シャープの赤外線式の測距モジュールとしては、GP2Y0A21YKがArduino作品でよく使われます。

今回はもっと小型のものを試してみたいと思い、3.3V電源で使用する測距モジュールモジュールGP2Y0E02Aを選択しました。

18.9 × 8.0 × 5.2mmとたいへんコンパクトなモジュールですが、赤外線LEDとCMOSイメージセンサーを備えています。

4~50cmの距離を高精度に素早く測定できますが、赤外線がしっかり反射する材質と面積と位置(角度)の相手物でないと測定できません。つまり、

  • 測定が早くて正確
  • 測定する相手物は、真正面
  • 相手物にはセンサーと平行の赤外線反射面が必要
  • 反射面の面積がある程度必要

なので、例えば決められたルートや迷路を自動走行するロボットなどには使えそうです。

ArduinoとGP2Y0E02Aの配線図

Arduinoと赤外線モジュールGP2Y0E02Aの配線図
Arduinoと赤外線モジュールGP2Y0E02Aの配線

回路図はFritzingで作成しています。

赤外線式距離モジュールGP2Y0E02Aには、4本の端子があります。

  1. VDD(3.3V電源)
  2. GND
  3. Vout(出力)
  4. GPIO1

1番と2番はArduinoの3.3VとGNDに接続します。

3番のVoutは、電圧で距離情報を返してくるので、Arduinoのアナログピン(回路図ではA3ピン)に接続します。

4番のGPIO1は、電圧がVDD付近であれば計測、GND付近であればスタンバイ(計測しない)モードとなります。今回はお試しなので簡易的に1番のVDDに直接つなぎます。

GP2Y0E02Aを使うスケッチ(プログラム)

void setup() {
 Serial.begin(9600);
}

void loop() {
delay (100);
     long distAns ;
     distAns = IDMread(3)  ;           // アナログピン3番のセンサーの値を読込む
     long distAns1 = map(distAns,0,1023,0,500) ; // 電圧値に変換する(0から5V)
     long distAns2 = map(distAns1,55,220,50,4) ;  // 電圧値から距離に変換する(0.55から2.2Vを50から4cmに)
     int distResult = distAns2; 
     Serial.println(distResult);  
}

// 赤外線測距モジュールから読み込む処理
int IDMread(int PinNo) {
     long distA ;
     int i ;
     distA = 0 ;
     for (i=0 ; i < 100; i++) {
          distA  = distA + analogRead(PinNo) ;   // アナログピンから読取る
     } 
     return distA/100 ;                        // 100回の平均値を返す
}

測定した距離を、センチメートルでシリアルモニターに表示するスケッチです。

測定時間が短いので、100回に一回、その平均値を表示します。それでも早すぎるので表示するまで0.1秒のディレイ(休憩時間)を入れています。

シリアルモニターには、このように表示されます。

f:id:solocamptouring:20180526150338p:plain

平らな板ではなく、手帳のざらざらした革表紙を計測してみたため、少しバラツキが大きい結果が表示されました。

GP2Y0E02A まとめ

室内で、センサーと平行な関係になることが分かっている平らな壁との距離を、早く正確に測ることができます。4~50cmの測定範囲が用途にあえば、小型で使いやすいモジュールです。

実用では、衣類などに対するバラツキ幅を乱数として有効活用して、1/fゆらぎを発生するUSB扇風機を作ってみました。

www.solocamptouring.com

 

超音波モジュール HC-SR04

Arduinoで距離を測る場合に、よく使われるモジュールです。

45×20×15mmと少し大柄ですが、超音波発信部と受信部の作りがロボットの目のようで愛嬌がある形です。

データシートでは15°の範囲で2~400cmの距離を測れることになっていますが、相手物がしっかり音を反射して返すかどうかで、計測精度や検知可否が変わってきます。

他にも試して気付いたことを、纏めてみます。

  • 近くの測定は、そこそこ早くて正確。遠くの測定は少し時間がかかる
  • 測定できる相手物は、近くは真正面から左右7.5°の範囲だが、遠くになると正面だけ
  • 相手物にセンサーと平行の超音波反射面がある方が、測定精度が良い
  • 検知物が90°のカドだと45°方向からは計測できない

超音波は思いのほか拡散して薄まるのか、遠くまでしっかり計測できるのは正面方向だけのようです。

とはいえ、1m以内の近距離のものは赤外線センサーよりも安定して計測できるので、こちらの方が使いやすそうです。

ArduinoとHC-SR04の配線図

Arduinoと超音波モジュールHC-SR04の回路図
Arduinoと超音波モジュールHC-SR04の回路

超音波モジュールHC-SR04には、4本の端子があります。

  1. VCC(5V電源)
  2. Trig(トリガー)
  3. Echo(エコー)
  4. GND

1番と4番はArduinoの5VとGNDに接続します。

2番のTrigは、Arduinoから10mSのパルスを入れることで、超音波モジュールに8x40KHzの超音波を発するように指示します。今回はD7に接続します。

3番のEchoは、超音波が返ってくるまでの間ONになります。この時間をArduinoで読むことで、距離を計測できます。今回はD8に接続します。

HC-SR04を使うスケッチ(プログラム)

int trigPin = 7; // trigピンはARDUINOのD7に接続
int echoPin = 8; // echoピンはARDUINOのD8に接続
// defines variables
long duration;
long distance;
long distA ;
long distResult;
int i ;

void setup() {
pinMode(trigPin, OUTPUT); 
pinMode(echoPin, INPUT);
Serial.begin(9600);
}
void loop() {

distA = 0 ;
    for (i=0 ; i < 10; i++) {
 
    digitalWrite(trigPin, LOW); // 初期化
    delayMicroseconds(2);

    digitalWrite(trigPin, HIGH); // 10mSのトリガーをモジュールに出す
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);

    duration = pulseIn(echoPin, HIGH);// echoピンから帰ってくる数値mSを読む
    distance= duration*0.034/2;// 距離計算
    distA  = distA + distance ; 
    } 
distResult = distA/10 ;   // 10回の平均値をアウトプット

Serial.println(distResult);
}

赤外線モジュール同様に、測定した距離をセンチメートルでシリアルモニターに表示します。

超音波モジュールは遠くまで測定するのに時間がかかるので、100回ではなく10回に一回、その平均値を表示します。

シリアルモニターの表示です。

f:id:solocamptouring:20180526184839p:plain

HC-SR04 まとめ

シリアルモニターの表示でもわかるとおり、近距離の測定結果が赤外線モジュールよりも安定しています。

少し角度がついている面でも、実際よりは遠い距離だと認識しますが計測結果は得られます。 

この超音波モジュールを数個使って自動走行ロボットを制作中です。まだ粗削りの動きなのでレベルアップに挑戦し続けており、製作記事は順次更新いたします。

www.solocamptouring.com