11月25日発売 書籍『Arduinoと3Dプリンタでロボットを作ろう』を出させて頂きました!

【Arduino入門編⑪】超音波センサーを使って距離の測定や障害物の検知をやってみる![HC-SR04]

昨年夏あたりから電子工作というものを始めArduinoを使うようになり自分への備忘録として学んだことをまとめたこのシリーズの記事なんですが、やりたい事が多すぎて少し更新が遅れておりました。

Arduino歴3ヶ月ほどの初心者が書く記事ではありますが、ブログのArduino関連の記事へのアクセスが非常に多いことに驚いております。
もう下書きとしては30記事ほど新たに書いているのですが・・・学んだことをこれからはじめる方にもできるだけ分かりやすいように書き残しておきたいと思います。(楽しいことが多すぎて少し更新頻度は遅いのですが!)

そんな事で今回はセンサーを使ってみたいと思います。
Arduinoで使えるセンサーには温度や湿度、光やジャイロセンサーなど様々なものがありますが、今回はHC-SR04という超音波を使ったセンサーモジュールを使ってみたいと思います。

人間の聞き分けられる可聴域より高い超音波をスピーカーから出力し、物体に当たって反射されて戻ってきた音を検出してその時間から距離を計測するというものです。

高性能とまではいきませんが、cm単位くらいではほぼ正確に測定でき、また障害物の検知では現在製作途中のスパイダーくんに組み込んでみましたが問題なく使うことができました。
プログラム的にもう少し当たり判定等を工夫する必要がありそうですが、ちゃんと障害物の検知は出来ていますね!

Arduinoでは難しいハードウェアを組むことなくモジュールを組み合わせる事により比較的簡単にセンサーなどを扱うことが出来るため電子工作が楽しくなりますね!

段階を追いながらこのシリーズを書いていますが、今回使ったHC-SR04というメジャーな超音波センサーはこれまでご紹介してきたデジタル入出力の知識があれば、あとはその仕様さえ理解できていれば比較的簡単に扱うことが出来るかと思います。

Arduinoのデジタル入出力に関してはこちらの記事も参考にしながら読んで頂けると理解しやすいかと思います。

【Arduino入門編①】ArduinoでLEDを点滅(Lチカ)させてみる!Arduinoの基本となるデジタル出力の解説その①
【Arduino入門編②】複数のLEDを点滅(Lチカ)させてみる!デジタル出力の解説その②

それでは超音波センサーHC-SR04を使って障害物の検知や距離の測定をやってみたいと思います。

Arduino用 HC-SR04超音波距離センサー
ELEGOO

【Arduino入門編⑪】超音波センサーを使って障害物の検知や距離の測定をやってみる![HC-SR04]

今回の目標

これまでArduinoを使い(こちらではArduino Unoで解説していきます)デジタル入出力ピン(D0~D13)・アナログ入力ピン(A0~A5)を使いLEDの点灯やサーボモータの制御などやってきました。
これらArduinoの基本となるGPIOピンの使い方が分かってきたところで今回はセンサーを使ってみたいと思います。

センサーと言ってもいろいろとありますが、今回はデジタル入出力ピンを使って出来る超音波センサーを使って障害物の検知や距離の測定をしていこうと思います。

人間の耳には聞こえない高周波の音を出し、物体に当たって反射してくる時間を計測しそこから距離を計算するというものとなります。
非接触で物体までの距離を測定する事ができます。
ロボットに組み込み障害物検知などで使えますね!

超音波センサーとは?(HC-SR04)

今回HC-SR04という電子工作ではよく見かけるメジャーな超音波センサーを使ってみたいと思います。
主要な回路は既に組み込まれているモジュールとなり比較的簡単に扱うことが出来るようになっています。

2つの大きなスピーカーが付いていて一方から音を出し(超音波なので人間の耳には聞こえません)、もう一方のスピーカーで物体に当たって反射して戻ってきた音を受信しその時間を計測できるセンサーとなります。

