macsbug

Using the TFT LCD display in the ESP8266

leave a comment »

ESP8266 で TFT LCD Display ( 2.4inch 240×320 SPI ILI9341) を使用する方法。 2016.04.16

ケースはカードサイズの大きさで 50 x 85 x 18 mm 。
ESP8266 で TFT LCD を動かす環境(ライブラリ)は 5つ程あり今回はその1回目です。
画像のサイズは 240 x 320 と少ないですが これで 多様な表現が可能となります。
電源は USB 又は ワイヤレス給電が可能です。
ESP8266 用のライブラリーは まだ無い物や過渡的なものもありますのでご留意ください。
ワイヤレス給電(442円)を除き、約1600円で WiFi や Graphic を駆使したものが作れます。


準備:
1. D1 mini with TELEC 又は ESP8266:956円。( 431+525円)

2. 240×320 3.3V 2.4″ SPI TFT LCD Touch Panel Serial Port Module with PBC ILI9341
_  ebay :618円。  * 1. と 2. で 1574円です。注:円レートで変化します。
_  注:左のピンを基準に右のSD CARD用のスルーフォールは半ピッチずれている。
_  Touch Panel の無い物は 531円がある。

3. Library:Sermus / ESP8266_Adafruit_ILI9341:Andrey Filimonov氏に感謝
_  DL後 以下の Adafruit_ILI9341 Folder を Library Folder へ入れる。
_  esp8266-Arduino-master/esp8266com/esp8266/libraries/Adafruit_ILI9341

4. Library:adafruit/Adafruit-GFX-Library
_  DL後 Adafruit-GFX-Library を Library Folder へ入れる。
_  Adafruit_GFX.cpp の改修をします。数が多く面倒ですが頑張ってください。
_  Adafruit_GFX.cpp の各Graphics Routine の最後に ESP.wdtDisable(); を追加する。
_   drawLine、drawRect、drawFastVLine、drawFastHLine、fillRect、fillScreen
_   drawRoundRect、fillRoundRect、drawTriangle、fillTriangle、drawBitmap
_   drawBitmap、drawBitmap、drawBitmap、drawXBitmap、write
_ 追記:その後の調査で ESP8266_Adafruit_ILI9341Adafruit-GFX-Library-master
_    大きな問題はなく動作確認をしていますので 後日 記事にまとめます。
_    ESP.wdtDisable(); はライブラリーではなくスケッチ側に記載する事で
_    ハングアップは防止できました。以下のスケッチの55行に追加しました。

5. ワイヤレス給電:5V 1000mA程度。
_   Qi Pad Wireless Power Charger Hot:237円
_   Universal QI Wireless Charger Receiver Module:205円


配線:SPIは 5本ですが MISO(ESP8266への入力) は使用しない為 4本となります。
_ 画像はTFT LCD Display の裏の端子に表示されたもの。
_ CS=5, DC=2, MOSI=13, CLK=14:配線の端子番号は固定で変更してはいけません。
_  理由:MOSI=13, CLK=14はLibraryの中で行っている為。
_ ESP8266 は LCD基板の裏側に D1 mini を裏にして両面テープで固定しました。
_ ESP8266の金属ケースが止めるのに便利で ついでにTELEC No が見えなくなります。
_  理由:薄く作る為で基板に乗せる必要も無く 手間が省けます。
_ ワイヤレス給電の5V出力は コネクター経由 D1 mini の 5V 端子へ接続します。
_   USBからの書込みと給電 及び ワイヤレス給電の両方が可能になります。





注:基板下側の配線はTOUCH SENSの調査用の為に配線してあります。


メモ:
Adafruit の Graphics Test の設定は以下の様にする。GPIO は固定である。

#define TFT_DC 2
#define TFT_CS 5
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);

問題 その1:
_ wdt reset (Watchdog Timer) のエラーがでて動作しない。
_ 原因:Adafruit_GFX_Library:ESP8266に最適化されていない。
_ 解決方法 その1:Adafruit_GFX_Library にある Adafruit_GFX.cpp の16個の
_          Graphics Routine の最後に ESP.wdtDisable(); を追加する。
_ 結果:graphicstest はエラー無く正常に動作し速度も速い。
問題 その2:
_ スケッチ「3D cube」はきわめて遅い。
_ 解決方法 その2:ESP8266 に最適化された Andrey Filimonov氏 の
_  Sermus / ESP8266_Adafruit_ILI9341を使用する。

