EGT59
February 16, 2024, 1:59pm
1
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
J-M-L
February 16, 2024, 2:47pm
2
partagez des liens vers les exemple et le matériel
EGT59
February 16, 2024, 4:44pm
3
J-M-L
February 16, 2024, 5:11pm
4
EGT59:
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.
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
EGT59
February 16, 2024, 5:44pm
5
//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
J-M-L
February 16, 2024, 6:01pm
6
vous pouvez poster ce code ?
EGT59
February 16, 2024, 6:09pm
7
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
J-M-L
February 16, 2024, 6:30pm
8
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 ?
EGT59
February 16, 2024, 6:33pm
9
ok je teste ça demain ou lundi et vous tiens au courant
EGT59
February 18, 2024, 5:15pm
10
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.
J-M-L
February 18, 2024, 7:49pm
11
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.
EGT59
February 19, 2024, 3:08pm
12
Bonjour,
Avec votre modification, tout fonctionne parfaitement, les valeurs des différents Y sont ok.
un grand merci pour votre aide
system
Closed
August 17, 2024, 4:19pm
14
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.