2017年1月29日
AT020QVSを追加 2017年2月19日
TFT1N3204-Eを追加 2017年2月27日
倉庫番パズル追加 2017年3月19日
液晶初期化仕様変更 2017年5月1日
S95417-AAAを追加 2017年5月2日
S95591-AAA2を追加 2017年5月3日
各液晶用ブートローダ修正 2017年6月4日
ペグソリテア追加 2018年1月3日
携帯電話の普及などのおかげで、小型のカラーグラフィック液晶モジュールが、低価格で簡単に入手できるようになりました。このたび格安で小型カラー液晶を入手することができたので、以前から作りたかった液晶搭載ゲームシステムを製作しました。SDカードスロットも搭載されているので、SDカードに複数のゲームを入れ、画面から選択して遊べるようにしてみました。
その後、複数の小型カラー液晶を入手したので、対応液晶を追加しました。
秋葉原の電子部品ショップアイテンドー」の店頭で1個300円、2個で500円(税別)の在庫処分価格で購入したM024C9320TPを使用します。M024C9320TPは解像度240×320ドット、26万色表示可能な2.4型のカラー液晶ディスプレイです。
この製品には液晶モジュールのほか、SDカードスロットとタッチパネルが搭載されていますので、SDカードもマイコンから使えるようにしました。タッチパネルは今回使用していません。
使用したマイコンはこれまで何度も使用してきたPIC32MX250F128Bです。メモリ容量が倍のPIC32MX270F256Bも使用可能です。システムクロックは8MHzの内蔵FRCをPLL回路経由で48MHzにして動作させています。
電源はマイコン、液晶モジュールおよびバックライト全て+3.3Vです。今回の回路図では電源は省略しましたが、せっかくの小型液晶なので、バッテリで作ると面白いと思います。
このマイコンは汎用I/Oが19本しかなく、液晶モジュールとの接続にデータ8本、コントロール5本を使用すると、残りが6本しかなくなります。SDカードに4本必要なため、残り2本ではゲーム操作に必要なスイッチなどを付けることができません。そのため、3ステートバッファ74HC541Aを用いて、液晶のデータ信号線とゲーム操作用スイッチを同じピンで排他使用することにしました。
操作スイッチをバッファ越しに配置し、読み込みが必要な時は液晶を無効にしてからゲートを開き読み込むという方式です。ゲートには液晶のCSピンを単純に使いたかったのですが、残念ながら論理が反対でインバーターを追加するのも面倒なので、別にI/Oを1本使用しました。
残り1本のI/Oは音声出力に使用しました。回路図上は簡単のため単純に圧電素子を接続していますが、適宜スピーカー回路などに変更してください。
このマイコンにはRB6、RB12ポートがないため、なんと8ビットを連続してとることができません。そのため液晶とのデータのやり取りにはビットをずらす一手間が必要になります。本当はRB6、RB12があるPIC32MX150F128Bを使用すればI/Oも2つ増えてよいのですが、現在の国内での入手性を考えて泣く泣く使う予定もないUSB機能搭載チップを選択しました。そのため、今後入手性が変われば採用チップと接続回路とソフトを変更するかもしれません。
I/Oピンの接続に悩みながら作ったということもあり、今のところまだブレッドボードでの製作となっていますが、いずれは電池を搭載し持ち運びできるようにしたいと考えています。
この液晶はマイコンとの接続に8ビットまたは16ビットを選択できるようになっており、今回は8ビットで接続するため、裏面のジャンパーをハンダ付けする必要があります。ハンダだけでくっつけるのは意外と難しく、気を付けないとランドが剥がれたりするので、私はポリウレタン線を使ってジャンパー接続しました。
アイテンドーのサイトによると今回使用した液晶ディスプレイのコントローラチップはILI9320と記載されています。しかしこちらのサイトによると互換性のある別チップのようで、実際私が確認しても同様のIDが返ってきました。しかし、使用上は問題なさそうなので、ILI9320として製作をします。
この液晶コントローラのドライバはマイクロチップ社提供のソースプログラムがあるので、それを使用することを考えたのですが、いつものことながら汎用性が高過ぎて、巨大で全体から必要な部分を切り出すのが大変なため、断念して他の方が公開されているものを改造して使用させていただきました。
参考にしたのは、みはさんのこちらのページで、その元となったのはこちらで公開されているものです。
(2017.2.19) 実際に搭載されているチップはR61505で、パラメータも異なるためマイクロチップ社のライブラリを参考に修正しました。
本システムでは、ゲームプログラムはHEXファイル形式でSDカードのルートディレクトリに保存して、ブートローダから液晶画面上で選択して起動する仕組みとなっています。ブートローダは、基板上のいずれかのボタンを押した状態で電源オンまたはリセットすることで起動します。
ブートローダプログラム自体は、以前こちらで作成したものと画面表示以外ほぼ同じです。メモリマップも全く同じで、ハイスコア等を記録する共通エリアもあります。対応アプリケーションの作成方法などの詳細は上記でご確認ください。
ブートローダ画面
メモリーマップ
下記リンクから関連ファイル一式をダウンロードできます。最初にブートローダのHEXファイルをPICkit3等を用いてマイコンに書き込みます。その後はゲームのHEXファイルをSDカードにコピーし、ブートローダから選択してフラッシュメモリに書き込んで動作させることができます。
ソースプログラムのビルドは最適化が必要です。特にブートローダプログラムは、単純なビルドでは必要なサイズに収まらないため工夫が必要です。通常はHEXファイルをそのままご利用ください。
関連ファイル一式のダウンロード |
収録プログラム(随時追加予定)
パックマン | こちらで製作したものを単純に改造したものです。そのためレイアウトが全体的に上に片寄っています。 | |
テトリス | こちらで製作したものを単純に改造したものです。パックマン同様に全体的に上に片寄っています。 | |
箱入り娘パズル | 駒を動かして、「娘」と書かれた駒を外に出すパズルです。こちらで製作したものを単純に改造したものです。 | |
インベーダー | ご存知インベーダーゲームです。MachiKania type ZのKM-BASICで製作したものを改造しました。 | |
写真立て | JPEG画像を連続して表示します。画像ファイルは横320×縦240ドットのものをSDカードに入れてください。JPEG画像のデコードにはマイクロチップ社のライブラリを使用しています。 | |
倉庫番 | 昔はやったパズルゲームです。荷物を所定の位置に入れるのですが、壁と他の荷物が邪魔をしてなかなかうまくはまりません。 BRAIN様作のプログラムを本システム向けに改造しました。 | |
ペグソリテア | 一人遊びのボードゲームです。隣のボールを飛び越して取り除き、最後にボールが1つだけ残るようにできれば成功です。参考 Wikipediaのページ |
液晶モジュールの低価格化で、気軽にマイコン用ディスプレイとして小型液晶を使うことができるようになりました。液晶コントローラは使い方さえ覚えれば難しいものではなく、今回の製作もこれまでPICマイコンによるカラービデオ出力の各種実験、製作を行って来たものを、小型液晶ディスプレイ用に改造を行っただけなので、多くの時間は掛かりませんでした。今後も活用していきたいと思います。
この記事について何かご不明点やご意見などありましたら、お気軽にこちらの掲示板に書き込みをお願いします。
私が宣伝しすぎたせいか(?)M024C9320TPはこのページの公開直後に売り切れてしまったので、同じように300円で在庫処分セールされていた別の液晶を入手して、同じシステムを動作させることにしました。
2.0型で解像度240×320ドットのAT020QVSとキャリー基板のセット品です。こちらはキャリー基板と液晶モジュールがハンダ付けされていないので、自分でハンダ付けする必要があります。ハンダ付けの要領はまずキャリー基板のランド付近にフラックスを塗った後、ハンダめっきを行います。ランド間のショートがないことを確かめてから、液晶モジュールのフレキ基板をキャリー基板のランドの上から当ててハンダ付けします。フレキ基板側にも両面にフラックスを先に塗っておきましょう。
この液晶モジュール製品は既にアイテンドーのWebサイトからは消えているようですが、データシートらしきものがこちらにありましたので、これを参考にして実験しました。
搭載されている液晶コントローラはILI9325です。液晶モジュールの電源はマイコンと同じ3.3Vでよさそうですが、バックライトはVf値3.2〜3.4Vの白色LED3個がアノードコモンでそのまま基板に出てきているだけなので、マイコンと同じ電源での点灯には無理があります。私は5Vの電源を別途用意し、120Ωの電流制限抵抗を入れました。
また、このキャリー基板には残念ながらSDカードスロットが搭載されていませんので、別途用意する必要があります。私はこちらのマイクロSDカードスロットDIP化キットを使用しました。
この液晶モジュールは8ビットパラレル接続専用で作られており、マイコンのI/Oとの接続は最初に作成したM024C9320TP版と同じとしています。液晶コントローラの初期化パラメータはねむいさんのブログなどを参考に作成しました。ファイルはページ上部のダウンロードコーナーからダウンロードできます。
当初はM024C9320TP用とAT020QVS用で分けて作成しましたが、液晶コントローラのIDを読み込むことで自動判別できることから、バイナリプログラムを共通にすることができました。ただし、ブートローダだけはプログラムサイズの関係でそれぞれ別々のバイナリファイルとしました。
(2017.5.1) 液晶コントローラの種類ごとに初期設定が異なるため、ブートローダは個別に用意しました。一方アプリケーション側では液晶の初期化を省略することで、液晶によらず共通のものとしました。
2.6型で解像度240×320ドットのTFT1N3204-Eとキャリー基板のセット品です。こちらもキャリー基板と液晶モジュールがハンダ付けされていないので、自分でハンダ付けする必要があります。上述のAT020QVS同様にしてハンダ付けしてください。また、基板上に抵抗を付ける箇所がありますので、36Ωのものを付けてください。
この液晶モジュールのデータシートによると電源は2.7〜2.9Vということで、これまで使用してきたものより少し低くなっています。マイコンおよびロジックICもこの電圧で動作させます。しかし、SDカードには3.3Vが必要です。また、バックライトは白色LEDでVf値が3.0〜3.4Vということなので、さらに高い電圧が必要となります。私の実験環境では5V電源から3端子レギュレータで3.3Vを作り、小信号用のダイオードで0.6V程度電圧を落として約2.7Vを作りました。バックライトは5Vから基板上の36Ωの抵抗を通して接続しています。
このキャリー基板にもSDカードスロットは搭載されていませんので、こちらのマイクロSDカードスロットDIP化キットを使用しました。
搭載されている液晶コントローラはR61505Wです。型番はR61505と似ていますが設定は異なりますので、初期化パラメータは今回もねむいさんのブログなどを参考に作成しました。プログラムはダウンロードコーナーからダウンロードできます。今回もブートローダのバイナリはこの液晶専用とし、アプリケーションプログラム(ゲーム)では液晶を自動認識するため、液晶初期化を省略することで、共通のものとなっています。
当ページを見てJA1WBYさんが製作してくれたプリント基板と対応液晶モジュールをいただきました。対応液晶はアイテンドーで販売中の2.4型液晶S95417-AAAおよびその互換品となります。プリント基板はキャリーボードとマイコンボードに分かれており、キャリーボードはArduinoのシールドにもなるようです。
S95417-AAAの液晶コントローラはILI9325です。別のものが搭載されていたという情報もありますが、ILI9325用のブートローダで正常に動作したようです。
NOBOSANのページ
JA1WBYさんのプリント基板を使用せずに製作する場合は、以下を参考にしてください。
電源は2.8Vが標準となっていますが、3.3Vでも問題なさそうです。バックライトはVfが3.0〜3.4Vの白色LEDが4つあるので、5V電源などから各LED15mA程度となるよう適当な電流制限抵抗を入れてください。
S95417-AAAのピン配置は右図のようになります。接続部は37ピン、0.8ミリピッチです。タッチパネルは付いていませんでした。8ビット転送モードにするため、IM0(11番ピン)は10KΩで3.3Vにプルアップします。8ビット転送モードの場合、DB10〜DB17がデータ線となります。間違ってDB0〜DB7につながないよう注意してください。
その他のピンについては、これまで製作したものの回路図を参考に、同様に接続してください。マイクロSDカードスロットも忘れず付けてください。
S95591-AAA2は2.2型のQVGA液晶です。Web等を検索すると末尾の2がないS95591-AAAが出てきます。写真を見比べるとパネル下部のタッチ用アイコンが異なるようです。搭載している液晶コントローラはS6D0129です。接続部は1ミリピッチの26ピンとなっており、ピン配置は右図のように8ビットパラレル接続専用となっています。私の場合、写真のように汎用の変換基板にハンダ付けして使用しました。マイコンとはこれまで実験してきた回路図を参考に接続を行います。
電源は3.3Vでよいようですが、バックライトLEDには9Vが必要とあります。今回の実験では006P乾電池を75Ωの抵抗を介してLED+とLED-に接続しました。
液晶コントローラS6D0129に対応したブートローダは、マイクロチップ社提供の初期化プログラムを参考に作成しました。また、S6D0129に対応するため一部アプリケーション側にも改造が必要となりました。
1つは縦横切り替えで、レジスタ0x01と0x03を変更することで切り替えますが、S6D0129はレジスタ0x01の別のビットも使用しており、これまでと同じ値を書き込むと表示されなくなります。そのため、縦横切り替え時はコントローラIDを読み込んで種類判別してから適切な値を出力するようにしました。
もう1つはハードウェアスクロール機能(表示開始位置指定)です。これまで使用してきたものと異なるレジスタに割り当てられているため、こちらもアプリケーション側でコントローラIDを読み込んで判別するようにしました。実際にはインベーダーゲームでこの機能を使用しています。
いずれもダウンロードファイルの更新しておきました。