Maker Faire Bangkokで展示した「10sec Game」について

先日(2019/01/18-19)タイのバンコクで開催されたMaker Faire Bangkokに、スイッチサイエンスも出展しました。

f:id:ohki_s:20190725171413j:plain
真ん中へんが消えてるのは接触不良っぽいです

出展するからには何か展示しないと、ということで、2017、18年にMaker Faire Tokyoで展示したLEDパネルを利用した簡単なゲームを作ろうということになりました。あまり凝ったことは性能的にも時間的にもできないので、ボタンを連打してスコアを出すゲームにしました。プレイ時間は、短いと繰り返し遊ぶ人が出てきますし長いとダレるので10秒にしました。

何を作るかが決まれば、次は部品調達です。 連打されるものなので、ボタンは業務用のゲーム機でも使われるセ​イ​ミ​ツ​工​業のΦ30mmの物にしました。一個だけだと不安なのでたくさん買いました。機材を入れる箱はタカチの汎用金属(アルミ)ケースにしました。アルミなら加工も比較的簡単にできます。

制御用のマイコン基板は、MFTの機材から流用してArduino Mega 2560 R3を使いました。大したことやらないのになぜUnoにしないんだと思われるかもしれませんが、RAM上にLEDパネルの表示データを置く必要があるのでUnoだとRAMが足らないのでした。また会場ではなぜmicro:bitの方が高性能なのになぜArduinoを使うのかと聞かれたんですが(学生さんで、今micro:bitでプログラミングを勉強中と言っていた気がします)、前述の通り過去の資産があるのと、ビジュアルプログラミング環境で長いプログラムを書くのはつらいのと、なにより枯れた環境でさっさと作ってしまいたかったからです。特に3番目が重要ですね。

LEDパネルはAdafruitがNeoPixelと呼んでいるWS2812 RGB LEDのテープを敷き詰めたもので、解像度は横30×縦20の計600ピクセルです。色は(見て認識できるかどうかは別として)1677万7216色出せます。パネルには電源(DCジャック)とLED制御信号コネクタがつながるようになっていて、ACアダプタから電源を供給すればLED制御信号コネクタから電源が取れるので、ここからArduino Mega 2560 R3の電源を取ることにしました。そのままだと見にくいので、ホームセンターで窓に貼るスモークフィルムを買ってきて貼りました。おかげで炎天下でも数字を読めました。

f:id:ohki_s:20190725172238j:plain
シャッタースピードのせいかちゃんと写ってませんが

Arduino Mega 2560 R3とLEDパネルをつなぐために、バニラシールドを加工して接続用のシールド基板を作りました。動作試験程度ならブレッドボードでよいのですが、実際に使う時には面倒でもはんだ付けした基板を作った方が安心ですね。ボタンともこの基板で接続するのですが、コネクタを介することにしてボタンの交換ができるようにしました。コネクタは手元にいっぱいあったのでLEDパネルと同じコネクタです。ただLEDパネルとはオスメスを逆にして、間違ってつながないようにしました。さらにボタンを半透明のものにしたのでシールドにもLEDを取り付けました。

また、アルミケースにボタンの穴とケーブルを引き出す穴を開けました。ボタンの穴はΦ30mm、ケーブルの穴はACアダプタとLEDパネルのコネクタが通るよう、だいたいΦ20mmくらいで適当に開けました。手で触れるところではないですし見た目も関係ないので、精度は気にせず。

LEDパネルとArduino Mega 2560 R3をつなぐハーネス(ケーブル)も作りました。2mで作ったらArduino Mega 2560 R3が起動しなくなったので(おそらく線が長くて電圧が下がりすぎたんだと思います)、1mで作りました。

ACアダプタはいろいろ試してみて、秋月電子の5V/4Aのものがちょうどよかったので採用となりました。LEDテープのACソケット部分との接続がぐらぐらしているとここが発熱して恐いので、ちょうどいいものを探すのは大事です。

ソフトで苦労したことは、LEDパネルはLEDテープがつづら折り状に繋がっているので、0〜29番目の直下のLEDは59〜30番だということです。このままだと大変使いにくいので変換する関数を作って対応しました。以前作ったプログラムを改造というか建て増しして作ったので他にも全画面塗りつぶしとかスクロールとかいろいろ関数があって見通しは悪くなってしまいましたが、ともかく完成したのでよしとします。