[RESOLU]Coordonnées X et Y sur écran tactile

Bonjour, j'ai un écran tactile à base de RA8875 et GSLX680. Tout cela tourne avec une mega2560r3

Les coordonnées lues sont stockées dans un struct de ce type :

struct _ts_event
{
    uint16_t    x1;
    uint16_t    y1;
    uint16_t    x2;
    uint16_t    y2;
    uint16_t    x3;
    uint16_t    y3;
    uint16_t    x4;
    uint16_t    y4;
    uint16_t    x5;
    uint16_t    y5;
    uint8_t    fingers;	
};

Tout cela fonctionne très bien, je lis mes coordonnées stockées avec ceci (code fourni dans l'exemple) :

inttostr(ts_event.x1&0x0fff,ss);	
	      tft.textMode();
      tft.textSetCursor(100,80);
      tft.textColor(RA8875_RED, RA8875_BLACK);
      tft.textWrite("X =  ");
       tft.textSetCursor(140,80);
      tft.writeCommand(RA8875_MRWC);
          tft.writeData(ss[0]);
          delay(1);
         tft.writeData(ss[1]);  
         delay(1);
        tft.writeData(ss[2]);
        delay(1);
        tft.writeData(ss[3]); 

	inttostr(ts_event.y1&0x0fff,ss); 
      tft.textSetCursor(100,140);
      tft.textWrite("Y =  ");
       tft.textSetCursor(140,140);
      tft.writeCommand(RA8875_MRWC);
          tft.writeData(ss[0]);
          delay(1);
         tft.writeData(ss[1]);  
         delay(1);
        tft.writeData(ss[2]);
        delay(1);
        tft.writeData(ss[3]);        
          
     }

l'affichage est cohérant avec la position du touch.

Si je fais ceci (mon code):

tx = (ts_event.x1);	
 ty = (ts_event.y1);
 tft.print(tx); tft.print(ty);

la valeur qui s'affiche pour tx est correcte (entre 0 et 840) mais la valeur pour ty est toujours supérieure à 4000 alors qu'elle devrait être entre 0 et 480.
Après quelques essais, je me suis rendu compte que je devais déduire 4096 de ty pour avoir la position exacte.

Ca solutionne mon problème mais j'aimerais bien savoir pourquoi j'ai cette différence seulement sur ty.

Si quelqu'un pouvait éclairer ma lanterne de débutant.

merci

partagez des liens vers les exemple et le matériel

voici le lien vers le matériel :
https://www.buydisplay.com/5-inch-tft-display-arduino-lcd-shield-w-capacitive-touch-screen-800x480
voici le lien vers les exemples :
https://www.buydisplay.com/arduino/Libraries-Examples_ER-TFTM050A2-3.zip

postez le code de lecture parce qu'il manque dans ce que vous partagez l'appel à GSLX680_read_data()

➜ faites un petit code qui imprime sur Serial le x et y quand il y a une touche

//get the most data about capacitive touchpanel.
uint8_t GSLX680_read_data(void)
{	uint8_t touch_data[24] = {0}; 
	uint8_t reg = 0x80;
	GSLX680_I2C_Read(reg, touch_data, 24);
        
         ts_event.fingers=touch_data[0];	

	ts_event.y5 = (uint16_t)(touch_data[23])<<8 | (uint16_t)touch_data[22];
        ts_event.x5 = (uint16_t)(touch_data[21])<<8 | (uint16_t)touch_data[20];
				
        ts_event.y4 = (uint16_t)(touch_data[19])<<8 | (uint16_t)touch_data[18];
	ts_event.x4 = (uint16_t)(touch_data[17])<<8 | (uint16_t)touch_data[16];
						
						
	ts_event.y3 = (uint16_t)(touch_data[15])<<8 | (uint16_t)touch_data[14];
	ts_event.x3 = (uint16_t)(touch_data[13])<<8 | (uint16_t)touch_data[12];
						
						  
	ts_event.y2 = (uint16_t)(touch_data[11])<<8 | (uint16_t)touch_data[10];
	ts_event.x2 = (uint16_t)(touch_data[9])<<8 | (uint16_t)touch_data[8];
						
						 
	ts_event.y1 = (uint16_t)(touch_data[7])<<8 | (uint16_t)touch_data[6];
	ts_event.x1 = (uint16_t)(touch_data[5])<<8 | (uint16_t)touch_data[4];
				

	return 0;	
}

J'avais déjà fait le code avec des Serial qui imprime les x1, y1, tx et ty et j'avais les mêmes résultats : corrects pour x1, y1 et tx mais toujours cette différence de 4096 en plus pour ty

vous pouvez poster ce code ?

je ne l'ai plus mais c'était du genre :

tx = (ts_event.x1);	
 ty = (ts_event.y1);
 tft.print(tx); tft.print(ty);
Serial.print (tx); Serial.println (ty);

par contre je n'avais pas les x1 et y1 sur le moniteur série, je les lisais sur l'écran tft contrairement à ce que j'ai écrit au #5

