障害物を回避! センサーろぼっとカー 2019

ロボットカーを走らせよう。 進め! 止まれ! 右! 左!
壁(モノ)にぶつからない工夫は?
思いどおりに走らせるは?

【構成】
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度ゆっくり回転して、
    センサで一番空いている方向を探すルーチンを入れてもよい。

6LEDルーレット (二進数シフト版)

HEART★6基板(OUT1~6にLED,IN1~IN4にSWを追加したシールド基板)とIchigoDakeを使った、6灯ルーレットです。

スイッチ1(IN1)を押すとルーレットスタート、スイッチ4(IN4)を押すとルーレットストップ。
ルーレットはストップボタンを押してから徐々に止まるので、どこでとまるかわかりません。
LEDは6個あるので、双六の代わりに使えます。

通常、OUTポートにつないだLEDは、OUT1,1やOUT2,1で光らせますが、このプログラムでは二進数によるシフト演算によって光らせています。

サンプルプログラム

【ソースコード】

1 ‘HEART*6ルーレット ver1.0 by NEXTDAY
10 LET N,2
20 OUT 1<<N
30 IF IN(1)=1 GOTO 30
40 LET W,1

50 OUT 1<<N
60 BEEP 100
70 WAIT W
75 PRINT N,BIN$(1<<N,6),IN(4),IN(3),IN(2),IN(1)
80 LET N,N+1
90 IF N=6 THEN LET N,0
100 IF IN(4)=1 GOTO 50

200 OUT 11,0
210 LET W,W+2
220 IF W<30 GOTO 50

230 OUT 11,-1
300 BEEP 5,60
310 GOTO 30

【プログラム説明】
10行目 変数Nを初期化。最初にLEDを点灯する位置をいれる(0~5)。
20行目 N番目のLEDを点灯する。
30行目 ボタン1が押されるのを待つ。ここがスタートボタン待ち。
40行目 変数Wを初期化。WにはLEDの点灯時間が入る。1が最も早い。

50行目 N番目のLEDを点灯する。
60行目 音を鳴らす。LEDが1つ動くごとに鳴る。
70行目 LED点灯待ち時間。W値の分だけ点灯。
80行目 Nの値を1つプラス。
90行目 もし、Nが6なら Nに0を入れる。
     これでルーレットが一周したことになる。
100行目 ボタン4が押されていなければ、GOTO50へ飛んで次のLEDを点灯。

200行目 IN4をOUTポート(OUT11)に変更して0を出力。
     こうするとIN4の値は常に0となり、
     ボタンを押したままと同じ状態になる。
210行目 WAIT値のWを少し増やす。だんだんゆっくりになる。
220行目 WAIT値Wが30以下なら、GOTO50

230行目 IN4をOUTポートからINポートに戻す。
300行目 ルーレットが停止した合図(BEEP)を鳴らす。

【応用】
・逆回りに光らせたいときは、20行目と50行目をつぎのようにします。
  OUT 1<<(5-N)
   または
  OUT 32>>N

・220行目をつぎのようにかえると、ルーレットの止まり方が毎回変わります。
  IF W<20+R GOTO 50 ELSE LET R,RND(20)

【参考】1行だけのプログラムでLEDをルーレットのように光らせる方法

例1 10 OUT 1<<(TICK()/2%6):IF IN(4)=1 CONT
例2 10 OUT 1<<(TICK()%60):IF IN(4)=1 CONT
例3 10 T=TICK():OUT 1+T/10%6,T/60%2:IF IN(4)=1 CONT ELSE OUT 1<<(TICK()/2%6)
例4 10 OUT TICK()/60%2*255:IF IN(4)=1 CONT ELSE OUT 1<<(TICK()/2%6)
例5 10 OUT 1<<(TICK()/2%6):IF !BTN() CONT ELSE WAIT180:CONT
  (逆回転にするなら、OUT 32>>(TICK()/2%6)に替える)

【機能変更したサンプルプログラム】
・どのボタンでもスタート&ストップ
・右回り回転
・ストップボタンで止まるタイミングも変化
・止まったLEDを点滅

1 ‘HEART*6ルーレット v1.05 by NEXTDAY
10 @START
20 W=2: N=0: R=10

