Problème TFT 2,8’ Ili9341 SPI & UNO⁸

Bonjour,

J'essaye depuis une semaine d'utiliser un écran Tft sur un arduino Uno, ce que je sais:

Tft 2,8’ ili9341 SPIP, c'est un écran tactile bon marché d'Aliexpress avec un emplacement pour carte SD.

la tension est de 3,3v ou 5V en connectant le cavalier J1 au dos de la carte. Par contre, je sais pas dans quelle position on alimente en 3,3 ou 5V.

D'après mes recherches sur le forum et le net, les signaux doivent être en 3,3v pour pas abîmer l'écran. Le soucis, c'est qu'on peut lire tout et son contraire...

Je joins une image de mon montage, que je pense être bon, ainsi que le code actuel.

L'écran s'allume mais rien ne s'affiche,tout au plus l'écran clignote en blanc. J'ai essayé plusieurs configurations ainsi que les bibliothèques Adafruit GLX & Ili9341 et Tft_espi.


#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"

// For the Adafruit shield, these are the default.
#define TFT_CS 10
#define TFT_DC 8
#define TFT_MOSI 11
#define TFT_CLK 13
#define TFT_RST 9
#define TFT_MISO 12

// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
// If using the breakout, change pins as desired
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);

void setup() {
// Initialise le reset
pinMode(TFT_RST, OUTPUT);
digitalWrite(TFT_RST, LOW);
delay(50);
digitalWrite(TFT_RST, HIGH);
delay(50);

Serial.begin(9600);
Serial.println("ILI9341 Test!"); 
// Initialisation de l'écran
tft.begin();


Serial.println("Écran initialisé !");
tft.fillScreen(ILI9341_BLUE); // Teste si l'écran change de couleur
delay(1000);
tft.fillScreen(ILI9341_BLACK);



// read diagnostics (optional but can help debug problems)
uint8_t x = tft.readcommand8(ILI9341_RDMODE);
Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX);
x = tft.readcommand8(ILI9341_RDMADCTL);
Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX);
x = tft.readcommand8(ILI9341_RDPIXFMT);
Serial.print("Pixel Format: 0x"); Serial.println(x, HEX);
x = tft.readcommand8(ILI9341_RDIMGFMT);
Serial.print("Image Format: 0x"); Serial.println(x, HEX);
x = tft.readcommand8(ILI9341_RDSELFDIAG);
Serial.print("Self Diagnostic: 0x"); Serial.println(x, HEX); 
Serial.println(F("Benchmark Time (microseconds)"));
delay(10);
Serial.print(F("Screen fill "));
Serial.println(testFillScreen());
delay(500);

Serial.print(F("Text "));
Serial.println(testText());
delay(3000);

Serial.print(F("Lines "));
Serial.println(testLines(ILI9341_CYAN));
delay(500);

Serial.print(F("Horiz/Vert Lines "));
Serial.println(testFastLines(ILI9341_RED, ILI9341_BLUE));
delay(500);

Serial.print(F("Rectangles (outline) "));
Serial.println(testRects(ILI9341_GREEN));
delay(500);

Serial.print(F("Rectangles (filled) "));
Serial.println(testFilledRects(ILI9341_YELLOW, ILI9341_MAGENTA));
delay(500);

Serial.print(F("Circles (filled) "));
Serial.println(testFilledCircles(10, ILI9341_MAGENTA));

Serial.print(F("Circles (outline) "));
Serial.println(testCircles(10, ILI9341_WHITE));
delay(500);

Serial.print(F("Triangles (outline) "));
Serial.println(testTriangles());
delay(500);

Serial.print(F("Triangles (filled) "));
Serial.println(testFilledTriangles());
delay(500);

Serial.print(F("Rounded rects (outline) "));
Serial.println(testRoundRects());
delay(500);

Serial.print(F("Rounded rects (filled) "));
Serial.println(testFilledRoundRects());
delay(500);

Serial.println(F("Done!"));

}


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

unsigned long testFillScreen() {
unsigned long start = micros();
tft.fillScreen(ILI9341_BLACK);
yield();
tft.fillScreen(ILI9341_RED);
yield();
tft.fillScreen(ILI9341_GREEN);
yield();
tft.fillScreen(ILI9341_BLUE);
yield();
tft.fillScreen(ILI9341_BLACK);
yield();
return micros() - start;
}

unsigned long testText() {
tft.fillScreen(ILI9341_BLACK);
unsigned long start = micros();
tft.setCursor(0, 0);
tft.setTextColor(ILI9341_WHITE); tft.setTextSize(1);
tft.println("Hello World!");
tft.setTextColor(ILI9341_YELLOW); tft.setTextSize(2);
tft.println(1234.56);
tft.setTextColor(ILI9341_RED); tft.setTextSize(3);
tft.println(0xDEADBEEF, HEX);
tft.println();
tft.setTextColor(ILI9341_GREEN);
tft.setTextSize(5);
tft.println("Groop");
tft.setTextSize(2);
tft.println("I implore thee,");
tft.setTextSize(1);
tft.println("my foonting turlingdromes.");
tft.println("And hooptiously drangle me");
tft.println("with crinkly bindlewurdles,");
tft.println("Or I will rend thee");
tft.println("in the gobberwarts");
tft.println("with my blurglecruncheon,");
tft.println("see if I don't!");
return micros() - start;
}

