Ajouter des fonctions dans librairie écran TFT 3.5"

Bonjour à tous,

Je suis en train de bidouiller avec un arduino et l’écran TFT tactile 3.5", celui-ci est un KUMAN acheté sur Amazon il y’a quelques temps, il était livré avec CD contenant des exemples, les librairies et la doc du driver, avec les commandes prises en charge par ce dernier.

Or dans la librairie MCUFRIEND_kbv qui est fourni avec, et qui utilise elle-même les librairies ADAFRUIT_GFX, Adafruit_TFTLCD et TouchScreen, certaines fonctions comme par exemple, le contrôle du rétroéclairage ou la mise en veille de l’écran ne sont pas implémentés, bien que présente dans la doc du driver. J’ai donc entrepris en m’aidant de la doc et en m’inspirant des fonctions déjà présente, de les implémenter moi-même. Celle-ci sont bien reconnues par l’IDE Arduino et le code compile sans problème, mais cela ne fonctionne pas convenablement, par exemple la mise en veille s’arrête à l’écran blanc, étape en effet décrite dans la doc du driver, mais ne continue pas, et la fonction d’allumage ou d’extinction du rétroéclairage ne fait rien du tout.

Voilà les fichiers présent dans le CD (non modifiés) : CD La doc du driver se trouve dans "Documents" : "Driver chip ILI9486.pdf" et les librairies dans "Arduino Demo_UNO&Mega2560/Install libraries"

Et les modifications que j’ai réalisées :

J’ai ajouté dans le fichier MCUFRIEND_kbv.h :

void     sleepIn(void);
void     sleepOut(void);
void     backlightOff(void);
void     backlightOn(void);

dans le fichier MCUFRIEND_kbv.cpp

void MCUFRIEND_kbv::sleepIn(void){
    CS_ACTIVE;
    WriteCmd(0x10);
    WriteData(0x00);
    CS_IDLE;
}

void MCUFRIEND_kbv::sleepOut(void){
    CS_ACTIVE;
    WriteCmd(0x11);
    WriteData(0x00);
    CS_IDLE;
}

void MCUFRIEND_kbv::backlightOff(void){
    CS_ACTIVE;
    WriteCmd(0x53);
    WriteData(0x00);
    CS_IDLE;
}

void MCUFRIEND_kbv::backlightOn(void){
    CS_ACTIVE;
    WriteCmd(0x53);
    WriteData(0x4);
    CS_IDLE;
}

Et voici le code de l’Arduino que j’utilise pour mes tests :

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library
#include <TouchScreen.h>

#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0

#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

#define YP A2  // must be an analog pin, use "An" notation!
#define XM A3  // must be an analog pin, use "An" notation!
#define YM 8   // can be a digital pin
#define XP 9   // can be a digital pin

#define TS_MINX 130
#define TS_MAXX 905

#define TS_MINY 75
#define TS_MAXY 930

#define MINPRESSURE 10
#define MAXPRESSURE 1000

#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

boolean inSleepMode = false;

void init_screen(){
  tft.fillScreen(BLACK);
  tft.setCursor(0, 0);
  
  tft.setTextColor(RED);  tft.setTextSize(6);
  tft.println("Hello World!");
}

void setup(void) {
  Serial.begin(9600);

  tft.reset();

  uint16_t identifier = tft.readID();
  tft.begin(identifier);
  tft.setRotation(1);

  init_screen();
}

void loop(void) {
  if(Serial.available() > 0){
    while(Serial.available() > 0){
      String command = Serial.readString();
      Serial.println(command);
      Serial.println(command == "SLEEP");
      if(command == "SLEEP"){
        enter_sleepMode();
      } 
    }
  }
}

void enter_sleepMode(){
  tft.sleepIn();
  inSleepMode = true;
  sleep_mode();
}

