先日、こんなツイートを目にした。
#河濯山教室 22.11.25
— PCN武生 (@pcntakefu) November 28, 2022
初めての子がきてくれたり、マイカムロボ製作中だった子のPGロボが完成したり、カニロボPGを体験してみたり、4人でフルカラーLEDを紫色に光らせるにはどうしたら良いか考えてみたり、いろんな子がいろんなことをしていた教室でした✨
多様な感じが良い👍#IchigoJam pic.twitter.com/mxiTBcww5U
そこで、フルカラーLEDを紫色に光らせるにはどうしたら良いかを考えてみた。
紫色といえば高城れに…?
あまり複雑なことは考えたくないので、「無限の猿」を使うのが良さそうだと考えた。
無限の猿
無限の猿 (と自分が呼んでいるもの) は、以下のアルゴリズムである。
- 解を何個か適当に生成する
- 生成された解の中から「一番いい」ものを選ぶ
- 選んだ解をちょっとだけ変えて、他の解を何個か適当に生成する
- 2に戻る
これを繰り返していくと、けっこういい感じの解になりがちである。
無限の猿でWS2812を設定する
WS2812は、マイコン内蔵(電源に加えて信号線1本で制御可能)のフルカラーLEDであり、IchigoJam 1.4.0 以降で制御に対応している。
今回は、このWS2812が8個連なったハードウェアを用い、色の設定値に対して無限の猿を適用する。
具体的には、以下のプログラムを用いる。
10 ' イロザル
20 FOR I=0 TO 23
30 [I]=RND(256)
40 NEXT
50 WS.LED 8
60 K=INKEY()
70 IF K<48 OR 56<K GOTO 60
80 IF INKEY()<>0 GOTO 80
90 IF K=48 ?"RESET":GOTO 20
100 K=K-49
110 ?[K*3];",";[K*3+1];",";[K*3+2]
120 FOR I=0 TO 7
130 IF I=K GOTO 200
140 FOR J=0 TO 2
150 V=[K*3+J]+RND(63)-31
160 IF V<0 V=0
170 IF V>255 V=255
180 [I*3+J]=V
190 NEXT
200 NEXT
210 GOTO 50
20~40行目で初期解をランダムに生成し、50行目でそれをLEDに反映させる。
さらに、60~80行目でどの色が「一番良い」かを1~8のキーで選択させている。
0のキーが押された場合は、リセットしてまた初期解をランダムに生成する。(90行目)
1~8のキーが押された場合は、その設定値を出力し(110行目)、
「選ばれた解から少し変えた解」をランダムに生成する。(120~200行目)
なお、設定値は「緑、赤、青」の順番である。
WS2812の電源を接続し、DINをIchigoJamのLED端子に接続してから、プログラムを実行する。
例えば、初期解はこのようにバラバラな色になっている。
(そのままだと明るすぎたので、ティッシュを巻いている)
この中から紫色に近いと思う色を選ぶと、このようにそれに近い色が生成される。
これを繰り返していくことで、良いと感じる色に近付いていけることが期待できる。
おまけ
今回のプログラムのJavaScript版を作成した。
上に並んでいる8個の四角をクリックすることで、色を選択する。
色を選択すると、近い色が生成されるとともに、選択した色とそのカラーコードが下に表示される。
See the Pen Color Monkey by MikeCAT (@mike_cat) on CodePen.
おわりに
IchigoJamはjig.jpの登録商標です。