ハードウェアの気になるあれこれ

技術的に興味のあることを調べて書いてくブログ。主にハードウェアがネタ。

ゲームボーイを作る(17) - LCDの調査

スポンサーリンク

ゲームボーイを作るその17。CPUを作るのに若干飽きてきたので、LCD周りの調査を始めた。今回は入手したLCDについて調べた事を少しまとめてみる。

MSP2807

買ったLCDはこれ。理由はお値段お手頃で、そこそこの大きさと解像度があったから。

ちなみに実際のゲームボーイの画面は160x144でモノクロ4階調になる。なので、実際にこのLCDを使う場合は、スケーリングかけるとか160x144にしといて、余白を埋めるとかの処理が必要になる。

いずれにしても、ゲームボーイ側のインタフェースの話もあるので、それに対応するためのブリッジ部分とか、パワーオン時にLCD側のコントローラーを初期化したりする論理が必要になるので、そこに上記のような処理を追加することになるんだろうな、、、、と漠然と考え中。

このLCDは結構いろんな方が動作させてみたという報告をしてくれており、そのあたりの情報を元に確認を進めた。

ESP32で動かす

以下に上げたような記事を読んで、とりあえずラズパイやArduino、ESP32での動作が可能っぽいというところまではわかった。

ラズパイはとりあえず現在の最新環境を使って試してみたのだが、手順の途中でラズパイの再起動をしたら起動しなくなったというトラブルが発生しそこで諦めた。

次にESP32で試してみようと思いたった。理由としてはAdafruitというライブラリでMSP2807に載っているLCDのコントローラー「ILI9341」がサポートされているからだ。

とは言いながらESP32という名前自体はいろんなところで聞くのだが、自分は全然使った事が無かったりした。なので、最初にどうするんだという所からのスタートに。まずはデバイスの入手ということで、とりあえずアマゾンで適当なデバイスをポチッとした。

Arduino IDEのインストールとESP32の設定

ESP32の開発自体はArduino IDEででできるらしいので、まずはインストールから。インストールは次のサイトから、使用しているOSのインストーラーをダウンロードして、手順に従ってインストールするだけ。

自分の場合はLinux 64bitでarduino-1.8.16-linux64.tar.xzがダウンロードされる。このファイルを展開して中に含まれるinstall.shを実行すればOKだった。

$ tar xf arduino-1.8.16-linux64.tar.xz
$ cd arduino-1.8.16
$ ./install.sh

インストール後はarduinoというコマンドで起動可能だが初期の状態ではESP32がボードには含まれていない。このため、ESP32を使えるようにする必要がある。このあたりの設定は、次の記事を参考にさせて頂いた。

作業自体は次の2ステップ。

  1. 「環境設定」の「追加のボードマネージャのURL」に次のURLを追加
    1. https://dl.espressif.com/dl/package_esp32_index.json
  2. 「ツール」から「」ボードマネージャ」を開き「ESP32 Dev Module」をインストール

これでESP32が選択できるようになる。

Adafruitライブラリの導入

ここからの手順は、最初に上げた次の記事にしたがい実施した。

ArduinoIDEの「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理…」を選択すると「ライブラリマネージャ」が起動する。

f:id:diningyo-kpuku-jougeki:20210912174318j:plain

f:id:diningyo-kpuku-jougeki:20210912174335j:plain

ここの検索から「Adafruit GFX Library」と「Adafruit ILI9341」を検索してそれぞれインストールする。バージョンはその時の最新版を選択したが、自分が実行したタイミングではそれぞれ「1.10.11」と「1.5.9」だった。

動作確認

インストールした「Adafruit ILI9341」には動作確認用のプログラム(スケッチ)が含まれている。これを実行して購入したLCDが正しく動作するかを確認した。

スケッチの作成と微修正

「ファイル」から「スケッチ例」→「Adafruit ILI9341」→「graphicstest」を選択。

f:id:diningyo-kpuku-jougeki:20210912174357j:plain

生成されたスケッチをESP32向けに少しだけ修正する。

#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"

// For the Adafruit shield, these are the default.
// ESP32のピン配置に合わせるために以下の2行を書き換える
//#define TFT_DC 9
//#define TFT_CS 10
#define TFT_DC 17  // DCは9→17
#define TFT_CS 5   // CSは10→5
#define TFT_RST 16 // RSTは新たに追加

// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
// tftの引数にTFT_RSTを追加
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);

ボードの接続

ボードの接続については、上記のリンク先の記事を参考に接続する。自分の環境で接続した時は次のような感じになった。

f:id:diningyo-kpuku-jougeki:20210912180245j:plain f:id:diningyo-kpuku-jougeki:20210912180252j:plain

ESP32への書き込み

書き込みの際には書き込むボードを正しく設定しておく必要がある。設定は「ツール」→「ボード」→「ESP32 Arduino」→「ESP32 Dev Module」を選択する。

f:id:diningyo-kpuku-jougeki:20210912174422j:plain

この状態で「スケッチ」→「マイコンボードに書き込む」でマイコンボードに書き込みが実行できる。

ただ自分の環境では、このタイミングでpythonのライブラリが存在しないということでエラーが発生した。serialがないというメッセージだったが、インストールする必要があるのはpyserialなことに注意。

pip install pyserial

パッケージをインストールした後に再度書き込みを実行したところ、無事LCDの動作を確認できた。

f:id:diningyo-kpuku-jougeki:20210912180234j:plain

これで動作確認はできたので、次はAdafruitのライブラリで何が行われているかをチェックしていこう。