
Witajcie, dzisiaj przedstawię uruchomienie układu AS1115 z Arduino w oparciu o gotową bibliotekę. AS1115 to kontroler wyświetlacza 7-segmentowego (do 8 cyfr) oraz klawiatury (do 16 klawiszy) z interfejsem I2C, oferującym dodatkową linię-przerwanie dla zdarzeń pochodzących od klawiatury. Temat ten po raz kolejny bazować będzie na płytce z wyświetlaczem uratowanej z elektrośmieci.
Płytka z AS1115
Płytka pochodzi z elektrośmieci, ale otrzymałem ją już luzem. Nie wiem z jakiego urządzenia pochodzi, ale obecność 4 przycisków, wyświetlacza i odbiornika IR sugeruje jakieś urządzenie w stylu tuner telewizji satelitarnej lub podobne.

Płytka podpisana jest CPT D4-DISPL-02 02-FEB-2010.
Sercem układu jest AS1115:

Oprócz tego mamy odbiornik IR:

Przyciski:


Wyświetlacz 4-cyfrowy, 7-segmentowy, dodatkowo o kropkach i dwukropku:

Płytka jest dwustronna, te większe pady to testowe punkty tych samych sygnałów co idą na tasiemkę:

Układ AS1115 i podobne...
AS1115 to sterownik wyświetlacza LED przeznaczony dla osobnych 64 LEDów bądź dla 8 cyfr składających się z 8 segmentów (klasyczna cyfra 7 segmentowa + kropka). Dodatkowo wspierany jest też ósmy segment - kropka. Układ oferuje interfejs I2C. Każdy segment jest osobno adresowany i może być dowolnie zmieniany. Tylko jeden rezystor wymagany jest do pracy - Rset.

Ten SEGDP to właśnie Dot Point, czyli kropka. Z kolei SEGA, SEGB, itd. to kolejne segmenty cyfr.
Oprócz obsługi LEDów możliwa jest też obsługa klawiatury. Klawisze można odczytywać poprzez polling (odpytywanie układu o ich stan) bądź poprzez przerwanie (sygnał IRQ).
Układ również oferuje kontrolę jasności wyświetlacza.
Przykładowa aplikacja wygląda następująco:

Istnieje też bratni układ AS1116, który z kolei ma interfejs SPI oraz pozwala połączyć razem kilka sterowników:


Inny podobny, AS1130:

Z tej serii jest więcej układów, ale niektóre są naprawdę mało popularne i trudne do kupienia.
Wyprowadzenia PCB
Zamiast bawić się z tasiemką, zrobiłem małą kombinację i wyprowadziłem sobie goldpiny. Goldpiny podłączyłem do padów, które wyglądają na testowe. Rolę padów sprawdziłem multimetrem, badając ciągłość między nimi a nóżkami AS1115:

Biblioteka AS1115 dla Arduino
W poprzednich tematach z tej serii z reguły musiałem samodzielnie implementować komunikację z kontrolerem wyświetlacza. W przypadku jednego z wyświetlaczy znalazłem bibliotekę do Arduino, ale niestety mapowanie segmentów się nie zgadzało. Czy tu będzie lepiej?
Wyszukiwanie sugeruje, że jest już jakaś sprawdzona biblioteka dla AS1115:
https://github.com/blemasle/arduino-as1115
Bibliotekę zainstalowałem z poziomu Arduino IDE poprzez Library Manager:

Sprawdziłem i... wszystko działa!
W takim razie tym razem pominiemy implementację komunikacji i użyjemy gotowca.
Podłączenie Arduino
Interfejs I2C wymaga podłączenia sygnałów SDA (Dane) i SCL (Zegar), które są też zaznaczone na Arduino. Dodatkowo oczywiście masa no i zasilanie - 5V. Dodatkowo (dla przykładu numer 3) podłączyłem IRQ, czyli przerwanie, na pin 2 od Arduino.
AS1115 przykład 1 - licznik
Pierwszy przykład prezentuje tylko użycie wyświetlacza, bez obsługi przycisków. Odliczamy sekundy, począwszy od 1234. Funkcja init z klasy AS1115 bierze dwa argumenty, ilość cyfr dostępnych na wyświetlaczu oraz poziom jasności.
Code: c
Demo:

AS1115 przykład 2 - kody przycisków
Poniższy kod po prostu regularnie odpytuje AS1115 o stan przycisków zakodowany w postaci liczby całkowitej. Przyciski są zakodowane jako jej bity - przycisk może mieć tylko dwa stany, więc aż się prosi o takie rozwiązanie.
Code: c
UWAGA: Jak mamy wyświetlacz 4-cyfrowy i wciśniemy przycisk o bicie nr 14 to jego kod będzie wynosić 2^14 = 16384 ale wyświetli się nam tylko 6384, bo mamy tylko 4 cyfry...
Demonstracja:

