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

大学入学共通テスト・プログラミング問題

大学入学共通テストの科目「情報基礎」のプログラミング問題(第3問)
https://mainichi.jp/exam/kyotsu-2023/q/?sub=IFB14
に、今年もIchigoJamで挑戦してみました。
今回は、ロープを伝い降りて途中のリボンに触れてポイントをゲットする、というゲームの最適化問題でした。
動かしてみた動画はこちら。

www.youtube.com


各ロープが55mある設定ですが、IchigoJamの画面は縦24行しかないので、59~40m、39~20m、19~0mの3画面で表示が切り替わるようにしました。

問1:5mずつ下る

11本のロープを単純に5mずつ下って、リボンを通過したらポイントをゲットします。

10 CLV:CLS
20 LET [1],55,53,31,37,37,22,13,19,25,16,0
30 F=40
110 S=0
120 H=55
130 FOR I=1 TO 11
140 IF [I]>=H-5 AND [I]<=H S=S+1
161 GSB @MOV
170 H=H-5
180 NEXT
190 LC 0,20:?"SCORE=";S
200 END
800 @MOV
810 FOR Y=H TO H-5 STEP -1
820 F=Y/20*20
830 GSB @PR
840 LC (I-1)*3,19-Y+F
850 ?CHR$(250)
860 WAIT 30
870 NEXT
880 RTN
900 @PR
910 CLS
920 FOR P=1 TO 11
930 FOR Q=19 TO 0 STEP -1
940 LC (P-1)*3,19-Q
950 IF F+Q=[P] ?"@" ELSE ?"|"
960 NEXT
970 NEXT
980 LC 0,20:?"(";F+19;"-";F;")"
990 RTN

110~190行が問題のコード部分です。各ロープのリボンの場所は、20行で配列[1]~[11]に設定しています。
10~30行は初期設定、800~880行は人間を動かすサブルーチン、900~990行はロープやリボンを表示するサブルーチンです。

問2-a:リボンがある所まで下る

ロープに移ったら、リボンがある所までとにかく下ります。

10 CLV:CLS
20 LET [1],55,53,31,37,37,22,13,19,25,16,0
30 F=40
110 S=0
120 H=55
130 FOR I=1 TO 11
140 IF [I]<=H S=S+1:GSB @MOV:H=[I]
170 LC (I-1)*3,21:?I
171 LC (I-1)*3,22:?S
172 LC (I-1)*3,23:?H;
180 NEXT
190 LC 0,20:?"SCORE=";S
200 END
800 @MOV
810 FOR Y=H TO [I] STEP -1
820 F=Y/20*20
830 GSB @PR
840 LC (I-1)*3,19-Y+F
850 ?CHR$(250)
860 WAIT 30
870 NEXT
880 RTN
900 @PR
910 LC 0:FOR Z=0 TO 20:?CHR$(24):NEXT
920 FOR P=1 TO 11
930 FOR Q=19 TO 0 STEP -1
940 LC (P-1)*3,19-Q
950 IF F+Q=[P] ?"@" ELSE ?"|"
960 NEXT
970 NEXT
980 LC 0,20:?"(";F+19;"-";F;")"
990 RTN

110~190行が問題のコード部分です。

問2-b:下る距離を制限

あまり下へ下ると上のリボンがゲットできなくなるので、一度に下る距離を20mまでに制限。それより下らなければいけないロープは無視します。

10 CLV:CLS
20 LET [1],55,53,31,37,37,22,13,19,25,16,0
30 F=40:G=20
110 S=0
120 H=55
130 FOR I=1 TO 11
140 IF ([I]<=H AND H-[I]<G) OR I=11 S=S+1:GSB @MOV:H=[I]
170 LC (I-1)*3,21:?I
171 LC (I-1)*3,22:?S
172 LC (I-1)*3,23:?H;
180 NEXT
190 LC 0,20:?"SCORE=";S
200 END
800 @MOV
810 FOR Y=H TO [I] STEP -1
820 F=Y/20*20
830 GSB @PR
840 LC (I-1)*3,19-Y+F
850 ?CHR$(250)
860 WAIT 30
870 NEXT
880 RTN
900 @PR
910 LC 0:FOR Z=0 TO 20:?CHR$(24):NEXT
920 FOR P=1 TO 11
930 FOR Q=19 TO 0 STEP -1
940 LC (P-1)*3,19-Q
950 IF F+Q=[P] ?"@" ELSE ?"|"
960 NEXT
970 NEXT
980 LC 0,20:?"(";F+19;"-";F;")"
990 RTN

