SHIROのIchigoJam日記

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

ソーラーLEDライト

IchigoJamを使っていませんが、電子工作を1つご紹介。
4月にPCNの皆さんがネパールへ支援活動に行ったのですが、その際にソーラーLEDライト基板を作りました。

f:id:shiro0922:20190513131846j:plain

明るい昼間はソーラーパネルでバッテリへ充電。夜になるとLEDが点灯します。
電気が無い村でも照明に使えます(^_^)

f:id:shiro0922:20190523100324p:plain

f:id:shiro0922:20190523094626p:plain

ジュースの紙パックを切り抜いて、組み込んでみました。なかなかいい感じです(^_^)
ソーラーパネルを外向きにして、窓際に置くといいと思います。


基板データ

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

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

地底探検

こちらも「かわくだり魔改造グランプリ」応募作品。画面が上下スクロールする「地底探検ゲーム」です。
f:id:shiro0922:20190520084358p:plain

遊び方

  • 自分のキャラを上下左右のカーソルキーで動かして地下へ潜り、5つのコイン「$」を集めてください。
  • 敵(エイリアン)に捕まった場合や、制限時間の60秒が過ぎても地上へ戻れなかった場合は、ゲームオーバーです。

ここまで来るとかわくだりゲームとは全くの別物ですが、「IchigoJamでこんなことができるんだ」と参考になれば幸いです。

プログラム

1 '*Titei Tanken
2 CLV:VIDEO1:CLS:VIDEO3:X=0:Y=5:L=60
3 FORB=#A20TO#A2F:POKEB,1:NEXT
4 R=#A11+RND(15):POKER,36
5 FORE=1TO4:A=#A20+E*#60
6 FORB=0TO15:POKEA+B,1:NEXT
7 R=A+4+RND(9):FORB=1TO6:POKER-B*16,72:NEXT
8 R=A-14+RND(13):IFPEEK(R)CONTELSEPOKER,36
9 [E]=E%2*15:POKEA-16+[E],237
10 NEXT
11 GSB27:LC0,0:?S:LCX,Y:?CHR$(250):CLT
12 FORE=1TO4
13 D=BTN(31)*(SCR(X,Y+1)=72)-BTN(30)*(H=72)
14 U=X-BTN(28)*(X>0)+BTN(29)*(X<15):I=SCR(U,Y+1):IFD||((I!=1)&&(I!=72))U=X
15 X=U:IFDO=O+D
16 GSB27:IFH=36GSB29
17 IFH=237M=1:E=4:GOTO22
18 A=#A10+E*96:B=A+[E]:POKEB,[E+5]
19 [E]=[E]+1-(E%2)*2:[E]=[E]&15
20 B=A+[E]:[E+5]=PEEK(B):POKEB,237:GSB27
21 IF[E]=X&&O+Y=5+E*6M=1:E=4
22 WAIT2:NEXT:IFT<=0||MG=3
23 IFP=5&&O=0G=1
24 IF!GGOTO12
25 LC3,4:?"GAME ";:IFG=1?"CLEAR"ELSE?"OVER":LCX,Y:?"X"
26 BEEPG*10,30:WAIT30:CLK:END
27 W=#9C0+O*16:COPY#900,W,192:H=SCR(X,Y):LCX,Y:?CHR$(250)
28 LC0,0:?"$";P:T=L-TICK()/60:LC14,0:?DEC$(T,2):RTN
29 P=P+1:BEEP:POKE#A10+O*16+X,0:RTN

Web版はこちら。
Web版は画面表示が遅いので、WAITを減らしています。

プログラムでは、画面をVIDEO 3モード(16文字×12行)に設定。使われていないVRAMを仮想画面にして、背景・敵・コインなどをそちらに描画。自キャラの動きに合わせて実画面へCOPYで転送しています。
他のゲームでも使えるテクニックだと思います。
f:id:shiro0922:20190520084610p:plain

IchigoJam時計

秋月電子のシフトレジスタ(74HC595)付き7セグメントLEDモジュールを使って、IchigoJam時計を作ってみました。


【IchigoJam】IchigoJam時計

7セグメント4個に配線するのは大変なので、オリジナルシールド基板を作りました。

f:id:shiro0922:20190514100544p:plain

IchigoJamからは3本の出力でシリアル制御します。

  • OUT1:Serial(シリアル信号、1=LEDオン、0=LEDオフ)
  • OUT2:Clock(信号を1段階転送)
  • OUT3:Latch(ラッチ。7セグメントLEDへ出力して、その状態を保持)
  • OUT6:中央のコロン「:」

