SHIROのIchigoJam日記

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

野球ルーレット

ロジックIC回路で動く、野球盤っぽいルーレットを作ってみました。

動画はこちら。

www.youtube.com
電源は裏面の単4電池×3本です。

遊び方

  • ACTIONボタンを押すと、ピッチャーが投球した後、バッティングのルーレットが回って結果が表示されます。走者や得点の管理は人間がやってください(笑)
  • バッティング結果は10種類で、三振(K)、ファーストゴロ、セカンドゴロ、サードゴロ、内野フライ、レフトフライ、ライトフライ、シングルヒット、ツーベースヒット、ホームランです。チーム打率3割の強打線ですが、そのままだとフォアボールが無い、内野ゴロや外野フライでの進塁が無いなどで、意外に点が入りません。人間の運用ルールでカバーしてください。
  • バッティングのルーレットが止まったら、RESETボタンを押すと、ボールがピッチャーに戻ります。再びACTIONボタンを押してルーレットを回してください。

回路図

  • 回路は以前作った電子ルーレットの応用です。トランジスタ2個の弛張発振回路でクロック信号を作り、シフトレジスタ・4015と10進カウンタ・4017へ入力しています。ACTIONボタンを押すとコンデンサC1に充電されて発振がスタート。ボタンを離した後はC1の電力を消費して発振するので、電力が無くなってくるとルーレットがだんだんゆっくりになって止まります。
    発振回路の電流の一部はフォトトランジスタを通っているので、周囲の光の加減でルーレットが回る時間が変わり、ヒットを狙うのを難しくしています。
  • 4015のシフトレジスタ1個を使って、ピッチングをLEDで表示しています。電源ON直後はQ0A~Q3Aが全てLなので、最初のLED・P0が光ります。発振回路からクロックが入力されると、データ入力DAは常にHなので、Q0A~Q3Aが順にHに変化します。電流がH→Lの方向へ流れるので、LED・P1~P3が順に光ります。
  • 10進カウンタ・4017はバッティングのルーレットを表示します。発振回路からのクロック信号はCLK-Iへ入力されていて、CLOCK入力がHの時にCLK-Iの立ち下がりでカウントします。電源ONからピッチングP0~P3を表示するまでの間は、CLOCK入力がLなのでカウントしません。また4015の出力Q3Aにつながっているデジタルトランジスタ・DTC143ELのベース入力がLなので、トランジスタはOFFとなり、バッティングのLED×10個はGNDにつながらないので電流が流れず光りません。
    ピッチング表示が終わって4015のQ3AがHになると、4017のCLOCK入力がHになり、CLK-Iへ入るクロック信号でカウントを始めます。同時にデジタルトランジスタ・DTC143ELがONになるので、バッティングのLED×10個が光って回ります。
    つまり、ピッチングは最初の1回だけ表示して、後はバッティングのルーレットが回るようにしています。またDTC143ELのスイッチングによって、ボールが同時に2個表示されないようにしています。
  • リセットボタンを押すと、4015と4017のRESET端子がHになり、ICがリセットされて最初の状態に戻ります。

基板データ

*いわゆるB基板のサイズで設計しています。B基板用のケースやパネルが使えます。
*この基板データは、CC BYライセンスとします。どうぞご利用ください。