30 @LOOP
40 BEEP 100
50 N=N+1: IF N>5 N=0
55 ? N,W,BIN$(32>>N,6),IN(4),IN(3),IN(2),IN(1)
60 OUT 32>>N: WAIT W
70 GSB @SW(S)
80 IF !S GOTO @LOOP

90 P=0: GSB @PORT(P)
100 W=W+2
110 IF W<20+R GOTO @LOOP

120 R=RND(30)
130 P=-1: GSB @PORT(P)
140 BEEP 5,60
150 GSB @SW(S): IF S CONT
160 FOR S=0 TO 1
170 OUT 6-N,TICK()/30%2
180 GSB @SW(S)
190 NEXT
200 GSB @SW(S): IF S CONT
210 GOTO @START

1000 @SW(S):S=!IN(4)*8+!IN(3)*4+!IN(2)*2+!IN(1):RTN
2000 @PORT(P):OUT8,P:OUT9,P:OUT10,P:OUT11,P:RTN

走れ!ろぼっとカー 黒ラインを見つけろ!!

赤外線トラッキングセンサを使って、黒い道路に沿って走る、ろぼっとカーのキットです。
道路幅はロボットカーよりも少し広い幅になります。
左右どちらかのセンサが、道路からはずれると、外れた方向と反対に向きを変えるように制御します。

コース見本をダウンロードして、いろいろ組み合わせてコースを作ってみましょう。
 途中でコースがなくなったり、分岐したコースも走れるようサンプルのプログラムを改造してみましょう。

【構成】
1.IchigoJam-S基板×1
2.五稜星基板 (STAR★MTDRVv0.3に対応) ×1 (NextDay)
3.赤外線トラッキングセンサ(3ch) [T5000-3CH-M2]×1 
4.3Vモーター+ギアボックス+タイヤ ×2
5.単4(1.5V) × 2本
6.車体(3Dプリンタによるオリジナル)×1

【サンプルプログラム】

  1. プログラムを修正するときは、電池BOXの電源をOFFにし、ビデオ、キーボード、USB電源の順にケーブルを接続します。
  2. IchigoJam基板の電源(SW1)はONのままにしておきます。
  3. プログラムはSAVE0に保存します。 USB電源 、キーボード、ビデオの順にケーブルを外します。
  4. 走らせるときは、 コースに車を置いてから、タクトスイッチを押しながら電源BOXの電源スイッチをONにします。

【ソースコード】

1 ‘LINE TRACE ROBOT GoryoSEI by NEXTDAY
10 OUT 0 :BEEP 10,60 :BEEP : WAIT 120
20 L=IN(4) :C=IN(2) :R=IN(1)
25 PRINT L,R
30 OUT 4,1 :OUT 2,1
50 IF R=0 THEN OUT 4,0 :WAIT 5
60 IF L=0 THEN OUT 2,0 :WAIT 5
100 GOTO 20

【プログラム説明】
10行目 音を鳴らして、2秒待つ(スタート時の準備)
20行目 左(L)と右(R)のセンサー値を調べる(このプログラムでは中心(C)のセンサ値は使いません)
25行目 センサー値を表示する
    道路だと1(黒)、外れていると0(黒以外)、の値になります
30行目 左モータ、右モータとも回す(前進)
50行目 もし、右(R)センサーが0(道路から外れた)ならば 左モータを5/60秒止める(左へ曲がる)
60行目 もし、左(L)センサーが0(道路から外れた)ならば 右モータを5/60秒止める(右へ曲がる)
100行目 20行目に戻る

五稜星 2chモータードライバー基板

北海道150年を記念して、開拓使のシンボル 五稜星 を模した
モータードライブキット。
IchigoJam T や dake★IO に取り付けて、2個のモーターを動かすことができます。
左右にそれぞれ1個のFETを備え、一方向のみに回転ができます。
左右のLED(青・緑)で入力信号も確認することができます。

4つの入力端子(IN1、IN2、IN4、BTN)でデジタルとアナログに対応しています。
赤外線センサーを接続してライントレーサーや光センサーを接続してモーター制御などができます

未来に向かって「前進!前進!!」

五稜星モータードライブ基板製作マニュアル
五稜星_v03make–201808013 (PDF 6.18MB)

