Using the TFT LCD display in the ESP8266
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_ILI9341 と Adafruit-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 } // } //
コメントを残す