unsigned long testLines(uint16_t color) {
unsigned long start, t;
int x1, y1, x2, y2,
w = tft.width(),
h = tft.height();

tft.fillScreen(ILI9341_BLACK);
yield();
x1 = y1 = 0;
y2 = h - 1;
start = micros();
for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
x2 = w - 1;
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
t = micros() - start; // fillScreen doesn't count against timing

yield();
tft.fillScreen(ILI9341_BLACK);
yield();

x1 = w - 1;
y1 = 0;
y2 = h - 1;
start = micros();
for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
x2 = 0;
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
t += micros() - start;

yield();
tft.fillScreen(ILI9341_BLACK);
yield();

x1 = 0;
y1 = h - 1;
y2 = 0;
start = micros();
for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
x2 = w - 1;
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
t += micros() - start;

yield();
tft.fillScreen(ILI9341_BLACK);
yield();

x1 = w - 1;
y1 = h - 1;
y2 = 0;
start = micros();
for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
x2 = 0;
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);

yield();
return micros() - start;
}

unsigned long testFastLines(uint16_t color1, uint16_t color2) {
unsigned long start;
int x, y, w = tft.width(), h = tft.height();

tft.fillScreen(ILI9341_BLACK);
start = micros();
for(y=0; y<h; y+=5) tft.drawFastHLine(0, y, w, color1);
for(x=0; x<w; x+=5) tft.drawFastVLine(x, 0, h, color2);

return micros() - start;
}

unsigned long testRects(uint16_t color) {
unsigned long start;
int n, i, i2,
cx = tft.width() / 2,
cy = tft.height() / 2;

tft.fillScreen(ILI9341_BLACK);
n = min(tft.width(), tft.height());
start = micros();
for(i=2; i<n; i+=6) {
i2 = i / 2;
tft.drawRect(cx-i2, cy-i2, i, i, color);
}

return micros() - start;
}

unsigned long testFilledRects(uint16_t color1, uint16_t color2) {
unsigned long start, t = 0;
int n, i, i2,
cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;

tft.fillScreen(ILI9341_BLACK);
n = min(tft.width(), tft.height());
for(i=n; i>0; i-=6) {
i2 = i / 2;
start = micros();
tft.fillRect(cx-i2, cy-i2, i, i, color1);
t += micros() - start;
// Outlines are not included in timing results
tft.drawRect(cx-i2, cy-i2, i, i, color2);
yield();
}

return t;
}

unsigned long testFilledCircles(uint8_t radius, uint16_t color) {
unsigned long start;
int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2;

tft.fillScreen(ILI9341_BLACK);
start = micros();
for(x=radius; x<w; x+=r2) {
for(y=radius; y<h; y+=r2) {
tft.fillCircle(x, y, radius, color);
}
}

return micros() - start;
}

unsigned long testCircles(uint8_t radius, uint16_t color) {
unsigned long start;
int x, y, r2 = radius * 2,
w = tft.width() + radius,
h = tft.height() + radius;

// Screen is not cleared for this one -- this is
// intentional and does not affect the reported time.
start = micros();
for(x=0; x<w; x+=r2) {
for(y=0; y<h; y+=r2) {
tft.drawCircle(x, y, radius, color);
}
}

return micros() - start;
}

unsigned long testTriangles() {
unsigned long start;
int n, i, cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;

tft.fillScreen(ILI9341_BLACK);
n = min(cx, cy);
start = micros();
for(i=0; i<n; i+=5) {
tft.drawTriangle(
cx , cy - i, // peak
cx - i, cy + i, // bottom left
cx + i, cy + i, // bottom right
tft.color565(i, i, i));
}

return micros() - start;
}

unsigned long testFilledTriangles() {
unsigned long start, t = 0;
int i, cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;

tft.fillScreen(ILI9341_BLACK);
start = micros();
for(i=min(cx,cy); i>10; i-=5) {
start = micros();
tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
tft.color565(0, i*10, i*10));
t += micros() - start;
tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
tft.color565(i*10, i*10, 0));
yield();
}

return t;
}

unsigned long testRoundRects() {
unsigned long start;
int w, i, i2,
cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;

tft.fillScreen(ILI9341_BLACK);
w = min(tft.width(), tft.height());
start = micros();
for(i=0; i<w; i+=6) {
i2 = i / 2;
tft.drawRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(i, 0, 0));
}

return micros() - start;
}