void sleep_mode(){
  boolean touch = false;
  while(!touch){
    digitalWrite(13, HIGH);
    TSPoint p = ts.getPoint();
    digitalWrite(13, LOW);
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
    
    if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
      touch = true;   
    }
  }
  inSleepMode = false;
  tft.sleepOut();
  //init_screen();
}

Est-ce que l’un.e d’entre vous aurait déjà réaliser ce genre de modifications ou alors y’a t’il une erreur flagrante qui fait que ça foire.

Merci d’avance,

Corentin

Modifier une librairie est une opération déconseillée.
A la prochaine mise à jour les modifications sont perdues.
Ou alors on ne fait jamais de mise à jour et on ne profite jamais des évolutions et corrections de bugs.

Ce que l'on peut faire : dériver la classe, y compris dans une nouvelle librairie, et ajouter les méthodes qui manquent.
Cette solution est beaucoup plus rationnelle. Par contre cela suppose qu'un test soit effectué à chaque mise à jour de la librairie.

Il faut savoir que ce genre d'afficheur est composé de 4 objets complètement indépendants:

  • un écran TFT avec son driver
  • un rétroéclairage
  • un lecteur SD
  • un touchpad

La fonction 53 est une fonction pour le driver, ainsi que la fonction 10. Elle vont changer le comportement de ce qui est affiché, par exemple en coupant les drivers des led en sortie. Tout ce que l'on peut faire avec les fonction du driver, c'est de ne plus commander les leds... qui laissent passer la lumière d'un deuxième objet: le rétroéclairage. Si on veut pouvoir "éteindre", il faudrait couper le rétroéclairage.

Or il n'y a pas de broches que pour ce rétroéclairage, il est directement branché sur le 5V. La seule solution pour éteindre le rétroéclairage, c'est de couper le 5V. Avant il faut mettre à zéro tous les fils de l'afficheur (toutes les broches dont le nom commence par LCD) pour ne pas alimenter le driver par ses entrées.

Les broches pour le touchpad sont multiplexées avec celles de l'afficheur. Cela veut dire que si on coupe le 5V, il ne faut plus appeler les fonctions du touchpad. Il faut trouver un autre moyen pour le réveiller


Il est plus sympathique de mettre des liens que l'on peut voir plutôt que des liens à télécharger. Ainsi en cliquant dessus j'ai l'info, sans avoir à sauvegarder, décompresser... Ici cela fait 2 liens à mettre. Il faut penser que voir un pdf, c'est facile, télécharger et lire le zip n'est pas à la porté de mon téléphone.

Il ne faut pas non plus croire tout ce qui est écrit. Il est indiqué dans la doc, premier paragraphe:

MAR3528
module is 3.5" TFT LCD with 262K color 480x 320 resolutions.
The controller of this LCD module is ILI9486/ILI9488, it supports 16-wires DataBus interface. Moreover, this module includes the 5V 3.3V power conversion circuit and Level conversion circuit This Module can Directly inserted into the Arduino Mega2560 Board ,it also includes the SD card socket and SPI FLASH circuitcircuit.

  1. Pour avoir les 262K color, il faut faire soi même la bibliothèque, celle qui est founie n'accède qu'à 64K color. Ce n'est donc pas complètement faux, mais c'est de la publicité trompeuse

2)" It supports 16-wires DataBus interface". vrai, le ILI9486 possède bien un mode 16 fils. Mais pas le MAR3528. Ce n'est donc pas complètement faux, mais c'est encore de la publicité trompeuse. C'est d'ailleurs repris dans les spécifications, mais le brochage de la carte dit le contraire.

3)"This Module can Directly inserted into the Arduino Mega2560 Board ,it also includes the SD"
C'est vrai que l'on peut l'enficher sur une carte Mega. Mais ce n'est pas dit "On peut l'enficher sur une varte Méga, mais le lecteur SD ne fonctionnera pas" ce qui aurait été correct; Je suis sûr par contre que tout fonctionne correctement avec une carte uno! Pour faire fonctionner le SD avec une mega, il faut déplacer les 4 broches du lecteur sur les broches 50 à 53. Ce n'est donc pas complètement faux, mais c'est encore de la publicité trompeuse

