勝手な電子工作・・

勝手なオリジナル電子工作に関する記事を書きます

3.5インチTFT-LCD(480x320)をArduinoで試してビックリ

f:id:a-tomi:20210524091240j:plain

しばらく前に注文した3.5インチのTFT-LCD (480x320)が先週末にやっと到着。受取りと評価の連絡が必要なので、とりあえず簡単にテストをしようと・・忙しい時に限って色々到着するのは不思議ですが^^; 

海外での最近の梱包は多くが日本より丁寧になってきたのを感じます。また、商品への表示も的確になっています。これは段ボール箱にパッキンでくるんで入ってきました。

f:id:a-tomi:20210524092357j:plain

袋にはドライバーIC名がILI9488、接続がSPIとちゃんと表示されています。SKU(Stock-keeping Unit)としてLCDのモデル名(MSP3521)が書かれているのはナンですが、過去の表示なしとは大違い。

320x480と書かれているので縦長が基本でしょう。しかしソフトで回転すれば横長になるのでどちらでもいいわけですが。

テストしようかと、ネットで検索してみると、ESP32用のライブラリーは簡単に見つかります。

GitHub - loboris/ESP32_TFT_library: Full featured TFT library for ESP32 with demo application

ESP32だけということもないでしょうね。Teensy4.0ではみつかりませんが、Arduinoは当然あるでしょうね。小さいArduino-Mega-Pro-Miniの手持ちが生かせることでもありますし。

f:id:a-tomi:20210524101937j:plain

Arduino-Mega-Pro-Mini

Arduinoでの例を検索するとたくさんヒットしますが、その殆どは海外Forum投稿です。「Arduinoではうんともすんとも動かない・・・」とのQが散見され、回答も色々で正解が出てない感じ。まさかね??

注文する前に調べておけばよかったか?と不安になりましたが、今やほぼすべてのLCD機種のガイドやソフトが”LCD-WIKI”にあるわけなので、きっと妥当なガイドがあることでしょう。

http://www.lcdwiki.com/Main_Page

f:id:a-tomi:20210524094103j:plain


モデル名MSP3520で検索するとMSP3521(同じ型でタッチパネル装備)が出てきます。そのモデルなら同じ(サブセットとなる)わけですが。あるいはILI9488で検索してもそのページへたどり着くことができます。

f:id:a-tomi:20210524094331j:plain

ご覧のとおり仕様や関係マニュアル、ラズパイあるいはマイコン機種ごとの使えるソフトなど、網羅的に詳しく掲載されています。グラフィック表示装置を調べたり、関連資料やソフトウェアをダウンロードしたいときに便利に使える百科事典のようなものです。言語は英語か中国語だけなのですが、有難いことです。

というわけで、そこに表示されているArduino用のLCDWIKIライブラリーをダウンロードしてテストすることにしました。グラフィック表示なのでUnoでは容量が厳しいことになるのでArduino-MEGAで試します。

SampleスケッチでSPI接続を試すと、ありゃ? バックライトが点灯するだけでうんともすんとも・・・。

今はたまたま時間がないところなのですが、なにやら落とし穴がある感じですね。こうなったらしかたがない。プロトコルの点検に備え、サンプルプログラムでなく、ごく単純なテストプログラムを作りました(記事の後ろのほうに載せておきます)。テスト結果は当然ですが最初は同じこと。

