福野泰介の一日一創 - create every day

IoT人流センサーでも活躍、超音波で距離を測るセンサー「HC-SR04」は、デジタル入力を使ってアナログ量が測れます。
0か1かしかないデジタルでどうやって、量がわかるのでしょう?
1になるまでの時間を見るのです。

改めて、このセンサーの使うプログラムを見てみましょう。
(測距センサーHC-SR04:IchigoJam、Trig:OUT1、Echo:IN1、GND:GND、Vcc:5V)

10 OUT1,1:OUT1,0:A=0 20 A=A+1:IF IN(1) CONT ELSE ?A 30 WAIT 5:GOTO 10

OUT1としてしまうと、他のOUTポートもまとめてコントロールしてしまうので、OUT1,1:OUT1,0と変更しました。
これがセンサーのTrigとなり、超音波センサーの2つの丸めの1つから超音波のパルス(短い時間の1)が発射されます。
この超音波が返ってくるまでの時間を変数Aを使って、IN1が0になるのを待つ。Aが距離。
以上が使い方の基本です。

OUT1が埋まっている時は、TrigをOUT2から6まで空いているところに挿して、例えば10行をOUT3,1:OUT3,0とかすればOK!
IN1が埋まっている時は、EchoをIN2から4までの空いているところに挿して、例えば20行をIN(2)とかすればOK!

(測距センサーHC-SR04:IchigoJam、Trig:OUT3、Echo:IN2、GND:GND、Vcc:5V)

10 OUT3,1:OUT3,0:A=0 20 A=A+1:IF IN(2) CONT ELSE ?A 30 WAIT 5:GOTO 10

IchigoJamが速いほどに、近いものが認識でき、細かく測れます。高速化した1.4β、お試しください!

いろんなセンサーやモーターを組み合わせて、誰も作ったこと無いものつくっちゃいましょう!


HC-SR04 x IchigoJam S

更に、精度が必要な場合や、ファームウェアの書き換えが面倒な場合、マシン語を使って時間計測を高速化します。

R0=0 R1=[@IN3]L @LOOP R2=[R1]L R0=R0+1 R2-0 IF !0 GOTO @LOOP R0=R0>>9 RET @IN3 DATA L #50000080

IN1のアドレスは #50001000 でした。
IN2はアナログ入力設定になっているので切り替えが必要なため、少しややこしい。
IN3のアドレスは #50000080
IN4のアドレスは #50000100
となります。

これをasm15を使ってアセンブルするか、マシン語表を見ながらハンドアセンブルしてできるマシン語がこちら。

10 POKE#700,0,32,3,73,10,104,64,28,0,42,251,209,64,10,112,71,128,0,0,80 20 OUT1,1:OUT1,0:?USR(#700,0) 30 WAIT 5:GOTO 20

このアドレスの求め方、IchigoJamのCPU、LPC1114の取説によると、PIO0のベースアドレスは #50000000
IN3は、PIO0_5の場所なので ?"#5000";HEX$(1<<(5+2),4) → #50000080
IN4は、PIO0_6の場所なので ?"#5000";HEX$(1<<(6+2),4) → #50000100
(参考、マシン語でLEDを光らせよう! - IchigoJamではじめるArmマシン語その4


Hana道場、越前がにロボコンに向けて開発が進んでます!超音波センサーを違うポートで使いたい?


2つのモーター制御に、たまごを惑星においてくるためのサーボ制御、ライントレース用の2つセンサー、もりもりです!
これにレアメタル判定用に、超音波センサーを追加!


福井の小学生向けご当地ロボコン「越前がにロボコン」いよいよ今週末11/3開催
11/3日 9:00-17:00 ショッピングシティ ベル、あじさいホールにて!(Googleマップ

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / アイコン画像 / プロフィール画像