信号機プログラムをつくろう2(右折信号付き)

車用(緑・黄・赤 + 右折)と歩行者用(青・赤)の新バージョンの信号機キットです。
また、「信号機プログラムをつくろう1」のプログラムをもとに、OUT命令を二進数表記にしました。

参照:信号機wiki

【サンプルプログラム】
プログラムを入力したら、RUNしてください。
IchigoJam本体のタクトスイッチを押すと、信号機が歩行者用に切り替わります。

【ソースコード】

10 ‘NEW TRAFFIC LIGHT by NEXTDAY (Binary version)
20 OUT ‘010001 :WAIT 180 :’クルマ ミドリ,ホコウシャ アカ
30 IF BTN()=0 CONT :’オシボタンヲ マツ
40 OUT ‘010010 :WAIT 120 :’クルマ キイロ
45 OUT ‘011100 :WAIT 120 :’クルマ アカ,ウセツ
50 OUT ‘010100 :WAIT 60 :’クルマ アカ
60 OUT ‘100100 :WAIT 180 :’ホコウシャ アオ
70 FOR I=1 TO 7
80 OUT ‘000100 :WAIT 15 :’ホコウシャ アオ テンメツ
90 OUT ‘100100 :WAIT 20
100 NEXT
110 OUT ‘010100 :WAIT 60 :’クルマ アカ,ホコウシャ アカ
120 GOTO 20

【プログラム説明】
20行目 車用:緑、歩行者用:赤。3秒間(180TICK)点灯する(OUT1,1:OUT5,1)
30行目 押しボタンを(押されるまで)待つ。
40行目 車用:黄 を2秒点ける(OUT2,1)
45行目 車用:赤、車(矢印)用:青 を2秒点ける(OUT3,1:4,1)
50行目 車用:赤、を1秒点ける(OUT3,1)
60行目 歩行者用:青 を3秒点ける(OUT6,1)
70~100行目 歩行者に間もなく赤に変わることを知らせるため、歩行者用:青を7回点滅
110行目 車用:赤、歩行者用:赤。1秒点ける
120行目 20行目に戻る

【参考】
同じ動作をOUT命令で書いたプログラムを掲載します。
二進表記とどこが違うのか比べてみてください。

10 ‘NEW TRAFFIC LIGHT by NEXTDAY (OUT command version)
20 OUT 0: OUT 1,1: OUT5,1: WAIT 180
30 IF BTN()=0 CONT
40 OUT 1,0: OUT 2,1: WAIT 120
45 OUT 2,0: OUT 3,1: OUT 4,1 :WAIT 120
50 OUT 4,0: WAIT 60
60 OUT 5,0: OUT 6,1: WAIT 180
70 FOR I=1 TO 7
80 OUT 6,0: WAIT 15
90 OUT 6,1: WAIT 20
100 NEXT
110 OUT 6,0: OUT 5,1: WAIT 60
120 GOTO 20

信号機プログラムをつくろう1

車用(緑・黄・赤)と歩行者用(青・赤)が一体になったオリジナル信号機キット。
IchigoJamにそのまま取り付けて、OUT命令による信号機プログラムの学習ができます。

はじめは、車用の3色だけを使って順に点燈させる基本からスタート。
応用として、歩行者青信号の点滅方法や、IchigoJam本体のボタンやスピーカを使って、歩行者が安全に渡れるようにための制御方法が学べます。

サンプルプログラム

【ソースコード】 

10 ‘NEXT-DAY信号機(OUT命令)
 20 OUT 1,1: OUT5,1: WAIT 180 :’クルマ ミドリ,ホコウシャ アカ
 30 LED 1: IF BTN()=0 GOTO 30 ELSE LED 0: WAIT 60 :’オシボタンヲ マツ
 40 OUT 1,0: OUT 2,1: WAIT 120 :’クルマ キイロ
 50 OUT 2,0: OUT 3,1: WAIT 60 :’クルマ アカ
 60 OUT 5,0: OUT 6,1: WAIT 180 :’ホコウシャ アオ
 70 FOR I=1 TO 7
 80 OUT 6,0: WAIT 15 :’ホコウシャ アオ テンメツ
 90 OUT 6,1: WAIT 20
