300円テトリスに好きな画像を出すまでの道のり

この記事ははJLCPCBの提供でお送りします。

JLCPCBとは

jlcpcb.com (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)

JLCPCBとは、プリント基板製造などで有名な香港の企業です。

日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。

値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。

この記事の作例もJLCPCBに基板を発注して実現しました。

300円テトリス

最近は100円均一ショップで電子ゲームが手に入るようになっているようです。

まぁさすがに100円とはいかず、300円のようですが・・

さて、この300円テトリスですが、好きなゲームをプログラミングして動かせるようにできないものでしょうか?

そんな素朴な思いからこのプロジェクトは始まりました。

分解してみる

何はともあれ分解してみます。

ねじを数本外すだけで簡単に分解できます。

メインとなる基板はこれで、液晶の後ろに固定されています。

メインの処理はこの黒い樹脂(いわゆるCOB)の中のようです。

ここがプログラム可能なマイコンなどであれば、HACKのしようもあったのかもしれませんが、COBでは手出しができません。

液晶と基板の接続は縦方向にのみ信号を通す導電ゴムで、ゼブラコネクタと呼ばれたりするものです。

基板の設計を始める

いつもだいたいこの辺であきらめるのですが、今回はスポンサーもついているので、ちょっと基板を設計してこの300円テトリスを乗っ取るという挑戦をすることにしました。

やりたいのは、メイン基板と互換性のあるプログラム可能な基板を作り、ごっそりそれを入れ替えることです。

さて、この基板を作るにあたっての作業は意外とたくさんあります。順番に説明していきます。

液晶の仕様のリバースエンジニアリング

液晶はゼブラコネクタで基板と接続されていますが、どのような信号がやり取りされているか不明です。

制御を乗っ取るにあたり、この液晶の仕様を知る必要があります。

この液晶はいわゆる「LCD」と呼ばれるもので、この知識があると解析はそこまで難しいものではありません。

LCDというのは2極間の電位差が生じていると光を通さなくなるいわゆる「液晶」を使った表示機です。

この液晶をセグメントに区切って、数字や、テトリスのブロックを表現しているのです。

素直にすべてのセグメントに直接配線すると配線数が膨大になってしまうので、マトリクス状に配線されることが多いです。

これらの配線はCommonとSegmentと呼ばれたりします。

ここまで聞くと、いわゆるドットマトリクスLEDと同じかな、と思うのですが、液晶は電位差を与えれば光を通さなくなるのですが、長く電位が偏った状態が続くと急速に劣化してしまいます。そのためパルスを使って制御する必要があります。

このLCDを制御するパルスの生成はマイコンにその機能があるものや、専用ICを使う方法、汎用マイコンのGPIOを使い制御する方法などがあります。

制御の手法はともかく、ここまでの知識でこの300円テトリス液晶の仕様を解析することにします。

ちょうど家に簡易オシロスコープがあるので、液晶とゼブラコネクタで接続しているピンに来ている信号を見てみることにします。

接続しているパッドは18個のものが2列、計36個です。

おそらくこの36個のパッドがそれぞれ、CommonだったりSegmentだったりするのだと思います。

ということで信号を見てみると・・・ピンによって信号は様々なのですが、明らかに傾向が違う2種類のピンがあることがわかりました。

10個並んだピンは4段階の電圧を行ったり来たりするようなパルスを出力していました、残りの26ピンは3段階の電圧を行ったり来たりするようなパルスか、もしくは全くパルスが出ていないものでした。

Commonと思われる信号

Segumentと思われる信号

LCDの制御の方式はいくつかあるようでデューティーやバイアスといったパラメータで表現されるようですが・・・

ここではそんな知識はなくとも2種類の信号が出るピンがあったということがわかればまぁOKです。

一般的にCommonのピンの方が数が少ないので、おそらくCommonが10ピンと、残りの26ピンがセグメントだと見当がつきました。

10*26=260でセグメントの総数としてもおおむね、この300円テトリスの画面のセグメント数と一致しそうな雰囲気です。

ちなみにこのテトリスの液晶、非常に多くの安価なテトリスゲームで使用されており、右下にかわいい「坊や」がいるので、「テトリス坊やの液晶」なんて呼ばれていたりも・・(どこかで聞いた気がするのですが、ソースが見当たらず・・)

