ILI9488をSpresenseで描画してみた！

# 初めに
Spresenseの公式サイトでもお勧めしているし、

[**3.2. Camera プレビュー画像を LCD に表示する**](https://developer.sony.com/spresense/development-guides/arduino_tutorials_ja.html#_camera_%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E7%94%BB%E5%83%8F%E3%82%92_lcd_%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B)

AIキットでも使われているのが、

https://developer.sony.com/ja/posts/spresense-edge-ai-kits

ILI9431というLCD。

https://akizukidenshi.com/catalog/g/gM-16265/

このLCDは安くてちょうどよいものなんだけど、サイズが、2.2インチ、2.4インチ，2.8インチとちょっと小さくって、テキストを表示するなどを行う場合は、もう自分には見えない…。

※ちなみにこのデバイス最近はすごく高くなってます…。1000円以下で買えた時あったのに…。

なので、同じシリーズでもうちょっと大きいLCDないかな～、
しかも、手軽に動かせるもの！って思って探しました。

# 用意するもの

SpresenseはMainボードと拡張ボード。

[**SPRESENSEメインボード[CXD5602PWBMAIN1]**
https://www.switch-science.com/catalog/3900/](https://www.switch-science.com/catalog/3900/)
<img src="https://d2air1d4eqhwg2.cloudfront.net/images/3900/500x500/42ccd153-3e89-4f7c-921c-775bc7de996d.jpg" width="200">

[**SPRESENSE拡張ボード[CXD5602PWBEXT1]**
https://www.switch-science.com/products/3901](https://www.switch-science.com/products/3901)
<img src="https://www.switch-science.com/cdn/shop/products/5ecdbd33-8e31-4798-b31f-cedc64e19830_9ab348f5-b647-4d2a-bb57-fe96aaa54b10_500x500.jpg" width="200">

それとLCD。同じILIのシリーズのILI9488であれば、4インチの大きさまであるので、だいぶ大きいかなあと思ってこれを選択。


[**4 インチ TFT LCD ディスプレイ モジュール、カラー スクリーン モジュール、ILI9488**](https://www.amazon.co.jp/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%80%81%E3%82%AB%E3%83%A9%E3%83%BC-%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%80%81ILI9488-480x320-%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%80%81%E3%83%A1%E3%83%A2%E3%83%AA-%E3%82%B9%E3%83%AD%E3%83%83%E3%83%88%E4%BB%98%E3%81%8D%E3%80%813-3V/dp/B0BYZNW8N1/ref=asc_df_B0BYZNW8N1/?tag=jpgo-22&linkCode=df0&hvadid=676074782630&hvpos=&hvnetw=g&hvrand=7732027259022425513&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009343&hvtargid=pla-2274960103404&psc=1&mcid=36d6179d99ed3129a7c21ab4fe9c0a9a)
<img src="https://m.media-amazon.com/images/I/51CmIL4rBLL._AC_SX679_.jpg" width="200">

これをジャンパでつなぎます！

# ブログ（元ネタ）
この記事は、以下のブログに過去に投稿したもののまとめです。

http://spresense.livedoor.blog/archives/34424502.html

# ILI9488について

同じILIのシリーズでもあるし、そうじゃなくても安いこの手のSPI接続のLCDって**コントローラが一緒なことがほとんど**なので、対して苦も無く、初期化だけちょっと変えれば動くでしょ、って感じで軽く考えていました。

で、実際に、**ILI9488**をみてみると、なんと、RGB888のみでRGB565に対応していない！
メモリもったいないけど仕方ないな～って思いながら、RGB888対応をすることにしました。

# Arduino向けライブラリ
Spresenseの公式が提示しているArduinoのILI9431ライブラリを確認するとRGB888に対応していない！

https://github.com/kzhioki/Adafruit_ILI9341

まあ、そうだよね。
Adafruit は、ILI9488のデバイス売ってないし、ライブラリの目的は商品販売のためって書いてあるんで未対応だよねえ～。

なんで、この Adafruit のライブラリを RGB888 対応しました。

実は、これ、このライブラリのベースクラスの

https://github.com/kzhioki/Adafruit-GFX-Library

こっちを直さなければいけなかったです。
とはいえ、修正量が多くなく、実際に**Adafruit_SPITFT**のメソッド

~~~ c
inline void writeFillRectPreclipped(int16_t x, int16_t y,int16_t w, int16_t h, uint16_t color);
~~~ 

が、**inline**で実装されたたんだけど、これを、ILIのドライバ側でこのメソッドをオーバーライドすればよいというもの。

https://github.com/Interested-In-Spresense/Adafruit-GFX-Library

で、ILI9431のライブラリに、このメソッドのRGB888対応コードを入れたものが、ILI9488のドライバになります。

https://github.com/Interested-In-Spresense/ILI9488

ってことで、これでILI9488のライブラリの準備ができました。

# 動作確認

実際に、以下のように動作できます！

https://twitter.com/spresense/status/1707426534674633004

ただし、どうもSPIクロックは、40,000,000 でなくって、20,000,000 が、限界だし画枠は、320x240　から、480x320なのでおおきくなったから、ちょっと動きがもっさりしてるかも…。