AS1115 przykład 3 - przerwanie przycisków
Ten przykład może wydawać się być nieco bardziej skomplikowany. Korzysta on z przerwań. Przerwanie wywołuje zmiana stanu na pinie AS1115_ISR_PIN , a dokładniej zbocze opadające (FALLING). AS1115 informuje nas w ten sposób o zdarzeniu przycisku. Wtedy możemy zareagować i odebrać informacje o wciśniętych przyciskach w głównej pętli. Zwalnia nas to z obowiązku ciągłego odpytywania układu o przycisk tak jak w poprzednim przykładzie. Zmienna oznaczona jest jako volatile, gdyż może zmienić się w "niespodziewanym" momencie, z przerwania.
Code: c
AS1115 przykład 4 - poziomy jasności cyfr
Skoro mamy już specjalizowany układ do sterowania wyświetlaczem, to czemu nie wykorzystać lepiej jakoś jego możliwości? Takie funkcjonalności też tutaj są dostępne - można ustawić jasność wyświetlacza z poziomu kodu i AS1115 też w pełni to kontroluje. Poziomy jasności są od 0 do 15. Ustawia je funkcja setIntensitiy:
Code: c
Rezultat:

AS1115 przykład 5 - wyświetlanie liter
Wyświetlacz 7-segmentowy może w ograniczonym stopniu wyświetlać też litery - chociażby znaki a, b, c, d, e i f, potrzebne do wyświetlania liczb zapisanych szesnastkowo.
Omawiana biblioteka posiada do tego funkcję. W teorii ta funkcja wspiera też wyświetlanie kropki (używa kropki na odpowiedniej cyfrze), ale u mnie to nie działało.
Code: c

Dostępne funkcje
Oto krótka tabelka pokazująca co oferuja klasa AS1115:
Funkcja | Argumenty | Opis |
AS1115 | uint8_t addr | Konstruktor klasy AS1115. Pobiera adres I2C urządzenia, dzięki czemu możemy mieć na jednej magistrali kilka układów (niekoniecznie kilka AS1115, kilka różnych ogólnie urządzeń I2C) |
init | uint8_t digits, uint8_t intensity | Inicjalizuje układ AS1115 dla danej ilości cyfr wyświetlacza oraz ustawia jego jasność (liczba od 0 do 15) |
setIntensity | uint8_t intensity | Ustawia jasność wyświetlacza (od 0 do 15) |
clear | czyści wyświetlacz | |
display | uint16_t value | wyświetla liczbę całkowitą nieujemną |
display | const char value[] | wyświetla ciąg znaków, w teorii wspiera kropki (u mnie nie działało), wspiera też znaki a, b, c, d, e i f |
display | uint8_t digit, uint8_t value | wyświetla daną wartość na danej cyfrze |
readPort | uint8_t port | czyta dany z portów (zwraca jego wartość jako uint8_t) |
read | dokonuje odczytu obu portów, jednocześnie obsługując problem drgania styków (wykonuje debouncing styków), zwraca wartości w postaci typu 16-bitowego short, gdzie każdy bit informuje nas o stanie danego z przycisków | |
shutdown | bool preserve | wyłącza wyświetlacz - w zależności od preserve, czyści rejestr FEATURE |
resume | bool preserve | uruchamia wyświetlacz po 'shutdown', w zależności od preserve, resetuje rejestr FEATURE |
visualTest | bool stop | uruchamia bądź zatrzymuje animację testową wyświetlacza (wymaga #define _AS1115_DIAGNOSTICS_ w kodzie) |
Wynika z niej kilka ważnych informacji, które mogą nie być oczywiste na pierwszy rzut oka - chociażby to, że omawiane już read dokonuje debouncingu styków, więc nie musimy już tego obsługiwać w swoim kodzie.
Dodatkowe przyciski (i cyfry)
Na koniec dodam, że nawet tą płytkę można by rozbudować - dodatkowe przyciski można łatwo dodać (w jednym z pierwszych akapitów umieściłem schemat), w podobny sposób można by dodać cyfry, ale z tym już nieco większy problem. Wszystko w ramach limitu ilości obsługiwanych cyfr/przycisków układu AS1115.
Podsumowanie
Normalnie trzeba by podłączyć ze cztery tranzystory (po jednym na cyfrę), 7 pinów (po jednym na segment; ew. rejestr przesuwny..), rezystory, i w przerwaniu multipleksować wyświetlacz, dbając też by nie było ghostingu i by nie zużyć zbyt dużo cennego czasu mikrokontrolera. A tutaj wszystko mamy gotowe - jedna komenda I2C i już dowolna liczba jest wyświetlona. Potem druga komenda i już znamy stan przycisków. Co więcej, nawet nie trzeba odpytywać o stan przycisków regularnie, bo jesli tylko coś się zmieni, to dostaniemy sygnał na IRQ, więc po prostu wystarczy użyć przerwania.
Bardzo przydatny układ.
Temat umieściłem w dziale "Wnętrza urządzeń" a nie w "Artykuły", gdyż, jak już wspominałem, opisywany tu moduł pochodzi z wnętrza jakiegoś urządzenia i nie miałem możliwości wybrać sterownika LED/klawiatury, po prostu użyłem AS1115 gdyż akurat on wpadł mi w ręce.
A czy Wy korzystaliście w swoich projektach z jakiś podobnych układów, przejmujących za MCU obsługę wyświetlacza i klawiatury, a jeśli tak to z jakich?
To nie koniec przygód z tym modułem - spróbuję go jakoś wykorzystać, może uda się też ożywić jakoś dwukropek i/lub kropki oraz dodać dodatkowe przyciski.
Cool? Ranking DIY