Witajcie moi drodzy
Chciałbym przedstawić tutaj moje próby samodzielnego wykonania wyświetlacza 7-segmentowego opartego o kolorowe diody LED WS2812B, własne PCB i obudowę wydrukowaną na drukarce 3D.
Wyświetlacz pokazany tutaj przetestuję z Arduino i dam pełne kody obsługi do pobrania.
Serce wyświetlacza - diody WS2812B
Wyświetlacz opiera się o 'inteligentne', kolorowe diody WS2812B, których dużą ilość można sterować za pomocą jednego pinu. Diody te wymagają tylko podprowadzenia zasilania (5V i masa) oraz jednego sygnału, podłącza się je tak:
(w przypadku długich przewodów warto dać jeszcze rezystor na linię danych przed podłączeniem do mikrokontrolera)
Oczywiście sterowanie nimi wymaga zastosowania odpowiedniego protokołu.
Więcej o nich pisałem w temacie PIC18F45K50 jako sterownik paska LED WS2812, tutaj:
https://www.elektroda.pl/rtvforum/topic3590731.html
Projekt płytki
Projekt własnego wyświetlacza zacząłem od zaplanowania płytki. Użyłem do tego darmowej wersji programu Eagle.
Płytka reprezentuje jedną cyfrę. Cyfry można ze sobą łączyć i mieć ich większa ilość (sterowaną i tak przez jeden pin) dzięki użyciu WS2812B.
Starałem się by całość nie miała wymiarów większych niż 5cm na 5cm, gdyż większość płytkarni przyjmuje w tańszej cenie panele o rozmiarze do 10cm na 10cm, co pozwoli w przyszłości taniej zamówić większą ilość moich płytek (4 płytki na panel).
Na płytce jest mały błąd - odległość od złącz goldpinowych po prawej i lewej stronie do krawędzi płytki jest nieco za duża, przez co nie można łączyć ze sobą dwóch płytek samymi zworkami. To jest koniecznie do poprawy w przyszłości.
Płytki wyeksportowałem do Gerberów i zleciłem płytkarni (jak na początek bez panelu - to pierwsza wersja).
Lutowanie płytki
Jeszcze przed samym lutowaniem płytki warto jest podkreślić jedną bardzo ważną rzecz. Diody WS2812B powinny być oczywiście przylutowane w odpowiedniej orientacji - nie można obrócić diody i pomylić pinów. Trzeba zwracać uwagę na oznaczenia. Na mojej płytce (zrobionej w Eagle) pierwszy pin oznaczony jest kropką:
Natomiast sam WS2812B ma ścięty rożek w miejscu... trzeciego pinu:
Czyli kropka ma PCB ma być po przeciwnej stronie (po skosie) niż ścięty pin na WS2812B.
Uzbrojeni w tą wiedzę możemy zacząć lutowanie:
Odpowiednio ustawiony element:
Przylutowany:
Pierwszy test z Arduino UNO i "Adafruit Neopixel Library":
W trakcie lutowania (całość lutowałem najtańszą lutownicą grotową z chin):
Gotowy moduł:
Test pierwszej cyfry:
Projekt 3D wyświetlacza
Następnie uruchomiłem program Blender i wziąłem się za projekt 3D nakładki na płytkę z diodami, która będzie miała na celu ukształtowanie fragmentów cyfr. Zacząłem od przeniesienia otworów z PCB (użyję ich do montażu):
Następnie zdecydowałem o wielkości segmentów i naniosłem ich wstępny kształt:
Potem dopracowałem ich kształt i przygotowałem finalny element (w Blenderze użyłem operacji Boolean by z sześcianu wyciąć segmenty):
Tak nadałem całości trzeci wymiar (środkowe dwa cylindry to otwory; cztery po rogach to wypustki):
Wydruk 3D wyświetlacza i przymiarki
Element wyszedł dobrze za pierwszym razem. Na płytce prezentował się tak:
Ale to nie koniec, bo trzeba jeszcze zrobić jakąś nakładkę która choć troszkę rozproszy światło i da efekt świecenia całych segmentów (a nie pojedynczych LEDów).
Nie byłem pewny czego najlepiej w tym celu użyć, więc użyłem jednej z warstw ze środka starej matrycy LCD (których teardown opisywałem niedawno w dziale 'wnętrza urządzeń'). Dobrałem taką warstwę która daje najlepszy efekt, białą/mleczną:
Nakleiłem ją na wydrukowany element za pomocą kleju kropelka/superglue, gdyż nie planowałem już jej zmiany.
Wydrukowany element zamocowałem do PCB za pomocą śrubek od laptopa:
Końcowy efekt:
Łączenie kolejnych panelów
Panele zaprojektowałem tak, by można było je łączyć. Niestety okazało się, że jednak mają nieco za grube krawędzie i nie mogłem do łączenia użyć typowych zworek 2.54mm, ale poradziłem sobie w inny sposób. W następnej wersji to będzie poprawione.
Docelowo zrobione prototypy chciałem wykorzystać jako wyświetlacz temperatury, więc połączyłem razem trzy moduły:
(w międzyczasie przerzuciłem się też z Arduino UNO na Nano)
Moduł w akcji (największa możliwa jasność):
Test kolorów (50% jasności):
Przykładowy kod obsługi dla Arduino (odliczanie)
Docelowo zamierzam użyć mojego wyświetlacza z PIC, ale mimo wszystko uznałem, że napiszę krótki testowy kod pod niego na Arduino i się nim z wami podzielę.
Kod obsługuje podział na cyfry i można łatwo do niego dodać wsparcie kolejnych cyfr.
Kod opiera się o bibliotekę Adafruit_NeoPixel.h, stąd:
https://github.com/adafruit/Adafruit_NeoPixel
Kopia repo powyżej do pobrania w .zip:
Kod:
Kod: C / C++
Funkcja 'displayDigit' ustawia wyświetlanie danej cyfry na konkretnej pozycji, a 'displaySimple' wyświetla trzycyfrową liczbę (można obsłużyć więcej cyfr, ale trzeba zmodyfikować kod). Tablica 'masks' określa jakie fragmenty powinny być zapalone dla której cyfry (do tej tablicy można dodać kolejne elementy by wyświetlać np. literę 'A').
Warto pamiętać, że samo ustawianie koloru WS2812B przez bibliotekę tutaj nie wyświetla go na pasku, aby wyświetlić zmiany należy wywołać 'strip.show()'.
Rezultat działania kodu:
Na bazie tego możecie łatwo zrealizować prosty termometr lub zegar (w przypadku zegara przyda się czwarta cyfra, trzeba będzie zmodyfikować kod).
Popełnione błędy, co można by ulepszyć, itp
To była moja pierwsza próba zrobienia własnych wyświetlaczy w oparciu o wydruk 3D, więc można by było tu kilka rzeczy poprawić:
- przede wszystkim trzeba poprawić krawędzie płytek tak by goldpiny do siebie dochodziły (był między nimi odstęp 2.54mm) by móc je łączyć zwykłymi zworkami dwupinowymi
- można by dwukrotnie zwiększyć ilość WS2812B w celu zwiększenia jasności segmentów (choć teraz są dobrze widoczne)
- można by pomyśleć o wykorzystaniu drugiej strony PCB, np. dać tam miejsce na mikrokontroler (ale oczywiście użyć go tylko do pierwszego modułu, a w pozostałych nie lutować)
- ten element drukowany w 3D można by wydrukować z większym wypełnieniem (infill) albo w ogóle pogrubić bo nieco jego boczne ścianki przepuszczają światło a nie powinny
- można by użyć lepszej powłoki rozpraszającej światło, może ktoś ma pomysł jakiej?
- na płytce ze zdjęć z tematu brakowało oczywiście warstwy opisowej, po prostu zgubiła się przy eksporcie do Gerberów, w następnej wersji trzeba pamiętać by ją dodać
Podsumowanie
Pierwsza próba zasadniczo się udała - z mojego wyświetlacza jestem zadowolony. Jest wygodny w użyciu i dobrze się prezentuje w ciemnym pokoju. Z pewnością zrobię jego drugą, poprawioną wersję. Z przedstawionej tutaj wersji z kolei chyba zrobię termometr a możliwości RGB wykorzystam tak, by oddawać w jakiś sposób też wyświetlaną temperaturę poprzez kolor cyfr.
Załączniki:
Plik Blendera z modelem wyświetlacza (i kilkoma dodatkami):
Plik Eagle z PCB wyświetlacza (wymaga poprawek!):
Fajne? Ranking DIY Pomogłem? Kup mi kawę.