- Arduinoを使って液晶に画像や文字を表示させたいです
前提
Arduino初心者です。
秋月で下記のMSP2807というTFT液晶モジュールを購入しました。
https://akizukidenshi.com/catalog/g/gM-16265/
下記のURLの通り、
http://try3dcg.world.coocan.jp/note/spi/ILI9341.html
LCDモジュール ArduinoUNO
VCC 3.3V
GND GND
CS D10
RESET D9
DC D8
SDI(MOSI) D11
CSK D13
LED 3.3V
SDO(MISO) D12
に配線しました。
コードもここに載っている通り、記述しました。
しかし、液晶自体は白く光りはするのですが、表示されるはずの画像や文字が何も表示されません。
本来であれば、下記のYoutubeのように色とりどりに光るようです。
https://youtu.be/JGIdd8FkQFk
他のサイトやAdafruit ILI9341のgraphictest?というスケッチ例も試してみましたが、結果は同じでした。
どうしたら表示されるか教えてください
該当のソースコード
Arduino
1ソースコード(一部) 2```// ILI9341 SPI Graphics TEST 3#include <SPI.h> 4#include "image2.h" 5#include "font8x16.h" 6 7#define TFT_CLK 13 8#define TFT_MISO 12 9#define TFT_MOSI 11 10#define TFT_DC 8 11#define TFT_RST 9 12#define TFT_CS 10 13// BackLightはHIGH固定にするのでソフトがらは制御しない 14#define TFT_BL 7 15 16// SPISettings settings = SPISettings(8000000, MSBFIRST, SPI_MODE0); // 8MHzで合ってるよね?変だと思ったら修正してください。 17 18// ▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼ 19void setup() { 20 SPI.begin(); //SPIを初期化、SCK、MOSI、SSの各ピンの動作は出力、SCK、MOSIはLOW、SSはHIGH 21 SPI.setClockDivider(SPI_CLOCK_DIV2); 22 SPI.setBitOrder(MSBFIRST); 23 SPI.setDataMode(SPI_MODE0); 24// SPI.beginTransaction(settings); // M5StampやRaspberryPi PICOで使う時はコッチの設定でないとコンパイルが通らない 25 26 // --- ST3375 INITIAL 27 pinMode(TFT_CS, OUTPUT); 28 pinMode(TFT_DC, OUTPUT); 29 pinMode(TFT_RST, OUTPUT); 30 31 // --- HARDWARE Reset 32 digitalWrite(TFT_RST, LOW); 33 delay(20); 34 digitalWrite(TFT_RST, HIGH); 35 delay(20); // このdelayは必要 36 37 // --- ILI9341 動作設定 38 digitalWrite(TFT_CS, LOW); // TFTセレクト 39 40 digitalWrite(TFT_DC, LOW); // Command mode 41 SPI.transfer(0x01); //<< SOFTWARE RESET 42 delay(150); // ※このdelayはなくても大丈夫かも 43 44 SPI.transfer(0x13) ; //<< Normal Display Mode ON 45 46 SPI.transfer(0x36) ; //<< Memory Access Control 47 digitalWrite(TFT_DC, HIGH); // Data mode 48 SPI.transfer(0x48) ; // MX = ON , GBR = ON (縦画面,左から右に表示) 49 50 digitalWrite(TFT_DC, LOW); // Command mode 51 SPI.transfer(0x3a) ; //<< COLMOD: Pixel Format Set 52 digitalWrite(TFT_DC, HIGH); // Data mode 53 SPI.transfer(0x55) ; //<< 16Bits / 1Pixcel 54 55 digitalWrite(TFT_DC, LOW); // Command mode 56 SPI.transfer(0x11) ; //<< Sleep Out 57 58 delay(60); // 【重要】このdelayは絶対に必要:電源が不安定な場合は長めに(120ms位に)する 59 60 SPI.transfer(0x29) ; //<< Display ON 61 62 digitalWrite(TFT_CS, HIGH); // TFT解放 63} 64 65// ▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼ 66void loop() { 67 for (int i=0;i<5;i++) { 68 uint16_t color = 0x0000 ; 69 switch(i) { 70 case 0: color = 0x0000 ; break ; 71 case 1: color = 0xF800 ; break ; 72 case 2: color = 0x07E0 ; break ; 73 case 3: color = 0x001F ; break ; 74 case 4: color = 0xFFFF ; break ; 75 } 76 // --- 画面塗りつぶし 77 digitalWrite(TFT_CS, LOW); //TFTセレクト 78 79 digitalWrite(TFT_DC, LOW); // Command mode 80 SPI.transfer(0x2a); //<< Column Address Set 81 digitalWrite(TFT_DC, HIGH); // Data mode 82 SPI.transfer16(0); // 開始カラム 0 83 SPI.transfer16(239); // 終了カラム 239 84 85 digitalWrite(TFT_DC, LOW); // Command mode 86 SPI.transfer(0x2b); //<< Page Address Set 87 digitalWrite(TFT_DC, HIGH); // Data mode 88 SPI.transfer16(0); // 開始ページ 0 89 SPI.transfer16(319); // 終了ページ 319 90 91 digitalWrite(TFT_DC, LOW); // Command mode 92 SPI.transfer(0x2c); //<< Memory Write 93 digitalWrite(TFT_DC, HIGH); // Data mode 94 for (int y = 0 ; y < 320 ; y++) { 95 for (int x = 0 ; x < 240 ; x++) { 96 uint16_t data = color ; 97 SPI.transfer16(color); 98 } 99 } 100 digitalWrite(TFT_CS, HIGH); //TFT解放 101 delay(500) ; 102 } 103} 104} 105 106 107### 試したこと 108ジャンパー線の断線を疑い、全て新品のジャンパー線に差し替えました。 109持っている2つのArduinoUno両方で試しましたが、駄目でしあ。 110様々なサイトを参考にして、色々な配線、色々なプログラムを試しました。 111 112### 補足情報(FW/ツールのバージョンなど) 113 114Arduino Uno 互換ボード 115Arduino IDE 2.1.1 116液晶 ︎▼ 117ILI9341搭載2.8インチSPI制御タッチパネル付TFT液晶 MSP2807 118電源電圧範囲:3.3V~5V 119・消費電流:約90mA 120・LCDサイズ:2.8インチ(43.2×57.6mm) 121・ドライバIC:ILI9341 122・駆動方式:a-SiTFT 123・ドット数:320×240×(RGB) 124・色数:16bit(RGB565) 125・通信方式:4線式SPI 126・基板寸法:50.0×86.0mm 127・ロジック電圧:3.3V(TTL) 128・バックライト:白色LED
ココをこうすればあら不思議、動き始めましたよ...というような話を期待しないでくださいね。
「URLの通りにやりました」というのは...やったつもりになっているだけで、そうなっていないということはないですか? なんらかの前提条件をすっ飛ばしていたりしませんか? 例えば、
http://try3dcg.world.coocan.jp/note/spi/ILI9341.html
には
---
ArduinoUNOなどの5V系のマイコンで使用する場合にはレベルシフタが必要です。
---
との記述がありますが、質問ではそれには全く触れられていませんね。そこはどうなっていますか?
3.3V入力に5V突っ込むとデバイスが破壊されることもあります(確実に壊れるとまではいいません)。
> 配線しました。
間違いが無いこと、断線やショートがないことは何らかの方法で確認していますか?
もちろん、何らかのパーツ故障の可能性もゼロではないです。(他の全ての要因が正しいなら故障としか考えられない、ということになります)
> 他のサイトやAdafruit ILI9341のgraphictest?というスケッチ例も試してみましたが、結果は同じでした。
ソフトを差し替えても状況が変わらないなら、ハード的な問題の可能性が大きくなります。
僕の持っているArduinoUnoには3.3V出力があります。そこに刺して配線していました。
試したことの記述が不足していたので、質問を編集しました🙇♂️
何度も何度も配線は指さし確認をしました。
ジャンパー線の断線を疑い、全て新品にとりかえたりArduinoUnoに問題があるかも、と思い持っているもう1つのArduinoUnoでも試したりしました。
