[RISOLTO] Keypad e interferenze (ingressi INPUT_PULLUP)

Buonasera, chiedo aiuto dopo alcuni giorni che combatto con questo problema e dopo mille ricerche invane.
Ho un problema collegando un keypad 5x4 ad un Arduino MEGA (ne ho provati 3 diversi di Mega e 2 keypad).
Uso la libreria Keypad, lo sketch è quello di prova CustomKeypad, ho aggiunto semplicemente la 5a riga (ma ho provato anche a lasciare 4x4 e non connettere il pin della 5a riga).
Ho usato i pin sul MEGA come da sketch, ma ho provato anche tantissimi altri pin.

Il problema è questo, ci sono interferenze quando avvicino la mano al keypad (a volte, ma raro, anche senza avvicinarla), in pratica vengono rilevate pressioni di tasti a caso, anche se in realtà non premo nulla.
Se con un bastoncino premu i pulsanti li vedo sul monitor perfettamente, tutto funziona benissimo.
Ho prvato diverse fonti di alimentazione, alimentatori 220-12V, 220-5V, collegato all' usb del computer...
Nulla da fare.

Non so più cosa provare.
Grazie

Aggiungo, visto che continuo a fare prove e ci passerò la nottata...

La libreria Keypad non c'entra nulla.
Ho provato a semplificare tutto utilizzando semplicemente la lettura digitale dei pin e avviene lo stesso, letture casuali senza pressione.

Ho messo a massa il pin Riga1 del keypad, ho collegato i pin di 3 colonne a pin digitali di Arduino impostati come "INPUT_PULLUP" (quindi simulando la semplice lettura di 3 pulsanti che chiudono a massa su ingressi messi in Pull_UP) e avviene la stessa cosa, letture casuali, soprattutto se avvicino la mano al keypad o ai collegamenti.
questo è il codice:

byte pulsante1 = 22;
byte pulsante2 = 23;
byte pulsante3 = 24;
byte uscitaLuce1 = 51;
byte uscitaLuce2 = 52;
byte uscitaLuce3 = 53;
boolean luce1 = false, luce2 = false, luce3 = false;
boolean letturaPulsante = false;
void setup() {
  pinMode(pulsante1, INPUT_PULLUP);
  pinMode(pulsante2, INPUT_PULLUP);
  pinMode(pulsante3, INPUT_PULLUP);
  pinMode(uscitaLuce1, OUTPUT);
  pinMode(uscitaLuce2, OUTPUT);
  pinMode(uscitaLuce3, OUTPUT);
  pinMode(LedPin, OUTPUT);
}

void loop() {
  letturaPulsante = digitalRead(pulsante1);
  if (letturaPulsante == false){
    luce1 = !luce1;
    digitalWrite(uscitaLuce1, luce1);      
  }
  letturaPulsante = digitalRead(pulsante2);
  if (letturaPulsante == false){
    luce2 = !luce2;
    digitalWrite(uscitaLuce2, luce2);      
  }
  letturaPulsante = digitalRead(pulsante3);
  if (letturaPulsante == false){
    luce3 = !luce3;
    digitalWrite(uscitaLuce3, luce3);      
  }
}

Scusa ma se il problema c'è solo avvicinando la mano senza toccare nulla probabilmente il problema è hardware non software. Dovresti postare lo schema e foto di ciò che hai fatto.

Vi allego foto. Lo schema è basilare, keypad connesso al mega e mega connesso a fonte di alimentazione, anche alla usb del PC da tavolo.
Solo se lo alimento a batteria non me lo fa, quindi deduco che ci siano interferenze sul mio impianto elettrico di casa e che io faccio da antenna per interferenze, ma la massa a terra c'è e fino ad ora non avevo notato altri problemi.

pensando che potesse essere il PullUp interno dei pin (magari impedenza troppo alta) ho provato ad aggiungere una Resistenza da 10K in PullUp (ho provato anche a metterle in PullDown) su ogni ingresso ma il risultato è lo stesso.
Non so più dove sbattere :confused:

