SHIROのIchigoJam日記

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

カウントダウンタイマー

指定した年月日までの残り時間をカウントダウンするタイマー基板を作ってみました。
IchigoJam R用の拡張基板です。
ロジックICで出力を変換することで、IchigoJamの11本のOUTで7セグメントLED×10個を制御しています。

特定の日時までの、残り日数・時分秒を表示してカウントダウンします。


基板裏面に、SanadaJam-RV(IchigoJam R互換機)と電源の単4電池×3本が付いています。
長期間運用するなら、micro USB電源をつないだ方がいいでしょう。
なおIchigoJam Sだと、実行速度が足りなくてうまく動作しません。


アクリルパネルを付けると、表示が見やすく、カッコ良くなります。

要は10桁の数字を表示するだけの基板なので、プログラム次第で表示内容は変えられます。

回路図

回路図
ブロック図
  • IchigoJamにつながったRTCモジュールから、現在の年月日・時分秒をI2Cで読み取ります。プログラムで目標の年月日・時分秒までの残り時間を計算します。
  • IchigoJamの出力ポート・OUT1~OUT8の8ビットで、7セグメントLEDペア2個に表示するデータを出力します。上位4ビット・下位4ビットのデータが、7セグメントデコーダーIC・4511で変換されて、2桁の数字を表示します。
  • OUT9~11の3ビットで、7セグメントLEDのどのペアを点灯させるかを指定します。3bit-8bitデコーダーIC・74138で、指定した番号の出力(シンク出力)がH→Lに落ちるので、吸い込み電流で7セグメントLEDが点灯します。5ペアの表示をプログラムで高速スキャンすれば、10桁の数字が表示されているように見えます(ダイナミック点灯)。
  • 今回はカウントダウンタイマーなので7セグメントLEDは10個(5ペア)ですが、ペア指定は3ビット(0~7)使えるので、同じ仕組みで最大16個(8ペア)の7セグメントLEDを制御できます。

基板データ

*いわゆるA基板のサイズで作っています。A基板用のパネルやケースが使えます。
*この基板データは、CC BYライセンスとします。どうぞご利用ください。