具体的な距離の計算方法を簡単に説明すると、一方のスピーカーから超音波を出力してその音波が障害物に当たって反射し、その反射した音波をもう一方のスピーカーで受信しその時間を計測します。

そして超音波は「音」なので、センサーから対象物の距離は

対象物との距離=[音速]✕[戻ってくる時間]÷2

となります。(往復なので2で割っています)
ここで空気中の音速は340m/sという定数なので、センサーで戻ってくる時間を計測できれば距離を計算することが出来るという仕組みとなります。

理屈が分かったところで、実際にHC-SR04を使ってみたいと思います。

MEMO
こちらでは音速を340m/sという定数として扱っています。
実際の音速は温度等にも左右されるので、温度センサーなど組み込んで補正するとより正確な値が出せるかと思います。
また、布製品のような音波を吸収しやすい素材?には誤検知が発生することがあるようです。

超音波センサー HC-SR04の接続方法

今回使う超音波センサーHC-SR04にはモジュールとして組み込むための回路が全てセンサーモジュール内に組み込まれているので、Arduinoと直接接続することが出来ます。

HC-SR04の接続端子は4ピンとなっています。
順番に見ていきます。

  1. Vcc:電源電圧(5V)
  2. Trig(トリガー端子):超音波の出力用の信号を送信
  3. Echo(エコー端子):超音波の入力信号を受信
  4. 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(エコー)のタイミング図は上記となります。

  1. 計測を開始するためにまずHC-SR04のTrigピンを10μsの間High状態(5V)にしLowに落とします。
  2. TrigピンがLowになった瞬間にセンサーモジュールから40kHz 8サイクルで超音波が出力されます。
  3. そして物体に当たって戻ってくる音波を待ち、Echoピンで戻ってきた超音波を受信しその時間を計測する

