距離の測定や障害物の検知などに使われるモジュールにHC-SR04という超音波センサーがあります。
電子工作では非常にメジャーな定番センサーになるかと思います。
HC-SR04は人間の可聴域より高い超音波を発して物体に当たって跳ね返ってくるまでの時間を計測し、その距離を計測する超音波センサーです。
数センチから数メートル(約2cm~4m)くらいの範囲で比較的正確に距離を計測することが出来ます。
距離の計測以外にも障害物の検知などでも使えることから、Arduinoなどのマイコンボードを使った製作物に組み込んで設定した範囲内に障害物があるとそれを回避しながら動かすといった用途で使えます。
HC-SR04はトリガー(超音波のパルスを発する)とエコー(跳ね返ってきたパルスを受け取る)の2つのスピーカー?により距離を検知しています。
ロボットに取り付けると顔のようになり、なかなか可愛いですよね!
比較的簡単に扱うことができるセンサーで、cm単位くらいでは結構正確に距離を測ることが出来るので電子工作用途では非常に便利に使える定番的なセンサーとなり使われている方多いと思います。
超音波センサーHC-SR04に関して詳しくはこちらの記事を参考にして下さい!
そんな電子工作用途でよく使われる超音波センサーHC-SR04にRGB LEDが組み込まれたタイプのRUS-04という面白いモジュールがあったので試してみました!
目次
超音波センサーHC-SR04にRGB LEDが組み込まれたRUS-04を試してみる!
こちらが一般的によく使われている超音波センサーHC-SR04です。
Arduinoなどのマイコンボードとの接続は、VCC/GND/Trig/Echoの4ピンを接続して使います。
まず簡単にHC-SR04の動作原理を見ておきます。
HC-SR04には2つのスピーカーが付いています。
一方から音を出し(人間の可聴域よりも高い周波数の超音波なので聞こえません)、物体に当たって跳ね返ってきた音をもう一方のスピーカーで検知し帰ってくるまでの時間を計測する事が出来るセンサーとなります。
空気中の音速は約340m/sという定数となるので、物体に当たって反射して戻ってくるまでの時間を計測できればその物体までの距離を計算する事が出来るという仕組みとなります。(往復なので2で割ったものが距離となります)
動作原理を簡単にまとめると、このような流れとなっています。
- Trig(トリガー)ピンを10μSの間HIGH状態にしてLOWに落とす
- TrigピンがLOWに落ちた瞬間にセンサーモジュールから40kHz 8サイクルの超音波が出力されます
- 物体に当たって戻ってくる音波を待ち、Echo(エコー)ピンで戻ってきた音波を受信しその時間を計測します
- [音速]×[戻ってくるまでの時間]÷2で物体との距離を計算する事が出来る
これがHC-SR04センサーの動作原理となります。
そしてRUS-04は、HC-SR04にRGB LEDが搭載された超音波センサーとなります。
距離の計測の他に搭載されているLEDの点灯パターンをプログラミングする事が出来るようになっています。
その機能とモジュールサイズは、HC-SR04と互換性があります。(ボードサイズは若干大きくなっています)
仕様に関してHC-SR04と少し異なる部分があるので見ていきます。
【RUS-04】RGB LEDを搭載した超音波センサー
RUS-04の接続端子はHC-SR04とは少し違い、VCC/GND/RGB/IOとなっています。(4ピンPH2.0端子)
HC-SR04ではTrigピンとEchoピンを使って距離の計測を行いますが、RUS-04では超音波の送受信を操作するのに必要なGPIOピンは[IOピン]の1つだけとなっています。
HC-SR04で使っていたTrigピンとEchoピンの役割をIOピン1本で行うので、Arduinoの場合少しスケッチが異なってきます。(簡単ですが!)
そして2つのスピーカーには、それぞれ3つのRGB LEDが内蔵されています。(左右で計6個)
この搭載されているRGB LEDの点灯を制御するのが[RGBピン]となっています。
RUS-04 接続端子 | 機能 |
VCC | 電源端子(3.5~5.5V) |
GND | GND |
RGB端子 | 左右(計6個)のLED点灯パターンの制御を行う端子 |
IO端子 | 超音波の送受信(Trig/Echo)の操作を行う端子 |
RUS-04 主な製品仕様 | |
動作電圧 | 3.5~5.5V |
検出距離範囲 | 2cm~4m |
入出力I/Oポート | 1 |
誘導角 | 15°未満 |
ボードサイズ | 46mm×21mm×20mm 固定穴サイズφ1.8mm |
インターフェース | PH2.0(4pin)と2.54mmピンヘッダーをサポート |
RUS-04のボードサイズはHC-SR04とほぼ同じなので、既に製作物にHC-SR04を組み込んでいる場合には簡単なスケッチの修正で載せ替えることが出来ます。
また、接続端子に4ピンPH2.0タイプのコネクタが使われている以外は完全にHC-SR04互換として使うことが出来ると思います。
HC-SR04と入れ替える場合、微妙なボードサイズの違いやコネクタの位置に少し注意が必要かもしれません!
距離の計測で使ってみる
超音波センサーとして距離の計測を行う場合、ほぼHC-SR04と使い方は同じです。
詳しくはこちらの記事を参考にして下さい!
距離を計測する簡単なテストスケッチを組んでみました。
HC-SR04とスケッチはほぼ同じとなります。(この段階ではまだLEDは点灯しません)
Arduinoとはこのように接続しています。
RUS-04 | Arduino |
VCC | 5V |
GND | GND |
RGB | D2 |
IO | D3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | // 超音波センサーRUS-04を使ってみる!① // https://burariweb.info const int LED_PIN = 2; const int SIGNAL_PIN = 3; const int LED_COUNT = 6; float Duration = 0; float Distance = 0; void setup() { Serial.begin(9600); } void loop() { pinMode(SIGNAL_PIN, OUTPUT); digitalWrite(SIGNAL_PIN, LOW); delayMicroseconds(2); digitalWrite(SIGNAL_PIN, HIGH); delayMicroseconds(10); digitalWrite(SIGNAL_PIN, LOW); pinMode(SIGNAL_PIN, INPUT); Duration = pulseIn(SIGNAL_PIN, HIGH); Duration = Duration / 2; Distance = Duration*340*100/1000000; if(Distance >= 400 || Distance <= 5){ Serial.println("距離 = 測定範囲外"); } else{ Serial.print("距離 "); Serial.print(Distance); Serial.println(" cm"); } delay(100); } |
HC-SR04とスケッチが異なる部分は、HC-SR04ではTrigピン(OUTPUTで使用)とEchoピン(INPUTで使用)の2本のGPIOピンでやり取りを行いますが、RUS-04では[IOピン]1本のみで行います。
そのため、void loop内でこのIOピンのINPUTとOUTPUTを切り替えながら(pinMode関数で切り替えています)TrigとEchoの動作をさせています。
18 19 20 21 22 23 24 25 26 | pinMode(SIGNAL_PIN, OUTPUT); digitalWrite(SIGNAL_PIN, LOW); delayMicroseconds(2); digitalWrite(SIGNAL_PIN, HIGH); delayMicroseconds(10); digitalWrite(SIGNAL_PIN, LOW); pinMode(SIGNAL_PIN, INPUT); |
これ以外はHC-SR04と完全互換として使うことが出来ます。(HCSR04 ultrasonic sensorなどライブラリを使用する場合は変わってくるかもしれません!)
RGB LEDの点灯制御方法
搭載されているRGB LEDの点灯パターンの制御は、「RgbUltrasonic」という専用ライブラリを使って制御すると開発元Emakefunのサイトに書かれているのですが、探してもこのライブラリを見つけることが出来ず・・・
調べてみるとRUS-04のLEDにはWS2812BというLEDコントローラーチップが使われているようです。
LEDテープライトなどで使われているチップですね。
内蔵されている6個のRGB LEDを1本の制御ピン[RGBピン]で個別に点灯を制御する事が出来る仕様となっています。
ArduinoにはWS2812Bを制御するためのライブラリは多数用意されています。
その中で定番となる「Adafruit NeoPixel」ライブラリを使って今回RGB LEDの点灯制御をやってみました。
Adafruit NeoPixelライブラリに関しては、こちらを参考にして下さい!
先程の距離計測のスケッチにRGB LEDの点灯制御を追加したスケッチがこちらです。
障害物を検知すると(10cm未満)全てのLEDが赤く点灯し、検知されていない時は青色に点灯するスケッチとなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | // 超音波センサーRUS-04を使ってみる!② // https://burariweb.info #include <Adafruit_NeoPixel.h> const int LED_PIN = 2; const int SIGNAL_PIN = 3; const int LED_COUNT = 6; float Duration = 0; float Distance = 0; Adafruit_NeoPixel pixels(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800); void setup() { pixels.begin(); Serial.begin(9600); } void loop() { pinMode(SIGNAL_PIN, OUTPUT); digitalWrite(SIGNAL_PIN, LOW); delayMicroseconds(2); digitalWrite(SIGNAL_PIN, HIGH); delayMicroseconds(10); digitalWrite(SIGNAL_PIN, LOW); pinMode(SIGNAL_PIN, INPUT); Duration = pulseIn(SIGNAL_PIN, HIGH); Duration = Duration / 2; Distance = Duration*340*100/1000000; if(Distance >= 400 || Distance <= 10){ Serial.println("距離 = 測定範囲外"); error(); } else{ Serial.print("距離 "); Serial.print(Distance); Serial.println(" cm"); normal(); } delay(100); } void error(){ pixels.clear(); for(int i=0; i<5; i++){ pixels.setPixelColor(i, pixels.Color(255, 0, 0)); } pixels.show(); } void normal(){ pixels.clear(); for(int i=0; i<5; i++){ pixels.setPixelColor(i, pixels.Color(0, 0, 255)); } pixels.show(); } |
下記動画では少しスケッチを変え、LEDの点灯をクルクル回るレインボーカラーにしてみました。
この投稿をInstagramで見る
最後に!
HC-SR04超音波センサーは電子工作用途でよく使われは定番的なセンサーとなります。
このHC-SR04と互換性がありRGB LEDが内蔵されているのは、ロボットなど製作物に組み込めば面白く使えそうですね!
またHC-SR04を複数取り付け(前後左右など)障害物の検知をしたい場合、ボードにもよりますがArduinoではGPIOピンが少ないので足りなくなるなってしまうことも考えられます。
RUS-04はIOピン1本のみで距離の計測が出来るので、GPIOピンの節約にもなりますね。
コメントを残す