問題 その4:課題として残すもの。
_ ESP8266 の GPIO:数が少ない為 Touch Sens, SD Card が使用できない。
_ ESP8266のGPIOは、0, 2, 4, 5, 12, 13, 14, 15, 16 の9個である。
_  その中で2つは書込みに必要な端子である為 接続方法に制限があります。
_  今回のSPIは 2, 5, 13, 14 の4個を使用。残りは 0, 4, 12, 15, 16 の5個。
_ Touch Sens:T_IRQ, T_D0, T_DIN, T_CS, T_CLK の4本を使用する。
_ SD Card:SD_CS, SD_MOSI, SD_MISO, SD_SCK の4本を使用する。
_ Arduino UNOやDue:GPIOが沢山ありパラレルもなんのそのです。
_ 結果、今回は Touch Panel や SD Card の操作は行いませんでした。

消費電流:130mA。ワイヤレス給電(800mA)で動きました。
_    ワイヤレス給電側及び受電は1000mA を使用してください。価格は大して差がありません。

部品:結論:ディスプレーは ebayで購入してください。
_ ディスプレー:以下の条件にあったディスプレーは国内では見受けられず、
_ ebayで購入(621円)する必要があります。
_ 条件:240×320、3.3V、2.4″、SPI、TFT、ILI9341、Touch Panel、SD Slot。
_ スイッチサイエンスのAdafruit 2.8インチ TFTタッチシールド v2(抵抗膜方式) は
_  確認していません。価格は 送料込み5303円。
_  aitendoの3.2インチ液晶モジュール [M032C9341B3]は 確認していません。
_  価格は送料代引き込み 3770円。
費用:計1574円。内33%の525円が技適化の為の費用です。
フォント:Adafruit_ILI9341 + Adafruit_GFX の組み合わせはフォントを拡大すると奇麗でない。
_    フォントを奇麗にする方法は再度調査が必要と思われます。


参考:
楽しくやろう:激安QVGA液晶をESP8266で使う:この記事は試したが動かない為 保留している。



感想:
大きさ:厚さ 18mm のカード型の大きさは 手に持つとなんともいい感触です。
幾つかの動作問題:事例の少ない TFT Display + ILI9341 + esp8266 が動きました。
Arduino陣営:Arduinoでは 他のDriver IC やサイズでも多数動作しておりESP8266 は遅れている。
費用:国内某販売店価格ではESP8266ボードを含め7613円で差額は 6036円。
_  今回の費用で4〜5台分に相当し 海外(技適不要)の場合の費用は7台分の価格になります。
_  この競争力の差には驚きました。
_  費用の33%が技適化の為で技適が競争力を低下させています。
_  その後のTFT価格調査:Aliexpress で583円がありました。
GPIOの数:SPI方式はディスプレーサイズが 240×320 までしかない。それ以上はパラレル方式。
_     そうなると ESP8266 ではGPIOポートが全然足りないという事になる。
_     まして Touch sens や CD Card を使用するとなるとどうしたらいいものか。
_     ESP8266 の最大の弱点です。
_     解決するには Nextion が望まれるが ESP8266 で動作した事例は見ていない。
コネクター:接続コネクタのピン配線は いろいろ試した結果 固定である事が判明。
_     ハードはこのままのピン配置で行う事。
_     スケッチは TFT_DC=2, TFT_CS=5 を変更してはいけない。Don’t change。
LibraryのVersion:Manage Library において Adafruit_ILI9341, Adafruit-GFX-Library の
_       バージョンアップがあるが関係があるかどうか調べきれてない。
TFTのLED電源:TFTバックライト用のLEDの電源は D1 miniの3.3Vを使用しているが
_       LDOがやや熱い。どの表示器のバックライト電圧も同じような感じ。
_       必要ならば USB 5V から 別な LDO で 3.3V を用意すればいい。
タッチパネル:現在 動作していません。端子数の問題と即動くライブラリが見つかりません。
_      この機能が実現すると入力が可能になり あらゆる事が出来る様になります。


スケッチ:3D Cube


// 3D Cube : ESP8266 + TFT SPI ILI9341 : macsbug
// Sermus/ESP8266_Adafruit_ILI9341 + Adafruit_GFX_Library with mod
// http://microcontrollerkits.blogspot.jp/2015/11/esp8266-wifi-tftlcd.html
// https://github.com/Sermus/ESP8266_Adafruit_ILI9341
// https://github.com/adafruit/Adafruit-GFX-Library
// TFT LCD Pin VCC  to +3.3V      : Don't change
// TFT LCD Pin GND  to GND        : Don't change
// TFT LCD Pin CS   to D1 GPIO_5  : Don't change
// TFT LCD Pin RST  to +3.3V      : Don't change
// TFT LCD Pin DC   to D4 GPIO_2  : Don't change
// TFT LCD Pin MOSI to D7 GPIO_13 : Don't change
// TFT LCD Pin CLK  to D5 GPIO_14 : Don't change
// TFT LCD Pin LED  to +3.3V      : Don't change
// TFT LCD Pin MISO to D2 GPIO_ 4 : Don't change

