macsbug

Try ESP8266 Adafruit_ILI9341 again

leave a comment »

ESP8266 で TFT LCD を動かす為の Adafruit_ILI9341 を再度 検証しました。   2016.04.20
ILI9341 のライブラリーは 幾つかあり 今回は Adafruit のものです。
ESP8266 用として他のライブラリーもあるようです。


ライブラリーの種類と使い方が混乱していましたので 再度 試しました。
TFT LCD 240 x 320 SPI のコントローラーは ILI9341 を使用しています。
ILI9341 に対するライブラリーが幾つかあり 動作状況もいろいろあります。


サンプル:「graphicstest」の表示。


準備:
ハード:
1. D1 mini with TELEC + TFT LCD 240×320 SPI Module:1600円。
_  
_  
_  尚、この配線は タッチ操作の為に次回1カ所変更になります。
ライブラリー:
1. adafruit / Adafruit_ILI9341:  github.com/adafruit を使用。
2. adafruit / Adafruit-GFX-Library:github.com/adafruit を使用。

サンプル:上記 Adafuruit_ILI9341 の中にある「graphicstest」を試します。

スケッチの設定:以下2点 ( DC=2, CS=5 )
1. #define TFT_DC 2
2. #define TFT_CS 5

実行:動作中にエラーがでて停止します。
_  このエラーが発生する場所は、Lines、Rectangles (filled)、Triangles (filled)、testText();
_  で wdt が発生します。


Rectangles (filled) 時のシリアル出力の表示で field で停止しています。

ILI9341 Test!
Display Power Mode: 0xFF
MADCTL Mode: 0xFF
Pixel Format: 0xFF
Image Format: 0xFF
Self Diagnostic: 0xFF
Benchmark Time (microseconds)
Screen fill 1541140
Text 100898
Lines 992463
Horiz/Vert Lines 126333
Rectangles (outline) 81402
Rectangles (filled)
ets Jan 8 2013,rst cause:4, boot mode:(1,6)

wdt reset


疑問:
_  何故、抽画する所で wdt がでるのでしょうか?
_  wdt は自動再起動の為と思われますが、再起動しなく停止しています。
_  と、思えば再起動するときもあり不安定です。
_  ネットでの議論:Automatic reboot after wdt reset
_   ここでは トップレベルの SensorsIot氏 や igrr氏 が論議しています。
_   今回の問題で私は「ESP.wdtDisable();」で済まそうかと思っていますが
_   これはクラッシュする基の原因をなくす物でなく 対症療法という感じです。
_   奥が深そうなのでこの辺にしておきます。


対策:その1
初回の記事では、対策としてライブラリーの各ルーチンの中に 「ESP.wdtDisable();」
を記載し wdt の発生を止めました。どれくらい止められるかも解らないままに行っています。
この対策は1つの方法かも知れませんが、何が正解か良くわかりません。
基礎やレベルもないままに中をいじっています。

対策:その2:SensorsIot氏 や igrr氏 の論議を読むと以下の対策が正解かどうか疑問が起きます。
今回は、wdt 発生に対して スケッチの中での対策を考えました。
方法: スケッチの中で tft ルーチンを実行する前に「ESP.wdtDisable();」を記述する。
_   特に testLines の中の多数の fill や 連続した fill は wdt を発生させるので
_   この前にも「ESP.wdtDisable();」を記述しました。
例:


unsigned long testFilledRoundRects() {
  unsigned long start;
  int           i, i2,
                cx = tft.width()  / 2 - 1,
                cy = tft.height() / 2 - 1;
  ESP.wdtDisable();
  tft.fillScreen(ILI9341_BLACK);
  start = micros();
  for(i=min(tft.width(), tft.height()); i>20; i-=6) {
    i2 = i / 2;
    ESP.wdtDisable();
    tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0));
  }

  return micros() - start;
} 

void loop(void) { 
  for(uint8_t rotation=0; rotation<4; rotation++) { 
    ESP.wdtDisable(); 
    tft.setRotation(rotation); 
    testText(); 
    delay(1000); 
  } 
} 


結果:シリアル出力の表示は最後までエラー無く動作しました。
ILI9341 Test!
Display Power Mode: 0xFF
MADCTL Mode: 0xFF
Pixel Format: 0xFF
Image Format: 0xFF
Self Diagnostic: 0xFF
Benchmark Time (microseconds)
Screen fill 1541146
Text 100875
Lines 992463
Horiz/Vert Lines 126343
Rectangles (outline) 81379
Rectangles (filled) 3199752
Circles (filled) 501936
Circles (outline) 433711
Triangles (outline) 314803
Triangles (filled) 1067064
Rounded rects (outline) 186470
Rounded rects (filled) 3492567
Done!


参考:
Adafruit GFX Graphics Library:Overview
フォント:Adafruit GFX Graphics Libraryは幾つかのフォントと 9, 12, 18, 24 point
_    のサイズを使用でき奇麗なフォントを表示できます。
_    Using Fonts を参照してください。
_    例: #include
_       tft.setFont(&FreeSansBoldOblique24pt7b);
_       tft.println(“Hello World!”);
サンプルスケッチの touchpaint :コントロールICが今回のICとは異なるので動きません。
_ 今回のTFT LCD の Touch Screen Controller は XPT2046 です。
2016.05.03 追記:
Microcontroller Projects:ESP8266 WiFi Development kit connect TFT LCD Display


課題:
上記の対策でエラーも無く抽画し充分な速度で動いていますが いつ停止するか不明です。
いつもの「3D Cube」を動作させると 速度は遅いです。対策方法は解りません。
2016.05.03 追記:
Adafruit-GFX-Library はグラフィックスの抽画速度が きわめて遅く高速表示が出来ない。
これは OLED の時と同じく ライブラリーSSD1306は高速であるがTFT LCDには使用できない。

Sermus / ESP8266_Adafruit_ILI9341:ESP8266 と書かれた物です。
_ サンプルプログラムがないのでライブラリー合わせてスケッチを作成しても動かず。
_ 関数のエラーがでて使用できませんでした。


感想:
同じ名前の「Adafruit_ILI9341」ライブラリーでも幾つかの種類が手元にあり、
動作する物とそうでない物があり混乱しました。又、他にESP8266用と書かれた
ものもありますが動作せず。今回、最初に戻り再度試した次第です。


 

Written by macsbug

4月 20, 2016 @ 9:06 am

カテゴリー: ESP8266

コメントを残す