100 NEXT
110 OUT 6,0: OUT 5,1: WAIT 60 :’ホコウシャ アカ
120 GOTO 20

【プログラム説明】
20行目.最初は車が緑、歩行者が赤。3秒点灯する。
30行目.押しボタンを待つ(押されるまで)。
40行目.車用:黄が2秒点く
50行目.車用:赤が1秒点く
60行目.歩行者用:青が3秒点く
70〜100行目.歩行者用:青を点滅
110行目.歩行者用:赤が1秒点く
120行目.プログラムを最初から繰り返す

キー入力を覚えよう

プログラムを作るためには、プログラムからキーを打ち込まなければなりません。
キーボードの記号・特殊キーの文字の形や読み方をおぼえましょう。
IchigoJamで使う記号の読み方をまとめました。

IchigoJamで使用する記号や文字については、チートシートも参照してください。
http://www.openspc2.org/reibun/IchigoJam/etc/cheat-sheet/0002/cheatsheet_v1.2.pdf

キー配列についてはJISキーボード用を使うことを想定しています。
https://ja.wikipedia.org/wiki/Template:106キーボードの配列

IchigoJamではローマ字入力が採用されています。
ローマ字の英→カナ変換はイチゴジャムレシピを参照してください。


記号読み方/キー入力方法
 ’アポストロフィ、 シングルクォート
  REM文の省略形
  Shiftキーを押しながら 7 キーを押す
  例: ‘DAKE ROBOT CAR by NEXT-DAY
 ”ダブルクォーテーション
  文字列の指定
  例: PRINT “モジヲカコム”
 :コロン
  命令と命令を分ける記号
  例: OUT20 : WAIT 80 : OUT 0 : WAIT 40
 ;セミコロン
  PRINT命令のとき、改行させないときにしようする 
  例: ?”カイギョウ” ;A; “シナイ”;
 ,カンマ
  区切り文字 
  例: OUT 1,0  ?”1+1=” , 2  LET [0],1,2,3,4,5,6,7,8,9
 .ピリオド、ドット
  小数点だがIchigoJamでは使わない
 @アット、アットマーク
  ラベルとして使用
  例: GOTO @MAIN
 #シャープ
  16進数の表現
  例: ? #FF A=#7E
 バッククォート
  2進数の表現
  Siftキーを押しながら @ キーを押す
 $ドル、ダラー
  文字列関数の時に使用
  例: ? STR$(#0900)  
 !びっくり、ノット
  NOT式の省略形 
  例:IF !BTN() CONT
    IF A != 0 THEN ?"ノット イコール"
 |たてぼう、オア
  論理和(OR)
  Siftキーを押しながら \ キーを押す
  例: IF K=28 | K=29 THEN LED1
 &アンパーサンド、アンド
  論理積(AND)
  例:  A=X-(K=28 & X>0)+(K=29 & X<31)
 ^ハット
  排他的論理和 XOR
  例: B=A ^#FF
 ~チルダ
  ビット反転
  Siftキーを押しながら ひらがなの へ キーを押す
  例1: A=10111011: ? BIN$(~A)
  例2: B=B+~A
 ( )かっこ、かっことじ
  関数命令や計算のときの優先に使用する
  例: ? ASC(“a”)
     A=X-(K=28)+(K=29)

 [ ]
だいかっこ、だいかっことじ
  配列を指定するときに使用する
  例: [1]=A  
     LET [0],”モジレツヲハイレツニ”

ちいさなコンピュータをつくろう


 IchigoJamプリント基板キットには、簡単な組み立て方説明書やBASICリファレンスなどが含まれています。
しかし、国野 亘 さんが写真を加えてより詳しく説明した「IchigoJam |の組み立て方」を公開していますので、こちらを参考に組み立てるのがよいでしょう。
CC BY ライセンス扱いとなっていますので、Nextdayの講座でも使用しています。

IchigoJam S の組み立て方 | ボクにもわかる

工具や抵抗のカラーコードは、初代 IchigoJam の組み立て方
が参考になります。
 また、組み立て方・説明書・読み物(IchigoJam公式サイト)や
IchigoJam の組み立て(イチゴジャムレシピ)も参考になります。
はんだ付けは、以下のムービーも参考にしてください