Go Down

Topic: Controllo touch screen resistivo 4 fili (Read 452 times) previous topic - next topic

TheShredding

Jul 23, 2013, 12:08 am Last Edit: Jul 25, 2013, 08:43 am by TheShredding Reason: 1
Salve a tutti.
Ho pensato di scorporare un po' il mio vecchio post per semplificare un po' le cose e affrontarne una alla volta, visto che nessuno ha potuto aiutarmi prima..forse affrontando un pezzo alla volta riusciamo a cavare un ragno dal buco!

Ho utilizzato uno schermo touch resistivo a 4 fili, collegati nelle porte analogiche da 0 a 3 ho collegato una presa MIDI come segue: pin 2 a GND, pin 4 a +5V con resistenza da 220 ohm e pin 5 all'uscita seriale TX (pin digitale 1 di ardu).

Ho scritto il seguente codice, prendendo spunto qua e la da vari post sul forum, il 95% del codice mi è chiaro, ma ho qualche dubbio:

Code: [Select]
#define xLow  14 //vado a definire le i pin dello schermo
#define xHigh 16
#define yLow  17
#define yHigh 15

void setup(){
 Serial.begin(31250);  //avvio la trasmissione seriale a 31250 perché comunico via protocollo midi
}

void loop(){
 
 pinMode(xLow,OUTPUT);  //parte 1, preparo i pin alla lettura del valore di resistenza del touch screen sull'asse X
 pinMode(xHigh,OUTPUT);
 digitalWrite(xLow,LOW);
 digitalWrite(xHigh,HIGH);

 digitalWrite(yLow,LOW);
 digitalWrite(yHigh,LOW);

 pinMode(yLow,INPUT);
 pinMode(yHigh,INPUT);
 delay(10);                      // fine parte 1

 //xLow has analog port -14 !!
 int x=analogRead(yLow -14);  //vado a leggere il valore dell'asse x

  //[color=red]qui non capisco benissimo la parte tra parentesi (yLow-14) ..delucidazioni??[/color]

 pinMode(yLow,OUTPUT);  //parte 2, come sopra ma per la y
 pinMode(yHigh,OUTPUT);
 digitalWrite(yLow,LOW);
 digitalWrite(yHigh,HIGH);

 digitalWrite(xLow,LOW);
 digitalWrite(xHigh,LOW);

 pinMode(xLow,INPUT);
 pinMode(xHigh,INPUT);
 delay(10);

 //xLow has analog port -14 !!
 int y=analogRead(xLow - 14); //come sopra l'istruzione tra parentesi non mi è chiarissima, il resto si
 
 /*Serial.print(x, DEC); 
 Serial.print(',');
 Serial.println(y, DEC);
 delay(200);*/                  //questa parte è per il debug..e quindi è disattivata, per usarla c'è da cambiare la velocità della seriale

if (0 < x < 1023 and  0 < y < 1023) {    //qui definisco la condizione per cui il pad è toccato..ed iniziano i problemi

              midiCC(0xB0,92,127); //questo comando, preso dal manuale del device midi, invia il segnale di on al pad

               int midix = map(x,0,1023,0,127);  // mappa il valore dell'asse x e lo converte in midi 0->127
               midiCC(0xB0, 12, midix);  // manda il segnale di control change, anche qui da manuale (questa parte funziona)
                 
               int midiy = map(y,0,1023,0,127);  // come sopra ma per la y
               midiCC(0xB0, 13, midiy);  // come sopra
             
}
else {
              midiCC(0xB0,92,0); //qui quando il pad non è toccato dovrebbe mandare il segnale di off al device e smettere di leggere le coordinate...ma questo non va!
}
delay(200);

}

void midiCC(char command, char value1, char value2) {  //questa funzione manda il segnale midi
 Serial.write(command);
 Serial.write(value1);
 Serial.write(value2);
}


Il problemi è il seguente:


le coordinate sul touch vengono lette bene, ma quando rilascio il touch, mi continua a mandare un segnale in basso a sx (suppongo sia la posizione x=0 y=0 o giù di li..fatto sta che non mi spegne la lettura dal touch come dovrebbe fare con il comando midiCC(0xB0,92,0)

Diamo per scontato che i fili siano attaccati bene...e presupponendo che i canali midi e i comandi midi li ho presi dal manuale..dove diavolo sbaglio?
Heeelp!

Edit: potrebbe essere utile eseguire nel void setup una serie di letture sugli assi x ed y e sottrarre la media al valore letto nella void loop per eliminare eventuale "rumore di fondo" del touch? Eseguire una sorta di "lettura del bianco" (sono un chimico, per cui parlo da chimico..non so come si esprima lo stesso concetto da elettronico) da sottrarre alla lettura per azzerarla e liberare da interferenze la condizione di accensione?

TheShredding

Ho modificato sostanzialmente il post, per cui uppo, spero di non infrangere il regolamento, nel caso mi scuso

TheShredding

#2
Jul 25, 2013, 02:42 pm Last Edit: Jul 25, 2013, 02:46 pm by TheShredding Reason: 1
Altro aggiornamento, scusate il monologo, ma quando faccio dei passi in avanti li condivido, faccio bene?

Ho capito la parte di codice che non capivo..o almeno credo, per cui spiego:

Code: [Select]
//xLow has analog port -14 !!
 int x=analogRead(yLow -14);  //vado a leggere il valore dell'asse x


Il punto è che qui è sbagliato andarlo a leggere così, e forse è questo uno dei problemi del programma, in quanto la lettura viene fatta secondo questo principio:

Lettura coordinate x:


















Pin schermoPin ArduinopinModestate
xLow -- RightA0OUTPUTLOW
xHigh -- LeftA1OUTPUTHIGH
yLow -- BottomA2INPUT
yHigh -- TopA3INPUT


Code: [Select]
int x1 = analogRead(A2);
int x2 = analogRead(A3);

unsigned int x = x1 - x2;


ok, ora utilizzando una unsigned int, è come se utilizzassi il valore assoluto giusto?

ovviamente ripeto il medesimo procedimento per y, nel programma precedente veniva sottratta in entrambi i casi la variabile xLow, ma essendo impostata come output ed essendo LOW mi andava a destabilizzare la lettura??

Può essere utile mettere delle resistenze da 220ohm per dire tra i pin del touch screen e il ground? in teoria dovrebbero stabilizzarmi la lettura..o me la vanno a disturbare?

Aiuto!!!

Go Up