SHIROのIchigoJam日記

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

危機一髪ゲーム

おなじみの危機一髪ゲームを、IchigoJamで再現してみました。
動画はこちら。

【IchigoJam】危機一髪ゲーム

f:id:shiro0922:20190922144751j:plain

樽はホームセンターで買ったステンレスたわし。
IchigoJamのGND端子とワイヤでつないでおきます。
中央に穴を空けて、小型ソレノイドを埋め込みます。
f:id:shiro0922:20190922145211j:plain

その上に、好みの人形を乗せます。
下が平らになっている物が乗せやすいです。
f:id:shiro0922:20190922145310j:plain

回路はブレッドボードで組みます。
左側は、8本の剣のどれかを当たりにする8chマルチプレクサ(14051)回路。
右側は、ソレノイドを動かすためのFET回路です。
f:id:shiro0922:20190922145231j:plain

回路図はこちら。
f:id:shiro0922:20190922170337p:plain

プログラム

かんたんバージョン

10 @ARUN:'*KIKI IPPATSU
20 SRND ANA(2)+TICK(-1)
30 OUT RND(8)
40 IF IN(1) CONT
50 LED 1:WAIT 6:LED 0

ランダムに当たりの剣を設定して、その剣が樽に刺さって導通したら、ソレノイドを動かして人形を飛ばします。
小型ソレノイドなので大した威力は無いのですが、それでも人形が飛ぶとちょっとビックリします。
※9/23修正 SRNDを追加して乱数パターンを変更。どのくらい効くかな…?

ちょっと作り込んだバージョン

開始音と終了音が鳴ります。終了後は剣を全部引き抜くとリプレイします。

10 @ARUN:'*KIKI IPPATSU
20 @LOOP
30 SRND ANA(2)+TICK(-1)
40 BEEP:WAIT 6:BEEP
50 OUT RND(8)
60 IF IN(1) CONT
70 BEEP 10,30
80 LED 1:WAIT 6:LED 0
90 @CHK
100 I=0
110 FOR P=0 TO 7
120 OUT P
130 IF !IN(1) I=1
140 NEXT
150 IF I GOTO @CHK
160 GOTO @LOOP

BingoJam

ビンゴゲーム用の拡張基板「BingoJam」を作ってみました。7セグメントLED×2個で、2桁の数字を表示します。
f:id:shiro0922:20190921175001j:plain

f:id:shiro0922:20190921191808p:plain

f:id:shiro0922:20190921191829p:plain

数字の1の位をOUT1~4、10の位をOUT5~8で、それぞれ指定します。

OUT (10の位の数字)*16+(1の位の数字)

デコーダーIC・4511で、7セグメントLEDの表示出力へ変換します。
もちろんプログラム次第で、ビンゴ以外にも使えます。

基板データ

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

