"Tasti Fantasma" con Scan Matrix

Salve a tutti,
Sto facendo un progetto con il quale vorrei trasformare una vecchia Yamaha in una tastiera MIDI.
Sono riuscito quindi ad interfacciarmi con la matrice, ed ho realizzato un mini circiuto con una sola colonna per testarlo.

Il problema è che quando effettuo la lettura Arduino rileva dei "Tasti Fantasma" (cioè rileva come premuti tasti che non lo sono), cosa che non succede con il tester. Ammetto che sto utilizzando un Arduino Nano non originale, e so che potrebbe essere anche quello il problema, ma vorrei prima tentare altre soluzioni prima di sostituirlo.

Allego Sketch, Schematic e Screenshot della console seriale

int rows[] = {2,3,4,5,6,7};
int nrows = 6;
void setup() {
  for(int i = 0;i < nrows;i++){
    pinMode(rows[i],OUTPUT);
    digitalWrite(rows[i],LOW);
  }
  
  pinMode(12,INPUT);
  Serial.begin(9600);
}

void loop() {
  for(int i = 0;i < nrows;i++){
    digitalWrite(rows[i],HIGH);
    if(digitalRead(12) == HIGH){
      Serial.print(rows[i]);
      Serial.print(" ");
      delay(1000);
    }
    digitalWrite(rows[i],LOW);
  }
  delay(1000);
}

Schematic (la resistenza è di 10k, non di 1k):

Screen 1:

Screen 2:

Grazie mille a tutti e buona serata!

EDIT1: Aggiornato Sketch

Buonasera,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

Buonasera Guglielmo,

Come da regolamento ho postato la mia presentazione al thread che mi hai indicato

Buona serata,
Elia

Ma questi tasti fantasma vengono fuori subito o dopo un po di tempo o dopo un po di tempo che schiacci dei tasti?

Per primo metti nel setup le uscite a LOW e non a HIGH.

poi cambia
Serial.print(String(rows*) + " ");*
in
Serial.print(rows*); Serial.print(" ");*
Ciao Uwe

ll problema avviene dopo un paio di secondi, sia senza premere alcun pulsante che premendo i tasti

Sto però notando che la maggior parte delle volte è l'ultima riga nell'array ad essere visualizzata in output.

Invece se premo un qualsiasi tasto Arduino manda in output la riga corrispondente, tutte le righe successive e qualche riga casuale.

Contemporaneamente ho modificato lo sketch come mi hai indicato, ma non ci sono state differenze significative. (modifico il post iniziale con lo sketch aggiornato, ho anche tolto il println per togliere lo spam di whitespace)

EDIT: Ho appena scoperto che aggiungendo un delay(100) come prima riga del for il problema sembra sparire. (Un problema di bouncing?) Non riesco però a capire il perchè e come diminuire questa latenza, visto che comunque 100ms non sono pochi per la latenza di un controller MIDI

Sicuramente hai un problema di "debuincing" ... ed evita di risolverlo via software con delay() o cose simili ed impara a risolverlo via hardware (... che, ad esempio, è l'unica possibilità se si usano interrupts).

Guarda gli schemi allegati :wink:

Guglielmo

P.S.: Se serve, puoi aumentare leggremente la capacità del condensatore ...

debouncing_hw.pdf (22.8 KB)

Non credo che sia un problema di debouncing.
Se fosse cosí avresti letture multiple dello stesso pulsante e non letture fantasma quando non schiacci niente.
Ciao Uwe

I tasti sono tutti collegati tramite una resistenza di pull up o pull down agli ingressi di Arduino? Se li hai collegati direttamente ai PIN, senza resistenze, il problema deriva dallo stato flottante dei PIN quando i tasti non sono premuti. Un ingresso, se non è collegato a nulla, riceve disturbi dall'esterno che provocano commutazioni indesiderate (PIN flottante). Gli schemi di Guglielmo ti illustrano i collegamenti da fare nei due casi. Arduino dispone di resistenze di pull-up interne che si possono abilitare via software: INPUT_PULLUP

krypton18:
I tasti sono tutti collegati tramite una resistenza di pull up o pull down agli ingressi di Arduino? Se li hai collegati direttamente ai PIN, senza resistenze, il problema deriva dallo stato flottante dei PIN quando i tasti non sono premuti. Un ingresso, se non è collegato a nulla, riceve disturbi dall'esterno che provocano commutazioni indesiderate (PIN flottante). Gli schemi di Guglielmo ti illustrano i collegamenti da fare nei due casi. Arduino dispone di resistenze di pull-up interne che si possono abilitare via software: INPUT_PULLUP

Ho collegato le colonne della matrice (quelle da cui leggo) in modalità pulldown.

Per quanto riguarda l'idea di Guglielmo, domani acquisterò la componentistica necessaria e vi farò sapere eventuali novità

krypton18:
I tasti sono tutti collegati tramite una resistenza di pull up o pull down agli ingressi di Arduino? Se li hai collegati direttamente ai PIN, senza resistenze, il problema deriva dallo stato flottante dei PIN quando i tasti non sono premuti. Un ingresso, se non è collegato a nulla, riceve disturbi dall'esterno che provocano commutazioni indesiderate (PIN flottante). Gli schemi di Guglielmo ti illustrano i collegamenti da fare nei due casi. Arduino dispone di resistenze di pull-up interne che si possono abilitare via software: INPUT_PULLUP

Prima di scrivere per favore leggere la discussione. Nel primo post di TheElix c'é lo sketch e lo schema elettrico.
Se leggi attentamente vedrai che la Tua risposta é sbaglata.
TheElix usa un unica entrata e quella é messa a massa con una resistenza da 1kOhm.
Ciao Uwe

Ho appena finito di provare con la soluzione di gpb01, ma non è cambiato nulla in output.

TheElix:
Ho appena finito di provare con la soluzione di gpb01, ma non è cambiato nulla in output.

... ok, quindi il problema non è legato ad un fatto di "debouncing" (... ma questo Uwe lo aveva già indicato), bensi a qualche altra cosa nei collegamenti ::slight_smile:

Guglielmo

TheElix facci vedere un po di foto nitide del Tuo circuito. Forse vediamo qualcosa su quelle.

Ciao Uwe

Ecco le foto del circuito
Considerate che il circuito sulla millefori non è altro che una "breakout board", in modo da collegare il cavo ribbon a dei, molto più comodi, jumper

Facci vedere anche la millefori da sotto.
Ciao Uwe

In pin in alto non sono collegati a nulla, sono solo un risultato della mia pessima tecnica di saldatura

Ok a quanto pare il fenomeno è sparito nel momento in cui ho cambiato la breadboard. Nel casso dovesse ricapitare vi faccio sapere, ma per ora sembra stia funzionando!

Sí, potrebbe essere che la resistenza pulldown non ha fatto bene contatto e cosí non hai un potenziale LOW.
Forse dovresti cercare di saldare meglio. Aggiungi del stagno mentre stai riscaldando i pin.
Ciao Uwe

Confermo che sono riuscito a far funzionare il tutto e a completare il progetto, Grazie mille ancora!