(https://s.click.aliexpress.com/e/_DmWdhkR から転載)

制御方式の決定

さて、解析の結果この液晶はCommonが10本、Segmentが26本あることがわかりました。

これを制御する仕組みを考えます。マイコンで制御するとなると36個信号線が必要で、例えばArduino UNOなどでは足りません。 また仮に信号線が足りたとしても、液晶制御用のパルスを生成するロジックを自前で実装する必要があり、面倒そうです。

ということで、今回は専用ICを探すことにします。

しかし普通のLCD制御用のICはCommonが4本や8本のものがほとんどで、それ以上のものがなかなか見つかりませんでした。 あきらめず探していると1つだけありました。それが、Commonが16本利用できるHT1626というICです。

Holtek

正直16本も不要なのですが、これよりCommonが少ないもの、となると8本のものしかないので仕方がありません。

そしてこのIC、足が100本もあります・・ はんだ付けが大変そうです・・

まぁともあれこれで制御方式の目途が立ちました。

液晶制御とは関係ない部分

このボードは液晶制御ICのほかにメインのCPUも搭載しています。

今回利用するのはArduinoでおなじみのATmega328です。DIPの部品だと300円テトリスの筐体に入らなそうなので、TQFPパッケージのものを利用します。

300円液晶の液晶下にある4つのボタンの入力もこの基板でセンシングします。

といっても、ボタンの裏に導電ゴム付きのラバードームがついているので、これが接触したら導通するようにくし形のパターンを基板上に露出させればOKです。

ここまでの部品は最低2.8Vで動くので、今回はレギュレータを使わず300円テトリス筐体の電池ボックスに入る乾電池2本の3Vを直接繋げて制御することにしました。部品点数も少なくなるので作るのが簡単になります。

シンボル・フットプリントの作成

液晶はゼブラコネクタを介して基板と接続されています。

作成する基板にもこのゼブラコネクタに信号を伝えるためのパッドを用意する必要があります。

KiCADのフットプリントウィザード(今回初めて存在を知りました)の、FPCコネクタを使って、パッドの数やサイズを合わせて、不要な要素を削除しました。

で、できたものが↓です。

明るい紫の矩形はソルダーマスク除外の指定です。これをしておかないとソルダーマスクされてしまい、ゼブラコネクタと導通させることが出来ません。

液晶制御用のHT1626もKiCADのライブラリに存在していないため、モジュールとフットプリントを作る必要があります。

手はんだしやすいようにパッドは長めにしました。

液晶下のボタンについても、適切な大きさのくし形のフットプリントの作成が必要です。

こちらもフットプリントウィザードの、静電容量タッチセンサーのパターンを少し改造して作りました。

こちらもソルダーマスク除外の指定を忘れないようにします。

論理回路図の作成

ここまでのところで、利用する部品が決まりました。

これらの論理的は配線をKiCADでデザインします。

LCD制御のためのHT1626は配線は多いですが、ほとんどが液晶のゼブラコネクタに直結なので回路は単純です。

基板に間違いがあったときにも、少しでも検証ができるように、液晶のゼブラコネクタ経由での信号線や、HT1626のすべてのピンを拡張端子として引き出しました。 これにより最悪の場合ブレイクアウトボードとして利用できます。

サイズ調整と実体配線図の作成

この乗っ取り基板は、サイズがとても重要です。

ゼブラコネクタ、固定穴、基板サイズが適切でないと、300円テトリスの筐体に収めることが出来ません。

ということで、本体基板のサイズをあれこれ測って、それをLibreCADにメモしました。

このメモしたデータをKiCADにインポートし、これをもとに部品の位置合わせや基板外形をデザインしました。

部品の配置が終わったら、配線を行いますが、この部分はFreerouterで自動配線しました。

最終サイズ確認

設計が終わった後、基板データをPDFで出力し、コンビニで印刷したものを、はさみで切り取り、実際の300円テトリスの筐体にはめてみて、大きさに問題がないかを念入りに確認しました。

盛大に穴の位置がずれていることに気付きました。危ない危ない・・

部品購入

マイコンなどは家にすでにあったのですが、今回初めて利用するLCD制御用のICであるHT1626については、家になかったので、基板発注の前にAliExpressで購入しました。

届いてみてびっくり!パッケージが期待したものとは違います。

用意していたフットプリントは25×25の100ピンのICだったのですが、実際に届いたものは 30×20ピンのICでした。

調べてみるとHT1626は同じ型番で2種類のデータシートが存在しており、それぞれピンの配置が異なっていることがわかりました。

事情は分かりませんが、これは罠でした・・

まぁ買ってしまったので今回は30×20ピンを使うこととして、フットプリントを作り直しました。

そしてこれ、フットプリントウィザードだとこのような比率が1:1でないパッケージは作れないようで、泣く泣く手で配置しました。 (プログラムでやったほうが良かったなぁ・・)

基板発注

基板もJLCPCBに発注しました。

サイズが10cm角以内だったので非常に安く済みました。

5枚で送料も入れて・・$3!! 安いですねー

動作確認

基板が届いたら早速動作確認です。まずはマイコンをはんだ付けして、ICSP端子からファームウェアを書き込む・・・・

全く動きません

途方に暮れて、配線を確認すると・・・

やっちまいました・・・

論理回路図ではDIP部品用のシンボルを使っていたにもかかわらず、フットプリントをTQFPにしてしまっていたのです・・・

大半の部品がそうであるようにATmega328もDIP部品とTQFP部品はピンの番号に対応する役割が違います(そもそもピン数が違います)

ということで、この基板にATmega328を搭載して動かすことは難しいことがわかりました・・・

悲しいですが気を取り直して、次はHT1626の動作確認です。

基板上のマイコンは前述のように利用できないので、基板の外のArduino UNOから外出ししておいたHT1626の制御用のピンを使って制御してみます。

まずは液晶を取り付けずに、メモリに値を書き込み、それが読み取れるかを確認します。

(はんだ付け不良があり、何度か失敗したものの・・・)確認できました。

その後300円テトリスの液晶を基板に押し付けて確認すると、メモリに対応するセグメントが黒く表示されることが確認でき、この基板がある程度は使い物になることが確認できました。よかった。

メモリマップの作成

HT1626は内部にメモリを持っており、そのメモリに読み書きすると、メモリ番地に対応したセグメントが黒くなる、という動作をします。

今回雑にCommonとSegmentの種別のみを頼りにテキトーに配線したため、300円テトリスの画面とメモリの番地が結構おかしなことになっています。

ということで、電子ノートを取り出して、メモリ番地と液晶のセグメントの対応をひたすら確認します。

順にメモリの中身に1を書き込んでいき、メモリ番地をシリアルコンソールに出すプログラムを用意し、液晶を見つつ、セグメントが黒くなった番地をメモすることで、メモリマップを完成させました。

デモプログラムの作成

メモリマップが出来ればあとは、プログラムするだけです。

無事、配列に格納したビットマップを300円テトリスの液晶に表示することが出来ました。

次にやること

取り敢えずこの基板はマイコン部分に問題があり、今回は外部のArduino UNOから制御したので、これを修正したいです。 そうなると、基板単体で動作するようになり、300円テトリスの筐体内にも収まります。

ボタンのセンシングなども行うようにして、オリジナルのゲームを動くようにしてみたいです。

ここまでのところで難所は乗り切ったので、おそらくそこまで難しくないはずです。(フラグ?)

まとめ

さいころ、親に買ってもらってうれしかった手のひらサイズのテトリスゲームですが、まさかこんな形で再会するとは思っていませんでした。

あの頃はゲーム機に内蔵されていたテトリスゲームで遊んでいただけだったのに、今やその中身をまるっと入れ替える基板を設計し、独自のプログラムを実行すべく改造していると考えると、結構自分も成長したなぁと感じます。

LCDの制御に用いたICはピンの間隔が0.65mmと結構細かい上に、100ピンもあったのですが、特に苦労することなくはんだ付けすることが出来たので、今後は臆せずこのサイズのICを使っていく自信がつきました。

このプロジェクトはまだ途中なので、また進捗があったら記事を書きます。

参考記事

無数にWebの記事を参考にしましたが、特に印象に残っている記事をリンクしておきます。

hackaday.com

チープカシオの液晶を、今回やったのと同じように基板を総とっかえして乗っ取る話。 Youtube動画の中で、CommonとSegmentの見分け方なども詳しく解説されています(英語)

awawa.hariko.com

今回はやりませんでしたが、汎用CPUでLCDを駆動する方法。 最悪これでできそう、という目途が立ったため、実験に踏み切ることが出来ました。

github.com

HT1621という、今回使ったICのモデル違い(COMが少ない版)のArduino用制御コードです。 制御コードを0から作るのは大変だったので、これを参考にしました。

基本的なプロトコルはこれとよく似ていますが、アドレス長や、dutyの設定が無かったりと細かい違いがありました。