昨年夏あたりから電子工作というものを始めArduinoを使うようになり自分への備忘録として学んだことをまとめたこのシリーズの記事なんですが、やりたい事が多すぎて少し更新が遅れておりました。
Arduino歴3ヶ月ほどの初心者が書く記事ではありますが、ブログのArduino関連の記事へのアクセスが非常に多いことに驚いております。
もう下書きとしては30記事ほど新たに書いているのですが・・・学んだことをこれからはじめる方にもできるだけ分かりやすいように書き残しておきたいと思います。(楽しいことが多すぎて少し更新頻度は遅いのですが!)
そんな事で今回はセンサーを使ってみたいと思います。
Arduinoで使えるセンサーには温度や湿度、光やジャイロセンサーなど様々なものがありますが、今回はHC-SR04という超音波を使ったセンサーモジュールを使ってみたいと思います。
人間の聞き分けられる可聴域より高い超音波をスピーカーから出力し、物体に当たって反射されて戻ってきた音を検出してその時間から距離を計測するというものです。
高性能とまではいきませんが、cm単位くらいではほぼ正確に測定でき、また障害物の検知では現在製作途中のスパイダーくんに組み込んでみましたが問題なく使うことができました。
プログラム的にもう少し当たり判定等を工夫する必要がありそうですが、ちゃんと障害物の検知は出来ていますね!
この投稿をInstagramで見る
Arduinoでは難しいハードウェアを組むことなくモジュールを組み合わせる事により比較的簡単にセンサーなどを扱うことが出来るため電子工作が楽しくなりますね!
段階を追いながらこのシリーズを書いていますが、今回使ったHC-SR04というメジャーな超音波センサーはこれまでご紹介してきたデジタル入出力の知識があれば、あとはその仕様さえ理解できていれば比較的簡単に扱うことが出来るかと思います。
Arduinoのデジタル入出力に関してはこちらの記事も参考にしながら読んで頂けると理解しやすいかと思います。
それでは超音波センサーHC-SR04を使って障害物の検知や距離の測定をやってみたいと思います。
目次
【Arduino入門編⑪】超音波センサーを使って障害物の検知や距離の測定をやってみる![HC-SR04]
今回の目標
これまでArduinoを使い(こちらではArduino Unoで解説していきます)デジタル入出力ピン(D0~D13)・アナログ入力ピン(A0~A5)を使いLEDの点灯やサーボモータの制御などやってきました。
これらArduinoの基本となるGPIOピンの使い方が分かってきたところで今回はセンサーを使ってみたいと思います。
センサーと言ってもいろいろとありますが、今回はデジタル入出力ピンを使って出来る超音波センサーを使って障害物の検知や距離の測定をしていこうと思います。
人間の耳には聞こえない高周波の音を出し、物体に当たって反射してくる時間を計測しそこから距離を計算するというものとなります。
非接触で物体までの距離を測定する事ができます。
ロボットに組み込み障害物検知などで使えますね!
超音波センサーとは?(HC-SR04)
今回HC-SR04という電子工作ではよく見かけるメジャーな超音波センサーを使ってみたいと思います。
主要な回路は既に組み込まれているモジュールとなり比較的簡単に扱うことが出来るようになっています。
2つの大きなスピーカーが付いていて一方から音を出し(超音波なので人間の耳には聞こえません)、もう一方のスピーカーで物体に当たって反射して戻ってきた音を受信しその時間を計測できるセンサーとなります。
具体的な距離の計算方法を簡単に説明すると、一方のスピーカーから超音波を出力してその音波が障害物に当たって反射し、その反射した音波をもう一方のスピーカーで受信しその時間を計測します。
そして超音波は「音」なので、センサーから対象物の距離は
対象物との距離=[音速]✕[戻ってくる時間]÷2
となります。(往復なので2で割っています)
ここで空気中の音速は340m/sという定数なので、センサーで戻ってくる時間を計測できれば距離を計算することが出来るという仕組みとなります。
理屈が分かったところで、実際にHC-SR04を使ってみたいと思います。
実際の音速は温度等にも左右されるので、温度センサーなど組み込んで補正するとより正確な値が出せるかと思います。
また、布製品のような音波を吸収しやすい素材?には誤検知が発生することがあるようです。
超音波センサー HC-SR04の接続方法
今回使う超音波センサーHC-SR04にはモジュールとして組み込むための回路が全てセンサーモジュール内に組み込まれているので、Arduinoと直接接続することが出来ます。
HC-SR04の接続端子は4ピンとなっています。
順番に見ていきます。
- Vcc:電源電圧(5V)
- Trig(トリガー端子):超音波の出力用の信号を送信
- Echo(エコー端子):超音波の入力信号を受信
- GND:グランド(マイナス)
秋月さんのサイトにHC-SR04データシートがあったので参考までに!
参考 HC-SR04データシート秋月電子通商HC-SR04製品仕様 | |
電源電圧 | DC5V |
静止電流 | 2mA |
動作時電流 | 15mA |
動作周波数 | 40kHz |
最大計測範囲 | 4m |
最小計測範囲 | 2cm |
有効角度 | 15° |
トリガー入力パルス幅 | 10μs |
デジタル信号でのやり取りとなりArduinoのデジタル入出力ピンと直接やり取りが出来るため接続自体は非常に簡単です!
今回Trig(トリガー)ピンをArduinoのD8ピン、Echo(エコー)ピンをD9ピンに接続、電源もArduino側から供給する形で接続しました。
HC-SR04動作原理
接続自体は非常に簡単ですね!
それではどのようなプログラム(スケッチ)で動かすかというと、上記データシートにあるパルスタイミング図から考えてみたいと思います。
HC-SR04のTrig(トリガー)とEcho(エコー)のタイミング図は上記となります。
- 計測を開始するためにまずHC-SR04のTrigピンを10μsの間High状態(5V)にしLowに落とします。
- TrigピンがLowになった瞬間にセンサーモジュールから40kHz 8サイクルで超音波が出力されます。
- そして物体に当たって戻ってくる音波を待ち、Echoピンで戻ってきた超音波を受信しその時間を計測する
これが基本的な流れになります。
EchoピンがHighになってからLowに変化するまでの時間(超音波が送信されてから受信するまでの時間(μs)が計測出来たら、あとは速度(音速)に掛けると距離を求めることが出来ます。(実際には往復なので2で割っています)
[物体との距離]=[速度(音速)]✕[時間]÷2
※音速=340m/s=0.034cm/μs
使用スケッチ
今回このようなスケッチを作ってみました。
HC-SR04のTrigにパルスを送り音波を出力させ、Echoピンから戻ってきた音波を受信しその時間を計測するシンプルなものとなります。
実際に計測した距離を視覚化するためにシリアルモニタに表示させています。
シリアルモニタに関してはこちらの記事も参考にしてみて下さい。
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 | // Arduino入門編⑪ 超音波センサーHC-SR04で距離を測定する! // https://burariweb.info #define trigPin 8 // トリガーピンをD8に #define echoPin 9 // エコーピンをD9に float Duration = 0; // 計測した時間 float Distance = 0; // 距離 void setup(){ Serial.begin(9600); // シリアルモニタの開始 pinMode(echoPin,INPUT); // エコーピンを入力に pinMode(trigPin,OUTPUT); // トリガーピンを出力に } void loop(){ digitalWrite(trigPin,LOW); // 計測前に一旦トリガーピンをLowに delayMicroseconds(2); digitalWrite(trigPin,HIGH); // トリガーピンを10μsの時間だけHighに delayMicroseconds(10); digitalWrite(trigPin,LOW); Duration = pulseIn(echoPin,HIGH); // エコーピンからの入力 Duration = Duration / 2; // 距離を1/2に Distance = Duration*340*100/1000000; // 音速を掛けて単位をcmに if(Distance >= 400 || Distance <= 2){ // センサーの測定範囲外の処理 Serial.println("距離 = 測定範囲外"); } else{ Serial.print("距離 "); // シリアルモニタに距離を表示させる Serial.print(Distance); Serial.println(" cm"); } delay(100); } |
実際に動かしてみる
上記スケッチ及びArduinoとの接続で実際に動かしてみます。
シリアルモニタにcm単位で距離を表示させるようにしています。
実際に定規を使って測ってみましたがcm単位では十分な精度が得られているようです。
動画では分かりやすいようにLEDの点灯やブザーを鳴らしています。
この投稿をInstagramで見る
またI2C通信を利用してLCDモニターなどに表示させたり、サーボモーターを使いセンサー部分を回転させればロボットの障害物検知にも使えますね。
スケッチ解説
void setup()内でTrigピンを出力に、Echoピンを入力に事前に設定。
11 12 13 14 15 16 17 18 | void setup(){ Serial.begin(9600); // シリアルモニタの開始 pinMode(echoPin,INPUT); // エコーピンを入力に pinMode(trigPin,OUTPUT); // トリガーピンを出力に } |
メインとなるセンサーモジュール動作部分は以下となります。
計測前に一旦TrigピンをLowに落としておきます。
パルス入力(Trig)は最小2μsとなっています。
あとは仕様通り、Trigピンを10μs(マイクロ秒)だけHighの状態にし、Lowに落とした瞬間に40kHzパルスが8回出力されます。
そのパルスが物体に当たり跳ね返り戻ってきたパルスを受信するためにpulseIn関数を使って信号を計測しています。
23 24 25 26 27 28 29 30 31 32 33 | digitalWrite(trigPin,LOW); // 計測前に一旦トリガーピンをLowに delayMicroseconds(2); digitalWrite(trigPin,HIGH); // トリガーピンを10μsの時間だけHighに delayMicroseconds(10); digitalWrite(trigPin,LOW); Duration = pulseIn(echoPin,HIGH); // エコーピンからの入力 Duration = Duration / 2; // 距離を1/2に Distance = Duration*340*100/1000000; // 音速を掛けて単位をcmに |
pulseIn(pin, value, timeout) 関数
指定したピンに入力されるパルスを検出します。(こちらではHighで使っています)
パルスをHighに指定すると、pulseIn関数はHighに変わった瞬間から計測を開始しLowに戻るまでの時間(パルスの長さ)をμs(マイクロ秒)で返します。
パラメータ
pin: パルスを入力するピン番号
value: 測定するパルスの種類(High or Low)
timeout(省略可): タイムアウトまでの時間(デフォルトは1秒)
「Arduino日本語リファレンスより」
あとは計測した時間を往復なので1/2にして単位をcmに変換して完了です。
30 31 32 33 | Duration = pulseIn(echoPin,HIGH); // エコーピンからの入力 Duration = Duration / 2; // 距離を1/2に Distance = Duration*340*100/1000000; // 音速を掛けて単位をcmに |
【追記】SG90サーボで動かす4足歩行ロボットを公開しました!
SG90サーボモーターで動かす2関節8サーボ制御の4足歩行ロボットのデータを公開しました。
基本動作を入れたサンプルスケッチと超音波センサーHC-SR04を使って障害物をひたすら避けながら動くサンプルスケッチも添付しています。
Arduinoを使った動くものの学習用としてや、さらにハードやプログラムを変更し自分仕様に仕上げるなどして楽しんで頂ければと思います。
【追記】超音波センサーHC-SR04にRGB LEDが内蔵されたRUS-04を試してみる!
距離の計測や障害物の検知などに使われる定番センサーHC-SR04にRGB LEDが内蔵されたRUS-04を試してみました。
超音波センサーでの距離計測の他に内蔵された6つのRGB LEDの点灯パターンを制御する事が出来るモジュールとなり、ロボットなど製作物に組み込むと面白い使い方ができそうですね。
この投稿をInstagramで見る
今回使ったパーツ
HC-SR04
今回使った超音波センサーHC-SR04は海外サイトや日本のAmazonなどでも簡単に入手出来るもとなります。
高精度で距離を計測するセンサーは他にもありますが、今回ご紹介したような障害物の検知やおおよその距離を計測する程度のことには十分使えるセンサーで電子工作ではよく使われているのを目にするパーツになるかと思います。
Arduino用センサーモジュールセット
また個別で購入すると電子工作関連のパーツは比較的割高ですが、Arduinoで使える便利なセンサーモジュールキットなんてものもあります。
こちらのセンサーキットにもHC-SR04は付属していました。
かなり多くのセンサーが同封されているので、これからArduinoでいろいろ試すのに便利かと思います。
Arduino UNO
Arduinoはオープンソースのハードウェアなので正規品以外にも互換品が多数メーカーから販売されています。
互換品でも正規品と比べて特に問題なく使用でき数百円程度で購入が可能なのでArduino学習用としていいですね!
Arduino スターターキット
これからArduino学習を進めていくにあたりArduino UNO(互換品)やブレッドボード、ジャンパーピンなどがセットになったスターターキットが販売されています。
私はGeekcreit製のスターターキットを使っていますが、ELEGOO製のものは国内Amazonなどでも購入可能で人気があるようです。(セット内容はほぼ同じです!)
そしてELEGOOのサイトからスターターキット用サンプルスケッチのダウンロードも可能です。(Geekcreitのキットでも使えます)
参考 チュートリアルダウンロードELEGOO基本的にこれからこのセットで出来るものから紹介していこうと考えていますが、かなり多くのことが出来ます。
電子工作を始めるにはまずブレッドボードやジャンパーピン、メインとなるArduino UNOやサーボ、LEDなどの基本的なパーツがないと実際に動かすことが出来ませんが、個々にパーツを購入して回路を組んでとなるとかなりの手間がかかります。
スターターキットがあればArduinoの初歩的なことはかなりの数こなすことが出来るのでオススメです!
そこからスキルアップに伴い個別でセンサーなど必要なものを増やしていくのがいいと思います。
今回のポイント
- Trigピンを10μsの時間High状態にすると40kHz×8サイクルのパルスが送信される
- パルスが送信されると、EchoピンがHighからLowになる時間を計測する
- 計測された時間(片道の時間)から音速をかけ合わせ物体との距離を計算する
最後に!
超音波センサーHC-SR04は、超音波トランスミッターとレシーバーモジュールが組み込まれているため追加のハードを組むことなくArduinoから直接デジタル信号のやり取りだけで物体までの距離を計測したり障害物検知などで使うことができる便利なセンサーとなります。
Amazonなどでも安価で入手が可能な非常にメジャーなセンサーになります。(私が学生時代にも既にこの形状であったような?)
今回このセンサー単体で動かしてみましたが、LCD画面に距離を表示させたり、ブザーやサーボモーターとセットで使ったりと・・・いろいろと応用がきく扱いやすいセンサーになるかと思います。
この投稿をInstagramで見る
また、今回は動作原理を理解しやすいようにデータシートを参考にArduinoでTrigピンにパルスを与え動かしEchoピンの動作時間を計測して距離を計算してみましたが、ライブラリーを使う方法(New Pingなど)もあります。
Arduinoはポートの数が少ないのでライブラリを使いTrigerピンとEchoピンを一緒に使えばポートを節約することができ複数台のHC-SR04センサーを同時に動かすなんてことも出来ます。
こちらのスパイダーくんは8サーボ接続のためにArduino Nano拡張ボードを使っています。
そしてサーボモーターの接続に占領されデジタルピンの残りは僅かとなっています。
ライブラリを使ってTrigピン&Echoピンを一緒に使い使用するポートを節約することによりHC-SR04を後ろや横にも設置して精度を上げることも出来そうですが・・・そんな精度を求めるロボットでもなく、これくらいが可愛いかななんて思ったり・・・。
この投稿をInstagramで見る
そんな事で今回は超音波センサーHC-SR04を使って距離を計測したり障害物の検知に使ったりするお話でした。
コメントを残す