raspberry-pi i wyświetlacz led
19.03.2013 20:26
... a także barometr i podtrzymywany bateryjnie RTC.
Jak wiemy (lub zaraz się dowiemy), r‑pi poza standardowymi złączami "komputerowymi" z rodziny hdmi czy USB, posiada także zestaw szpilek oznaczonych "gpio". Do tego złącza można podłączyć różne dziwne rzeczy jak sensowy, wyświetlacze i całą masą innych bzdur. Po ostatnio stworzonym włączniku urządzeń zasilanych z 230V przyszedł czas na ledowy wyświetlacz z gratisami. A dojdzie jeszcze mała klawiatura sterująca mpd + wyświetlacz LCD (128x64).
Na początek, schemat:
Oraz zmontowany układ podwieszony na żyłce:
Czas na opis. Całość rozmawia z r‑pi używając szyny i2c. Za obsługę wyświetlacza oraz czujnika oświetlenia odpowiada mikrokontroler ATmega8, zegar czasu rzeczywistego (RTC) to DS1307, ciśnienie i temperaturę podaje BMP085. A wyświetlacze są pomarańczowe i mają 1,8" wielkości (co powoduje kilka problemów, no nie tyle ich wielość co ilość diód w n ich zamontowanych). r‑pi na GPIO ma poziomy napięć LVTTL (3V3) i porty te nie są niczym zabezpieczone. ATmega8 może działać przy napięciu od 2V7 do 5V5. DS1307 potrzebuje 5V, BMP085 jest na 3V3. A LEDy potrzebują przynajmniej 6V. To razem daje trzy poziomy napięć, które skądś trzeba wziąć i odpowiednio skonwertować aby nie wysadziły czegoś w powietrze.
Zasilanie
Do głównej linii zasilającej weźmiemy napięcie 12V, dlaczego? Bo można je wziąć z komputera PC (z serwera, który i tak jest cały czas włączony) i jest większe niż 6V. 5V z zasilania r‑pi (bo tak). A 3V3 zrobimy sobie sami. Można by je było wziąć r‑pi ale r‑pi tylko 50mA może dostarczyć, więc trochę mało.
Sprawa konwersji napięć, szczęśliwie DS1307 i ATmega8 mają piny z otwartym kolektorem (z czymś otwartym, nigdy nie pamiętam). W każdym razie wynikają z tego dwie rzeczy, po pierwsze linie SDA (dane), SCL (zegar) wymagają rezystora podciągającego ich napięcie. Po drugie same układy mogą stan napięcia na nich zmieniać tylko ciągnąć je w dół. Podnosić go nie mogą, a że za stan wysoki uznają napięcie >2,7V, to wystarczy że linie są podciągnięte do 3V3 i nic się nie wysadzi. Jak widać na schemacie pull-upów nie ma, bo r‑pi je ma wbudowane.
Z 12V zrobić 3V3 jest bardzo prosto, wystarczy skorzystać z regulatora LV33V (IC3) oraz 2 kondensatorów (C3 i C2). Dalej wystarczy je poprowadzić do zasilania wszystkich układów poza RTC. RTC wymaga zasilania 5V wziętego ze złącza SV1.
C1 powinien być względnie mały i umieszczony blisko pinów zasilania sekcji cyfrowej kontrolera. To dla poprawy jego stabilności.
Zegar RTC
Bardzo prosty do podłączenia DS1307. Potrzebuje tylko zasilania (5V), baterii CR2032, 32,768kHz kryształu, jeśli używamy wyjścia zegarowego (używamy) to musimy je podciągnąć rezystorem do 3V3. Kryształ powinien być jak najbliżej układu, a jego obudowa powinna być połączona z masą, to w celu ochrony przed zakłóceniami. Kiedyś zrobiłem błąd i jej nie uziemiłem... dryf zegara wynosił 1h na dobę. :D
Barometr i termometr
Schemat trochę oszukuje, BMP085 nie jest w konstrukcji podłączony bezpośrednio do wszystkiego. Bezpośrednio to układ jest połączony z modułem GY‑65, który zawiera kilka elementów potrzebnych aby potrzebnych do jego poprawnego działania.
Notka: z modułu trzeba wymontować dwa rezystory, które podciągają SDA i SCL do zasilania. Te rezystory są już obecne w r‑pi, a co za dużo to nie zdrowo.
Czujnik oświetlenia
Czujnik oświetlenia zamontowany mamy w celu automatycznej regulacji jasności LEDów, nie chcielibyśmy aby nocą waliły po oczach jak małe słońca, albo za dnia, w słońcu nie dało sie nic odczytać. Układ jest banalnie prosty, składa się z fotorezystora (R2, RPP130), rezystora ograniczająco-podciągającego R3 i końcówki ADC kontrolera, który w praktyce mierzy spadek napięcia na fotorezystorze. ;)
Wyświetlacz
Wyświetlacz to najbardziej skomplikowany element układu, i coś przez co musiałem robić układ dwa razy. Też mi się zachciało używać dużych wyświetlaczy, pfff. Wszystkie problemy wynikają z tego, że w każdym segmencie są 3 diody LED, całość połączona szeregowo (i ma wspólna anodę, znaczy +). Jedna dioda ma spadek napięcia na poziomie 1V8. Diody są trzy więc w sumie 5,4V. Co oznacza, że napięcie musi wynosić więcej niż około 6V. Z tego wynika, że nie możemy sterować segmentami bezpośrednio z portów kontrolera, i musimy użyć tranzystorów. Oryginalnie sekcje podłączone do anody wyświetlacza wyglądały dokładnie tak jak te sterujące segmentami. Jednak po wykonaniu układu okazało się, że to nie działa jak powinno. Układ sterowania segmentami działał poprawnie. A nawet lepiej niż poprawnie, okazuje się, że można zamienić tam emiter z kolektorem i układ działa tak samo... magia.
Problemem było jednak tranzystory na anodzie, które zawsze były włączone i wyłączały się tylko przy podłączeniu do +12V, czego oczywiście nie można było zrobić, takie napięcie rozwaliłoby kontroler. Problem rozwiązało dodanie drugiego tranzystora (PNP) i 2 rezystorów.
Soft
Software po stronie r‑pi jest banalnie prosty (na razie, bo to wersja do testowania wyświetlacza), i wygląda tak:
#include <cstdio> #include <ctime> #include <wiringPi.h> #include <wiringPiI2C.h> #include <unistd.h> int main() { int dev = wiringPiI2CSetup (0x4A); if (!dev) { return 1; } wiringPiI2CWriteReg8(dev, 0x02, 0x88); wiringPiI2CWriteReg8(dev, 0x03, 0x88); sleep(1); int mmp = 0; for(;;) { time_t tme = time(NULL); tm * t = localtime(&tme); int hh = (t->tm_hour % 10) | ((t->tm_hour / 10) << 4); int mm = (t->tm_min % 10) | ((t->tm_min / 10) << 4); if (mm != mmp) { wiringPiI2CWriteReg8(dev, 0x02, hh); wiringPiI2CWriteReg8(dev, 0x03, mm); mmp = mm; } sleep(1); } close(dev); return 0; }
A kod kontrolera udostępniony i opisany będzie przy następnej okazji. A na koniec galeria:
Tutaj sprawdzałem czy wymiary wyprowadzeń wyświetlacza pasują do tego co nabazgrałem na płytce drukowanej.
A tutaj widzimy badanie czemu to draństwo nie działa prawidłowo.
A tutaj płytka w nadsiarczanie sodowym, spędziła tam cale 6h, a potem się zepsuła. ;P