かずの不定期便ブログ

備忘録代わりに書きます

Arduino向けILI9486 LCDパネルを使ってラズパイで動画再生(仕様確認編)

目次

目的

オリジナルドライバでLCDに動画を表示させること
下記の記事に触発され、自分ドライバで動画を再生したくなり、Arduino向けとして安価で売られているLCDシールドを買いました。(Aliexpressにて1000円程度でした)
【マイコンの限界に挑戦】小型液晶に動画を表示してみた【16bit】 - ニコニコ動画

購入したモジュール

新3.5インチtftカラーディスプレイモジュール320X480超hdサポートar uno Mega2560完璧な交換|LCD Modules| - AliExpress


この手のモジュールのLCDドライバICへのアクセス方法はSPI、parallel-8bit,parallel-16bitがあるようです。そこそこ高速に動画を再生するにはSPIの様なシリアル転送ではfpsが稼げないだろうと思ったのでparallel接続、また配線が少ない方の8bitのものをチョイスしました。

簡単に必要性能を算出してみます。
今回の液晶の解像度は320x480pixです。1pixあたり16bitとして30fps表示するには 1秒当たり16bit x 30fps x 320 x 480 =73728Kbit の転送が必要です。
8bit接続なので、 73728K/8 = 9216K = 9.216Mアクセス必要です。
つまり10MHz程度のレートでLCDへデータ転送できれば30fps表示できるであろうと考えました。

LCD駆動マイコンの選定

LCDモジュールはArduinoと直結出来るので素直にArduinoで動作させればよいのですが、私がArduinoでのプログラム作成に慣れていないこと、動画再生にあたって性能に余裕があったほうが目的を達成しやすい。何よりArduinoはRAM容量が小さいので多分自分には実現できない気がする。と思ったので、まずはラズパイターゲットで動作させることにしました。
念のため注意を記載。本記事の通り行ってもラズパイ用LinuxOSの表示先として本LCDモジュールが使えるわけではありません。ブログ主がただ動画を表示させたというだけの記事です。

購入したLCDモジュール

  • 320x480 8bit パラレル,ドライバはILI9486
  • SDカードスロット付き(SPI接続)
  • Arduino と直結可能

amazonにも似たような仕様のものが売っています。(ピン配列も全く同じ)
後から知ったのですが、ラズパイにもILI9486を使用したLCDモジュールが販売されていてSPI接続になりますがLinuxの表示先として利用できて簡単に組み込めるようです。

LCDモジュールの動作確認

Aliexpressの販売ページには端子名が書いてあるだけで、どのようなドライバが適用できるかの説明もありません。とりあえず買ってからこの辺りは考える事にしました。

到着すると商品の包装にDriver:ILI9486と書いてありました(商品ページに記載してほしかった...)。
>

LCDモジュールの包装

商品の動作チェック用に一緒にArduino megaを買っておいたのでドライバを検索してLCDモジュールの動作確認を行いました。8bit-parallelのドライバが意外となくて探すのに大分苦労しました。

LCDモジュールの仕様確認

LCDシールドピン面

このモジュールから出ているピンとICチップに繋がる線にテスター針を当てて仕様を調査しました。
5Vは4pinのIC(薄いですがLD1117と読める)と接続されていました。おそらくこのICは電圧レギュレータArduinoの5V電源出力→3.3V電源を作っています。
3.3Vに変換された電源がU2,U3のチップ(5V耐圧のバスバッファIC)のVcc端子に行っているので、Arduinoの5V信号を3.3Vへ変換するためのICだと思われます(バスバッファIC自体は3.3V動作なので信号レベル変換として働く)。
Arduinoからのリード時、データ線のHレベルは3.3Vになりますが、この電圧でもArduinoはHighレベルと認識できると思われます。

また、LCDモジュールには3V3という印刷がありますが、本端子は特に利用されていないようです。
SDカード側の信号(SD_SS,SD_DI,SD_DO,SD_SCK)は今回使わないので見ていません。
本モジュールをラズパイで利用する場合、気を付けないといけない点は、ラズパイのIOの電圧レベルが3.3VでArduinoは5Vということです。
電圧レギュレータに5Vを供給さえすればバスバッファICは3.3Vで動作する事になるのでデータ信号が5V入力であっても3.3V入力であっても変換された信号は3.3Vレベルになるので、ラズパイが3.3V IOであっても問題ありません。

5V出力を利用することさえ気を付ければ、ラズパイのIO信号線を本モジュールに直結させれば動きそうであることは分かったので、残りはソフトウェアの作成です。

ILI9486のデータシート

まずはデータシートを探します。ILI9486のキーワードで検索したところすぐに見つかりました。ILITEK製のドライバICです。
データシート中の端子一覧の中でLCDモジュールの端子として出てきているのは、RESX,CSX,DC/X,WRX,RDX,DB[7:0]です。下表にLCDシールドのピン名とデータシート上の端子名を記載しました。

端子一覧(抜粋)

シールド上の名前 Pin Name I/O Type Descriptions
IM2,IM1,IM0 I MPU IOVCC/DGND Select the interface mode
LCD_RST RESX I MPU The external reset input.
LCD_CS CSX I MPU A chip select signal.
Low: the chip is selected and accessible
High: the chip is not selected and not accessible
LCD_RS D/CX I MPU The signal for command or parameter select.
Low: Command.
High: Parameter.
LCD_WR WRX/SCL I MPU 8080 system (WRX): Serves as a write signal and writes data at the rising edge.
LCD_RD RDX I MPU 8080 system (RDX): Serves as a read signal and read data at the rising edge.
LCD_D7-D0 DB[17:0] I/O MPU 8-bit MCU System Interface Mode DB[7:0]
本モジュールは8bit幅なのでDB[17:8]は使いません。モジュールから出ていません

タイミング

簡単なタイミングチャートを書きました。一般的な非同期バスになっています。基本的には最初のライトアクセスでコマンドを、2回目以降のライトアクセスでコマンドに付随するデータを書き込みます。
コマンドかデータの切り分けはD/CXのレベルで決まり0でコマンド入力、1でデータ入力になっています。入力するコマンドの種類で続くデータの数が決まります(このようにしてレジスタに値を書き込みます)。
画像データを入力するコマンドはMemoryWriteです。このコマンドに対するデータ入力数は別のコマンドで決めます。MemoryWriteコマンド1回で最大で1画面分のデータを送信できます。別コマンドで水平、垂直開始位置と水平、垂直サイズを指定可能です。つまり任意の位置のピクセル(というかbox)を書き換えることが出来ます。今回は動画再生が目的なので1画面全部を常に書き換えることになります。

ILI9486 8bitパラレル バスタイミング

以上で大体の仕様は把握出来ました。次回はデータシートのコマンド一覧を見ながら必要そうなコマンドを使って実際にLCDへ画像を表示したいと思います。


次回
Arduino向けILI9486 LCDパネルを使ってラズパイで動画再生(ソフト作成編その1)」へ続きます