SHIROのIchigoJam日記

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

カーリング

上田のパソコンクラブで「カーリングを作りたい」という子がいて、一緒に頭を悩ませながらプログラムを作りました。
ストーンの動きやルールはかなり簡略化していますが、勝つための戦略を考えるとかなり頭を使って面白いです。

遊び方

  • A、Bの2プレイヤーで、交互に8回ずつストーンを投げます。
  • 上の数字(ストーンを投げる強さ)が10~30の範囲で変化するので、スペースキーを押します。
  • その強さでストーンを投げます。ストーン移動中は、カーソルキーの上↑下↓でコースを操作できます。
  • 他のストーンに当たると、当たった場所で止まり、当てられたストーンが弾かれて進みます。弾かれる角度はランダムです。
  • 合計16個のストーンが投げられると、勝敗を判定します。中心の「+」マークに一番近いストーンのプレイヤーが勝ちです。
  • 点線にはさまれたエリアにある、勝ったプレイヤーのストーンの個数が得点になります。点線の手前・点線の後ろのストーンは無効です。
  • 公式ルールでは、以上の「エンド」を10回繰り返して、合計点数で勝敗を決めます。が、回数などは2人で話し合って決めるといいでしょう。

プログラムリスト

10 '*CURLING
20 CLV:CLS
30 LC 25,11:?"+"
40 FOR Y=0 TO 22
50 LC 22,Y:?"|":LC 28,Y:?"|"
60 NEXT
70 FOR T=1 TO 8
80 FOR S=0 TO 1
90 C=232+S
100 LC 0,0:?CHR$(C,65+S);"-";T
110 N=T*2+S-2:[N]=352
120 LC [N]:?CHR$(C)
130 GSB @STONE
140 NEXT
150 NEXT
160 E=200
170 FOR N=0 TO 15
180 X=[N]%32:Y=[N]/32
190 U=X-25:V=Y-11:D=U*U+V*V
200 IF D<E F=N:E=D
210 NEXT
220 S=F%2:C=232+S
230 LC 0,20:?CHR$(C,65+S);" WIN!"
240 P=0
250 FOR T=1 TO 8
260 N=T*2+S-2
270 X=[N]%32
280 IF X>=22 AND X<=28 P=P+1
290 NEXT
300 ?"SCORE=";P
310 BEEP 10,30:END
320 @STONE
330 L=10
340 @SPEED
350 L=L+1:IF L>30 L=10
360 LC 10,0:?L:WAIT 3
370 IF INKEY()!=32 GOTO @SPEED
380 X=0:Y=110:D=0:J=0
390 @LOOP
400 LC X,Y/10:?CHR$(D)
410 X=X+1
420 Y=Y-BTN(30)*2+BTN(31)*2+J
430 D=SCR(X,Y/10)
440 LC X,Y/10:?CHR$(C)
450 [N]=X+Y/10*32
460 WAIT 3
470 IF D=232 OR D=233 GSB @HIT
480 IF X<L GOTO @LOOP ELSE RTN
490 @HIT
500 BEEP
510 FOR M=0 TO 15
520 IF [M]=[N] H=M:M=15
530 NEXT
540 N=H:X=[N]%32:Y=[N]/32*10
550 D=C:C=232+N%2:J=RND(11)-5
560 IF X<L-1 L=L-1
570 IF X=L L=L+1
580 RTN

フットワーク練習機

バドミントンをやっている人から「ホームポジションから前後左右をランダムに指示して、フットワークを練習する基板が欲しい」とリクエストがあったので、作ってみました。
中央のLEDと8方向のLED(ランダム)が交互に光ります。
紹介動画はこちら。

www.youtube.com

回路図

  • NANDゲート2個で組んだ発振回路で、ベースのクロックを生成しています。VRを回すと、クロックの周波数=LED点灯のスピードが変えられます。
  • シフトレジスタ・4015の上半分とNANDゲートなどで線形帰還シフトレジスタを組んで、疑似乱数を出力しています。
    4ビットの線形帰還シフトレジスタは、本来はこのようにXORゲートで帰還させます。
    (0が連続しないように、ここではXNORゲートにしています)

  • XORゲートの等価回路


を元にして、NANDゲートとダイオードの組み合わせでXNORゲートを作っています。

  • シフトレジスタの出力3ビットを、3ビット-8ビットデコーダ・74138へ入力して、8方向のLEDを光らせています。
  • シフトレジスタ・4015の下半分は、中央のLED点灯/8方向のLED点灯の2フェーズを交互に切り替えるスイッチャーとして使っています。

基板データ

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

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

IchigoJamプログラム版


IchigoJamでもやってみました。中央に●が表示された後、8方向にランダムに●が表示されます。
十数行のプログラムで実現できます。やっぱりコンピュータってスゴい。

10 '*RANDAM8
20 CLV:VIDEO 3:CLS
30 LET [0],87,0,7,14,94,174,167,160,80
40 LC [0]:?CHR$(233);
50 WAIT 60
60 LC [0]:?CHR$(0);
70 Z=RND(8)+1
80 LC [Z]:?CHR$(233);
90 BEEP
100 WAIT 60
110 LC [Z]:?CHR$(0);
120 GOTO 40

時計シールド2025

以前にIchigoJam用の時計シールド(拡張基板)を作ったのですが、
www.ichigojaman.jp
カウンタIC・4026内蔵の7セグメントLEDが入手できなくなってしまったので、シフトレジスタ内蔵の7セグメントLEDを使ったシールドを新たに作りました。

7セグメントLED×4桁で、時:分を表示できます。
RTCモジュールを載せているので、IchigoJamの電源を切っても正確な時間を保持します。
また、ジョイスティックやボタンも載せているので、それらで設定するアラーム機能なども搭載できます。

