SHIROのIchigoJam日記

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

LEDマトリックス名札

以前作ったLEDマトリックス基板「LED64Stack」
www.ichigojaman.jp
を4個連結して、名札にしてみました。
動画はこちら。

www.youtube.com

f:id:shiro0922:20210714142940j:plain
LED64Stackを横に4個連結。全体を名札形状に収めるために、専用コントローラーIchigoJam基板を新規に作りました。
首にかけるとこんな感じ。
f:id:shiro0922:20210714143800j:plain

ボタンを押すとダッシュゲームが遊べます。
f:id:shiro0922:20210714143024j:plain

今回はLEDマトリックスに、100均で買った「暗記したじき」の緑色をはさみで切って、接着剤で貼り付けています。これで緑色のLEDがかなり見やすくなります。

ただ、最近IC・LPC1114が品薄で入手困難になっています。LEDマトリックス1個に付きLPC1114を1個使う今回の方式は、あまり他の方には勧められません。LEDマトリックスを光らせる別の方式を現在検討中です。

コントローラー基板データ


電源のレギュレータは、LEDマトリックス4個を動かすということで、800mA出力のTO-252パッケージ品を使いました。コンデンサは、電解コンデンサ10μFとセラミックコンデンサ0.1μFを使っています。

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

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

プログラム

ファイル0:名前表示

IchigoJamの文字フォントデータを配列変数にコピーして表示しています。40行の文字列データを変更すると、表示する文字が変えられます。
ボタンを押すと、ファイル1のプログラムを実行します。

10 @ARUN:'*LED64Stack Saito
20 VIDEO 0:UART 1:CLS:?
30 GSB @PRTCLR
40 P="サイトウ":L=3
50 FOR X=0 TO L
60 C=PEEK(P+X)
70 GSB @PRTC
80 NEXT
90 IF !BTN() CONT
100 IF BTN() CONT
110 GSB @PRTCLR
120 SRND TICK()
130 LRUN 1
140 @PRTCLR
150 FOR I=1 TO 4
160 ?"MATLED SHOW 0000000000000000"
170 NEXT:RTN
180 @PRTC
190 A=C*8
200 FOR B=0 TO 7
210 [B]=PEEK(A+B)
220 NEXT
230 M=128
240 FOR I=0 TO 7
250 D=0
260 FOR B=7 TO 0 STEP -1
270 D=D<<1
280 D=D+([B]&M>0)
290 NEXT
300 ?"MATLED PUSH ";D
310 M=M>>1
320 NEXT
330 RTN

ファイル1:ダッシュゲーム

ボタンを連打して、ランナーを右端→左端へ走らせてください。ゴールするとタイムが表示されます。ボタンを押すとリプレイします。
数字・ランナーとも独自のデータを用意してPUSHして表示しています。が、文字フォントデータを使っても良かったかもしれません。

10 '*DASH64
20 UART 1:CLS:?
30 GSB @PRTCLR
40 LET [0],#3E,#41,#3E,0,#42,#7F,#40,0
50 LET [8],#62,#51,#4E,0,#22,#49,#36,0
60 LET [16],#4F,#49,#31,0,#3E,#49,#31,0
70 LET [24],#3E,#49,#31,0,#03,#71,#0F,0
80 LET [32],#36,#49,#36,0,#26,#49,#3E,0
90 FOR N=3 TO 1 STEP -1
100 GSB @PRTN
110 BEEP:WAIT 60
120 NEXT
130 GSB @PRTCLR
140 LET [90],#8C,#C8,#2E,#7E,#48,#D8
150 FOR L=0 TO 5
160 ?"MATLED PUSH ";[90+L]
170 NEXT
180 CLT
190 FOR R=1 TO 26
200 IF !BTN() CONT
210 IF BTN() CONT
220 ?"MATLED PUSH 0"
230 NEXT
240 T=TICK()
250 BEEP 10,60
260 WAIT 60
270 N=T/600:IF N>9 N=9
280 IF N>0 GSB @PRTN
290 T=T-N*600
300 N=T/60
310 GSB @PRTN
320 T=T-N*60
330 ?"MATLED PUSH 128"
340 ?"MATLED PUSH 0"
350 N=T/6
360 GSB @PRTN
370 IF !BTN() CONT
380 IF BTN() CONT
390 RUN
400 @PRTCLR
410 FOR I=1 TO 4
420 ?"MATLED SHOW 0000000000000000"
430 NEXT:RTN
440 @PRTN
450 FOR I=0 TO 3
460 ?"MATLED PUSH ";[N*4+I]
470 NEXT
480 RTN

LEDマトリックススキャン

IchigoJam Rの速度を活かして、8×8のマトリックスLEDをスキャン表示する基板を作りました。
動画はこちら。

www.youtube.com

f:id:shiro0922:20210707211222j:plain

f:id:shiro0922:20210629110431p:plain
配線の数は多いですが、頑張ればブレッドボードでも組める回路です。

f:id:shiro0922:20210708005119p:plain
OUT1~OUT8で1行分のドットデータを出力、OUT9~OUT11(IN2~IN4)で8行分のスキャンをしています。
※動画内の説明画像で、OUT1~OUT8のドット配置が上下逆になっていました。すみません。上の画像の配置が正しいです。
スキャン信号は3to8ラインデコーダIC・74HC138を使って、3ビット→8ビットに変換しています。
f:id:shiro0922:20210629113042p:plain
OUT9~OUT11(入力A~C)の3ビットで0~7を入力すると、出力Y0~Y7の指定した番号だけが0になります。この8ビット出力をLEDマトリックスのカソードにつないで、行方向へスキャンしています。(0を出力したLED列が吸い込み電流で点灯)

基板データ

