この記事ははJLCPCBの提供でお送りします。
JLCPCBとは
jlcpcb.com (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)
JLCPCBとは、プリント基板製造などで有名な香港の企業です。
日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。
値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。
この記事の作例もJLCPCBに基板を発注して実現しました。
ここまでの流れ
前回の記事で、ダイソーの300円テトリスの中身を乗っ取り、画面に好きな画像を出すことが出来ました。
しかし、基板の設計に失敗し、肝心のマイコンを基板に搭載することが出来ず、代わりにArduino UNOを外付けして制御することになってしまっていました。
今回はこの話の続きです。
失敗基板が活用できたわけは?
前回の失敗基板ですが、「こんなこともあろうかと」という精神で用意した仕掛けが、うまく利用できたために、完全なボツ基板とはならず、液晶制御の実験を行うことが出来ました。
この仕掛けというのは、なるべくICのピンを引き出しておくことです。
今回はHT1626というLCD制御用の100ピンのICを使いましたが、この基板では、このICのピンをすべて引き出しています。 利用しないCOM、SEGの制御用のピンは表面実装用のパッドに、利用しているCOM、SEGや、制御用のピンはスルーホールのパッドに引き出しています。
ここで、制御用のピンを引き出していたおかげで、外付けのArduino UNOから簡単に液晶を制御できたという言うわけです。
そのほかにもATMega328Pの未使用ピンや、ICSP端子、Arduino Mini互換の書き込みポートなども引き出しています。
修正版の基板発注
失敗基板の原因はメインマイコンであるATMega328Pの型番間違え、だったので、単純に正しい型番を指定し、再度配線を引き直すだけで再発注できました。
今回もJLCPCBに基板の製作を依頼しました。
なんとなく今回は紫色です。
色を変えることで基板の取り違えを防ぐという目的もあります。
緑と値段は変わりませんが、製作にかかる時間が少し長くなるようです。
修正版基板の実装
配線以外は全く同じなので、実装は前と同じことをやるだけ、なのですが、HT1626は100個もピンがあるICなので、それなりに大変です。 出来た!と思ってもいくつかのピンがうまくはんだ付けできていないなど、苦労がありました。
書き込み用ポートの増設
基板が実装出来たら、いよいよ組み込みです。 今回はメインマイコンも基板上に実装できたので、300円テトリスのケースの中にすべて収めることが出来、一見元の300円テトリスのようだが、中身はArduino互換マイコン、というのが実現しました。
しかし、このままではArduinoとして書き込みするためには、ケースを開いて中の書き込みポートとパソコンをつなげる必要があります。
ということで、ケースを開かずに簡単にArduinoとして書き込みができるように、ケースに少し穴をあけて、書き込み用のピンを引き出すことにしました。
あまり深く考えていなかったのですが、Arduino Mini互換の書き込みポートがちょうどよい位置にあったので、ピンソケットを90度曲げたものを取り付けて、ケースを少し削ることで、ほとんど見た目に影響なく、書き込み口を取り付けることが出来ました。
この書き込み口にUSB-シリアル変換モジュールを差し込むことで、Arduino UNOのように簡単に書き込みできます。
日本語表示の実験
ここまで来たら、後はソフトウェアの世界です。
300円テトリス液晶の解像度は10×20で、小さいながら日本語のフォントも表示できそうです。
ということで、この界隈では有名な「美咲フォント」を使うことにします。
Arduinoで簡単に美咲フォントを扱うためのライブラリがあるので、これを使わせてもらうと・・・
美咲フォントを使ってダイソー300円テトリスに日本語表示ができた!! pic.twitter.com/v9PHglNK6b
— ina_ani@3歳児のパパ (@ina_ani) 2022年12月5日
ほら出来た。 縦書きで2文字とちょっと1画面に表示できるので、これをスクロールして表示しています。
スクロールさせて気づきましたが、この液晶は残像が結構長く残ります。そのためちょっと早めに画面を切り替えると、うまく文字が読めないという現象が起きました。
ということで、スピード感のあるゲームなどをこれで実行するのは厳しそうです。
ボタンとスピーカーの実験
配線の確認もかねて、ボタンを押すとスピーカーから音階が流れるようなプログラムを作ってみました。 9個ボタンがあるので、1オクターブ以上ならせます。慣れればこれで1曲演奏できそうです。
キーとスピーカーとテスト。
— ina_ani@3歳児のパパ (@ina_ani) 2022年12月5日
楽器としても使えるね!
マイコンの足が1つ浮いてて一度バラした pic.twitter.com/HAZU00vUBe
十字キーの部分はマトリクス配線になっていたので、キースキャンのロジックを実装する必要がありました。
回転ボタンは一見4つキーがあるように見えますが、全部1つのキーとして扱われます。
簡易ライブラリの実装
前回の記事で、テトリスのブロック表示部分のロジックはできていたのですが、右側のスコア表示の部分はまだ処理が作れていませんでした。
メモリマップのメモを頼りにこの部分を実装し、setScore(100)
みたいな関数で簡単に設定できるようにします。
ちなみに、この液晶のスコア表示、右側の00の部分はこれで1つのセグメントとなっており、どうやっても末尾は00としか表示できません。 また、テトリス坊やの体と、SPEED、LEVELの表示も1つのセグメントとなっており、これらはまとめてON/OFFしかできません。
セグメントを節約しつつ表示要素を増やすという涙ぐましい努力なんですかね?
さらに、前の実験で作ったキースキャンのロジックなどもライブラリとして提供するようにしました。
ここまでできると、300円テトリスを使ったゲーム作りが簡単にできるようになります。
Flappy Bird風ゲームの実装
ということで、かねてからの目的であった、300円テトリスで、自作のゲームを動かす挑戦です。
といっても、画面解像度が10×20しかないので、この画面で遊べるゲーム、となるとかなり絞られます。
今回はよくあるFlappy Bird風のゲームを作ってみました。
内蔵を入れ替えた #ダイソー 300円テトリスでFlappyBird風ゲームを自作してみた pic.twitter.com/Fq70sb3FWy
— ina_ani@3歳児のパパ (@ina_ani) 2022年12月14日
ボタンを押している間だけ上昇し、離すと重力の影響で下に落ちてしまう磁気を操作し、迫りくる障害物をよけるゲームです。
加速度のある動きは、300円テトリスの既存のゲームには存在しないので、ちょっと面白いかな?と思いこれを選びました。
まぁ、普通に遊べますね。
ドット絵エディタ実装とハーフトーンの実験
ゲーム以外も何か作れないか?と考えて作ってみたのが、ドット絵エディタです。
カーソルキーでポインタを動かして、ドットを打ち込むことが出来ます。 さらに、ONとOFFの中間のハーフトーンの表現もできるようにしてみました。
ハーフトーンなんて言ってますが、単に高速にON/OFFしているだけです。 一応ハーフトーンの表示はできますが、あまり視認性は良くありませんでした。
ドット絵エディタを実装したので少し遊ぶ。
— ina_ani@3歳児のパパ (@ina_ani) 2022年12月15日
下の列にハーフトーンを実験してる。
まぁできなくはないが視認性が悪い pic.twitter.com/nNUwFSAME6
かんたん作曲ツールの実装
もう一つ、ゲーム以外の作例として、かんたん作曲ツールも作ってみました。
ドット絵エディタと仕組みはほとんど同じなのですが、並べたドットに対応して音が鳴るというものです。 和音にはまだ対応しておらず、1音のみを8個並べることが出来るだけですが、プログラムを改良すれば、ちょっとした曲作りに使うものは作れそうです。
かんたん作曲ツールを作ってみた。
— ina_ani@3歳児のパパ (@ina_ani) 2022年12月16日
まだ和音には未対応
音も聞いてね pic.twitter.com/95jOZmRYIl
DeepSleepの実験
この300円テトリスの筐体には電源の線をON/OFFするスイッチがなく、ON/OFFはモーメンタリなボタン(要は押している間だけ導通するスイッチ)で実現されています。
これを再現するには、ATMega328のDeepSleep機能を使うのがよさそうだったので、これを試してみました。
スリープへの移行とボタン押下による復帰 の記事などを参考にしながら、Deep Sleepモードをに移行させてみました。もちろんHT1626の機能もOFFにします。このための命令がHT1626には用意されていたので、ATMega328がスリープする直前に、HT1626も機能をOFFにする命令を発行しています。
地味だけどDeepSleepの実験をした。
— ina_ani@3歳児のパパ (@ina_ani) 2022年12月18日
電源を落としてる風だけど、Sleepしてるだけで、メモリの内容は保持されてる。
消費電力などは未測定 pic.twitter.com/coeifc6eqc
DeepSleepは電源断とは違い、メモリの内容が保持されるので、上の動画のように編集中のドット絵はそのまま保持されています。
雑に電力を測定すると、通常起動時は6mA程度、DeepSleep時は0.03mA程度の電流が流れていました。
ソフトウェアを作ってみて
メインマイコンのATMega328はFlash32K、RAMが2Kと、結構非力なマイコンですが、ゲーム開発において、メモリ消費の大半を占めるのがグラフィックスであることを考えると、このゲーム機は画面が10*20しかないので、結構余裕があるように感じます。
上記のソフトを作る時もメモリのことはほとんど気にせず、プログラミングして、特に問題は起きていません。
ただ、当然その反動として、表現力が非常に低いのは課題です。
英字すら2,3文字しか表示できないので、画面に文字で説明を入れることが出来ませんし、この解像度だと、キャラクタも1ドットくらいの表示となるため、ゲームキャラクタの個性なども出すことが出来ません。
逆に考えると、この環境で面白いゲームが作れれば、かなり根源的に面白いといえるのでは?という気もします。
言うまでもなくテトリスはそういったゲームの1つですが、さて、自分はそういうゲームを考え付くことが出来るだろうか?なんて思いながら開発をしていました。
まとめ
1度は基板の設計ミスで思うように動きませんでしたが、2度目の挑戦で、当初予定していたものが完成し、いくつかのソフトウェアを実装して、遊ぶことが出来ました。
300円テトリスの改造を通して、多くの知識を得ることができ、また自分の新たなおもちゃが増えました。
この知見を活かすと、任意の液晶付きのガジェットを、自分の好きな仕様で動かすことが出来ます。また一つ100円均一ショップに行くのが楽しみになってしまいました。
この300円テトリスの改造、どの程度読者の方が興味を持っているかわからないのですが、キットとして頒布する、と言ったら欲しい人いますか? この記事のコメントや、Twitter( http://twitter.com/ina_ani )などでフィードバックをいただけると、今後の展開を考えるうえでの参考になりますので、よろしくお願いします。