(C) 2023 Shiro Saito (https://www.ichigoaman.jp)

材料

以下の順番ではんだ付けすると作りやすいです。

はんだ付けが終わったら、ICをソケットにはめます。向きを間違えないようにしてください。

Ichigoマトリックス名札

8×8のLEDマトリックスを4個並べた名札を作ってみました。

基板の右半分はIchigoJam-R互換機で、キーボードとモニタをつなげれば普通のIchigoJamとしてプログラミングできます。

基板の穴にひもを通すと、首から下げられます。

電源は裏面の単3電池×3本です。

以前にも同様の名札を作ったのですが、
www.ichigojaman.jp
その時はIchigoJam Sと同じマイコン・LPC1114を5個使った力技でした。
今回はIchigoJam-R互換機とロジックIC回路を組み合わせて、マイコン1個だけでLEDマトリックス4個を制御しています。

以前に出展したデザインフェスタで首からLEDマトリックス名札を下げていたのですが、お客さんから「その名札欲しい!」と何度も言われたので、なるべく簡単に作れそうな名札を…と思って開発しました。

回路図

回路図
ブロック図

回路は、以前作ったカウントダウンタイマーの応用です。

  • IchigoJam-RのOUT1~8で、8ビットの表示データをLEDマトリックスへ出力します。
  • OUT9~11の3ビット出力で、3to8デコーダIC・74138を制御して、LEDマトリックスの表示列を決めます。
  • 4個のLEDマトリックスのスキャンは、10進カウンタIC・4017の出力Q0~Q3を使って、4個の74138の内1個をイネーブルにしています。74138が最初のLEDマトリックスを0列(Y0)~7列(Y7)までスキャンすると(シンク出力なのでそれぞれのYnの出力がH→Lへ落ちる)、出力Y7はダイオード4個のANDゲートを通じて4017のクロック入力へつながっているので、4017のカウントが1つ進んで次のLEDマトリックスの表示へ進みます。4個目のLEDマトリックスのY7までスキャンされると4017のカウントが進んでQ4がL→Hになりますが、そのままリセット入力につながっているので出力がQ0に戻り、1個目のLEDマトリックスの表示へ戻ります。
    10進カウンタで切り替えているので、同じ仕組みで10個までのLEDマトリックスを制御できます(IchigoJam-R互換機のプログラム速度が間に合えば、ですが)
  • 4017のリセット入力はIchigoJam-RのSOUND出力にもつながっているので、表示プログラムの最初でBEEPを鳴らすと、4017にリセットがかかって1個目のLEDマトリックスの順番になります。

基板データ

*基板サイズが大きいので製作費・送料が上がります。ご注意ください。
*この基板データは、CC BYライセンスとします。どうぞご利用ください。

(C) 2023 Shiro Saito (https://www.ichigoaman.jp)

材料

↑ここまでのはんだ付けで、ファームウェア書き込み可能↑

↑ここまでIchigoJam-R互換機部分↑

↑はんだ付けここまで↑

プログラム0:テストプログラム

起動すると、ビープ音が鳴った後、LEDマトリックスのLEDが1個ずつ点灯して、行方向→列方向→次のマトリックスへ移動します。
ちゃんと全部点灯するか確認してください。点灯しないLEDがあったら、部品のはんだ付けを確認してください。

10 'TEST 
20 FOR P=1 TO 11
30 OUT P,0
40 NEXT
50 BEEP
60 FOR Z=1 TO 4
70 FOR Y=0 TO 7
80 FOR X=0 TO 7
90 M=1<<X
100 OUT M+Y<<8
110 WAIT 4
120 NEXT
130 NEXT
140 NEXT
150 GOTO 60

プログラム1:4文字表示

4文字の文字列をLEDマトリックスに表示するプログラムです。
20行目の文字列を変えると、表示される文字が変わります。

10 @ARUN:'*NAME
20 S="サイトウ"
30 VIDEO 0
40 FOR P=1 TO 11
50 OUT P,0
60 NEXT
70 BEEP
80 FOR C=0 TO 3
90 A=8*PEEK(S+C)
100 FOR B=0 TO 7
110 [C*8+B]=PEEK(A+B)
120 NEXT
130 NEXT
140 WAIT 10
150 FOR A=0 TO 24 STEP 8
160 FOR Y=0 TO 7
170 OUT [A+Y]+Y<<8
180 NEXT
190 NEXT
200 GOTO 150

カウントダウンタイマー

指定した年月日までの残り時間をカウントダウンするタイマー基板を作ってみました。
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