(C) 2023 Shiro Saito (https://www.ichigoaman.jp)

材料

だいたい以下の順番ではんだ付けすると作りやすいです。

オプション

IchigoJam Rとの接続、プログラミング

  1. IchigoJam Rのピンソケットに、カウントダウンタイマー基板のピンヘッダを差します。
  2. IchigoJam Rに、USBキーボードとモニタのビデオケーブルをつなぎます。
  3. カウントダウンタイマー基板のmicro USB端子に、USB電源ケーブルをつなぎます。
  4. IchigoJam Rの電源スイッチをONにします。
  5. カウントダウンタイマー基板の電源スイッチをONにします。
  6. IchigoJam Rでプログラムを入力して動かします。

プログラム

表示テスト

まず、7セグメントLEDでちゃんと数字が表示されるか確認してください。
以下のプログラムを動かすと、「12 34 56 78 90」と数字が表示されます。

10 '7SEG TEST
20 FOR P=1 TO 11
30 OUT P,0
40 NEXT
50 LET [0],#90,#78,#56,#34,#12
60 FOR B=0 TO 4
70 OUT [B]+B*256
80 NEXT
90 GOTO 60
  • 7セグメントLEDの5つのペアに表示させる数字を配列変数[0]~[4]に設定(50行)、それを高速スキャンしてダイナミック点灯させています(60~90行)。
  • 20~40行は、OUT1~OUT11に0を出力してポートをリセットしています。最初にこれをやらないと動作しません。

時刻設定

RTCモジュールに現在の年月日・時分秒を設定します。
福野さんが公開しているプログラムです。

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

カウントダウンタイマー

目標までの日数・時・分・秒を表示してカウントダウンします。
「SAVE0」でファイル0番に保存して、電源ONで自動起動させるといいでしょう。
30行で、目標の年・月・日・時・分・秒を設定してください。
ちなみに現在の目標日時は2024年4月1日0時0分0秒、IchigoJam10周年の日です。

10 @ARUN:'*COUNT DOWN
20 CLV:VIDEO 0
30 X=24:J=4:C=1:G=0:L=0:R=0
40 FOR P=1 TO 11
50 OUT P,0
60 NEXT
70 @LOOP
80 GSB @TIMEREAD
90 [0]=R-S:[1]=0
100 IF [0]<0 [0]=[0]+60:[1]=-1
110 [0]=([0]/10)<<4+[0]%10
120 [1]=[1]+L-M:[2]=0
130 IF [1]<0 [1]=[1]+60:[2]=-1
140 [1]=([1]/10)<<4+[1]%10+256
150 [2]=[2]+G-H:Z=0
160 IF [2]<0 [2]=[2]+24:Z=-1
170 [2]=([2]/10)<<4+[2]%10+512
180 IF J<=2 X=X-1:J=J+12
190 IF N<=2 Y=Y-1:N=N+12
200 A=365*(X-Y)
210 A=A+X/4-Y/4
220 A=A-X/100+Y/100
230 A=A+X/400-Y/400
240 A=A+306*(J+1)/10-306*(N+1)/10
250 A=A+C-D+Z
260 [3]=A%100
270 [3]=([3]/10)<<4+[3]%10+768
280 [4]=A/100
290 [4]=([4]/10)<<4+[4]%10+1024
300 CLT
310 FOR B=0 TO 4:OUT [B]:NEXT:IF TICK()<60 CONT
320 GOTO @LOOP
330 @TIMEREAD
340 POKE #700,0
350 IF I2CR(#68,#700,1,#701,7) ERR
360 A=PEEK(#707)
370 Y=A>>4*10+A&15
380 A=PEEK(#706)
390 N=A>>4*10+A&15
400 A=PEEK(#705)
410 D=A>>4*10+A&15
420 A=PEEK(#703)
430 H=A>>4*10+A&15
440 A=PEEK(#702)
450 M=A>>4*10+A&15
460 A=PEEK(#701)
470 S=A>>4*10+A&15
480 RTN

なお目標までの日数は、西暦1年1月1日からの日数を計算するフェアフィールドの公式

365y+[y/4]-[y/100]+[y/400]+[306(m+1)/10]+d-428
※yは年、mは月、dは日。[ ]は小数点以下切り捨て。ただし1月・2月は前年の13月・14月とする

を差し引きに変形して計算しています。
日数表示が4桁しかないので、9999日先(約27年先)を越えた未来の目標はうまく表示できません。

デジタル時計

普通のデジタル時計です。月日・時・分・秒を表示します。

10 '*CLOCK
20 CLV:VIDEO 0
30 FOR P=1 TO 11
40 OUT P,0
50 NEXT
60 @LOOP
70 GSB @TIMEREAD
80 [0]=(S/10)<<4+S%10
90 [1]=(M/10)<<4+M%10+256
100 [2]=(H/10)<<4+H%10+512
110 [3]=(D/10)<<4+D%10+768
120 [4]=(N/10)<<4+N%10+1024
130 CLT
140 FOR B=0 TO 4:OUT [B]:NEXT:IF TICK()<60 CONT
150 GOTO @LOOP
160 @TIMEREAD
170 POKE #700,0
180 IF I2CR(#68,#700,1,#701,7) ERR
190 X=PEEK(#707)
200 Y=X>>4*10+X&15
210 X=PEEK(#706)
220 N=X>>4*10+X&15
230 X=PEEK(#705)
240 D=X>>4*10+X&15
250 X=PEEK(#703)
260 H=X>>4*10+X&15
270 X=PEEK(#702)
280 M=X>>4*10+X&15
290 X=PEEK(#701)
300 S=X>>4*10+X&15
310 RTN