各モジュールのSDO→SDIをつなぐことで、1桁目→2桁目→3桁目→4桁目へバケツリレー式に信号が送られるので、IchigoJamからは1桁目のSDIへひたすら信号を送ればOKです。
最後にラッチ信号を送れば、シフトレジスタのラッチ回路で保持されて出力されるので、IchigoJam側はダイナミック動作などをやらなくて済みます。


基板データ

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

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

材料

プログラム

簡単プログラム

30行で初期時刻(時、分)を変数にセットして、TICK()で時間をカウント。
これでも10分で1秒くらいのずれなので、プログラミング教室で簡単に作るには充分です。

10 '*CLOCK
20 CLV:VIDEO 0
30 H=12:M=34
40 [0]=`0111111
50 [1]=`0000110
60 [2]=`1011011
70 [3]=`1001111
80 [4]=`1100110
90 [5]=`1101101
100 [6]=`1111101
110 [7]=`0100111
120 [8]=`1111111
130 [9]=`1101111
140 @LOOP
150 GSB @PRT
160 CLT
170 @COLON
180 T=TICK()
190 OUT 6,T%60<30
200 IF T<3600 GOTO @COLON
210 M=M+1
220 IF M>59 M=0:H=H+1
230 IF H>23 H=0
240 GOTO @LOOP
250 @PRT
260 N=H/10:GSB @SENDN
270 N=H%10:GSB @SENDN
280 N=M/10:GSB @SENDN
290 N=M%10:GSB @SENDN
300 OUT 3,1:OUT 3,0
310 RTN
320 @SENDN
330 F=[N]
340 FOR I=0 TO 7
350 OUT 1,F&#80
360 OUT 2,1:OUT 2,0
370 F=F*2
380 NEXT
390 RTN

7セグメントLEDモジュールへの出力は、数字フォントの7ビット(上位)→0ビット(下位)の順で、1ビットずつシリアル転送します。
(40~130行のフォントデータでは7ビット目を設定していませんが、7セグメントLEDでは小数点なので「0」でオフ)

※フォントデータは、2進数で「`gfedcba」の順。1=ON、0=OFF。

OUT1(Serial)にビットをセットして、OUT2(Clock)へパルスを送ると、1ビット転送されます(350~360行)。
以上を8ビット分くりかえし(340~380行)。
以上を時2桁、分2桁の4桁分くりかえし(260~290行)。
最後にOUT3(Latch)へパルスを送って(300行)、7セグメントLEDへ表示します。
ラッチ回路で出力状態が保持されるので、IchigoJam側は他の処理ができます。

RTCモジュールを使用


IchigoJamのCN5ソケットにRTCモジュールをつないで、現在時刻を読み取り。
正確に時刻をカウントできて、電源を切っても時刻が消えません。

10 '*CLOCK RTC
20 CLV:VIDEO 0
30 GSB @TIMEREAD
40 [0]=`0111111
50 [1]=`0000110
60 [2]=`1011011
70 [3]=`1001111
80 [4]=`1100110
90 [5]=`1101101
100 [6]=`1111101
110 [7]=`0100111
120 [8]=`1111111
130 [9]=`1101111
140 @LOOP
150 GSB @PRT
160 CLT
170 @COLON
180 T=TICK()
190 OUT 6,T%60<30
200 J=M
210 GSB @TIMEREAD
220 IF J=M GOTO @COLON
230 GOTO @LOOP
240 @PRT
250 N=H/10:GSB @SENDN
260 N=H%10:GSB @SENDN
270 N=M/10:GSB @SENDN
280 N=M%10:GSB @SENDN
290 OUT 3,1:OUT 3,0
300 RTN
310 @SENDN
320 F=[N]
330 FOR I=0 TO 7
340 OUT 1,F&#80
350 OUT 2,1:OUT 2,0
360 F=F*2
370 NEXT
380 RTN
390 @TIMEREAD
400 POKE #700,0
410 IF I2CR(#68,#700,1,#701,7) ERR
420 X=PEEK(#703)
430 H=X>>4*10+X&15
440 X=PEEK(#702)
450 M=X>>4*10+X&15
460 RTN
RTCモジュール時刻設定

福野さんのプログラムをそのまま使わせていただきました。
CN5への接続方法もそちらに書かれています。

1 'TIME SET
300 P=#707
310 INPUT"Y:20",X:GOSUB400
320 INPUT"M:",X:GOSUB400
330 INPUT"D:",X:GOSUB400
340 X=0:GOSUB400
350 INPUT"H:",X:GOSUB400
360 INPUT"M:",X:GOSUB400
370 INPUT"S:",X:GOSUB400
375 POKE #700,0
380 IF I2CW(#68,#700,1,#701,7) ERR
390 END
400 X=X/10*16+X%10:POKE P,X:P=P-1:RETURN