指定した年月日までの残り時間をカウントダウンするタイマー基板を作ってみました。
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を制御できます。
基板データ
- Fusion PCB用ガーバーデータ(ZIP)(155×114mm)
*いわゆるA基板のサイズで作っています。A基板用のパネルやケースが使えます。
*この基板データは、CC BYライセンスとします。どうぞご利用ください。
(C) 2023 Shiro Saito (https://www.ichigoaman.jp)
材料
だいたい以下の順番ではんだ付けすると作りやすいです。
- カーボン抵抗(炭素皮膜抵抗) 1/4W100Ω (100本入) ×5本
- マイクロUSBコネクタ 電源供給用
- スライドスイッチ 1回路2接点 基板用 横向き
- 整流用ショットキーダイオード 40V1A 1S4 (10本入)
- ICソケット (16P) (10個入) ×11個
- 緑色7セグメントLED表示器OSL10561-LG(カソードコモン) ×10個
- リード型積層セラミックコンデンサー 0.1μF50V F 2.54mm (10個入) ×5本
- 絶縁ラジアルリード型積層セラミックコンデンサー 10μF25V5mmピッチ (10個入)
- ピンヘッダ 1×40 (40P)
- IchigoJamとの接続に14P+14P+5P、RTCモジュールとの接続に4P使います。
- RTCモジュール(aitendo)
- amazonでも同じ品が売っています。
- まずRTCモジュールに4Pのピンヘッダをはんだ付けして、その後に基板にはんだ付けするとやりやすいです。
- リチウム電池 CR2032 ゴールデンパワー製 (5個入)
- RTCモジュールに入れます。CR2032は電器店やコンビニでも買えます。
- 7セグメントドライバ(7セグメントデコーダ) TC4511BP ×10個
- ICソケットに差します。
- 3to8 ラインデコーダ TC74HC138AP
- ICソケットに差します。
オプション
- 電池ボックス 単4×3本 リード線
- 乾電池を電源にする場合は付けてください。カウントダウンタイマーは長期間動かすので、micro USB端子から電源供給した方が良いと思います。
- A基板用アクリルパネル(アクリル板) 2mm厚(スモーク)
- 3mmプラネジ(7mm)+六角スペーサー(14mm)セット
- スモークのアクリル板を付けると、表示が見やすく、カッコ良くなります。
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