回路図


シフトレジスタ・74595を内蔵した7セグメントLEDモジュール×4桁を、IchigoJamのポートにつないでいます。
つなぎ方は以下のとおりです。

OUT1 分データ
OUT2 分クロック
OUT3 時データ
OUT4 時クロック
OUT5 分~OE(0=表示、1=消灯)
OUT6 時~OE(0=表示、1=消灯)
OUT8(IN1) ラッチクロック
BTN ボタン(タクトスイッチ)
LED LED
IN2(ANA2) ジョイスティック垂直方向

基板データ

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

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

プログラム

時刻設定プログラム

以前に福野さんが公開した、RTCモジュールへ時刻を設定するプログラムです。
最初にこのプログラムを使って、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

時計プログラム

基本的な時計プログラムです。7セグメントLEDで時:分を表示します。
モニタでは時:分:秒を表示します。

10 @ARUN:'*CLOCK
20 CLV:VIDEO 3:CLS:CLO
30 [0]=`11111100
40 [1]=`01100000
50 [2]=`11011010
60 [3]=`11110010
70 [4]=`01100110
80 [5]=`10110110
90 [6]=`10111110
100 [7]=`11100100
110 [8]=`11111110
120 [9]=`11110110
130 @LOOP
140 GSB @TREAD
150 GSB @PRTIME
160 WAIT 6
170 GOTO @LOOP
180 @PRTIME
190 D=1:C=2:E=M
200 GSB @PRDIGIT
210 D=3:C=4:E=H
220 GSB @PRDIGIT
230 LC 0:?DEC$(H+100,2);":";DEC$(M+100,2);":";DEC$(S+100,2)
240 RTN
250 @PRDIGIT
260 F=[E/10]:GSB @PRSEG
270 F=[E%10]:GSB @PRSEG
280 OUT 8,1:OUT 8,0
290 RTN
300 @PRSEG
310 B=1:FOR I=1 TO 8
320 OUT D,(F&B)>0
330 OUT C,1:OUT C,0
340 B=B<<1
350 NEXT
360 RTN
370 @TREAD
380 POKE#700,0
390 I=I2CR(#68,#700,1,#701,7)
400 H=PEEK(#703):H=H>>4*10+H&15
410 M=PEEK(#702):M=M>>4*10+M&15
420 S=PEEK(#701):S=S>>4*10+S&15
430 RTN

300~360行が7セグメントモジュールで数字を表示する部分です。シフトレジスタ制御なので、データポートに0(消灯)/1(点灯)をセットして、クロックポートにクロックパルスを送って1ビット送信します。それを8回繰り返して、8ビット=数字1桁分のデータをバケツリレー式に送ります。2桁の数字表示データを送ったら、最後にOUT8へラッチクロックを送って(280行)点灯させます。

アラームクロック


基本的な時計プログラムに、アラーム機能を追加しました。
プログラム容量がギリギリなので、かなり圧縮したプログラムになっています。

アラーム設定方法
  • 時計表示中にボタンを押すと、アラームセットモードになります。
  • 最初に時設定になるので、ジョイスティック上下で数字を設定して、ボタンを押します。
  • 次に分設定になるので、ジョイスティック上下で数字を設定して、ボタンを押します。
  • アラームを設定すると、モニタ画面に設定したアラーム時:分が表示されます。
  • 設定した時刻になるとアラームが鳴ります。ボタンを押すと止まります。

※電源を切るとアラーム設定時刻は消えてしまいます。
※アラームを一度止めると、翌日の同じ時刻には鳴りません。

10 @ARUN:'*ALARM CLOCK
20 CLV:VIDEO3:CLS:CLO
30 [0]=`11111100
40 [1]=`01100000
50 [2]=`11011010
60 [3]=`11110010
70 [4]=`01100110
80 [5]=`10110110
90 [6]=`10111110
100 [7]=`11100100
110 [8]=`11111110
120 [9]=`11110110
130 GSB310:GSB170
140 IFBTN()GSB370
150 IFH=X&&M=Y&&AGSB480
160 WAIT6:GOTO130
170 D=1:C=2:E=M:GSB210
180 D=3:C=4:E=H:GSB210
190 LC 0:?DEC$(H+100,2);":";DEC$(M+100,2);":";DEC$(S+100,2)
200 RTN
210 F=[E/10]:GSB250
220 F=[E%10]:GSB250
230 OUT8,1:OUT8,0
240 RTN
250 B=1:FORI=1TO8
260 OUTD,(F&B)>0
270 OUTC,1:OUTC,0
280 B=B<<1
290 NEXT
300 RTN
310 POKE#700,0
320 I=I2CR(#68,#700,1,#701,7)
330 H=PEEK(#703):H=H>>4*10+H&15
340 M=PEEK(#702):M=M>>4*10+M&15
350 S=PEEK(#701):S=S>>4*10+S&15
360 RTN
370 OUT5,1:WAIT30
380 D=3:C=4:E=X:GSB210
390 J=ANA(2):X=X-(J>768)*(X>0)+(J<256)*(X<23)
400 WAIT10:IF!BTN()GOTO380
410 OUT5,0:OUT6,1:WAIT30
420 D=1:C=2:E=Y:GSB210
430 J=ANA(2):Y=Y-(J>768)*(Y>0)+(J<256)*(Y<59)
440 WAIT10:IF!BTN()GOTO420
450 OUT6,0
460 LC0,2:?X;":";Y:A=1
470 RTN
480 A=0:BEEP10,30:WAIT40:IF!BTN()CONT
490 RTN