Vai al contenuto
PLC Forum


Libreria Pcf8574 Per Arduino Due


walterword

Messaggi consigliati

qualcuno di voi dispone di una libreria valida per PCF8574 da usare con Arduino?

Sto facendo delle prove con due slaves , uno configurato come uscita ed uno come ingressi

Nel software uso Wire.ha e riesco a scrivere sulle uscite ma non a leggere gli ingressi .Nel circuito implemento anche un traslatore di I2C 3.3V -5V TTL .

Ecco il software

#include <Wire.h>

#define IO_ADDR_OUT (0x20)     // indirizzo del PCF8574P come uscita , indirizzo fisico A2=0 , A1=0 , A0=0
#define IO_ADDR_IN  (0x21)     // indirizzo del PCF8574P come uscita , indirizzo fisico A2=0 , A1=0 , A0=1

 unsigned char data = 0x02;    // inizializzo le uscite accendendo le prime due
void setup() 
{
  Wire.begin();
  
}

void loop() 
{
 
  data++;
  // inizio l aprocedura di scrittura
  Wire.beginTransmission(IO_ADDR_OUT);
  Wire.write(data);
  Wire.endTransmission();
  delay(70);                // piccolo ritardo di prova
  
   Wire.requestFrom(IO_ADDR_IN, 1);   // richiedo la lettura di un byte allo slave ingresso
  //attendo la disponibilità di dati sul bus i2c
  if(Wire.available())
  {
    //quando è presente un dato avvia lo leggo
     data = Wire.read();
     //Serial.println(data);  
  }
 
}

Dunque , finchè non eseguo la Wire.requestFrom(IO_ADDR_IN, 1) va tutto bene , per esempio la commento ; i led's si accendono in cascata senza problemi .Quando tolgo il commento ed eseguo Wire.request mi si blocca , come se non ci fosse nessun device con quel indirizzo per cui rimane li ad attendere la risposta ......

Ho provato un paio di librerie ma non funzionano ...I PCF8574 che ho io sono i tipo P , per cui l'indirizzo fisico è 100

Link al commento
Condividi su altri siti


credo di aver fatto qualche pasticcio con gli ingressi ....ho collegato una vecchia schedina pizzamicro e non va bene in quanto c'e' conflitto con i 5V e la massa.Adesso l'ho tolta e metto i pin del pcf direttamente a massa o sui 5 V e qualcosa si muove... :angry:

Link al commento
Condividi su altri siti

ora sembra funzionare

void loop() 
{
 
   Wire.beginTransmission(IO_ADDR_OUT);
  Wire.write(data2);
  Wire.endTransmission();
  delay(1);  
  
  Wire.requestFrom(IO_ADDR_IN, 1);
  
  if(Wire.available())
  {
    
    data2 = Wire.read();
    Serial.println(data2);
  }
 
}
Link al commento
Condividi su altri siti

Walter lo hai lo scanner per leggere tutte le periferie I2C? E' un programmino semplice che ti mette sulla seriale tutti gli indirizzi degli slaves funzionanti.

Link al commento
Condividi su altri siti

no non ce l'ho , mandamelo ;)

comunque vedo che il PCF8574 ha dei comportamenti fluttuanti .

Se in assenza di ingresso a 5V non lo metto a massa mi fa dei casini .Praticamente sto usando la schedina pizza micro ma alimentata in modo inverso , cioe al posto del 5V metto la massa e viceversa ....eppure dagli schemi in rete sembra che non sia necessario mettere a massa l'ingresso del pcf in assenza di segnale ...bo....Il codice postato sopra funziona , il problema e' che se c'e' qualche problema con i 5V e la massa sui pin lui non trasmette piu e si impalla la rete , ora sta andando

Presumo si tratti di un loop for da 0 a 110 circa che richiede la lettura di un byte e in base ad un timeout impsota i flag in un vettore.Mandamelo comunque che sono curioso di vederlo

Modificato: da walterword
Link al commento
Condividi su altri siti

Dunque lo scanner o sniffer ce l'hai nella libreria di I2C. Non ce l'ho su questo PC, quando accendo l'altro copio il link e poi te lo mando.

Attenzione che il PCF8754 è bastardo. Ci avevamo sbattuto la testa anche io e Claudio ai tempi di Pizza Micro. Il Philips funziona meglio del TI che va curato di più sul clock.

