ロボットカーを走らせよう。 進め! 止まれ! 右! 左!
壁(モノ)にぶつからない工夫は?
思いどおりに走らせるは?
【構成】
1.IchigoDake ×1 (FW ver1.2.3)
2.DAKE★IOx ver1.0 ×1 (Nextday)
3.二回路DCモータドライバ DRV8835 ×1 (秋月電子)
http://akizukidenshi.com/catalog/g/gK-09848/
4.シャープ測距モジュール GP2Y0E02A (アナログ出力)×1 (秋月電子)
http://akizukidenshi.com/catalog/g/gI-07546/
5.FA130互換モータユニットタイヤ付き × 2(左右)
https://www.mabuchi-motor.co.jp/motorize/branch/motor/
6.電源 単4(1.5V) × 2本
7.車体 × 1 ()
センサおよびモーターの動作テストプログラム
1 ‘DAKE ROBOT CAR TEST V0 2019/01/06
10 A=ANA(2)
20 B=A/25-4
30 PRINT A,BIN$(0,B)40 K=INKEY()
50 IF K=#30 OUT 0 :’数字キー0 のとき 停止
51 IF K=#31 OUT 10 :’数字キー1 のとき 前進 OUT4,1 OUT2,1
52 IF K=#32 OUT 20 :’数字キー2 のとき 後退 OUT5,1 OUT3,1
53 IF K=#33 OUT 12 :’数字キー3 のとき 右旋回 OUT4,1 OUT3,1
54 IF K=#34 OUT 18 :’数字キー4 のとき 左旋回 OUT5,1 OUT2,1
55 IF K=#35 OUT 8 :’数字キー5 のとき 右折(L正転) OUT4,1
56 IF K=#36 OUT 2 :’数字キー6 のとき 左折(R正転) OUT2,1
57 IF K=#37 OUT 4 :’数字キー7 のとき 右折(R逆転) OUT3,1
58 IF K=#38 OUT 16 :’数字キー8 のとき 左折(L逆転) OUT5,1
999 GOTO 10
【サンプルプログラム】
運転プログラムはSAVE0に保存します。
走らせるときはタクトスイッチを押しながら電源スイッチを入れて、コースに置きます。
もう一度タクトスイッチを押すと、走り出します。
【ソースコード】
1 ‘DAKE ROBOT CAR by NEXTDAY
10 L=5: OUT 0
20 IF BTN()=0 THEN ? ANA(2): LED TICK()/30%2: CONT
30 @START
40 OUT 10: WAIT 1
50 IF ANA(2)<650 THEN CONT
60 OUT 0: WAIT 60
70 IF ANA(2)<450 GOTO @START
80 IF L=1 THEN OUT20: WAIT 80: OUT 0: WAIT 40
90 IF RND(3) THEN OUT16 ELSE OUT4
100 WAIT 30
110 L=L-1: IF L>0 GOTO @START
200 BEEP 5,100
999 RUN
【プログラム説明】
10行目 障害物検知回数、変数Lの初期化(5回検知したらリカバリ)
20行目 IchigoJam基板のタクトスイッチが押されるまで待つ
そのとき、LEDは0.5秒おきに点滅させる。
30行目 @START :プログラム繰り返し点
40行目 前進。 WAITは距離センサの出力が安定するまでの時間。
50行目 手前10cm以内に障害物がなければ、この行を繰り返す。
60行目 障害物を検知したら、1秒停止。
70行目 再度、手前約20cm以内障害物がなければ@STARTへもどる。
50行目より遠くの距離まで判断すること
これは、人間が手や足でセンサーにかざしたときの対策。
80行目 障害物検知回数が残り1回なら、大きく後退。
これは、袋小路などに入りこんで左右だけでは脱出できないときの対策
90行目 通常の障害物検知の時は、左右のどちらかに曲がる。
RND(2)だと、0,1対象なのでRND(3)にして偏りをつけた。
100行目 単純に0.6秒停止。この命令はなくても、ほかには影響しない。
110行目 障害物検知回数をカウントし、なくなるまで@START
200行目 ここからリカバリー処理。
現在はBEEPして、再度プログラムを実行するだけ。
応用として、ここで360度ゆっくり回転して、
センサで一番空いている方向を探すルーチンを入れてもよい。