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:
#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?