Sempre più spesso ci si trova nella necessità di collegare ad Arduino dei dispositivi che funzionano con una tensione di 3.3V.
Abbassare la tensione di funzionamento dei circuiti integrati ha infatti diversi vantaggi:
[checklist]
- consente di realizzare transistor più piccoli
- richiede una minore dissipazione di calore
- permette transizioni di stato più veloci (la differenza di tensione tra lo stato logico basso e quello alto è inferiore)
[/checklist]
per questo i produttori di moduli, sensori… stanno sempre più adottando la tensione di 3.3V come standard.
Il problema
Prendiamo come riferimento una scheda Arduino Uno. La scheda può essere alimentata in diversi modi (tramite il connettore da 2.1mm, tramite la presa USB…) ma la tensione di funzionamento è 5V, fornita dal regolatore a bordo:
La scheda presenta anche un regolatore a 3.3V (LP2985), che rende possibile alimentare dispositivi esterni con tale tensione:
Tutti i PIN della scheda funzionano quindi a 5V: se un PIN digitale viene configurato come output, un valore logico 1 (digitalWrite(PIN, HIGH);
) corrisponderà ad una tensione di 5V su tale PIN.
Se invece il PIN viene configurato come input, normalmente una tensione su tale PIN maggiore di 2.5V viene interpretata come valore logico 1; una tensione inferiore di 2.5V come valore logico 0.
Colleghiamo ora a tale PIN il corrispondente PIN di un dispositivo alimentato a 3.3V:
[checklist]
- se il PIN di Arduino è configurato come input (dispositivo -> Arduino) non ci sono problemi: quando il dispositivo vuole inviare un valore logico alto impone una tensione di 3.3V che da Arduino viene correttamente interpretata (> 2.5V);
[/checklist]
[badlist]
- se invece il PIN di Arduino è configurato come output (Arduino -> dispositivo), in caso di valore logico alto Arduino impone una tensione di 5V, che supera la tensione di funzionamento del dispositivo e può quindi danneggiarlo!
[/badlist]
Soluzioni
Vi sono diverse soluzioni possibili per adattare le due tensioni di funzionamento.
Le soluzioni più semplici utilizzano soltanto componenti passivi (diodi, resistenze…). Queste soluzioni funzionano bene dal punto di vista delle tensioni ma introducono dei transitori sui passaggi di stato che non le rendono adatte per comunicazioni ad alta velocità. In questo blog post sono ben illustrate alcune di queste soluzioni e il loro effetto visualizzato su un oscilloscopio.
La soluzione che vi voglio invece suggerire utilizza un piccolo modulo in vendita su diversi webshops (io ad esempio l’ho acquistato da Banggood):
Questo modulo utilizza dei transistor per convertire fino a 4 segnali.
Il suo utilizzo è molto semplice: per prima cosa colleghiamo ad HV la tensione di alimentazione maggiore, mentre ad LV quella minore; quindi colleghiamo la massa (GND). Ai PIN etichettati come HVx va collegato il dispositivo a tensione più elevata, mentre a quelli etichettati come LVx quello a tensione più bassa.
Ad esempio per far comunicare via seriale Arduino con un dispositivo che funziona a 3.3V, i collegamenti saranno i seguenti:
Ecco ad esempio l’utilizzo su breadboard:
Salve.
Una domanda: al pin TX e RX della parte di 5v, li collego a due pin che manderanno e riceveranno il segnale da un dispositivo collegato dal lato 3.3v… giusto?
esempio: lato 5v lo collego ad arduino e a due pin (D2 e D3), mentre lato 3.3v a un modulo alimentato a 3.3v che manda e riceve un segnale. Quindi arduino e il modulo interagiranno…
si esatto, il modulo si occupa solo di traslare il segnale
Il sensore se è da 5vsarà alimentato dal modulo o da un alimentatore esterno? Se volessi collegare un relè che quindi non solo invia, ma anche riceve come lo collego? Devo usare due pin su Arduino?
Luigi non ho capito la domanda… se il sensore è da 5V non ti serve questo logic level converter… idem per un relay a 5V
Scusa,mi sono espresso male io, devo collegare dei sensori a 5v. sulla gpio di una gertboard che funziona a 3,3v