秋月電子のシフトレジスタ(74HC595)付き7セグメントLEDモジュールを使って、IchigoJam時計を作ってみました。
7セグメント4個に配線するのは大変なので、オリジナルシールド基板を作りました。
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)
材料
- 緑色7セグメントLEDシリアルドライバモジュール 完成品(秋月電子)
- ※実は赤色LEDのモジュールも試しましたが、7セグ4個を動かすとIchigoJamの出力電流が足りないらしく、かなり暗い表示になってしまいます。緑色LEDは高効率でかなり明るく光るのでお勧めです。
- 3mm緑色LED OSG5GL3E34B (10個入)(秋月電子)(中央のコロン用)
- RTCモジュール (aitendo)
プログラム
簡単プログラム
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,FP 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,FP 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