(C) 2019 Shiro Saito (https://www.ichigojaman.jp)

プログラム

  • IchigoJamのボタンを押すと、ビンゴが回って1~75の数字が1個ずつ表示されます。ビンゴなので一度出た数字は出ません。
  • ボタンを1秒長押しするとレビューモードになります。ボタンを押すと、これまで出た数字が1個ずつ表示されます。全て表示すると通常モードに戻ります。
10 @ARUN:'*BingoJam
20 CLV:OUT 0:OUT 8,0
30 @SHOOT
40 IF !BTN() GOTO @SHOOT
50 IF !S SRND ANA(2)+TICK()
60 CLT
70 @PUSH
80 IF TICK()>60 GSB @REVIEW:GOTO @SHOOT
90 IF BTN() GOTO @PUSH
100 W=5:FOR I=1 TO 10:GSB @SHN:NEXT
110 W=20:FOR I=1 TO 5:GSB @SHN:NEXT
120 [N]=1:S=S+1
130 IF S<75 GOTO @SHOOT
140 END
150 @SHN
160 N=RND(75)+1
170 IF [N] GOTO @SHN
180 BEEP 10,2
190 OUT N/10*16+N%10
200 WAIT W
210 RTN
220 @REVIEW
230 N=0
240 @REVLOOP
250 P=1:N=N+1
260 IF N>75 BEEP 30,30:WAIT 60:OUT 0:RTN
270 IF ![N] GOTO @REVLOOP
280 BEEP 30,2
290 OUT N/10*16+N%10
300 @REVB
310 IF !BTN() P=0
320 IF BTN() && P=0 GOTO @REVLOOP
330 GOTO @REVB

レビューモードを無くせばもっと簡単なプログラムになります。
基板の電子工作も含めて、子ども向け教室のネタにいかがでしょうか。

シンプル版ビンゴ

レビューモードを無くしてシンプルにしたバージョンです。

10 @ARUN:'*Bingo
20 CLV:OUT 0:OUT 8,0
30 @SHOOT
40 IF !BTN() CONT
50 IF !S SRND ANA(2)+TICK()
60 W=5
70 FOR I=1 TO 10
80 GSB @SHN
90 NEXT
100 W=20
110 FOR I=1 TO 5
120 GSB @SHN
130 NEXT
140 [N]=1:S=S+1
150 IF S<75 GOTO @SHOOT
160 END
170 @SHN
180 N=RND(75)+1
190 IF [N] GOTO @SHN
200 BEEP 10,2
210 OUT N/10*16+N%10
220 WAIT W
230 RTN

Ichigo 60 Clock

円形の文字盤基板に、マイコン内蔵フルカラーLED(PL9823-F5)を60個並べて、時計を作ってみました。
動画はこちら。

【IchigoJam】Ichigo 60 Clock

f:id:shiro0922:20190914215022j:plain

文字盤は専用基板を作りました。
IchigoJamが1個ではLEDを34個までしか制御できないので、文字盤上にLPC1114を2個置いて、LEDを30個ずつ制御しています。
f:id:shiro0922:20190914215959j:plain

時刻制御は外付けの別のIchigoJamです。
f:id:shiro0922:20190914220028j:plain
時計モジュールから現在時刻を読み込んで、どのLEDを光らせるかのコマンドを文字盤のICへ送っています。

実は基板の回路がちょっと間違っていたので、修正した次バージョンの基板を発注しています。基板データの公開は後ほど。※Ver.2の基板データを下↓に公開しました。
将来4K版ファームウェア1.4が出れば、60個のLED全部を制御できそうなので、文字盤のLPC1114は要らなくなるかもしれません。
それよりも、60連のLEDを使った方が楽かな…?
www.switch-science.com

(9/27追記)Ver.2基板

改良したVer.2基板を作りました。回路修正と、基板の中心に穴を空けてCDケースに入るようにしました。さすがにフタは閉まりませんが…
f:id:shiro0922:20190927163944j:plain

f:id:shiro0922:20190927234326j:plain

さっちゃん、CDデビュー!(^_^)
f:id:shiro0922:20190928064326j:plain

基板データ

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

(C) 2019 Shiro Saito (https://www.ichigojaman.jp)

プログラム

外付け親機

どのLEDを光らせるかのコマンドは、文字コード1文字で送っています。
32(特殊コードからずらす)+色(赤=0、緑=1、青=2)×60+LED番号(0~59)
なお文字コード255を送ると、全LEDが消灯します。

10 @ARUN:'*Ichigo 60 Clock
20 CLV:UART 1:CLS
30 WAIT 60
40 ?CHR$(255):WAIT 6
50 GSB @TIMEREAD
60 GSB @HPN:GSB @MPN:GSB @SPN
70 I=H:N=M:T=S
80 @LOOP
90 GSB @TIMEREAD
100 IF T!=S GSB @SPR
110 IF N!=M GSB @MPR
120 IF I!=H GSB @HPR
130 I=H:N=M:T=S
140 GOTO @LOOP
150 @HPR
160 D=32+120+(I%12)*5:?CHR$(D):WAIT 6
170 @HPN
180 D=32+120+(H%12)*5:?CHR$(D):WAIT 6
190 RTN
200 @MPR
210 D=32+60+N:?CHR$(D):WAIT 6
220 @MPN
230 D=32+60+M:?CHR$(D):WAIT 6
240 RTN
250 @SPR
260 D=32+T:?CHR$(D):WAIT 6
270 @SPN
280 D=32+S:?CHR$(D):WAIT 6
290 RTN
300 @TIMEREAD
310 POKE #700,0
320 IF I2CR(#68,#700,1,#701,7) ERR
330 X=PEEK(#703)
340 H=X>>4*10+X&15
350 X=PEEK(#702)
360 M=X>>4*10+X&15
370 X=PEEK(#701)
380 S=X>>4*10+X&15
390 RTN

文字盤子機

受信した点灯/消灯コマンドはXOR処理をしていて、消灯しているLEDへコマンドが来たら点灯、点灯しているLEDへ来たら消灯します。

子機1:LED0~29
10 @ARUN:'*Ichigo 60 Clock-C00
20 CLV:UART 2,1:VIDEO 0:CLS
30 ?"*Ichigo 60 Clock-C00"
40 [99]=80:[100]=50:[101]=150
50 GSB @LEDCLR
60 WAIT 60
70 @LOOP
80 K=INKEY():IF !K CONT
90 ?"#";K
100 IF K=255 GSB @LEDCLR:GOTO @LOOP
110 K=K-32
120 IF K<0 GOTO @LOOP
130 C=K/60
140 L=K%60
150 ?"C=";C;" L=";L
160 IF L>29 GOTO @LOOP
170 GSB @LEDXOR
180 GOTO @LOOP
190 @LEDCLR
200 [0]=0:COPY #801,#800,179
210 WS.LED 30
220 RTN
230 @LEDXOR
240 M=C+L*3
250 D=[99+C]
260 [M]=[M]^D
270 WS.LED 30
280 RTN
子機2:LED30~59
10 @ARUN:'*Ichigo 60 Clock-C30
20 CLV:UART 2,1:VIDEO 0:CLS
30 ?"*Ichigo 60 Clock-C30"
40 [99]=80:[100]=50:[101]=150
50 GSB @LEDCLR
60 WAIT 60
70 @LOOP
80 K=INKEY():IF !K CONT
90 ?"#";K
100 IF K=255 GSB @LEDCLR:GOTO @LOOP
110 K=K-32
120 IF K<0 GOTO @LOOP
130 C=K/60
140 L=K%60
150 ?"C=";C;" L=";L
160 IF L<30 GOTO @LOOP
170 GSB @LEDXOR
180 GOTO @LOOP
190 @LEDCLR
200 [0]=0:COPY #801,#800,179
210 WS.LED 30
220 RTN
230 @LEDXOR
240 M=C+(L-30)*3
250 D=[99+C]
260 [M]=[M]^D
270 WS.LED 30
280 RTN

なお、基板上のLPC1114にUSBシリアルをつないでファーム書き換えやプログラム転送をする時は、もう片方のLPC1114のRESET端子をGNDへ落としてリセットしておいてください。そうしないと、1番のICへ書きこんでいるつもりが、実は2番のICの方だった…ということが起こります。基板上で電源やシリアル信号が両方のICへ並列につながっているので。