SHIROのIchigoJam日記

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

Ichigo 60 Clock

円形の文字盤基板に、マイコン内蔵フルカラーLED(PL9823-F5)を60個並べて、時計を作ってみました。
動画はこちら。

【IchigoJam】Ichigo 60 Clock

f:id:shiro0922:20190914215022j:plain

文字盤は専用基板を作りました。
IchigoJamが1個ではLEDを34個までしか制御できないので、文字盤上にLPC1114を2個置いて、LEDを30個ずつ制御しています。
f:id:shiro0922:20190914215959j:plain

時刻制御は外付けの別のIchigoJamです。
f:id:shiro0922:20190914220028j:plain
時計モジュールから現在時刻を読み込んで、どのLEDを光らせるかのコマンドを文字盤のICへ送っています。

実は基板の回路がちょっと間違っていたので、修正した次バージョンの基板を発注しています。基板データの公開は後ほど。※Ver.2の基板データを下↓に公開しました。
将来4K版ファームウェア1.4が出れば、60個のLED全部を制御できそうなので、文字盤のLPC1114は要らなくなるかもしれません。
それよりも、60連のLEDを使った方が楽かな…?
www.switch-science.com

(9/27追記)Ver.2基板

改良したVer.2基板を作りました。回路修正と、基板の中心に穴を空けてCDケースに入るようにしました。さすがにフタは閉まりませんが…
f:id:shiro0922:20190927163944j:plain

f:id:shiro0922:20190927234326j:plain

さっちゃん、CDデビュー!(^_^)
f:id:shiro0922:20190928064326j:plain

基板データ

*この基板ガーバーデータは、CC BYライセンスとします。どうぞご利用ください。

(C) 2019 Shiro Saito (https://www.ichigojaman.jp)

プログラム

外付け親機

どのLEDを光らせるかのコマンドは、文字コード1文字で送っています。
32(特殊コードからずらす)+色(赤=0、緑=1、青=2)×60+LED番号(0~59)
なお文字コード255を送ると、全LEDが消灯します。

10 @ARUN:'*Ichigo 60 Clock
20 CLV:UART 1:CLS
30 WAIT 60
40 ?CHR$(255):WAIT 6
50 GSB @TIMEREAD
60 GSB @HPN:GSB @MPN:GSB @SPN
70 I=H:N=M:T=S
80 @LOOP
90 GSB @TIMEREAD
100 IF T!=S GSB @SPR
110 IF N!=M GSB @MPR
120 IF I!=H GSB @HPR
130 I=H:N=M:T=S
140 GOTO @LOOP
150 @HPR
160 D=32+120+(I%12)*5:?CHR$(D):WAIT 6
170 @HPN
180 D=32+120+(H%12)*5:?CHR$(D):WAIT 6
190 RTN
200 @MPR
210 D=32+60+N:?CHR$(D):WAIT 6
220 @MPN
230 D=32+60+M:?CHR$(D):WAIT 6
240 RTN
250 @SPR
260 D=32+T:?CHR$(D):WAIT 6
270 @SPN
280 D=32+S:?CHR$(D):WAIT 6
290 RTN
300 @TIMEREAD
310 POKE #700,0
320 IF I2CR(#68,#700,1,#701,7) ERR
330 X=PEEK(#703)
340 H=X>>4*10+X&15
350 X=PEEK(#702)
360 M=X>>4*10+X&15
370 X=PEEK(#701)
380 S=X>>4*10+X&15
390 RTN

文字盤子機

受信した点灯/消灯コマンドはXOR処理をしていて、消灯しているLEDへコマンドが来たら点灯、点灯しているLEDへ来たら消灯します。

子機1:LED0~29
10 @ARUN:'*Ichigo 60 Clock-C00
20 CLV:UART 2,1:VIDEO 0:CLS
30 ?"*Ichigo 60 Clock-C00"
40 [99]=80:[100]=50:[101]=150
50 GSB @LEDCLR
60 WAIT 60
70 @LOOP
80 K=INKEY():IF !K CONT
90 ?"#";K
100 IF K=255 GSB @LEDCLR:GOTO @LOOP
110 K=K-32
120 IF K<0 GOTO @LOOP
130 C=K/60
140 L=K%60
150 ?"C=";C;" L=";L
160 IF L>29 GOTO @LOOP
170 GSB @LEDXOR
180 GOTO @LOOP
190 @LEDCLR
200 [0]=0:COPY #801,#800,179
210 WS.LED 30
220 RTN
230 @LEDXOR
240 M=C+L*3
250 D=[99+C]
260 [M]=[M]^D
270 WS.LED 30
280 RTN
子機2:LED30~59
10 @ARUN:'*Ichigo 60 Clock-C30
20 CLV:UART 2,1:VIDEO 0:CLS
30 ?"*Ichigo 60 Clock-C30"
40 [99]=80:[100]=50:[101]=150
50 GSB @LEDCLR
60 WAIT 60
70 @LOOP
80 K=INKEY():IF !K CONT
90 ?"#";K
100 IF K=255 GSB @LEDCLR:GOTO @LOOP
110 K=K-32
120 IF K<0 GOTO @LOOP
130 C=K/60
140 L=K%60
150 ?"C=";C;" L=";L
160 IF L<30 GOTO @LOOP
170 GSB @LEDXOR
180 GOTO @LOOP
190 @LEDCLR
200 [0]=0:COPY #801,#800,179
210 WS.LED 30
220 RTN
230 @LEDXOR
240 M=C+(L-30)*3
250 D=[99+C]
260 [M]=[M]^D
270 WS.LED 30
280 RTN

なお、基板上のLPC1114にUSBシリアルをつないでファーム書き換えやプログラム転送をする時は、もう片方のLPC1114のRESET端子をGNDへ落としてリセットしておいてください。そうしないと、1番のICへ書きこんでいるつもりが、実は2番のICの方だった…ということが起こります。基板上で電源やシリアル信号が両方のICへ並列につながっているので。