みなさん,こんにちは
おかしょです.
ロボットにとって障害物がある環境は,与えられたミッションを遂行する上で大きな障害となります.
障害物には建物や岩などが考えられ,これを避けるためにはまずその障害物とロボットの距離を測定する必要があります.
距離を測定するセンサーにはさまざまなものがありますが,この記事では超音波センサーで距離を測定する方法を解説します.
この記事を読むと以下のようなことがわかる・できるようになります.
- 超音波センサーの使い方
- データシートの読み方
- Arduinoのプログラム
この記事を読む前に
この記事では超音波センサーで距離を測定できるプログラムを公開しますが,プログラムで使用しているコマンドについては以下の記事で詳細に解説しています.
Arduinoをいじったことがある方は読まなくても大丈夫だと思いますが,初めてArduinoをいじるという方は以下の記事を先に読んでからこの先の記事を読むことをおすすめします.
データシートを読む
センサーを使うときは,必ずデータシートを読むようにしましょう.
データシートというのは,そのセンサーの特徴や使用方法などがかかれています.センサーによっては,Arduinoのサンプルプログラムがあったりするのでデータシートを読まなくても使用できることもあります.
ちょっとした趣味で電子工作をする方はそれを使うだけでも良いですが,高度なものを作ったり研究などで使用するときはデータシートをしっかり読み込んで理解した方が良いと思います.
今回使用する超音波センサーのHCSR04のデータシートはこちらから見れます.
この記事では私がデータシートを読んで,このセンサーの特徴や使用方法をまとめて記したいと思います.
センサーの特徴
この超音波センサーは40kHzの超音波を発生します
このときに出した超音波が何かしらの障害物にぶつかって跳ね返ってきた超音波を受信します.
このセンサーでは超音波を出すときにタイマーをスタートし,跳ね返ってきた超音波を受信したらタイマーをストップします.こうすることで,超音波を発してから受信するまでの時間がわかります.
センサーからマイコンには測定した時間をデータとして与えてくれます.
なので,マイコンではデータを取得して時間を距離に変換することで障害物との距離を知ることができます.
このセンサーでは最長4m,最短で2cmまで測定が可能です.
センサーの使い方
次にこのセンサーの使い方を見ていきます.
この線sなーのピン配置は以下のようになっています.
- Vcc: 電源供給
- Trig: 超音波の発生制御
- Echo: 超音波の受信
- GND
上記の写真の左から順にこのようなピン配置となっています.
Vccには電源供給として5 Vを供給する必要があります.
Trigピンは超音波の発生を制御することができます.このピンにHIGHを入力すると超音波を発生することができます.
この超音波を発生し続けなければならない時間は10µsとなっています.つまり,このTrigピンにはHIGHを10µs入力し続ける必要があります.
次にEchoピンは超音波を受信して,超音波を発生してから受信するまでの時間を返してくれます.
なので,マイコンではこのピンから出てくるデータを取得することになります.
このデータの取得方法は,EchoピンがHIGHになっている時間を計測することで得られます.
また,一度データを取得して,もう一度データを取得したくなった時はTrigピンを10µsだけHIGHにして同じことをすればOKです.
ただ,TrigピンをHIGHにしてから60msは間隔をあけなければならないので注意してください.
図で表すと以下のようになります.
データを距離に変換する式
Trigピンで超音波を発生したら,Echoピンでデータを取得します.
このデータを距離に変換するには以下の式を用います.
\[
距離= \frac{データ\times 音速}{2} \tag{1}
\]
後程,プログラムを載せますがEchoピンからデータの取得にはpulseInというコマンドを使用します.
このコマンドでは指定したピン(Echoピン)が指定した信号(HIGH)になっている時間をµs単位で返してくれます.
これを(1)式のデータに入れます.
次に音速はセンサーを使用する環境によっても変わってきますが,基本的には340m/sとして問題ありません.
電子回路
超音波センサーをArduino Unoで使用する場合,以下のような電子回路になります.
Arduinoプログラム
このプログラムでは,測定可能周期をタイマーを使って調整しています.タイマーを使わずにloop関数でdelayコマンドで調整をしても良いのですが,タイマーの方が正確に調整ができるのでこのようにしました.タイマーについて詳しく知りたい方はこちらで解説しているので参考にしてください.
超音波センサーを使って障害物までの距離を測定するプログラムは以下になります.
const int TrigPin = 2;
const int EchoPin = 3;
unsigned long echo = 0;
int dist = 0;
void setup()
{
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
Serial.begin(9600); // シリアル通信のレートを設定
TCCR1A = 0; // 初期化
TCCR1B = 0; // 初期化
OCR1A = 6250; // 10Hz
OCR1B = 3125; // 20Hz
TCCR1B |= (1 << CS12) | (1 << WGM12); // 分周比256, CTCモードに設定
TIMSK1 |= (1 << OCIE1A) | (1 << OCIE1B);
digitalWrite(TrigPin, LOW);
}
ISR (TIMER1_COMPA_vect) {
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
echo = pulseIn(EchoPin, HIGH);
dist = echo*0.034/2;
if(dist<400)
{
Serial.println(dist);
}
else
{
Serial.println("error");
}
}
ISR(TIMER1_COMPB_vect) {
}
void loop()
{
}
このセンサーが測定できるのは最大で4mなので,4m以上のデータが出てくるのはおかしいです.
そのようなデータが測定されたときはシリアルモニターに”error”と出力されるようになっています.
実行結果
上記で示したプログラムではシリアルモニターに算出した距離を表示できます.
Twitterに投稿した動画では,性能がわかりやすいようにwebカメラの映像も同時に出力できるようにProcessingでビジュアライズ化しました.
超音波センサーの使い方と性能を確認しました. pic.twitter.com/jZIv2PURao
— おかしょ (@okasho_engineer) October 10, 2020
まとめ
この記事では超音波センサー(HC-SR04)をArduinoで使用する方法を解説しました.
データシートに書かれている内容から距離を測定するプログラムまで公開しました.
上記のプログラムを使用すれば,障害物までの距離をcm単位で取得することができます.
Twitterでは記事の更新情報や活動の進捗などをつぶやいているので気が向いたらフォローしてください.
それでは最後まで読んでいただきありがとうございました.
コメント