Ceci n'est une analyse que du premier paragraphe. Je continue rapidement:

Electrical Characteristics -> BackLight Voltage 2.8 3.2 3.3 V
Ca c'est pour nous faire croire qu'on peut agir dessus...

Electrical Characteristics -> IO Pins Voltage MCU Voltage = 3.3V 3 3.3 3.6 V
mais plus loin on nous dit plusieurs fois que la broche 3,3V n'est pas connectée. Ça veut dire quoi ce minimum et ce maximum?

Avant d'acheter un composant il faut voir la doc avant. L'idéal serait qu'elle soit juste, sinon cela revient au même que de ne pas la lire

Merci beaucoup pour vos premières réponses

@hbachetti : oui en effet je n'y avais pas pensé du tout, je vais voir pour faire ça, au cas ou ce soit possible mais en tant cela m'en a pas l'air.

@vileroi : Désolé pour les fichiers, j'ai pensé directement au zip pour mettre tout les fichiers d'un coup et je n'est pas pensé à les séparer.

Quand j'ai acheté cet écran, c'était pour faire un petit projet et je n'avait pas fait plus attention que ça, finalement je ne suis pas aller au bout de celui-ci et je l'ai ressorti il y'a quelques jours pour bricoler autre chose.

Quand je me suis aperçu de cela et que j'ai regardé la doc du driver, je suis tombé sur les fonctions sleepIn et sleepOut, puis sur la fonction 53 qui parler du BackLight. Donc je me suis dit que c'était le rétroéclairage, mais de ce que comprend de ta réponse cela coupe uniquement la partie LCD et non pas le rétroéclairage en lui-même.

Pour le fait qu'il n'y a que 64K color ce n'est pas vraiment gênant en fait, mais c'est intéressant à savoir. Mais je n'est pas le courage de faire moi-même la bibliothèque, et je n'est pas trouvé d'autre librairies qui en parle, y compris lors de ma recherche pour le rétro éclairage et le mode veille, a moins que je ne suis passé à côté de quelque chose.

Pour finir je suis tombé sur le problème de carte SD aussi lors de mes recherches, et j'ai donc essayé d'utiliser le SOFTWARE_SPI mais sans succès.

Après je pourrai toujours essayer de modifier l'alimentation du rétroéclairage en y mettant un transistor. Mais ce sera vraiment si on ne peut rien faire côté software. Et du coup ça me permettra de couper uniquement le rétro-éclairage et conserver le tactile pour le réveil. Parce que je doute que le rétro-éclairage tienne longtemps si il est allumé 24/24.

Ce que l'on peut faire : dériver la classe, y compris dans une nouvelle librairie, et ajouter les méthodes qui manquent.

je vais voir pour faire ça, au cas ou ce soit possible mais en tant cela m'en a pas l'air.

Il y a encore une autre solution, c'est de faire un bibliothèque à part qui n'utilise pas ADAFRUIT_GFX, Adafruit_TFTLCD. Comme ces bibliothèques n'utilisent pas ni la fonction 10 ni la fonction 53, il n'y a pas de conflit. Il suffit simplement de reprendre la définition des 4 fonctions de base CS_ACTIVE, WriteCmd, WriteData et CS_IDLE. et le code que tu as fait. Vu qu'il existe plusieurs bibliothèques différentes pour gérer cet écran, c'est alors possible d'en changer.

Pour le fait qu'il n'y a que 64K color ce n'est pas vraiment gênant en fait, mais c'est intéressant à savoir.

