Espansione I/O i2c

Ciao a tutti.
Ho iniziato una topic tempo fa volendo creare un looper/switcher per la chitarra, ma ho perso quell'account e non sono più riuscito a scrivere sul forum.
Rispetto a quel progetto, per chi l'ha visto, ho deciso di utilizzare un espansione i2c invece di 2 arduino per avere una sola alimentazione ma ora riscontro dei problemi.

L'espansione che utilizzo è PCF8575 e quando vado con il digitalRead a leggere se il pulsante è premuto "impazzisce" tutto il programma. Per capire cosa stava succedendo ho deciso di fare un Serial.print del pin dell'espansione e ho scoperto che:

  • Quando il tasto non è premuto (dovrebbe dare valore "1") da valore "1" ogni 10 "0"
  • Quando il pulsante è premuto da tutti valori "0"

Quindi alla lettura mi dice che è HIGH ma subito dopo è LOW.
Ho provato a verificare la necesssità di resistenze di pull-up e pull-down ma niente da fare.

Qualcuno mi sa aiutare?
Grazie mille

davidedev:
Ho provato a verificare la necesssità di resistenze di pull-up e pull-down ma niente da fare.

DOVE hai messo le resistenze?

... perché sul bus I2C vanno delle resitenze di pull-up (i pin del bus I2C sono open-drain) e vanno anche sugli ingressi (pull-up o pull-down, a seconda di come hai scritto il software) per forzarli ad un valore prefissato quando i bottoni non sono premuti.

Guglielmo

Ma le resistenze di pull up sul bus non sonon integrate nell'arduino?

davidedev:
Ma le resistenze di pull up sul bus non sonon integrate nell'arduino?

NO, non su Arduino UNO ... guardare SEMPRE gli schemi dei references per evitare questi errori ... ::slight_smile:

Guglielmo

Sto utilizzando un arduino mega

La mega è l'unica che ha effettivamente delle pull-up da 10K ... se le connesioni sono molto brevi dovrebbero bastare.

Quanto sono lunghi i cavetti di collegamento?

Guglielmo

Sono lunghi 40cm

Questo può essere un problema ... il bus I2C (come il bus SPI) NON è fatto per essere portato in giro con cavetti vari, ma nasce per interconnettere tra loro IC sulla stessa scheda, quindi ... portarlo a spasso con cavi è spesso fonte di problemi (non per nulla esistono appositi IC per estendere la lunghzza dei collegamenti in I2C).

Prova ad aggiungere un paio di resistenze di pull-up lato bus I2C per abbassare il valore di quelle che già ci sono ...
... due resistenze da 4.7K dovrebbero andare bene (arrivi ad una resistenza, data dal parallelo con la 10K già presente, di circa 3.1K) e vedi se la cosa migliora.

Ah, metti comunque un piccolo schema eletrico di come hai fatto le connessioni e della/delle alimentazioni, che magari il problema è li ... ::slight_smile:

Guglielmo

Allego la foto del circuito su breadboard

Il cavetto scollegato va al pulsante che in quel momento non era collegato e il pulsante si collega al pin P07 dove si vede collegata una resistenza al Vdd

La situazione non è cambiata nonostante le resistenze

Hai anche le pull-up/down sui vari ingressi ? ... perché, se SI, allora il problema potrebbe essere anche nel codice.

Sicuro che i fili di collegamento facciano un contatto stabile? Non ho mai ritenuto molto affidabili quel genere di collegamenti ... ::slight_smile:

Guglielmo

Ho messo la resistenza di pull-up sull'ingresso che utilizzo e basta. Che collegamenti dovrei usare?

Nel loop c'è semplicemente un:
Serial.print(pcf8575.digitalRead(P7));

Ho utilizzato un esempio della libreria PCF8575.h

davidedev:
... Che collegamenti dovrei usare?

... io, quando posso, i fili li saldo per non avere problemi ... ::slight_smile:

Hai provato a muovere/toccare i fili durante il loop di lettura e vedere se cambia qualche cosa ?

Guglielmo

Appena accendo arduino mi da solo 0
Dal momento che schiaccio il pulsante (ho provato sia con gnd che con vdd) il segnale passa a 01 e quando smetto di premere resta così.

Se muovo i cavi non cambia nulla

Ho notato che se rallento con un delay da 12 ms il risultato è corretto...

Mmmm ... metti il codice che vediamo un'attimo ...

Guglielmo

#include "PCF8575.h"
#include <Wire.h> 

PCF8575 pcf8575(0x20);

void setup() {

  Serial.begin(9600);
  pcf8575.begin();

  pcf8575.pinMode(P0, INPUT);

}
void loop() {

  Serial.print(pcf8575.digitalRead(P0));
  delay(12);

}

Ho fatto altri tentativi seguendo le istruzioni della libreria ma nulla....

Sicuro che non sia un limite temporale imposto dalla libreria? ... ovvero, che non supporta chiamate a raffica, ma vuole un minimo di tempo tra una chiamata e l'altra? Magari non è particolarmente ottimizzata o il componente richiede determinate tempistiche (mai usato quel chip, quindi non ti so dire) ... ::slight_smile:

Guglielmo

Mi hanno risposto su un altro forun che non posso leggere direttamente così ma devo salvare la lettura in una variabile uint8_t e poi lavorare su quella...
Ho provato e funziona perfettamente.

Grazie mille per l'aiuto

Un ultima cosa sapresti indicarmi dei topic sul midi program change fatti bene?

Grazie ancora

davidedev:
Mi hanno risposto su un altro forun che non posso leggere direttamente così ma devo salvare la lettura in una variabile uint8_t e poi lavorare su quella...
Ho provato e funziona perfettamente.

... quindi una limitazione della libreria ... ::slight_smile:

Guglielmo