
Pewnie wielu z Was podłączało kiedyś segmentowy wyświetlacz LED do Arduino i zastanawiało się co będzie jak zabraknie wyjść cyfrowych do ich sterowania. Otóż można wykorzystać interfejs komunikacyjny SPI i rejestry przesuwne. Ale żeby nie namącić Wam w głowach opowiem o wszystkim po kolei.

Będzie potrzebne oczywiście Arduino. Osobiście polubiłem wersję Nano V3 tak, więc na nim będą zaprezentowane przykłady. Najważniejsze z punktu widzenia tegoż projektu jest znajomość wyprowadzeń w Arduino. Do sterowania wyświetlaczem LED, a właściwie rejestrem przesuwnym, który tym wyświetlaczem steruje potrzebne jest zlokalizowanie wyprowadzeń SPI w Arduino. Poniższe zdjęcie chyba najlepiej to zobrazuje.
Interfejs SPI jest interfejsem szeregowym, którym przesyłane są po kolei bajt po bajcie (informacje) pomiędzy urządzeniami Master i Slave. W tym przypadku urządzeniem Master będzie Arduino, natomiast Slave – rejestr przesuwny HCF4094. Ale wracając do wyprowadzeń. Najważniejsza jest możliwość przesyłania danych. Dane przesyłać będą wyjściem MOSI czyli Master Out Slave In. Wejściem MISO czyli Master In Slave Out nie będziemy się teraz zajmować bo taki wyświetlacz nie ma dla Arduino żadnych informacji. Wyjście SCLK lub CLK, SCL, różnie ludzie to nazywają, jest to wyjście zegarowe, które pozwala zgrać w czasie pracę urządzeń Master i Slave. Natomiast wyjście CS lub jak niektórzy mówią SS jest niczym innym jak Chip Select lub Slave Select, pozwala na wybranie urządzenia z którym ma zajść komunikacja. Pin CS w Arduino podawany jest jako pin 10, ale nie jest to jakieś ograniczenie. Chip Select’em może być dowolne cyfrowe wyjście. To tyle od strony wyprowadzeń o SPI.
Następnym elementem jest wcześniej wspomniany rejestr przesuwny HCF4094. Akurat wykorzystałem rejestr firmy ST, ale jeśli się nie mylę wszystkie 4094 mają znormalizowane wyprowadzenia, ale najlepiej sprawdzajcie w notach katalogowych. U mnie przedstawiało się to w sposób następujący.

Ok, ale co z czym się je. Do wejścia STROBE podłączacie CS z SPI. DATA z MOSI i SCLK z CLOCK. Do VDD podłączacie zasilanie np. 5V z Arduino. OUTPUT ENABLE jest swojego rodzaju sygnałem dla rejestru, żeby zasilił wyjścia od Q1 do Q8. A że wyświetlacz ma działać od zaraz i nie chcę zbytnio komplikować prostej sprawy to zwarłem OUTPUT ENABLE z VDD w takim wypadku rejestr ma zezwolenie na pracę bez potrzeby angażowania do tego Arduino. VSS to oczywiście masa (GND). Przyszła kolej na wyjścia Q1– Q7. Zakładając, że nasz wyświetlacz ma wspólną katodę to owe wyjścia łączymy z odpowiednimi segmentami wyświetlacza LED. O ile tego co wyżej nie trzeba tłumaczyć to parę słów przydałoby się powiedzieć Q’s i Qs. Każdy rejestr ma na tyle wyprowadzeń że starczy na jeden wyświetlacz LED – pomijam w tym przypadku wyświetlacze powielone, o nich może kiedy indziej. Tak, więc aby połączyć większą ilość rejestrów przesuwnych należy jak wyżej odpowiednio podłączyć wszystkie wyprowadzenia z tą różnicą, że pin DATA kolejnego rejestru podłączamy do wyprowadzenia Qs (pin 9) poprzedniego rejestru. Tym zabiegiem łączymy rejestry szeregowo. Oczywiście wyprowadzenia Q1-Q7 podłączamy odpowiednio do kolejnego wyświetlacza LED. Powinno to wyglądać mniej więcej w ten sposób.
Jakby ktoś potrzebował to wewnętrzna struktura takiego pojedynczego wyświetlacza LED przedstawia się następująco.

Jeśli wszystko mamy już podpięte to nie pozostało nam nic innego jak zaprogramować Arduino odpowiednim programem. Jeśli chodzi o ważniejsze miejsca w kodzie to myślę, że wystarczy odpowiedni komentarz na końcach linii.
[crayon-50f33d12d2edc/]Jak widać w kodzie zdefiniowałem tablicę znaków (cyfr) w postaci bitowej. „Jedynka” oznacza włączenie odpowiedniego segmentu. Jeśli wszystko zrobiliście dobrze to efekt powinien być taki jak na poniższym filmiku.
http://www.youtube.com/watch?v=EpaCvfdMNGc Z uwagi na to, że SPI jest interfejsem szeregowym to w najprostszej jego postaci bajt, znaki, dane czy jak tam wolicie wysyłane są jeden po drugim, zatem, żeby na wyświetlaczu uzyskać obraz właściwy (nie lustrzany) najpierw wysyłamy bajt najstarszy, a kolejno młodsze. Jak sama nazwa wskazuje rejestry przesuwne przesyłają szeregowo do siebie informacje począwszy od pierwszego na lini (BUS). No ale dobra, żeby nie było zbyt nudno to spróbujcie zrobić coś takiego.Osobiście podobny wyświetlacz robię dla zaprzyjaźnionej firmy. Mają maszynę gdzie jest zwykły LCD 6x1 i niestety przy pewnych warunkach nasłonecznienia pracownicy muszą wytężać wzrok. A może sami macie jakieś pomysły na zastosowanie takiego wyświetlacza, nie wiem, może wyświetlacz aktualnego biegu w samochodzie ?
Dla tych, którzy by się dziwili stosowania tylu zmiennych globalnych w prostym kodzie powiem tylko, że to są DOBRE PRAKTYKI programowania. Przydadzą Wam się nawyki przy moich bardziej „skomplikowanych” projektach. Czytaj dalej...