Poi il PCF8754 non è completamente bidirezionale; si scrive come una porta di uscita, ma per usarlo come ingresso devi prima mettere a livello "1" la porta, così se l'ingresso è alto non c'è problema, se è basso lo tira giù e solo in questo modo puoi leggere gli ingressi a zero. Se hai scritto un "1" e poi comandi la porta come ingresso anche se è floating leggi "1".

Ho usato anch'io la scheda Pizza micro senza problemi.

Link al commento
Condividi su altri siti

nel pizza micro , la libreria includeva una scrittura di valori in-out per settare i pin come ingressi e/o uscite

Qua nel Arduino la libreria Wire non lo fa esplicitamente .Ho indagato un po al suo interno e sembrerebbe che lo faccia quando si manda il dato , a seconda della funziona usate che puo' essere Wire.write() o Wire.requestFrom() e mi sa che fino a che non riceve nulla la porta non sa cosa sia cioe se in o out.Devo guardare bene il datasheet del pcf e capire come fare per settare le porte nel setup() ...

Link al commento
Condividi su altri siti

in teoria , se io per farlo funzionare bene come ingressi ho dovuto mettere una resistenza da 10 k a riposo , tipo pull down , bisognerebbe settarlo internamente con qualche comando

Link al commento
Condividi su altri siti

quindi dovrei scrivere 0xFF sulla porta per leggere gli ingressi senza pull down? ....credo lo faccia la libreria , dovrei riguardare bene ...comunque lo scopo del test era di verificare il corretto funzionamento del traslatore di livelli per I2C e devo dire che funziona egregiamente , rapporto qualità - prezzo ottimo ...circa un euro

Mi piacerebbe provare la telecamerina da 6-7 euro , ma non saprei nemmeno da dove iniziare per gestirla ...

Modificato: da walterword
Link al commento
Condividi su altri siti

quindi dovrei scrivere 0xFF sulla porta per leggere gli ingressi senza pull down?

Esatto.

Se leggi bene il datasheet del PCF8754 lo trovi scritto che è semi bidirezionale.

.credo lo faccia la libreria , dovrei riguardare bene

No, per lo meno quella che ho usato io.

Link al commento
Condividi su altri siti

stanotte ho fatto la modifica ma non è come dici tu , cioe scrivere 0xFF negli ingressi , bensi' 0x00

In questo modo posso fare a meno di collegare la massa in quanto son oabilitati i pull dowun interni .

La scheda ingressi digIN pizzaMicro e' collegata che sui morsetti gnd ci metto +5V e i morsetti +5V sono liberi .

Credo che cosi possa andare bene .....

#include <Wire.h>

#define IO_ADDR_OUT (0x20)     // indirizzo del PCF8574P come uscita , indirizzo fisico A2=0 , A1=0 , A0=0
#define IO_ADDR_IN  (0x21)     // indirizzo del PCF8574P come ingresso, indirizzo fisico A2=0 , A1=0 , A0=1

 unsigned char data = 0x00;    // inizializzo le uscite accendendo le prime due
 
void setup() 
{
  Wire.begin();
  Serial.begin(9600);
  delay(50);
  Wire.beginTransmission(IO_ADDR_IN);
  Wire.write(0x00);
  Wire.endTransmission();
  
}

void loop() 
{
 
  Wire.requestFrom(IO_ADDR_IN, 1);
   if(Wire.available())
  {
    data = Wire.read();
  //  Serial.println(data);
  }
 
  Wire.beginTransmission(IO_ADDR_OUT);
  Wire.write(data);
  Wire.endTransmission();
  delay(1);  // speed of display
    
} 

Comunque ora va tutto bene , traslatore ect ....ora costruisco un hub I2C appena mi arrivano le millefori e i vari dispositivi e poi inizio a collegarci il real time clock , i sensori umidità -temperatura , accelerometri ect ... poi mettero anche l'lcd I2C cosi vediamo un po se c'e' qualche conflitto o bordello ...

Modificato: da walterword
Link al commento
Condividi su altri siti

sto cercando di gestire I2C in un modo piu ordinato , per esempio con una funzione che scrive parametrizzata

void I2CwritePin(unsigned char addr,unsigned char pin,bool value)
{
  unsigned char d = 0x00;
  Wire.beginTransmission(addr);
  d=value << pin;
  Wire.write(d );
  Wire.endTransmission();
}

I2CwritePin(IO_ADDR_OUT,0,(data & 1));
I2CwritePin(IO_ADDR_OUT,1,(data & 2) >> 1);
I2CwritePin(IO_ADDR_OUT,2,(data & 4) >> 2);

solo che in questo modo , cioè scrivere continuamente sul bus per un bit non e' una cosa buona....meglio preparare il byte con i bit a poi scriverlo una volta sola