110~190行が問題のコード部分です。
30行の「G=20」が下る距離制限です。

問3:動きを最適化して最高点

各ロープまでの最高点を計算して、動きを最適化します。
最適ルートを見つけた後にそのルートを下って見せるとカッコいいのですが、そこまでは入れていません(問題にも無いですし)。

10 CLV:CLS
20 LET [1],55,53,31,37,37,22,13,19,25,16,0
30 F=40
40 S=0:H=55
110 [21]=1
120 FOR I=2 TO 11
130 M=0
140 FOR T=1 TO I-1
150 IF [T]>=[I] AND M<[T+20] M=[T+20]:H=[I]
180 NEXT
190 [I+20]=M+1
191 GSB @MOV
192 LC (I-1)*3,21:?I
193 LC (I-1)*3,22:?[I+20]
199 WAIT 60
200 NEXT
210 LC 0,20:?"SCOREMAX=";[31]
220 END
800 @MOV
820 F=H/20*20
830 GSB @PR
840 LC (I-1)*3,19-H+F
850 ?CHR$(250)
860 RTN
900 @PR
910 LC 0:FOR Z=0 TO 20:?CHR$(24):NEXT
920 FOR P=1 TO 11
930 FOR Q=19 TO 0 STEP -1
940 LC (P-1)*3,19-Q
950 IF F+Q=[P] ?"@" ELSE ?"|"
960 NEXT
970 NEXT
980 LC 0,20:?"(";F+19;"-";F;")"
990 RTN

110~210行が問題のコード部分です。
各ロープまでの最高点は、配列[21]~に記録します。

日本縦断の旅エンディング

Facebookに過去に書いたものの再録です。



日本縦断の旅を見てくださった皆さん、ありがとうございました。
まとめのエンディングです。

===日本縦断の旅===
宗谷本線稚内駅~指宿枕崎線枕崎駅

●所要時間
12/28(水)10:28~1/3(火)19:59
6泊7日(6日9時間31分)

●使った切符
北海道・東日本パス
青春18きっぷ
その他乗車券・特急券など

●乗った乗り物
列車48本
・うち特急2本(長万部~函館、新見~米子)
フェリー1本(函館~青森)
バス2本(長府駅前~御裳川、和布刈~門司港駅前)
〈以下はカウント外〉
地下鉄2本(札幌)
市電2本(札幌、熊本)
タクシー3本(函館、青森、熊本)
エレベーター2本(関門トンネル人道
自分の足2本

●列車ぎゅうぎゅう詰め地獄
1回(倶知安長万部

●列車運休で引き返し
1回(備後落合)

●通った都道府県
1道1都2府21県
北海道、青森県岩手県宮城県福島県茨城県、千葉県、東京都、神奈川県、静岡県、愛知県、岐阜県滋賀県京都府大阪府兵庫県岡山県広島県鳥取県島根県山口県、福岡県、佐賀県熊本県、鹿児島県

●食べた名物
札幌味噌ラーメン
長万部かにめし
北海道限定カップカレー焼きそば
青森のっけ丼
盛岡冷麺
原ノ町ブラック醤油ラーメン
豊橋カレーうどん
豊橋銘菓ピレーネ
博多一蘭ラーメン
博多駅ラーメン
鹿児島県産カルビ焼肉と黒豚角煮弁当

八幡屋礒五郎の七味で食べたもの
稚内駅そば
上野駅そば
姫路駅そば
出雲市すき家豚汁
新山口駅そば

●お会いした方々
Hondaさん
佐々木さん
佐藤さん

●いただいた差し入れ
北海道限定カップカレー焼きそば
豊橋銘菓ピレーネ

●出会った動物
天塩川エゾシカ

ダッシュで汗だくになったこと
多数

●途中で帰りたくなったこと
無し

●楽しかったこと
全部

枕崎駅駅ノート