Anche se disconnetto il keypad e tocco con il dito uno degli ingressi (una delle le righe che evidentemente la libreria imposta come ingressi in PullUp, mentre le colonne sono le uscite multiplexate) l' arduino rileva tantissime pressioni di tasti inerenti quella riga.

Penso che un ingresso messo in PullUp interno con 20KOhm o addirittura 10KOhm esterno non dovrebbe rilevare un calo di tensione tale da percepirlo come stato logico basso.

Cerchiamo di circoscrivere eliminando il più possibile elementi di incertezza.
Lasciamo perdere per ora il keypad.
Solo un semplice ingresso digitale.
Collegamento e codice minimo che presentano il problema.

fatto, minimale, uso il led per vedere se avviene una lettura.

void setup() {
  pinMode(22, INPUT_PULLUP);
  pinMode(13, OUTPUT);
}
void loop() {
  int sensorVal = digitalRead(22);
  if (sensorVal == HIGH) {
    digitalWrite(13, LOW);
    delay(200);
  } else {
    digitalWrite(13, HIGH);
    delay(200);
  }
}

con questo codice se metto un ponticello da 10cm sul pin 22 e tocco la estremita del ponticello vedo letture dal pin digitale di ingresso.
Ho provato anche a collegare il keypad con 1 pin sul 22, basta che prendo tra le mani il keypad (senza premere pulsanti e non ci sono falsi contatti) che vedo delle letture. Il keypad con le sue piste lunghe fa da antenna e le mie mani trasmettono interferenze sull' antenna.
Sembrerebbe come se l' ingresso avesse una impedenza altissima.
Ho provato più ingressi, ho provato 2 arduino Mega

