SHIROのIchigoJam日記

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

自動クリスマスツリー2025

※2025/11/29:回路・基板更新、クリスマスツリープログラム追加

以前作った自動クリスマスツリー
www.ichigojaman.jp
を若干変更しました。

※2025/11/29変更

スイッチをONにすると、8個のLEDがランダムに光ります。
電子工作教室のネタとしていかがでしょうか。

回路図


※2025/11/29更新

トランジスタ2個の弛張発振回路で約1Hzのクロック信号を生成して、シフトレジスタ・4015のクロック端子へ入力します。
4015の出力が1ビットずつシフトして、8個のLEDが光ります。
その出力の一部をXORゲート・4030を通して、4015のシリアル入力へ帰還しています(線形帰還シフトレジスタ)。

XORゲートの真理値表。入力A,Bが同じ時はL、違う時はHを出力する。
BASICなら「Y=A^B」。

そのままの回路だと電源ON直後は4015の出力が全てLで、それらをXOR演算したシリアル入力もLのままでLEDがいつまでも光らないので、余ったXORゲート1個でVCC(=H)とのXORを取って反転させています(=NOT、インバータと同じ動作)。

基板データ

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

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

材料

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

疑似乱数プログラム


今回の回路と同じ線形帰還シフトレジスタの疑似乱数プログラムをIchigoJamで作ってみました。
1秒に1ビットずつシフトして、8ビットの疑似乱数(2進数と10進数)を表示します。

10 '*LFSR
20 CLV:CLS
30 @LOOP
40 D=0
50 FOR B=7 TO 0 STEP -1
60 ?[B];
70 C=[B]<<B
80 D=D+C
90 NEXT
100 ?"=";D
110 A=[7]^[5]
120 A=A^[4]
130 A=A^[3]
140 A=!A
150 WAIT 60
160 FOR B=7 TO 1 STEP -1
170 [B]=[B-1]
180 NEXT
190 [0]=A
200 GOTO @LOOP

クリスマスツリープログラム


ツリーの8個のLEDがランダムに光るプログラムです。

10 '*XMAS TREE
20 CLV:VIDEO 3:CLS
30 ?"      O      "
40 ?"     * *     "
50 ?"    O   O    "
60 ?"   *     *   "
70 ?"  O       O  "
80 ?" *         * "
90 ?"O*****O*****O"
100 ?"     * *"
110 ?"     * *"
120 LET [0],#60,#42,#82,#24,#A4,#06,#66,#C6
130 GSB @LIGHT
140 @LOOP
150 Z=2
160 GSB @LIGHT
170 WAIT 60
180 GOTO @LOOP
190 @LIGHT
200 FOR L=0 TO 7
210 LC [L]/16,[L]%16
220 ?CHR$(232+RND(Z))
230 NEXT
240 RTN

簡易入館者カウンター

新しいセンターの玄関に、IchigoJam+赤外線人感センサーを使った簡易入館者カウンターを付けました。

LCDシールドに付けた液晶画面で、時刻や人数カウントを表示します。
時刻は、以前に作った時計モジュールと同じく、RTCモジュールから読み出します。

LCDシールド

LCDシールドはかなり昔に作ったのですが、これまでブログで書いていなかったので改めて掲載します。
IchigoJamのSWITCHコマンドで切り替えて、小さな液晶に画面を表示できます。

回路図

基板データ

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

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

材料

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

※以下はEEPROMを使わない場合は不要です。

※以下は赤外線人感センサーです。使わない場合は不要です。

入館者カウンタープログラム

10 @ARUN:'*Counter*
20 CLV:SWITCH 1:CLS:OUT 5,-1
30 GSB @TIMEREAD
40 ?"*START ";DEC$(H+100,2);":";DEC$(M+100,2)
50 @LOOP
60 I=IN(10):LED I
70 IF I=1 AND J=0 GSB @COUNT
80 J=I
90 GOTO @LOOP
100 @COUNT
110 C=C+1
120 GSB @TIMEREAD
130 LC 0,2
140 ?DEC$(H+100,2);":";DEC$(M+100,2);" ";C
150 WAIT 180
160 RTN
170 @TIMEREAD
180 POKE #700,0
190 IF I2CR(#68,#700,1,#701,7) ERR
200 X=PEEK(#703)
210 H=X>>4*10+X&15
220 X=PEEK(#702)
230 M=X>>4*10+X&15
240 X=PEEK(#701)
250 S=X>>4*10+X&15
260 RTN

カーリング

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

遊び方

  • 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