SHIROのIchigoJam日記

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

StickJam(バーサライタ用IchigoJam)

※この記事は「IchigoJam Advent Calendar 2019」に参加しています。

f:id:shiro0922:20191220164819j:plain
バーサライタ(POV)用のスティック形IchigoJamです。手に持って左右に振ると、点滅するLEDで文字が見えます。ライブ会場で振ればオタ芸ができます(^_^)
★12/31にコミックマーケット97(東京ビッグサイト)で販売予定です。
説明動画はこちら。

【IchigoJam】StickJam

f:id:shiro0922:20191223001839p:plain

f:id:shiro0922:20191222142431p:plain
先月にデザインフェスタVol.50へ出展した時に、振ったり回したりして文字が見えるバーサライタが人気でした。それをヒントに、バーサライタ用IchigoJamの基板を起こして、作ってみました。

f:id:shiro0922:20191220164956j:plain
基板の裏に、電源の単3電池×3本があります。

f:id:shiro0922:20191220165322j:plain
LED部分は、マイコン内蔵フルカラーLED・WS2812B(チップタイプ)を8個搭載。IchigoJam BASIC 1.4から、このLEDを簡単に制御できるようになりました。フルカラーなので色もいろいろ変えられます。
表示する文字は2文字分(縦8ドット×横16ドット)です。
チップタイプLEDは見た目がカッコイイのですがはんだ付けがかなり大変なので、子ども向けには5mm砲弾タイプのLEDにした方がいいかもしれません。ちょっと考え中です。

写真ではLEDの左側にありますが、黒いチルトスイッチが2個付いています。通常のバーサライタでは、右に振る時と左に振る時で文字が逆(左右裏返し)に表示されてしまいます。このスティックでは、振る動きの切り替わりをチルトスイッチで検知して、左右どちらに振っても同じ向きで文字が見えるようにしています。
当初はジャイロセンサーを試したのですがうまく検知できず、ボール入りのチルトスイッチにしました。振るとカチカチ言うのが難点ですが、シンプルな物の方が案外うまく行くようです。

f:id:shiro0922:20191220165209j:plain
両端にビデオ端子とUSBキーボード端子が付いているので、モニタとキーボードをつなげると、普通にIchigoJamとして使えます。中のプログラムの書き換えもできます。


下の方に「1・2・3」と書かれた切り替えスイッチが付いています。
→3接点小型スライドスイッチ SS-14MDP2(共立エレショップ)
中のプログラム次第ですが、これで表示する文字を切り替えることができます。


カラーLEDとセットボタン。
これもプログラム次第ですが、モニタが無くても、表示する文字をキーボードなどで設定することができます。

プログラム

セレクタ

ファイル0にこのプログラムを入れて自動起動させると、切り替えスイッチの位置を読み取って、ファイル1~3のプログラムを起動します。

10 @ARUN:'*Selecter
20 OUT 1,-2:OUT 2,-2:OUT 3,-2
30 IF !IN(5) LRUN 1
40 IF !IN(6) LRUN 2
50 IF !IN(7) LRUN 3
60 GOTO 30

「上田」

左右に振ると「上田」の文字を表示します。
30~180行のデータを変更すれば、表示する文字が変えられます。
250~270行(1文字目)、350~370行(2文字目)の値を変えると、それぞれの文字の表示色(GRBの順)が変えられます。1文字目と2文字目で色を変えた方が、文字が見やすいようです。

10 '*Ueda
20 CLV:CLS
30 [80]=`01000000
40 [81]=`01000000
50 [82]=`01000000
60 [83]=`01111111
70 [84]=`01001000
80 [85]=`01001000
90 [86]=`01000000
100 [87]=`00000000
110 [88]=`01111111
120 [89]=`01001001
130 [90]=`01001001
140 [91]=`01111111
150 [92]=`01001001
160 [93]=`01001001
170 [94]=`01111111
180 [95]=`00000000
190 A=#900
200 FOR I=0 TO 7
210 FOR J=0 TO 7
220 M=1<<J
230 D=[80+I]&M
240 P=A+I*48+J*6
250 POKE P,70*(D>0)
260 POKE P+2,0*(D>0)
270 POKE P+4,0*(D>0)
280 NEXT
290 NEXT
300 FOR I=8 TO 15
310 FOR J=0 TO 7
320 M=1<<J
330 D=[80+I]&M
340 P=A+I*48+J*6
350 POKE P,0*(D>0)
360 POKE P+2,0*(D>0)
370 POKE P+4,70*(D>0)
380 NEXT
390 NEXT
400 @LOOP
410 X=IN(1):Y=IN(4)
420 IF X=0 && U=1 GSB @VM
430 IF Y=0 && V=1 GSB @VP
440 [0]=0:[1]=0:[2]=0
450 WS.LED 1,8
460 U=X:V=Y
470 GOTO @LOOP
480 @VP
490 WAIT 1
500 FOR I=0 TO 15
510 COPY #800,A+I*48,48
520 WS.LED 8
530 NEXT
540 RTN
550 @VM
560 WAIT 1
570 FOR I=15 TO 0 STEP -1
580 COPY #800,A+I*48,48
590 WS.LED 8
600 NEXT
610 RTN

