giovedì 26 febbraio 2015

Arduino a 5V e corretto interfacciamento tra periferiche 3.3V

Ho notato che spesso si trovano esempi di progetti su internet del tutto inaffidabili.
Un esempio classico è il collegamento di periferiche a 3.3V basate su bus SPI a normali arduini a 5V.
Un errore è quello di pensare che sia sufficiente alimentare la periferica a 3.3V, collegando il bus SPI normalmente senza alcun riduttore di tensione.
Sono incappato anch'io in questo errore, e ho scoperto a mie spese che il bus SPI deve lavorare alla stessa tensione dell'alimentazione della periferica, pena il cattivo funzionamento o addirittura il danneggiamento della scheda.

Vi faccio un esempio. Il classico lettore Rfid RC522 disponibile in molte varianti e marche va alimentato a 3.3V.

L'errore è quello di collegare Vdd a 3.3V di arduino, Gnd a gnd, e poi miso/mosi/sck/rst/sda ai rispettivi pin di arduino.

Devo essere sincero che ho fatto anch'io così e a prima vista sembrava funzionare tutto bene.
Poi quando ho smesso di alimentare il tutto via usb e sono passato all'alimentazione esterna, tutto ha smesso di funzionare.

Qualche giornata a dare la caccia ai fantasmi e poi il dubbio e l'intuizione: non è che alimentando il tutto con un alimentatore esterno si generano dei livelli di tensione più alti che alterano il funzionamento?

Se andiamo a leggere le specifiche NXP che trovate qui http://www.nxp.com/documents/data_sheet/MFRC522.pdf noterete che la tolleranza dell'RC522 è di circa mezzo volt rispetto alla tensione nominale di 3.3V.

Io ho provato in condizioni di alimentazione usb a misurare il livello di un'uscita ttl di arduino: a un valore HIGH non corrispondono 5V ma qualcosina di meno, nell'ordine dei 4V.
Ebbene, se alimentiamo l'arduino con un alimentatore esterno tale livello si alza di un qualcosina, diciamo che si porta attorno a 4.1/4.2V, a seconda delle schede e delle tolleranze dei componenti.
Tale differenza è quella che fa si che l'RC522 smetta di funzionare, perchè l'RC522 tollera (forse) un 4V al posto di un 3.3V, ma non riconosce un segnale più alto, anzi questa tolleranza cambia da scheda a scheda.

Ho avuto la fortuna di disporre di 3 schede RC522 identiche e di poterle intercambiare.
Ebbene, tutte e 3 funzionavano se alimentate da usb. Una sola su 3 funzionava se alimentato il tutto dall'esterno.

La soluzione corretta è l'applicazione di un level converter che converta il segnale dei pin miso/mosi/ecc da 5V a 3.3V.
Essendo il bus SPI bidirezionale ho adottato con successo questo level converter della adafruit.
http://www.adafruit.com/product/757 che costa circa €1.50 e svolge egregiamente il suo lavoro: converte da 5V a 3.3V i segnali SPI da arduino all'rfid e viceversa.

E mi viene da dire: culo che andasse senza level converter e che niente si sia guastato nelle prove.





3 commenti:

  1. Ma il convertitore come lo alimenti? Il mio richiede un'alimentazione a 5V e una a 3.3V!

    RispondiElimina
  2. ciao, i 3.3V e i 5V li prendi entrambi dalla scheda arduino.
    Il problema non era tanto avere una Vcc a 3.3V di riferimento, ma shiftare a 3.3V il bus dati visto che arduino "parla" a 5V e invece la RC522 vuole i dati a 3.3V

    RispondiElimina
  3. Riesco a comprendere quanto descritto nel progetto ma avrei bisogno urgente entro agosto 2018 di implementare un tale sistema per registrare gli accessi a 10 locali di un piccolo stabilimento alimentare e alle alle 5 celle frigorifere.

    Qualcuno di voi mi può recuperare tutto il materiale che serve?
    Montaggio e personalizzazioni del software lo posso fare io in poche ore, mi serve l'hardware che non mi faccia spendere troppo.

    Grazie

    RispondiElimina