SHIROのIchigoJam日記

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

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

3Dかわくだり

こちらも「かわくだり魔改造グランプリ」の応募作品。なんちゃって3D視点のかわくだりゲームです。
カーソルキーの左右で自キャラを動かして、流れてくる岩を避けてください。
岩に当たるとゲームオーバーとなり、画面左上に下った秒数が表示されて終了します。

プログラム

10 '*Kawakudari 3D
20 CLV:CLS:CLT:X=16:Y=22
30 LC 0,5:FOR I=0 TO 31:?CHR$(140);:NEXT
40 FOR R=0 TO 15
50 LC 15-R,R+6:?CHR$(134)
60 LC 16+R,R+6:?CHR$(137)
70 NEXT
80 IF X=[16] GOTO 190
90 X=X-BTN(28)+BTN(29)
100 LC X,Y:?"O";
110 [0]=RND(32)
120 COPY #821,#81F,-32
130 FOR R=1 TO 16
140 A=#9D0+R*31:B=R*2:S=[R]*B/32
150 POKE A,0:COPY A+1,A,B-1
160 POKE A+S,42
170 NEXT
180 GOTO 80
190 BEEP 30,30
200 LC X,Y:?"X";
210 LC 0,0:?TICK()/60

Web版はこちら。

Web版だと動きが遅いので、ぜひIchigoJam実機で遊んでみてください。
スタート時に川の左岸に岩が一列に並びますが、高速化のための仕様です(笑)

ラリーJam

こちらも「かわくだり魔改造グランプリ」応募作品。4方向スクロールゲームです。

f:id:shiro0922:20190512142819p:plain

遊び方

  • 起動すると画面中央にマイカーが表示され、画面がスクロールして走って行きます。上下左右のカーソルキーで、進行方向が変わります。
  • 画面左下にポイント(得点)が表示されます。チェックポイント「P」を通過すると10ポイント加算されます。
  • 画面右下に残りガソリンが表示されます。1スクロール進む毎に1ずつ減っていきます。ガスステーション「G」を通過すると100補充されます。
  • 岩「*」に当たるか、残りガソリンが0になると、ゲームオーバーです。

プログラム

10 '*Rally Jam
20 CLV:CLS:X=16:Y=11:D=2:G=300
30 LET [0],16,22,0,11,16,0,31,11
40 LET [28],1,3,2,0
50 POKE 224*8,129,255,153,24,90,126,90,24
60 POKE 225*8,7,114,34,254,254,34,114,7
70 POKE 226*8,24,90,126,90,24,153,255,129
80 POKE 227*8,224,78,68,127,127,68,78,224
90 FOR K=28 TO 31
100 IF BTN(K) D=[K]
110 NEXT
120 U=[D*2]:V=[D*2+1]
130 R=RND(32)-16:S=RND(23)-11
140 C=42
150 IF !RND(20) C=80
160 IF !RND(40) C=71
170 G=G-1
180 POKE #BE0,0:COPY #BE1,#BE0,31
190 LC X,Y:?CHR$(0)
200 SCROLL D
210 H=SCR(X,Y)
220 LC X,Y:?CHR$(224+D)
230 IF H=80 P=P+10:BEEP
240 IF H=71 G=G+100:BEEP 10,30
250 LC 0,23:?"POINT=";P;
260 LC 20,23:?"GAS=";G;" ";
270 IF D%2=0 LC U+R,V ELSE LC U,V+S
280 ?CHR$(C);
290 WAIT 3
300 IF H!=42 AND G>0 GOTO 90
310 LC X,Y:?"X"
320 BEEP 30,30

Web版はこちら。

8ビットパソコン時代の名作ゲーム「ラリーX」をイメージして作りました。
敵のレッドカーも出そうかと思ったのですが、そこは改造の余地として残しました。
Web版は画面表示が遅いので簡単ですが、IchigoJam実機だとオリジナルのかわくだりゲーム並みに難しいです。