これが基本的な流れになります。
EchoピンがHighになってからLowに変化するまでの時間(超音波が送信されてから受信するまでの時間(μs)が計測出来たら、あとは速度(音速)に掛けると距離を求めることが出来ます。(実際には往復なので2で割っています)

[物体との距離]=[速度(音速)]✕[時間]÷2
※音速=340m/s=0.034cm/μs

使用スケッチ

今回このようなスケッチを作ってみました。
HC-SR04のTrigにパルスを送り音波を出力させ、Echoピンから戻ってきた音波を受信しその時間を計測するシンプルなものとなります。
実際に計測した距離を視覚化するためにシリアルモニタに表示させています。
シリアルモニタに関してはこちらの記事も参考にしてみて下さい。

【Arduion入門編⑨】シリアルモニタの基本的な使い方!シリアルモニタからArduinoに繋げたサーボモーターやLEDを制御してみる!

実際に動かしてみる

上記スケッチ及びArduinoとの接続で実際に動かしてみます。
シリアルモニタにcm単位で距離を表示させるようにしています。
実際に定規を使って測ってみましたがcm単位では十分な精度が得られているようです。

動画では分かりやすいようにLEDの点灯やブザーを鳴らしています。

またI2C通信を利用してLCDモニターなどに表示させたり、サーボモーターを使いセンサー部分を回転させればロボットの障害物検知にも使えますね。

スケッチ解説

void setup()内でTrigピンを出力に、Echoピンを入力に事前に設定。

メインとなるセンサーモジュール動作部分は以下となります。
計測前に一旦TrigピンをLowに落としておきます。
パルス入力(Trig)は最小2μsとなっています。

あとは仕様通り、Trigピンを10μs(マイクロ秒)だけHighの状態にし、Lowに落とした瞬間に40kHzパルスが8回出力されます。
そのパルスが物体に当たり跳ね返り戻ってきたパルスを受信するためにpulseIn関数を使って信号を計測しています。

pulseIn(pin, value, timeout) 関数
指定したピンに入力されるパルスを検出します。(こちらではHighで使っています)
パルスをHighに指定すると、pulseIn関数はHighに変わった瞬間から計測を開始しLowに戻るまでの時間(パルスの長さ)をμs(マイクロ秒)で返します。

 

パラメータ
pin: パルスを入力するピン番号
value: 測定するパルスの種類(High or Low)
timeout(省略可): タイムアウトまでの時間(デフォルトは1秒)

Arduino日本語リファレンスより」

あとは計測した時間を往復なので1/2にして単位をcmに変換して完了です。

【追記】SG90サーボで動かす4足歩行ロボットを公開しました!

SG90サーボモーターで動かす2関節8サーボ制御の4足歩行ロボットのデータを公開しました。

基本動作を入れたサンプルスケッチと超音波センサーHC-SR04を使って障害物をひたすら避けながら動くサンプルスケッチも添付しています。

Arduinoを使った動くものの学習用としてや、さらにハードやプログラムを変更し自分仕様に仕上げるなどして楽しんで頂ければと思います。

Arduinoで動かす4足歩行ロボット製作ノート!Arduino学習に便利なロボくんなので使って下さい!【STLデータ公開】

【追記】超音波センサーHC-SR04にRGB LEDが内蔵されたRUS-04を試してみる!

距離の計測や障害物の検知などに使われる定番センサーHC-SR04にRGB LEDが内蔵されたRUS-04を試してみました。

超音波センサーでの距離計測の他に内蔵された6つのRGB LEDの点灯パターンを制御する事が出来るモジュールとなり、ロボットなど製作物に組み込むと面白い使い方ができそうですね。

【電子工作】超音波センサーHC-SR04にRGB LEDが搭載されたRUS-04を試してみる!

今回使ったパーツ

HC-SR04

今回使った超音波センサーHC-SR04は海外サイトや日本のAmazonなどでも簡単に入手出来るもとなります。

高精度で距離を計測するセンサーは他にもありますが、今回ご紹介したような障害物の検知やおおよその距離を計測する程度のことには十分使えるセンサーで電子工作ではよく使われているのを目にするパーツになるかと思います。

Arduino用 HC-SR04超音波距離センサー
ELEGOO

Arduino用センサーモジュールセット

また個別で購入すると電子工作関連のパーツは比較的割高ですが、Arduinoで使える便利なセンサーモジュールキットなんてものもあります。

こちらのセンサーキットにもHC-SR04は付属していました。
かなり多くのセンサーが同封されているので、これからArduinoでいろいろ試すのに便利かと思います。

37センサーモジュール スターター キット Arduinoに対応
HiLetgo

Arduino UNO

Arduinoはオープンソースのハードウェアなので正規品以外にも互換品が多数メーカーから販売されています。
互換品でも正規品と比べて特に問題なく使用でき数百円程度で購入が可能なのでArduino学習用としていいですね!

Arduino スターターキット

これからArduino学習を進めていくにあたりArduino UNO(互換品)やブレッドボード、ジャンパーピンなどがセットになったスターターキットが販売されています。

私はGeekcreit製のスターターキットを使っていますが、ELEGOO製のものは国内Amazonなどでも購入可能で人気があるようです。(セット内容はほぼ同じです!)

そしてELEGOOのサイトからスターターキット用サンプルスケッチのダウンロードも可能です。(Geekcreitのキットでも使えます)

参考 チュートリアルダウンロードELEGOO

基本的にこれからこのセットで出来るものから紹介していこうと考えていますが、かなり多くのことが出来ます。
電子工作を始めるにはまずブレッドボードやジャンパーピン、メインとなるArduino UNOやサーボ、LEDなどの基本的なパーツがないと実際に動かすことが出来ませんが、個々にパーツを購入して回路を組んでとなるとかなりの手間がかかります。

スターターキットがあればArduinoの初歩的なことはかなりの数こなすことが出来るのでオススメです!
そこからスキルアップに伴い個別でセンサーなど必要なものを増やしていくのがいいと思います。

今回のポイント

超音波センサーHC-SR04 ポイント!
  • Trigピンを10μsの時間High状態にすると40kHz×8サイクルのパルスが送信される
  • パルスが送信されると、EchoピンがHighからLowになる時間を計測する
  • 計測された時間(片道の時間)から音速をかけ合わせ物体との距離を計算する

最後に!

超音波センサーHC-SR04は、超音波トランスミッターとレシーバーモジュールが組み込まれているため追加のハードを組むことなくArduinoから直接デジタル信号のやり取りだけで物体までの距離を計測したり障害物検知などで使うことができる便利なセンサーとなります。

Amazonなどでも安価で入手が可能な非常にメジャーなセンサーになります。(私が学生時代にも既にこの形状であったような?)

今回このセンサー単体で動かしてみましたが、LCD画面に距離を表示させたり、ブザーやサーボモーターとセットで使ったりと・・・いろいろと応用がきく扱いやすいセンサーになるかと思います。

また、今回は動作原理を理解しやすいようにデータシートを参考にArduinoでTrigピンにパルスを与え動かしEchoピンの動作時間を計測して距離を計算してみましたが、ライブラリーを使う方法(New Pingなど)もあります。

Arduinoはポートの数が少ないのでライブラリを使いTrigerピンとEchoピンを一緒に使えばポートを節約することができ複数台のHC-SR04センサーを同時に動かすなんてことも出来ます。

こちらのスパイダーくんは8サーボ接続のためにArduino Nano拡張ボードを使っています。
そしてサーボモーターの接続に占領されデジタルピンの残りは僅かとなっています。

ライブラリを使ってTrigピン&Echoピンを一緒に使い使用するポートを節約することによりHC-SR04を後ろや横にも設置して精度を上げることも出来そうですが・・・そんな精度を求めるロボットでもなく、これくらいが可愛いかななんて思ったり・・・。

そんな事で今回は超音波センサーHC-SR04を使って距離を計測したり障害物の検知に使ったりするお話でした。

その他 Arduino入門編 関連の記事
【Arduino入門編㉛】INA219モジュールで電圧・電流を計測する基本的な方法! 【Arduino入門編㉚】マイコンのデジタル端子(I/O)不足を解消!『I/Oエキスパンダー(MCP23017)』の基本的な使い方! 【Arduino入門編㉙】SPI通信の基礎知識!SPIで使われる信号線や接続方法などについて! 【Arduino入門編㉘】ソフトウェアシリアルを使ってみる! 【Arduino入門編㉗】赤外線(IR)モジュールを使いリモコンの信号を読み取り送受信する方法! 【Arduino入門編㉖】UARTシリアル通信の基礎知識!Arduino間でのデータのやり取りなどをやってみる! 【Arduino入門編㉕】ステッピングモーターを動かしその基礎を理解する!(28BYJ-48 & ULN2003) 【Arduino入門編㉔】Arduinoで7セグメントLEDを制御してみよう!(スタティック制御 / ダイナミック制御) 【Arduino入門編㉓】PCA9685 16チャンネルPWMサーボモータードライバを使って複数のサーボモーターを同時に制御してみる!(最大16台) 【Arduino入門編㉒】ArduinoでDCモーターを制御する。【L298Nデュアルモータードライバ】 【Arduino入門編㉑】温湿度センサー(DHT11)を使い温度と湿度を計測する! 【Arduino入門編⑳】Arduino Uno R3ボードのピン配列&基本機能まとめ! 【Arduino入門編⑲】RTC(リアルタイムクロック)モジュールDS3231を使いシンプルな時計を作る![I2C通信] 【Arduino入門編⑱】I2C通信の基礎!LCDディスプレイに文字を表示させてみる![後編] 【Arduino入門編⑰】LCDディスプレイに文字を表示させてみる![前編][1602 LCDモジュール] 【Arduino入門編⑯】サーボモーターをジョイスティックやシリアルモニタから動かしてみる! 【Arduino入門編⑮】Arduino Unoへの電力供給(外部電源)および電源出力端子の使い方!【追記】 【Arduino入門編⑭】センサーシールド(Sensor Shield)を使ってみる! 【Arduino入門編⑬】テスト環境に便利!Arduino拡張ボード(シールド)プロトタイプシールドを使ってみる! 【Arduino入門編⑫】光センサー(Cdsセル)をアナログ入力ポートで読み取り制御に使ってみる!

コメントを残す