unsigned long testFilledRoundRects() {
unsigned long start;
int i, i2,
cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;

tft.fillScreen(ILI9341_BLACK);
start = micros();
for(i=min(tft.width(), tft.height()); i>20; i-=6) {
i2 = i / 2;
tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0));
yield();
}

return micros() - start;
}



docs et les ressources de l'écran TFT 2,8’ ILI9341 SPI

J'ai trouvé tous les documents et ressources sur cet ecran, mais je ne connais pas du tout les bibliothèques utilisées...
http://www.lcdwiki.com/2.8inch_SPI_Module_ILI9341_SKU:MSP2807

c'est 9 et pas aa, faute de frappe lors la recopie sinon tu n'aurais pas pu compilé/téléversé

le jumper J1 court circuit l'entrée et la sortie du regulateur 3v3 du module quand on l'utilise avec vcc sur3v3, il ne faut pas le "courtcircuiter" si on met Vcc sur le 5V,
ton retro eclairage s'allume ? quels sont les infos dans le moniteur série ?
les resistances 1k8 et 3k3 servent a faire de diviseurs de tension pour ne pas dépasser 3v3
sur les entrées de l'ili9341, faire çà sur breadboard avec des fils dupont n'est pas le meilleur moyen...

Lien mort.

Merci pour tes réponses. :slight_smile:

Oui erreur de frappes. Xd

Du coup, J'alimentais en 3,3V au lieu du 5V requis...

Oui l'écran s'allume mais n'affiche rien... Des fois il clignote en blanc. Avec les différents exemples que j'ai essayé, des "trucs" s'écrivent sur le moniteur série... je posterai un copier/coller du moniteur série deque je suis sur le PC.

Pour les résistances, je sais pas si se sont les meilleures valeurs...

Je vais revoir mon câblage, je ne voulais pas souder avant d'avoir pu faire fonctionner l'écran.

J'ai corrigé le lien:
http://www.lcdwiki.com/2.8inch_SPI_Module_ILI9341_SKU:MSP2807

  • Si tu appliques du 5V sur la broche Vcc de l'afficheur il faut laisser le jumper ouvert. Le régulateur sur la carte de l'afficheur générera du 3.3V pour l'afficheur.
  • Si tu appliques du 3.3V sur le Vcc de l'afficheur il faut mettre le jumper en place pour contourner le régulateur.

Si j'en crois le schéma que tu as mis au #1 tu appliques du 3.3V sur le Vcc de l'afficheur. Donc si tu veux continuer comme ça, tu mets le jumper, sinon, si tu ne veux pas faire de modification sur la carte, tu appliques le 5V sur le Vcc de l'afficheur.

Qu'est-ce que tu vois dans le moniteur série lorsque tu lances le programme?

Je me suis rendu compte que j'avais inversées toutes les pins sur mon schema et mon câblage... Au lieu de cabler de 1 à 9, j'ai fais l'inverse. :sweat_smile:

J'ai tout recommencer et ça fonctionne!

J'ai laissé J1 ouvert et 3,3v pour l'amention... Je sais pas pourquoi mais ça marche sans court-circuiter le régulateur.

Il me reste à :

  1. Faire fonctionner le tactile et la carte SD.

  2. Pouvoir contrôler l'intensité de l'ecran.

  3. Trouver la meilleur solution pour créer une interface graphique. Genre des boutons pour contrôler des leds et des zones textes pour avoir des retours d'information. Peut-être contrôler un deuxième Arduino avec le tft ?

Je publierai tout à l'heure le schéma corrigé et le code.

L'écran est légèrement sous-alimenté dans ce cas.

Le schéma et le câblage corrigé:


Ce que ça donne:

Super, bonne chance pour la suite.

J'essaye maintenant de configurer la partie tactile du tft... Je ne sais pas quelle bibliothèque utilisée pour le touch screen, je ne trouve pas pas non plus un schema de cablagle.

Edit: apparemment, mon tft utilise la puce Xpt2046 pour la partie tactile.

Bonjour axelmaux

image

Cordialement
jpbbricole

@jpbbricole Merci :slight_smile:

Je me suis renseigner et j'ai modifié mon schéma (voir l'image plus bas), j'espère que je ne me suis pas trompé.

La "pin" T_IRQ serait optionnelle ?

Bonjour axelmaux

Je suppose (je n'ai pas ce type d'écran) que c'est pour générer une interruption lors d'un touché de l'écran. Ca permet une gestion plus efficace de la fonction tactile. Ainsi, il n'est pas nécessaire de surveiller le tactile de l'écran, le tactile s'annonce de lui-même.

Cordialement
jpbbricole

C'est écrit dans le README.md de la bibliothèque.

Pourquoi T_DIN est-il raccordé à D8 au lieu d'être connecté à D11?

Erreur d'inattention quand j'ai modifié le schéma. Sur le cablage T_Din est bien relié à D11. Merci pour la remarque. :slight_smile:

Merci pour l'info.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.