【M5Stack_Core2】液晶ハードウエアスクロール機能

経緯

ここ、1~2週間はハマっていた内容がM5Core2から吐き出されるデータを液晶画面に表示して普通にスクロールアウトさせること。 まあ、当たり前すぎて誰も気に留めてないと思うが、エディタやWORDやEXCELでも、PageDownや↓キーで画面が上に移動していって次のデータが表示される機能である。
これをプログラム的に実行しようとすると画面内のデータをすべて記憶しておかないと再描画できない。昔のWindowsOS前のDOSパソコンであれば、FONT幅が等倍に なっており縦x横の文字数を記憶して置けば再描画ということで文字コードとして処理できた。現在、リッチテキスト(死語?)ではないが、装飾までいかなくても、Fontのプロポーショナルで1行の文字数がバラバラになる。また、UTF-8という、可変長文字コード問題もある。かといって、Frameバッファをカラーで使えばpixelとして管理できるが潤沢に使えるほど大きいRAMがないことは、描画のスプライト機能を使っていればわかる。そこで、そもそもスクールくらいハードウエアコマンドでできないのか?と、調べた結果。

Vertical Scrolling機能を使えば出来そう。

f:id:chiyoh:20201115162705p:plain

罠1 公開資料の間違い

M5Stack Core2のLCDコントロールICは、ILITEK ILI9341ではなく『ILI9342C』らしい。 液晶パネルを剥いて確かめてないのでわからないがM5Stackシリーズは前からこれみたい だ。ホントになってコッタい。M5公式のページから指定されているのはILI9341のデータ シートだから。その仕様書を読んで解析してたのに。 何とかの法則なのか丁度公式ページの更新があった。この苦労っていったい。。。

chiyoh.hatenablog.com

罠2 仕様書のあいまいさ(デメリットは、直接書かない)

hardscrollコマンドは、1方向固定らしい。つまり、ILI9341は、縦長方向。ILI9342C は、横長方向の時のみ有効。実際は、ILI9342C 240lineスクロールになっていてオリジナル サンプルプログラムは、ILI9341用なので240x320で縦長default設定320lineスクロールに なっている。このことは、サンプルのコメントにはsetRotation(0)じゃないと動かないと 書いてある。が実際は0,2,4,6の縦長でないと動かないである。どちらにしても、M5Stack では動作しない。

ILI9341 f:id:chiyoh:20201115164357p:plain

予期しない画像が表示されない限り、この設定は禁止されています。つまり、M5Stackシリーズは、ILI9342Cなので、下の仕様通り合計320の値では動作しない

ILI9342C f:id:chiyoh:20201115164454p:plain

M5Sackシリーズの横長画面では240になるように設定しなければならない。240より大きい320で動いてないので240mustなんでしょう

罠3 TFT_eSPIのドライバの定義(後から出てきたシリーズは亜種扱い)

M5StackシリーズのTFT_eSPI液晶ドライバ定義 In_eSPI_Setup.hでILI9341_DRIVERを 指定している。ILI9342Cは、ILI9341の亜種扱いで一部パラメータを変更する程度で対応 できるので、ILI9342C_DRIVERがないのであろう。ゆえに、勘違いする。

罠4 サンプルプログラム(見たままの機能の場合説明されない)

ハマった原因。サンプルプログラムを環境に合わせて変更し、一見動作している ように見えるが、どう動いたら正解なのかわからないのが問題。いや、サンプル プログラムは確実に動かないと問題なのだ。Serialからのデータ入力は、画面に 映っているがなにをハードスクロールしているか不明であった。

さんぷるプログラム

最近確認用のプログラムが長くなってきたのでこっちに移動

https://github.com/chiyo-h/Arduino/blob/master/M5Core2/TFT_Terminal/TFT_Terminal.ino

プログラムをUPLOADしたあと、PC端末側から、Serial通信でデータを送るとそのまま、M5Core2の液晶に文字が表示される。初期表示が、最下位行になっており、改行する毎に上側にハードウェアスクロールしていく。このプログラムのいいところは、表示スピード重視していて改行コード連打が最速になるようになっているっぽい。実際は、バグっているが。 もとは、TFT_eSPIライブラリ開発者のBodmerさんのサンプルプログラムこれをM5Core2用に変更と解析を行っていったもの うざいくらい説明書きをしてあるので内容は理解できると思う。というか、ハマりまくったので1行毎に動作確認が大変。 なんというか、最適化は、コンパイラに任せたらいいよ。みたいな、Pythonのシンプルさがありがたく感じるほかの方のプログラム解析

遊び機能

  • rot = 0;を変更すると縦横、変更される。0がdefaultで動かなかったモード。これはこれで、LOG表示としてはいいかも。
  • BOTTOMに、パラメータ設定を追加
  • スクロールが分かりやすいようにXラインを追加
  • FONT_HEIGHT/BOT_FIXED_AREA/TOP_FIXED_AREAを変更して機能確認ができる。
  • _キーでSCROLL機能ON/OFF
  • \\,/キーで強制ロール機能

副産物

M5.Lcd.setRotation(rot) 仕様 0~4が回転、5~7が鏡文字(液晶をそのまま表示するのではなく、鏡越しに表示したり、反射させて表示させるときのモード。)

f:id:chiyoh:20201115170627p:plain

f:id:chiyoh:20201115170707p:plain

まとめ

Vertical Scrolling機能は、使えるので上手くプログラムに組み込むと便利。SCROLL機能ON/OFFを使ってもらえればわかるように実際のFRAME RAMは、何ら書き換えは行われていない。 LSIの中でView位置を変更しているだけなのである。

f:id:chiyoh:20201115180206p:plain

わかってしまえば、VSPの値を変更しつつ普通に表示しているだけなのである。

なんか、脱線しまくって。こんなことしている。実は、まだまだ脱線しているのだが次回に続く