以前に8LEDスティックで作ったバーサライタと同様に、表示データをいったんVRAMへ展開(190~390行)、チルトスイッチで振る方向の切り替わりを検知して(410~430行)、VRAMのデータを配列変数領域へコピーしながらLEDを光らせています(480~540行が順方向、550~610行が逆方向表示)。そのため起動後は、データをVRAMへ展開するのを3秒くらい待ってから、左右に振ってください。

キー入力カスタム

USB端子にキーボードをつないで、表示する文字をカスタマイズできるプログラムです。

  • キーボードをつないで、切り替えスイッチをこのプログラムが入っているファイル番号にして、電源を入れます。
  • セットボタンを押して、設定モードに入ります。カラーLEDが赤く点灯します。
  • キーボードのカーソルキー(矢印キー)を押して、カラーLEDを見ながら表示色を設定します。←(左)で赤、↓(下)で緑、→(右)で青の値を変化させます。それぞれ「0」(消灯)~「7」(最大輝度)の8段階があり、「7」の時にキーを押すと「0」に戻ります。↑(上)を押すとリセットされて3色とも「0」(消灯)になります。
  • 表示色が決まったら、表示したい1文字をキーボードから入力します。入力した文字がそのままIchigoJamフォントで設定されて、8個のLEDで表示パターンが1回レビューされます。
  • 同様に、2文字目の表示色と文字を設定します。
  • 2文字目の入力が終わると、その設定が保存されて、通常モードに戻ります。スティックを左右に振ると、設定した2つの文字が表示されます。
  • 設定した文字と色は、プログラムと一緒にSAVEされるので(コード領域の末端に書きこんでいます)、電源を切っても消えません。新たな文字を設定するまで保持されます。
1 '*Key-In
2 CLV:WS.LED 9
3 N=0:GSB26
4 N=1:GSB26
5 V=#900:M=0:L=15:W=0
6 IF BTN() GOTO 36
7 X=IN(1):Y=IN(4)
8 IF X=0 && T=1 GSB 20
9 IF Y=0 && U=1 GSB 14
10 [0]=0:[1]=0:[2]=0
11 WS.LED 1,8
12 T=X:U=Y
13 GOTO 6
14 WAIT 1
15 FOR I=M TO L
16 COPY #800,V+I*48,48
17 WS.LED 8:WAIT W
18 NEXT
19 RTN
20 WAIT 1
21 FOR I=L TO M STEP -1
22 COPY #800,V+I*48,48
23 WS.LED 8:WAIT W
24 NEXT
25 RTN
26 A=#FF0+N*4
27 C=PEEK(A):G=PEEK(A+1):R=PEEK(A+2):B=PEEK(A+3)
28 V=#900+384*N
29 FOR I=0 TO 7:E=128>>I
30 FOR J=0 TO 7
31 D=PEEK(C*8+J)&E:P=V+I*48+J*6
32 POKE P,G*(D>0)
33 POKE P+2,R*(D>0)
34 POKE P+4,B*(D>0)
35 NEXT:NEXT:RTN
36 CLV:R=10
37 FOR N=0 TO 1
38 IF BTN(28) R=R+10:IF R>70 R=0
39 IF BTN(31) G=G+10:IF G>70 G=0
40 IF BTN(29) B=B+10:IF B>70 B=0
41 IF BTN(30) R=0:G=0:B=0
42 [24]=G:[25]=R:[26]=B:WS.LED 9
43 CLK:WAIT10:C=INKEY()
44 IF C<32 GOTO 38
45 A=#FF0+N*4
46 POKE A,C,G,R,B:GSB26
47 M=0:L=7:W=10:GSB14
48 NEXT
49 SAVE FILE()
50 RUN