*同じ基板を2枚配置しています。
*この基板データは、CC BYライセンスとします。どうぞご利用ください。

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

プログラム

LEDマトリックスをスキャン表示すると、ビデオ画面の表示が乱れます。
そのため以下のプログラムでは、最初に「VIDEO 0」で画面表示を止めています。
プログラムを終了した後は、F8キー(VIDEO 1)を押して画面表示を復活させてください。

1文字表示

40行で指定した1文字を、LEDマトリックスにスキャン表示します。
配列変数[0]~[7]に文字のドットデータを展開して(60~80行)、そのデータをスキャンして出力しています(90~140行)。
120行「'WAIT 10」のアポストロフィ(')を外して実行すると、スキャン表示の様子がよくわかります。

10 '*Matrix Chr
20 CLV:VIDEO 0
30 FOR P=1 TO 11:OUT P,0:NEXT
40 C=ASC("A")
50 A=C*8
60 FOR B=0 TO 7
70 [B]=PEEK(A+B)
80 NEXT
90 @LOOP
100 FOR Z=0 TO 7
110 OUT [Z]+256*Z
120 'WAIT 10
130 NEXT
140 GOTO @LOOP

文字列表示

40行で指定した文字列を、1文字0.5秒ずつ順番に表示します。

10 '*Matrix String
20 CLV:VIDEO 0
30 FOR P=1 TO 11:OUT P,0:NEXT
40 S="IchigoJam "
50 @LOOP
60 FOR X=0 TO LEN(S)-1
70 A=PEEK(S+X)*8
80 FOR B=0 TO 7
90 [B]=PEEK(A+B)
100 NEXT
110 CLT
120 @CHR
130 FOR Z=0 TO 7
140 OUT [Z]+256*Z
150 NEXT
160 IF TICK()<30 GOTO @CHR
170 OUT 0
180 NEXT
190 GOTO @LOOP

連打ゲーム

実行すると「3」「2」「1」とダウンカウントした後、64個のLEDが全て点灯します。
スペースキーを連打して、64個のドットを全部消してください。
全部消すとタイム(秒数)が1文字ずつ画面に表示されます。スペースキーを押すとリプレイします。

10 '*Renda64
20 CLV:VIDEO 0
30 FOR P=1 TO 11:OUT P,0:NEXT
40 FOR N=3 TO 1 STEP -1
50 BEEP:W=60:GSB @PRTN
60 NEXT
70 D=255
80 FOR B=0 TO 7
90 [B]=D
100 NEXT
110 CLT
120 FOR X=0 TO 7
130 D=D>>1
140 FOR Y=0 TO 7
150 GSB @PRTMAT:IF !BTN(32) CONT
160 GSB @PRTMAT:IF BTN(32) CONT
170 [Y]=D
180 NEXT
190 NEXT
200 T=TICK()/6:IF T>999 T=999
210 OUT 0
220 BEEP 10,30:WAIT 30
230 W=60:CLK
240 @TIME
250 IF T>99 N=T/100:GSB @PRTN
260 IF INKEY()=32 RUN
270 N=T%100/10:GSB @PRTN
280 IF INKEY()=32 RUN
290 N=-2:GSB @PRTN
300 IF INKEY()=32 RUN
310 N=T%10:GSB @PRTN
320 IF INKEY()=32 RUN
330 N=-16:GSB @PRTN
340 IF INKEY()=32 RUN
350 GOTO @TIME
360 @PRTN
370 A=(N+48)*8
380 FOR B=0 TO 7
390 [B]=PEEK(A+B)
400 NEXT
410 CLT
420 GSB @PRTMAT:IF TICK()<W CONT
430 RTN
440 @PRTMAT
450 FOR Z=0 TO 7
460 OUT [Z]+256*Z
470 NEXT
480 RTN

かわくだり

自分のキャラ(一番上のドット)をカーソルキーの左右で動かして、下から流れてくる岩をよけてください。
岩に当たるとゲームオーバーで、下った秒数がドットで表示されます。
スペースキーを押すとリプレイします。

10 '*KAWAKUDARI
20 CLV:VIDEO 0:CLT:W=40:X=4
30 FOR P=1 TO 11:OUT P,0:NEXT
40 @LOOP
50 X=X-BTN(29)+BTN(28)
60 X=X&7:Z=1<<X
70 COPY #800,#802,14
80 [7]=1<<RND(8)
90 IF [0]&Z GOTO @GOVER
100 [0]=Z
110 FOR I=1 TO W
120 GSB @PRT
130 NEXT
140 GOTO @LOOP
150 @GOVER
160 T=TICK()/60
170 BEEP 30,30
180 FOR I=1 TO 10*W
190 GSB @PRT
200 NEXT
210 CLK
220 FOR Y=0 TO 7
230 [Y]=0
240 FOR B=0 TO 7
250 S=S+1
260 IF T>=S [Y]=[Y]<<1+1
270 NEXT
280 NEXT
290 GSB @PRT:IF !INKEY() CONT
300 RUN
310 @PRT
320 FOR Y=0 TO 7
330 OUT [Y]+256*Y
340 NEXT
350 RTN

オリジナルのかわくだりはWAITで速さを調節していますが、このプログラムでWAITするとLEDスキャン表示が止まってしまうので、スキャン表示サブルーチンを繰り返し呼んで時間待ちしています(110~130行)。20行の「W=40」でWの値を変えると、全体のスピードが変わります。

LED踏み切り

以前作ったLEDネコ基板と同様に、無安定マルチバイブレータ回路でLED踏み切り(警報器)を作ってみました。
動画はこちら。

www.youtube.com

f:id:shiro0922:20210703160050p:plain


基板はレジスト色を黄色にして、黒マジックで縞模様を塗りました。

基板データ

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

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