Cela ne change pas grand chose, c'est juste une caractéristique gonflée. La raison est assez simple, et c'est pour cela que le ILI a en plus du mode 260Kc le mode 64Kc. La mémoire interne est sur 18 bits, 6 pour chaque couleur. Mais pour transférer 18 bits avec des octets, il faut 3 transferts alors qu'il n'en faut que 2 pour 64kc. Et c'est pire si le transfert était en 16 bits. Du coup, en prenant une définition moindre dans les bleus et les rouges, on accélère les transferts sans vraiment dégrader la restitution. Ils auraient pu avoir un mémoire interne de 16 bits! Mais visiblement, cela a l'air d'être un standard. L'avantage de passer en 64k, c'est aussi qu'une couleur est un uint16_t pour lequel les opérateurs ne sont pas à redéfinir. La limitation ne se voit que si on essaie de faire un écran avec un dégradé de rouge ou de bleu (32 nuances). Mais elle se voit aussi avec le vert (64 nuances).

j'ai donc essayé d'utiliser le SOFTWARE_SPI mais sans succès

Sur une Méga? En changeant ou pas les 4 broches de la SD? La carte SD marche naturellement avec la uno, mais pas sans modifier le câblage avec une Méga.

Après je pourrai toujours essayer de modifier l'alimentation du rétroéclairage en y mettant un transistor. Mais ce sera vraiment si on ne peut rien faire côté software.

A priori, les diodes sont montées en anode commune ou cathode commune. Je pense que les 5 diodes sont alimentées en 5V avec 5 résistances séries. A priori les 6 fils qui les alimentent sont facile à repérer car il doit y avoir trois nappes de fils. Sur un afficheur différent (je ne sais pas lequel est utilisé dans le KUMAN si je ne prend que le LCD sans le circuit imprimé:
ImageCiDessus.gif
En rouge le fils pour les leds.

C'est simple:

  1. décoller l'écran et le circuit imprimé du KUMAN
  2. Voir ou vont les fils
  3. Couper soit la nappe qui n'est pas vraiment soudable, soit le circuit pour y mettre au moins un fil
  4. Tout remonter
  5. Tout jeter car cela ne fonctionne plus (probabilité à définir)

Parce que je doute que le rétro-éclairage tienne longtemps si il est allumé 24/24.

J'ai fait une centrale météo avec un ami qui avait un afficheur graphique. C'était avant 1991. On a reparlé le mois dernier de ce projet et il m'a dit que ça fonctionnait toujours et qu'il était allumé 24/24, mais que deux lignes de l'afficheur ne fonctionnait plus. C'est costaud les leds!

Couper l'éclairage, c'est bien, vu la consommation, mais ce n'est pas simple à faire. C'est plus facile de tout couper et de rallumer par ailleurs.

ImageCiDessus.gif

Je vais voir pour essayer une autre librairie, mais vu que j'ai fait une petite connerie, je vais d'abord le réparer.

En fait en essayant de séparer l'écran et le circuit du shield qui était collé ensemble avec une mousse, en coupant la mousse le cutter à déraper et à sectionner la nappe du rétroéclairage et deux piste de la nappe principale :frowning:

Sinon pour le lecteur SD j'ai essayer sans déplacer les pins puisque apparemment c'est possible, mais je n'y suis pas arrivé.

en coupant la mousse le cutter à déraper et à sectionner la nappe du rétroéclairage et deux piste de la nappe principale :

C'est simple:

  1. décoller l'écran et le circuit imprimé du KUMAN
  2. Voir ou vont les fils
  3. Couper soit la nappe qui n'est pas vraiment soudable, soit le circuit pour y mettre au moins un fil
  4. Tout remonter
  5. Tout jeter car cela ne fonctionne plus (probabilité à définir)

Tu est allé de l'étape 1 à l'étape 5 directement!

Sinon pour le lecteur SD j'ai essayer sans déplacer les pins puisque apparemment c'est possible, mais je n'y suis pas arrivé.

Quelle carte? La Uno?
Pour avoir de l'aide il faut donner le code...