#include "SPI.h"                                                //
#include "Adafruit_GFX.h"                                       // with mod
#include "Adafruit_ILI9341.h"                                   // with Sermus
#define TFT_DC 2                                                // GPIO_2:Don't change
#define TFT_CS 5                                                // GPIO_5:Don't change
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);        //
float r, x1, z1, y2;                                            //
int f[8][2];                                                    // Draw box
int x = 320/2;                                                  // 320
int y = 240/2;                                                  // 240
int q = 60;                                                     //

void setup() {                                                  //
  tft.begin();                                                  //
  tft.fillScreen(ILI9341_BLUE);                                 //
  tft.setRotation(3);                                           // 0-3
  tft.setTextColor(ILI9341_WHITE);                              //
  tft.setTextSize(3);                                           //
}                                                               //

void loop() {                                                   //
  for ( int q = 20; q < 60; q = q + 8 ){ cube(q);}              // 
  for ( int q = 60; q > 20; q = q - 8 ){ cube(q);}              //
}                                                               //

void cube(int q) {                                              //
  int c[8][3] = {                                               // Cube
    {-q,-q, q},{q,-q, q},{q,q, q},{-q,q, q},                    //
    {-q,-q,-q},{q,-q,-q},{q,q,-q},{-q,q,-q} };                  //
  for (int a = 0; a <= 360; a = a + 3 ) {                       // 0 to 360 degree
   for (int i = 0; i < 8; i++) {                                //
    r       = a * 0.0174532;                                    // 1 degree
    x1      = c[i][2] * sin(r) + c[i][0] * cos(r);              // rotate X
    z1      = c[i][2] * cos(r) - c[i][0] * sin(r);              // rotate Z
    y2      = c[i][1] * cos(r) - z1      * sin(r);              // rotate Y
    f[i][0] = x1      * cos(r) - y2      * sin(r)  + x;         // X
    f[i][1] = x1      * sin(r) + y2      * cos(r)  + y;         // Y
    f[i][2] = c[i][1] * sin(r) + z1      * cos(r);              // Z
   }                                                            //
   ESP.wdtDisable();                                            //
   tft.fillScreen(ILI9341_BLUE);                                //
   tft.setCursor(0, 0);                                         //
   tft.println("3D Cube");                                      //
   tft.drawLine(f[0][0],f[0][1],f[1][0],f[1][1],ILI9341_WHITE); //
   tft.drawLine(f[1][0],f[1][1],f[2][0],f[2][1],ILI9341_WHITE); //
   tft.drawLine(f[2][0],f[2][1],f[3][0],f[3][1],ILI9341_WHITE); //
   tft.drawLine(f[3][0],f[3][1],f[0][0],f[0][1],ILI9341_WHITE); //
   tft.drawLine(f[4][0],f[4][1],f[5][0],f[5][1],ILI9341_WHITE); //
   tft.drawLine(f[5][0],f[5][1],f[6][0],f[6][1],ILI9341_WHITE); //
   tft.drawLine(f[6][0],f[6][1],f[7][0],f[7][1],ILI9341_WHITE); //
   tft.drawLine(f[7][0],f[7][1],f[4][0],f[4][1],ILI9341_WHITE); //
   tft.drawLine(f[0][0],f[0][1],f[4][0],f[4][1],ILI9341_WHITE); //
   tft.drawLine(f[1][0],f[1][1],f[5][0],f[5][1],ILI9341_WHITE); //
   tft.drawLine(f[2][0],f[2][1],f[6][0],f[6][1],ILI9341_WHITE); //
   tft.drawLine(f[3][0],f[3][1],f[7][0],f[7][1],ILI9341_WHITE); //
   tft.drawLine(f[1][0],f[1][1],f[3][0],f[3][1],ILI9341_WHITE); // cross
   tft.drawLine(f[0][0],f[0][1],f[2][0],f[2][1],ILI9341_WHITE); // cross
  }                                                             //
}                                                               //

Written by macsbug

4月 16, 2016 @ 5:27 am

カテゴリー: ESP8266

コメントを残す