il faudrait essayer de le recréer pour avoir un code plus simple qui fait configuration de l'écran et ensuite l'impression des positions des doigts sur l'écran

par exemple si vous mettez dans le setup()

  Serial.begin(115200);

et dans la loop juste

void loop() {
  if (digitalRead(GSL1680_INT) == HIGH) {
    GSLX680_read_data();

    if (ts_event.fingers >= 1) {
      Serial.print("Nb finger(s) ="); Serial.println(ts_event.fingers);
      Serial.print("  Finger 1 x1="); Serial.print(ts_event.x1);
      Serial.print(", y1=");          Serial.println(ts_event.y1);

      if (ts_event.fingers >= 2) {
        Serial.print("  Finger 2 x2="); Serial.print(ts_event.x2);
        Serial.print(", y2=");          Serial.println(ts_event.y2);
      }

      if (ts_event.fingers >= 3) {
        Serial.print("  Finger 3 x3="); Serial.print(ts_event.x3);
        Serial.print(", y3=");          Serial.println(ts_event.y3);
      }

      if (ts_event.fingers >= 4) {
        Serial.print("  Finger 4 x4="); Serial.print(ts_event.x4);
        Serial.print(", y4=");          Serial.println(ts_event.y4);
      }

      if (ts_event.fingers >= 5) {
        Serial.print("  Finger 5 x5="); Serial.print(ts_event.x5);
        Serial.print(", y5=");          Serial.println(ts_event.y5);
      }
    }
  }
}

et vous conservez tout le code de configuration de l'écran comme dans l'exemple

➜ que voyez vous dans le moniteur série ouvert à 115200 bauds quand vous touchez l'écran ?

ok je teste ça demain ou lundi et vous tiens au courant

Bonsoir,
J'ai fait les tests.
Voilà ce que j'ai sur le moniteur série :

Si je touche avec un doigt :

Nb finger(s) =1
Finger 1 x1=469, y1=4370
Nb finger(s) =1
Finger 1 x1=473, y1=4368

avec deux doigts :

Nb finger(s) =2
Finger 1 x1=613, y1=8498
Finger 2 x2=618, y2=4210
Nb finger(s) =2
Finger 1 x1=612, y1=8498
Finger 2 x2=615, y2=4212

et avec 3 doigts :

Nb finger(s) =3
Finger 1 x1=422, y1=12764
Finger 2 x2=384, y2=4214
Finger 3 x3=471, y3=8513
Nb finger(s) =3
Finger 1 x1=423, y1=12762
Finger 2 x2=383, y2=4215
Finger 3 x3=472, y3=8514

Je me suis arrêté à 3 doigts car dans mon code final je ne gère que 1 touch à la fois. J'ai toujours cette différence de 4096 pour y1, mais qui passe 8192 pour 2 touch et le triple pour 3 touch.

OK c'est donc que la fonction GSLX680_read_data() est fausse

il semble que les données de poids fort contiennent un identifiant du nombre de doigts sur 3 bits

si vous modifiez la fonction comme cela

//get the most data about capacitive touchpanel.
uint8_t GSLX680_read_data(void)
{
  uint8_t touch_data[24] = {0};
  uint8_t reg = 0x80;
  GSLX680_I2C_Read(reg, touch_data, 24);

  ts_event.fingers = touch_data[0];

  ts_event.y5 = ((uint16_t)(touch_data[23]) << 8 | (uint16_t)touch_data[22]) & 0x0FFF;
  ts_event.x5 = ((uint16_t)(touch_data[21]) << 8 | (uint16_t)touch_data[20]) & 0x0FFF;

  ts_event.y4 = ((uint16_t)(touch_data[19]) << 8 | (uint16_t)touch_data[18]) & 0x0FFF;
  ts_event.x4 = ((uint16_t)(touch_data[17]) << 8 | (uint16_t)touch_data[16]) & 0x0FFF;

  ts_event.y3 = ((uint16_t)(touch_data[15]) << 8 | (uint16_t)touch_data[14]) & 0x0FFF;
  ts_event.x3 = ((uint16_t)(touch_data[13]) << 8 | (uint16_t)touch_data[12]) & 0x0FFF;

  ts_event.y2 = ((uint16_t)(touch_data[11]) << 8 | (uint16_t)touch_data[10]) & 0x0FFF;
  ts_event.x2 = ((uint16_t)(touch_data[ 9]) << 8 | (uint16_t)touch_data[ 8]) & 0x0FFF;

  ts_event.y1 = ((uint16_t)(touch_data[ 7]) << 8 | (uint16_t)touch_data[ 6]) & 0x0FFF;
  ts_event.x1 = ((uint16_t)(touch_data[ 5]) << 8 | (uint16_t)touch_data[ 4]) & 0x0FFF;

  return 0;
}

ça devrait fonctionner. le masque & 0x0FFF va enlever les bits de poids fort au delà de 4096 qui semblent indiquer le nombre de doigts.

Bonjour,

Avec votre modification, tout fonctionne parfaitement, les valeurs des différents Y sont ok.

un grand merci pour votre aide

Bonne nouvelle :wink:

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