Wstęp
Podczas rozwoju podzespołów elektronicznych, wraz z ich przyśpieszaniem i zmniejszaniem poboru energii, zmieniały się też standardy w jakich te układy pracowały. Obecnie w elektronice amatorskiej (także w Arduino) panuje standard 5V. Oznacza to, że zasilanie układów scalonych i ich stany logiczne odnoszą się właśnie do tego napięcia. Wiadomo, że stan niski “LOW” to GND, a stan wyoki “HIGH” to napięcie w okolicach 5V.
Coraz częściej spotyka się układy scalone pracujące w standardzie 3,3V. Oznacza to, że ich zasilanie i stany logiczne nie pasują do obecnych rozwiązań. W tym wpisie dowiesz się jak sprawić, by urządzenia obydwu standardów mogły się ze sobą łączyć i komunikować.
W Arduino w grupie pinów “POWER” jest wyjście napięcia 3,3V. W nowszych wersjach Arduino grupy R3 pojawił się tam dodatkowy pin o nazwie “IOREF”. Jest na nim napięcie w jakim pracuje dana płytka Arduino. To taki wybieg jego projektantów dla przyszłych wersji płytek, które mogą pracować już w standardzie 3,3V. Ten pin pozwoli dopasowywać komunikację układów podczas okresu przejściowego.
Istnieją układy PCF8574 i TLC5940 potrafią pracować w obydwu standardach. Jeśli zasilisz je napięciem 5V, to pracują w standardzie 5V. Jeśli zasilisz napięciem 3,3V, to będą pracować w standardzie 3,3V.
Są też jeszcze inne układy przejściowe, które mają opcję “5V Compilant”. Są zasilane napięciem 3,3V, jednak jeśli podłączysz do nich sygnały logiczne standardu 5V, to będą działały bez przeszkód. Przykładem takiego układu jest opisany niżej bufor 74AHC125.
Coraz częsciej spotykane są układy używające tylko standardu 3,3V. Podłączenie do nich innych stanów logicznych lub zasilania może spowodować ich uszkodzenie. Aby komunikowały się ze starszym standardem potrzebne są układy dopasowujące, które tu opiszę.
Zasilanie układów 3V3
Pin 3V3 w Arduino ma ograniczoną wydajność do 40 mA. Często zdarza się, że zasilane tym napięciem układy pobierają znacznie więcej prądu.
Jeśli tak jest i w twoim przypadku, należy zbudować sobie odpowiedni układ zasilający.
Układ jest dość prosty. Składa się ze stabilizatora liniowego (o oznaczeniu MCP1700-3302E/TO) i dwóch kondensatorów ceramicznych 1µF. Stabilizator to rodzaj układu scalonego, który mimo różnych napięc na wejściu, zawsze ma cały czas takie samo napięcie na wyjściu. Ten typ stabilizatora wytrzymuje prąd do 250 mA. Jest on w obudowie typu TO-92 znanej z różnego rodzaju tranzystorów. Układ ma trzy wyprowadzenia. Patrząc od jego ściętej strony od lewej - pierwsze to GND, kolejne to wejście napięcia (do 6V), a ostatnie to wyjście stabilizowanego napięcia 3,3V. Do wejścia i wyjścia należy podłączyć kondensatory jak na rysunku.
Układ można zasilić napięciem z pinu 5V Arduino, pochodzi z modułu Adafruit XBee Adapter v1.1 i został w nim sprawdzony.
Są też inne stabilizatory wytrzymujące prąd o natężeniu do 3A. Podłączenie ich jest podobne do tego na rysunku, jednak zawsze należy się tego upewnić zaglądając do ich noty katalogowej.
Podłączenie wyjścia układu 5V do wejścia układu 3,3V
Schemat przedstawia połączenie Arduino pracującego w standardzie 5V z modułem typu XBee, pracującym w standardzie 3,3V. Sygnał wyjścia szeregowego Arduino ma trafić do wejścia szeregowego XBee i być przystosowany do jego napięcia pracy. Wyjście pinu arduino podłączone jest do 2 rezystorów połączonych szeregowo. Wyjście drugiego rezystora podłączone jest do GND. Połączenie między rezystorami trafia do wejścia XBee.
Tak połączone rezystory tworzą tzw. dzielnik napięcia, pozwalający zmniejszyć napięcie. Napięcie wyjściowe ustala się ze wzoru:
Uwy = Uwe * R2 / (R1 + R2)
W tym układzie są 2 rezystory o takim samym oporze 10 kΩ. Daje to dzielnik napięcia przez 2.
Uwy = 5V * 10 kΩ / (10 kΩ + 10 kΩ) = 5V * 10 / 20 = 5V * 1 / 2 = 2,5 V
Co sprawia, że stan wysoki wychodzący z pinu 1 Arduino zostanie zmniejszony do 2,5V i trafi do XBee. Ponieważ napięcie 2,5V jest mniejsze niż 3,3V to nie zepsuje XBee. Takie napięcie mieści się też na granicy zakresu tolerancji stanu wysokiego układów na 3,3V. Układ pochodzi z modułu Arduino XBee Shield v1.1 i działa w nim poprawnie.
Innym sposobem dopasowania wyjścia 5V do wejścia 3,3V jest zastosowanie różnego rodzaju dopasowujących układów scalonych (buforów). Jednym z nich jest 74AHC125, który posiada 4 takie bufory. Układ zasilany jest napięciem od 2 do 5V. Od napięcia zasilania zależy to w jakim standardzie będą działały wyjścia. W tym przypadku zasiliłem układ napięciem 3,3V (czerwony przewód). Element ten posiada 4 bufory. Wejścia buforów (oznaczone kolorem niebieskim) tolerują napięcie do 5V. Wyjścia (oznaczone kolorem żółtym) mają w stanie wysokim w tym przypadku napięcie do 3,3V. Każde wejście bufora jest powiązane z wyjściem i oznaczone na rysunku cyfrą.
Układ pochodzi z modułu Adafruit XBee Adapter v1.1 i działał w nim poprawnie.
Podłączenie wyjścia układu 3,3V do wejścia układu 5V
Tutaj sprawa jest ułatwiona. Wyjścia standardu 3,3V można łączyć bezpośrednio do wejść standardu 5V. Tolerancja wejść tego standardu pokrywa się z zakresem napięć wyjścia 3,3V.
Jak dwukierunkowo połączyć 3,3 i 5V?
Sygnały magistrali I2C (TWI) mogą być przesyłane w obydwu kierunkach. To utrudnia sprawę z dopasowaniem sygnału dla obydwu standardów i wymaga trudniejszego schematu.
Układ składa się z tranzystora MOSFET typu N z wbudowaną diodą o oznaczeniu BSS138 i 2 rezystorów 10 kΩ. LV to wejście zasilania 3,3V, a HV to wejście zasilania 5V. TX_LV to miejsce podpięcia sygnału w standardzie 3,3V, natomiast TX_HV to miejsce podłączenia sygnału w standardzie 5V.
Wysyłając sygnały, urządzenia magistrali TWI ustawiają się albo w stan niski, albo nieustalony. Zapobiega to przeciążeniu układu w przypadku gdyby 2 urządzenia na raz zaczęły nadawać różne sygnały (jeden HIGH drugi LOW). Dlatego magistrala we własnym zakresie musi zapewnić rezystory podciągające PullUp zapewniające na niej bezpieczny stan wysoki jako domyślny. Układ na schemacie zapewnia takie rezystory dla każdej ze stron standardu oznaczone jako R3 i R4.
Tranzystor MOSFET (Q1) składa się z trzech wyprowadzeń. Bramka (Gate) to wyprowadzenie podłączone do zasilania LV (3,3V). Źródło (Source) to wyprowadzenie podłączone do wyjścia TX_LV. Ostatnie wyprowadzenie o nazwie dren podłączono do wyjścia TX_HV. Tranzystor jest rodzajem przełącznika, który przewodzi prąd między drenem i źródłem w zależności od napięcia jakie znajduje się między bramką i źródłem. Jeśli to napięcie nie różni się to tranzystor nie przewodzi. Jeśli się różni o jakąś minimalną wartość, to zaczyna przewodzić.
W przypadku, gdy żaden z układów magistrali nie ustawił jej w stan niski, napięcie na źródle i drenie nie różni się i dla obydwu wynosi 3,3V.
Gdy układ po stronie standardu 3,3V ustawi magistralę w stan niski, wtedy na źródle pojawi się stan LOW czyli GND czyli 0V, a na bramce pozostanie dalej napięcie 3,3V. W ten sposób powstanie różnica napięć i tranzystor zacznie przewodzić prąd. Czyli ustawi stan niski LOW po stronie standardu 5V.
Po stronie standardu 5V, gdy panuje stan wysoki HIGH, dioda nie przewodzi prądu i po stronie standardu 3,3V napięcie stanu wysokiego ustala rezystor PullUp R3. Gdy po stronie 5V urządzenie ustawi magistralę w stan niski, wtedy dioda zacznie przewodzić stan niski, który jest taki sam dla obydwu standardów.
Jak to zrobić PROŚCIEJ?
Sklep Nettigo oferuje gotową płytkę, która zawiera 2 kanały dwukierunkowej konwersji standardów 3,3V i 5V, oraz dwa kanały konwersji standardów opartych na dzielnikach napięcia.
- HV – zasilanie 5V
- LV – zasilanie 3,3V
- GND – masa GND
- TXO – strona standardu 5V dla dwukierunkowego połączenia
- TXI – strona standardu 3,3V dla dwukierunkowego połączenia
- RXI – wejście standardu 5V do dzielnika napięcia
- RXO – wyjście standardu 3,3V z dzielnika
Przykład pokazuje jak wykorzystać moduł do konwersji standardu TWI w Arduino UNO R3. Wykorzystuje on 2 konwertery dwukierunkowe modułu.
Ten przykład jest kopią układu z początku artykułu. Pokazuje sposób podłączenie wyjścia szeregowego Arduino w standardzie 5V do wejścia szeregowego modułu typu XBee w standardzie 3,3V. Przykład wykorzystuje dzielnik napięcia kanału 1.
Oczywiście można wykorzystywać na raz dzielniki i 2 kanałowe połączenia.
Zakończenie
Na koniec wypada mi jeszcze wspomnieć o tym, że są też inne rodzaje Arduino, które pracują z różnymi standardami stanów logicznych. Arduino LilyPad można zasilać napięciami od 2,7 do 5 V. Zatem jego standard pracy zależy od tego jakim napięciem go zasilisz. Arduino Fio i Pro Mini (model 3,3V) pracują już tylko w standardzie 3,3V.