そこで些細な情報を含めて一応はすべて見ることに。そしたら、Arduinoでデモをする際の注意事項という小さなリンク先があるのに気づきました。そこを見ると、次のことがわかりにくく(・・? 書いてあるのです!!  超要約をするなら

「ILI9488はこれまでのICと違い5VトレラントではないのでArduinoでは次のどちらかの対応が必要。

①すべての信号レベルを3.3Vに変換する。

LCD側のVcc等に無理に5Vを突っ込む。その際のやりかた。ただし発熱して寿命が縮むとあります。(え?そんなの選択肢なの? 短時間のデモには使えるとしても ・・・だからデモする際の注意か・・・)。

そういうことならしかたがないですね。インターフェイスのロジックレベル変換をします・・・。手持ちの8チャネル変換モジュールを使うことに。ピンボケ写真ですみませんが次のものです。

f:id:a-tomi:20210524100057j:plain

信号レベル変換モジュールはトランジスタ(FET)と抵抗の組み合わせです。HVに5Vを、LVに3.3Vを入れることで各信号の両方向レベル変換をします。価格は海外ネットでは1個数十円のものです。

これを入れたらなんのことはない、一発であっけなく動きました。

f:id:a-tomi:20210524100456j:plain

このLCDは比較的新しい製品で、試したものは今年の製造。コントラストも強く色もきれい。そして鮮明です。この大きさ、画素数と解像度で千円もしないとは。素晴らしいコストパフォーマンスだと思います!

簡単なテストプログラムを次につけておきます。サンプルプログラムは複雑すぎてテストや解析の用途には今一つですから。短時間で勝手に作ったスケッチで大したものではありませんが一応。

なお、カーブの表示を単純にdrawPixelで描きましたが、drawLineでつなぐ方がきれいに描けます。とりあえずはやってませんが。

/*************************************************************
 * Test program for 480x320 TFT-LCD w/ILI9488(18bit-color)
 * for Arduino Mega, using LCDWIKI libraries.
 *                May 22, 2021              Akira Tominaga
 * ***********************************************************/
#include "LCDWIKI_GUI.h"     // Core graphics library
#include "LCDWIKI_SPI.h"     // SPI library
#define MODEL ILI9488_18     // LCD's IC model selection
// HW-SPI pins: DI(MOSI)=51, SDO(MISO)=50(unused), and SCK=52
// the other LCD pins are to any pins 
#define CS   45              // or to ground if no other SPI used
#define CD   49
#define RST  47
#define LED  -1             // to declare unused (set to 3.3V)
// generate class lcd
LCDWIKI_SPI lcd(MODEL, CS, CD, RST, LED);
uint16_t wW;
uint16_t hH;
uint16_t testNum = 0;

void setup() { // ***** Arduino setup() *****
  Serial.begin(9600);
  wW = lcd.Get_Display_Height();
  hH = lcd.Get_Display_Width();
  Serial.print("*** TFT-LCD ");
  Serial.print(wW);
  Serial.print("x");
  Serial.println(hH);
  lcd.Init_LCD();
  lcd.Fill_Screen(0x0);
  lcd.Set_Rotation(1);   // rotate screen by 90 degrees
  //display main panel
  lcd.Set_Draw_color(16, 16, 96);
  lcd.Fill_Rectangle(0, 0, wW - 1, 19); // draw header bar
  lcd.Set_Text_Mode(1);
  lcd.Set_Text_Size(2);
  lcd.Set_Text_colour(255, 255, 255);
  lcd.Set_Text_Back_colour(0);
  lcd.Print_String("TFT-LCD test with LCDWIKI", CENTER, 3);
  //
  lcd.Fill_Rectangle(0, hH - 19, wW - 1, hH - 1); // draw footer
  lcd.Print_String("<https://a-tomi.hatenablog.com/>", CENTER, hH - 17);
  //
  lcd.Set_Draw_color(255, 0, 0);
  lcd.Draw_Rectangle(0, 20, wW - 1, hH - 20);
}

void loop() { // ***** Arduino loop() *****
  // *** Print_String
  String s = "Test ";
  s.concat(String(testNum));
  lcd.Set_Draw_color(0, 0, 0);
  lcd.Fill_Rectangle(100, 24, 340, 48);
  lcd.Set_Text_Size(3);
  lcd.Set_Text_colour(255, 255, 0);
  lcd.Print_String(s, CENTER, 24);
  // *** Draw  pixel for sin wave
  lcd.Set_Draw_color(0, 255, 255);
  for (int i = 1; i < wW - 1; i++)  {
    lcd.Draw_Pixel(i, hH / 2 + 3 + (sin((i * 3.14 + testNum * 20) / 180) * 100));
  }
  // *** Fill_Circle(x,y,r)
  lcd.Set_Draw_color(testNum * 5, 0, 255 - testNum * 5);
  lcd.Fill_Circle(wW / 2, hH / 2 + 1, testNum * 2);
  //
  delay(1000);
  testNum++;
  if (testNum > 51) {
    Serial.println("*** End ***");
    while (true) {}
  }
}
/* End of Test Program */

パラメータにcolor と colourが混じっていますが区別があります(統一するとコンパイルエラーになります^^)。このあたり、中華料理の調理並みに大雑把(?)なライブラリーにみえます。突っ込みどころ多数ですね。

TeensyでもESPでもコンパイルエラーになりますが・・。中身をどこかで解析して直すか、各マイコン専用のを使うのがよさそうです。

 

以上、メモもかねて勝手な記事にしました。何らかのお役に立てば幸い。

 

©2021 Akira Tominaga, All rights reserved.