SHIROのIchigoJam日記

マイコン「IchigoJam」(イチゴジャム)の電子工作とプログラミングをメインに

信号機ボード

先日の先生向け研修で信号機のプログラミングがウケていたので、信号機の拡張ボードを作ってみました。
動かしてみた動画はこちら。

車用信号機(青・黄・赤)と歩行者用信号機(赤・青)、フォトトランジスタ、圧電ブザーを搭載。
あとはプログラム次第です。

基板データ

*この基板ガーバーデータは、CC BYライセンスとします。どうぞご利用ください。

(C) 2018 Shiro Saito (http://d.hatena.ne.jp/shiro0922/)

このファイルをそのままFusion PCBで登録すれば、基板を発注できます。
基板寸法は47×42mmです。

プログラム

セレクタ
  • 起動すると、車用信号機が青→黄→赤と順番に点滅します。それぞれプログラム1〜3を表します。
  • 起動したいプログラムの所でIchigoJamのボタンを押すと、プログラム1〜3を選択して起動します。
10 '*Selecter
20 CLV
30 OUT 0
40 '@LOOP
50 OUT 1<<N
60 CLT
70 '@INBTN
80 IF BTN() BEEP:WAIT 30:LRUN N+1
90 IF TICK()<60 GOTO 70
100 N=N+1:IF N>2 N=0
110 GOTO 40
信号機プログラム
  • 起動すると、車用信号が青、歩行者用信号が赤になります。
  • IchigoJamのボタンを押すと、車用が黄→赤になり、歩行者用が青になります。しばらく経つと歩行者用が赤になり、車用が青に戻ります。
  • 車用が青の時にフォトトランジスタを暗くすると、車用が黄の点滅信号になります。明るくなると黄→赤になり、元に戻ります。
10 '*TRAFFIC LIGHT
20 OUT 0
30 '*LOOP
40 OUT 1,1
45 OUT 4,1
47 IF ANA(2)<300 THEN GOSUB 400:GOTO 60
50 IF BTN()=0 THEN GOTO 47
52 LED 1
55 WAIT 180
60 OUT 1,0
70 OUT 2,1
80 WAIT 120
90 OUT 2,0
100 OUT 3,1
110 WAIT 120
120 OUT 4,0
130 OUT 5,1
135 LED 0
140 WAIT 300
150 FOR I=1 TO 3
160 OUT 5,1
170 WAIT 30
180 OUT 5,0
190 WAIT 30
200 NEXT
210 OUT 4,1
220 WAIT 120
300 OUT 3,0
310 GOTO 30
400 '*NIGHT
410 OUT 1,0
420 OUT 2,1
430 WAIT 30
440 OUT 2,0
450 WAIT 30
460 IF ANA(2)<300 THEN GOTO 420
470 RETURN
信号機プログラム(メロディ付き)
  • 歩行者用信号が青になる時にメロディが流れます。
10 '*TRAFFIC LIGHT MELODY
20 OUT 0
30 '*LOOP
40 OUT 1,1
45 OUT 4,1
47 IF ANA(2)<300 THEN GOSUB 400:GOTO 60
50 IF BTN()=0 THEN GOTO 47
52 LED 1
55 WAIT 180
60 OUT 1,0
70 OUT 2,1
80 WAIT 120
90 OUT 2,0
100 OUT 3,1
110 WAIT 120
120 OUT 4,0
130 OUT 5,1
135 LED 0
137 PLAY "O4L8 E2E4D4E4ED>B2 <F4FFA4FEFEDDE2 FFFF4AFEFEDDE2"
140 WAIT 720
150 FOR I=1 TO 3
160 OUT 5,1
165 PLAY "F4"
170 WAIT 30
180 OUT 5,0
185 PLAY "B4"
190 WAIT 30
200 NEXT
210 OUT 4,1
220 WAIT 120
300 OUT 3,0
310 GOTO 30
400 '*NIGHT
410 OUT 1,0
420 OUT 2,1
430 WAIT 30
440 OUT 2,0
450 WAIT 30
460 IF ANA(2)<300 THEN GOTO 420
470 RETURN
ルーレット
  • プログラムを起動してIchigoJamのボタンを押すと、ルーレットが回り、LED1〜5がランダムに点滅します。
  • ボタンを押すと、ルーレットがゆっくりになって止まります。ボタンを押すとリプレイします。
10 '*Roulette
20 CLV
30 OUT 0
40 '@START
50 IF !BTN() CONT
60 IF BTN() CONT
70 '@LOOP
80 OUT 0
90 BEEP 10,2
100 L=RND(5)+1
110 OUT L,1
120 WAIT 6
130 IF !BTN() GOTO 70
140 FOR I=1 TO 5
150 OUT 0
160 BEEP 10,2
170 L=RND(5)+1
180 OUT L,1
190 WAIT 20
200 NEXT
210 GOTO 40

プログラム(通信対戦)

以前作ったLEDセンサー基板と同様に、2台をケーブルでつないで通信対戦ができます。
基板右下のGND端子同士を結線、TXとRX端子はクロス(互い違い)で結線します。


じゃんけん
  • 2台のIchigoJamの電源を入れて、プログラムを起動します。
  • 車用信号のLEDが順番に光ります。青=グー、黄=チョキ、赤=パーを表します。自分が出したい手の所で、IchigoJamのボタンを押します。
  • 相手が手を入力するのを待って勝負します。結果は歩行者用信号で表示します。赤=勝ち、青=負け、両方とも点くとあいこです。
  • ボタンを押すとリプレイします。
10 '*Janken
20 CLV:CLK:UART 1,1
30 IF BTN() CONT
40 WAIT 30
50 '@INLOOP1
60 J=J+1:IF J>3 J=1
70 OUT 0:OUT J,1
80 CLT
90 '@INLOOP2
100 IF BTN() BEEP:GOTO 120
110 IF TICK()<60 GOTO 90 ELSE GOTO 50
120 '@READY
130 ?"*"
140 K=INKEY()
150 IF K<>42 GOTO 120
160 CLK
170 '@RLOOP
180 ?J
190 K=INKEY()
200 IF K<49 OR K>51 GOTO 170
210 K=K-48
220 CLK
230 ?J
240 WAIT 60
250 '@JUDGE
260 W=5
270 IF J=K W=0
280 IF J=K-1 OR (J=3 AND K=1) W=4
290 IF W>0 OUT W,1 ELSE OUT 4,1:OUT 5,1
300 BEEP 10+(W<>4)*20,30
310 WAIT 30
320 IF !BTN() CONT
330 RUN
スカッシュ
  • 2台のIchigoJamの電源を入れて、プログラムを起動します。
  • どちらからでもIchigoJamのボタンを押して、ボールをサーブできます。
  • レシーブ側では、ボールが車用信号の青→黄→赤、歩行者用信号の赤→青と飛んでくるので、歩行者用の青が点いた時にIchigoJamのボタンを押して打ち返してください。
  • ボタンを押すのが早すぎても遅すぎてもミスになり、IchigoJamのLEDが点いて停止します。ミスした方からサーブして再開してください。
10 '*Squash
20 IF BTN()=1 THEN CONT
30 '@RESTART
40 CLV
50 UART 1,1
60 CLK
70 OUT 0
80 W=30
90 '@START
100 IF BTN()=1 THEN GOTO 140
110 K=INKEY()
120 IF K>0 AND K<63 THEN GOTO 180
130 GOTO 90
140 '@GAMELOOP
150 GOSUB 290
160 CLK
170 K=0
180 '@GAMERE
190 IF K=0 OR K>62 THEN K=INKEY():CONT
200 W=K-32
210 K=0
220 GOSUB 370
230 IF M=0 THEN GOTO 140
240 LED 1
250 BEEP 30,60
260 WAIT 60
270 IF BTN()=0 THEN CONT
280 GOTO 30
290 '@SERVE
300 FOR X=5 TO 1 STEP -1
310 OUT X,1
320 WAIT W
330 OUT X,0
340 NEXT
350 PRINT CHR$(W+32)
360 RETURN
370 '@RECEIVE
380 B=0
390 FOR X=1 TO 4
400 OUT X,1
410 WAIT W
420 OUT X,0
430 NEXT
440 IF BTN()=1 THEN GOTO 500
450 OUT 5,1
460 CLT
470 '@WAITLOOP
480 IF BTN()=1 THEN GOTO 540
490 IF TICK()<W THEN GOTO 470
500 '@MISS
510 OUT 5,0
520 M=1
530 RETURN
540 '@STRIKE
550 BEEP
560 OUT 5,0
570 W=W-2
580 RETURN

プログラミングテキスト

こちらで公開しています。