Arduinoから超音波センサーを使ってみました。準備したセンサーはUS-015です。よくHC-SR04というセンサーも見かけるのですが、US-015にしました。
▼これです▼
Arduinoとの結線方法
▼Arduinoとの結線▼
Arduino 5Vピン ⇒ センサー VCCピン Arduino GNDピン ⇒ センサー GNDピン Arduino 出力pin ⇒ センサー trigピン Arduino 入力Pin ⇒ センサー echoピン
Arduinoの入出力ピンはソース(スケッチ)で設定するのでDigitalピンならなんでもいいです。
距離測定の概要
距離を測定する方法です。
センサーから超音波を出力して、測定物に反射して戻ってくるまでの時間で距離を測定します。
センサーtrigピン(Arduino出力ピン)を10μsほど「HIGH」にするとセンサーから超音波を発射。超音波が発射されるとECHOピン(Arduino入力ピン)が「HIGH」になります。超音波が測定物に当たり反射して戻ってきたところを検出するとEchoピンが「LOW」になります。
ですのEchoピンの「HIGH」時間を測定すれば、測定物までの往復距離が計算できます。
「往復距離=時間×速さ」で計算できますでの、音速を340m/sとすると
片道(測定物までの距離)=(「HIGH時間」×340m/s)/2
単位変えると、「HIGH」1μ秒で0.17mmとなります。(1cmがおよそ58.8μs)
音速は環境で変わってしまうので、より正確に距離をもとめるのであればそのあたりも考慮する必要があります。
Arduinoスケッチ(ソース)
Arduinoのpulsein()関数は使わずに行いたました。
pulsein()関数は「HIGH」時間の測定中は待ち時間があったり、timeoutまで1秒かかったりと、無駄な待ち時間が発生して、Arduino(マイコン)に他の処理をさせようとしたときに少し不便です。
なので今回は、ピン変化の割り込みを使って「入力ピン」の「HIGH」時間を計測します。(特にそういったことがなければpulsein()使ったほうが楽です)
割り込み処理も、ArduinoIDEのattachinterrupt()関数は使用せずに行いました。わけあって2、3ピン以外をEchoピンにしたかったので・・。
割り込みピン(Echoピン)はArduino 8pinへ割り当てました。 ピン変化0群割り込みのレジスタで
PCICR |= (1 << PCIE0); PCMSK0 |= (1 << PCINT0);
PCICR制御レジスタでPCIE0群(Arduinoで8ピン~13ピンとICSPピンの2つ)の割り込み許可を行います。
PCMSK0の0bitでArduino 8ピンの変化割り込み設定をします。
8ピンに変化があった場合は、
ISR(PCINT0_vect) { uint32_t tempTime = micros(); if (PINB & B00000001 == 1) { sonicTrigHIGH = tempTime; } else { sonicTrigLOW = tempTime; sonicTrig = 1; } }
ISR()関数が呼び出されます。PCINT0群ピン時の引数(マクロ)はPCINT0_vectとなります。
割り込み内では、8ピンのHIGH、LOWを確認して、その時の時刻を変数に入れているだけです。LOWの時、次のトリガーのためにフラグ立ててます。
メインループの方では
if (sonicTrig = 1)digitalWrite(3, HIGH ); //音波出力 sonicTrig = 0; delayMicroseconds( 10 ); digitalWrite(3, LOW ); float tempDistance = (sonicTrigLOW - sonicTrigHIGH) * 0.0157;//cm if (5.0 < tempDistance && tempDistance < 400.0) { distance = tempDistance; }
EchoピンのLOWを確認して、Trigピン(Arduino3ピン)を10μs程HIGHにしてます。
距離を計算して、5cm以上400cm以内であれば距離を測定してます。この処理をループしてます。(0.0157はこの時の実測値で補正した値です)
測定結果、精度確認
短い距離ですが、実測値と測定値を比較してみました。
実測といってもスケールで測っているだけなのでアバウトですけど・・・・。
まずは5㎝の距離です。
▼測定結果▼
なかなかの精度です。Arduinoで測定した結果をシリアル送信で表示してます。
▼8cm▼
▼10cm▼
▼最後に15cm▼
近距離でしか測定してませんが、なかなかの精度です。
仕様では2cm~400cmまで測定できるようです。この距離まで測定できるならドローンに搭載しても良いかも・・。私の場合、それほど高くまで飛ばさないですし、気圧センサーもなかなか扱いむずかしいし・・。どうしようかな。
コメント