Link al commento
Condividi su altri siti

bensi' 0x00 In questo modo posso fare a meno di collegare la massa in quanto son oabilitati i pull dowun interni

Controlla bene. Io l'ho provato un paio di mesi fa e poi l'ho lasciato li, andrò a rivederlo, ma credo proprio che devi scrivere un "1" per poter tirare a "0" l'ingresso.

Link al commento
Condividi su altri siti

cosi come dici tu legge gli ingressi a 1 a riposo ...per cui bisogna fare il complemento .in questo caso funziona senza il 5V attaccato alla schedina pizzamicro .Se invece inverto le polarità e le collego tutte e due allora lavora normale , per vedere il led devo premere il pulsante

Bo ...quale sarebbe la miglior cosa da fare ?

Ho notato che un paio di volte , alla riaccensione rimanevano accesi tutti i led , come un terzo stato ....

Cosa mi dici ?

Link al commento
Condividi su altri siti

Ti allegato il link dello sketch dello scanner per I2C e quello per la lettura in prova degli ingress.
Tutti gli ingressi floating hanno stato indefinito.
Questo componente, che è semi bidirezionalwe, vuole che le porte sia scritte a "1" prima di poterle leggere, è equivalente a mettere un pull up agli ingressi, quindi se lasci l'ingresso libero leggi "1", per leggere "0" devi chiuderlo a zero.
Link al commento
Condividi su altri siti

ok grazie lo provero ' a breve

Non capisco una cosa ....

Wire.beginTransmission(0x39);    // request 6 bytes from slave device #2

Come fa questa istruzione a richiedere 6 bytes dallo slave #2?

Di solito per richiedere una lettura non si usa

Wire.requestFrom(IO_ADDR_IN, 1);

Il problema e' che appena alimento la scheda tutte le uscite sono alte , in qualsiasi configurazione .Devo staccare la usb dalla scheda e poi riattaccarla .Questo e' grave , immagina un''applicazione che all'accensione alza tutte le uscite ....

Non capisco se e' un problema di Arduino DUE o cosa .... :toobad:

Link al commento
Condividi su altri siti

No è il pcf8754 che si comporta così. :( Non èm un componente adatto per pilotare uscite che comandano attuatori. Infatti è stato previsto per altre applicazioni.

Attenzione che i commenti possono non essere ....aggiornati. ho modificato il Sw originale per adattarlo alle mie esigenze, ma i commenti li ho ignorati.

Io predico bene, poi faccio come mi capita. :toobad:

Link al commento
Condividi su altri siti

ok ...mi sembrava strano .

comunque tempo fa si parlava di pilotare schede a rele' con i PCF8574 , dopo che i MCPxxx erano stati definiti fuori produzione .....

Voglio vedere cosa succede se invece dei leds ci collego la scheda a rele ...

Link al commento
Condividi su altri siti

Gli MCPxx non sono fuori produzione, credo che sia uscito lo MCPxx16, ma che lo MCPxx17 sia ancora in produzione.

Il vero problema del PCF8754 è che non ha una linea di reset Hw.

Per pilotare relè in sicurezza si dovrebbe tagliare le alimentazioni delle bobine, dando poi l'alimentazione solo dopo aver posto a zero l'uscita del PCF.

Altra soluzione è pilotare la bobina del relè tramite un PNP comandato dall'uscita del PCF. Per eccitare il relè è necessario portare a "0" l'uscita del PCF.

Link al commento
Condividi su altri siti

si infatti e' quello che pensavo di fare ...in pratic aun master rele' per le alimentazioni del PCF .In realtà si potrebbe anche tagliare l'alimentazione dei PCF , i 5V oltre all'alimentazione dei rele' o no?

Link al commento
Condividi su altri siti

Ma se usi un PNP per comadare il relè (tanto non lo puoi/non è corretto, comadare direttamente dal PCF8754) hai risolto il tuo problema.

Link al commento
Condividi su altri siti

no capisco bene come fare....il transistor dove andrebbe messo ?

Altra soluzione è pilotare la bobina del relè tramite un PNP comandato dall'uscita del PCF. Per eccitare il relè è necessario portare a "0" l'uscita del PCF

Adesso in cascata al PCF ho messo la schedina uscite pizzamicro con gli ULNxxx .

Pero' a me sembra quasi che sia il micro impallato all'accensione perche no nesegue nulla ....nel setup metto a zero le uscite ma rimangono alte ,mah...

Modificato: da walterword
Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...