E anche mettendo (come detto nel post #5) una ulteriore pull-up esterna da 10k tra +5V e ingresso 22, il problema permane?

si, sembra un poco più sordo, ma sente comunque un ingresso a massa inesistente, con le stesse modalità di cui sopra.

Ok, allora ritengo ci sia una tensione anomala nel sistema rispetto alla massa ambientale. Considera che dal punto di vista del circuito è indifferente che un elemento esterno gli immetta disturbi, o che il circuito stesso sia sorgente e l'esterno sia solo la via di fuga. Io sospetterei dell'alimentatore che scarica qualcosa sul GND. Perché l'alternativa poco probabile è solo che tu sia immerso in un campo di induzione mostruoso...

ho provato ad alimentare arduino da molte fonti, da 2 alimentatori che ho su banco, da 2 alimentatori switching da 30A (cinesi), dirattamente dalla USB del Computer Fisso (questa è quella che mi preoccupa maggiormente), ho anche provato a cambiare locazione (sempre sullo stesso impianto elettrico).....nulla, lo fa ovunque.
solo se lo alimento a batteria non lo fa.
Quindi suppongo che sia un problema sul mio impianto elettrico.
So che andiamo fuoi argomento arduino, ma quale prova potrei fare per capire meglio la provenienza? sono abbastanza attrezzato, compreso oscilloscopio 4 canali digitale.

La massa a terra c'è.

Altra domanda: io ho sempre scollegato il negativo degli alimentatori e strumentazioni dalla massa a terra (dopo aver avuto molto tempo fa problemi con oscilloscopio e con loop sulla massa), quindi lo zero logivo non è connesso alla massa a terra. Ho anche provato in questo caso a collegarle assieme ma il problema persiste.
Quale è il migliore modo di operare? conviene sempre mettere a terra il negativo di alimentazione? e magari dissocio l' oscilloscopio da tale massa, oppure lascio scollegati?

LucianoArdu:
La massa a terra c'è.

Magari a livello di impianto interno i collegamenti sono corretti, ma sarà funzionale o come in vari casi "finta" perché non o mal collegata a monte dell'impianto stesso? Questa è una verifica che deve fare un elettricista con apposito misuratore di terra.

conviene sempre mettere a terra il negativo di alimentazione?

No. Si mette se serve per protezione o fuga disturbi. Per un apparecchio in doppio isolamento di sicurezza non serve e anzi previene appunto i ground loop.

Quindi suppongo che sia un problema sul mio impianto elettrico

A sensazione sembra così. Io una terra non funzionate su cui scaricano i filtri interni degli alimentatori la sento subito a pelle col dorso delle dita scorrendole senza premere (nota: non è una scossa, ma una vibrazione particolare che si percepisce solo durante il movimento). Dal punto di vista di un circuito alimentato in quelle condizioni, una vera terra o altra massa esterna a zero volt appaiono come sorgenti di tensione alternata anche elevata.

La massa a terra dovrebbe essere collegata perchè premendo il pulsante di Test sul Differenziale questo scatta.
Tra Terra e Neutro rilevo una tensione Alternata irrisoria di 1,7V.
Non so se questo basta per sapere che è collegata.

Ok, quindi tengo il negativo di alimentatori e strumenti disconnessi dalla terra (pensavo potesse aiutare a tirar via disturbi).

Ho provato adesso anche un Arduino ProMicro Leonardo, stessa cosa.

Il differenziale col pulsante scatta comunque anche senza terra.
Secondo me serve la verifica di un elettricista col misuratore di terra.
Anche perché metti caso fosse un problema condominiale, tutti stanno rischiando di mettere in pericolo (e causare guasti) a tutti gli altri.
Hai fatto le stesse prove su un altro impianto?

no, ho provato solo qui. Domani se riesco faccio una prova altrove.
Per la Terra cerco di far fare una verifica. Vediamo se riesco a trovare l' arcano.
Intanto grazie mille, vediamo se esce qualche altra idea

Comunque una prova facile si potrebbe fare, trova un vecchio alimentatore non switching, con volgare trasformatore, senza filtri EMI, se le ipotesi sulla terra mancante sono corrette usando questo alimentatore "antico" non dovresti più riscontrare il problema.

In altro sito ne avevo un da laboratorio da 30A... ma qui non ce l' ho, devo vedere se recupero uno di quelli piccoli da parete, tanto bastano poche decine di milliampere. Devo verificare.
Comuque ho fatto fare delle prove a un elettricista (che ha fatto le prove che avevo gia fatto io) e dice che la terra c'è.
Ha riscontrato voltaggio 230V circa tra terra e fase.
Ha riscontrato 2V circa tra Terra e Neutro.
Ha riscontrato bassa resistenza tra Neutro e terra.
Ed altre prove, dice che è ok...
Non so dove appigliarmi.
Sto portado una linea dedicata da quadro a banco...
Sto eliminando tutte le ciabatte con interruttore con luce, creano una marea di interferenze, per sino i PowerLine non riescono quasi a funzionare con queste ciabatte...
Sto pulendo tutto cercando di tirare il ragno dal buco :confused:

Intanto grazie, sei gentilissimo, ti aggiorno man mano che faccio progresso (spero).

Scusa ma secondo me se non ci metti un condensatore tra pin e massa avrai sempre di questi problemi

Claudio_FF:
... trova un vecchio alimentatore non switching...

Specie se lo switching e' una ciofeca cinese ... noi siamo impazziti un mese tempo fa con il segnale video del ROV che aveva un'interferenza sovrapposta, che non si riuciva ad eliminare con nulla ... poi un giorno che il mio amico aveva dimenticato l'alimentatore del notebook che usa per il sonar (che non c'entra nulla con il resto delle alimentazioni, fra l'altro), l'interferenza era sparita ... l'alimentatore compatibile che aveva preso dai Cinesi buttava fuori tante di quelle interferenze da disturbare perfino un segnale a cui non era collegato :stuck_out_tongue:

EDIT: pero' i condensatorini sui pin di ingresso e' meglio che li metti lo stesso ... :wink:

Etemenanki:
pero' i condensatorini sui pin di ingresso e' meglio che li metti lo stesso

Se usa la libreria keypad non so se si può.

Poi ok che i condensatori su un ingresso normale non fanno che bene, ma comunque anche solo con una Rpull da 10k disturbi dalle mani non ne deve prendere.