自動運転カーをプログラムしよう

5.超音波センサの使い方

超音波センサの基本的な仕組みは、送信管から超音波を出して(トリガ)、その反射を受信管で受ける(エコー)までの時間から、距離を検出します。
JAMCARでは、HC-SR04という部品を使っています。

HC-SR04の仕様

測距範囲2~400cm(15度の範囲、分解能:0.3cm)
電源電圧DC 5.0V
動作電流15mA
動作周波数40kHz
トリガ信号10μS
エコー出力信号反射時間
サイズ45×20×15mm

HS-SR04の使用では、10μsのトリガを出すことになっていますが、IchgoJam BASICではそのような命令がありません。
そこで、正確ではありませんが、OUT命令を続けて実行してトリガの代わりにして、エコーをカウントします。

使用ポート用途備考
IN1超音波センサEcho変数U:IN(1)が真だった回数
OUT6超音波センサTrigerOUT6,1:OUT6.0を実行でトリガ生成

10 U=0:WAIT10:OUT6,1:OUT6,0
20 U=U+1:IF IN(1) && U<5000 CONT

エラー処理を行う場合は次のようにするとよい。

10 U=0:WAIT10:OUT6,1:OUT6,0
20 @ECHO:U=U+1:IF U>5000 GOTO@ERR
30 IF IN(1) GOTO@ECHO

変数Uに、IN(1)が真だった回数が入ります。
これだけでも、およその距離はわかるのですが、結構距離の判定に困ります。そこで、マシン語を使ってもう少し正確に距離を求めます。

たとえば、次のプログラムは、約10cm以内に障害物がある(U<100)のとき、BEEPを鳴らします。
マシン語の中でEcho信号が真だった回数(超音波が返ってきた時間の回数)を数えており、変数Uに代入しています。

10
POKE#700,114,182,0,32,3,73,10,104,64,28,0,42,251,209,64,9,98,182,112,71,0,16,0,80

20 WAIT10:OUT6,1:OUT6,0:U=ABS(USR(#700,0))
30 IF U<100 BEEP
40 GOTO 20


測定した距離が小さければ、Uの値は小さく、距離が大きければ、大きな値になります。