
Witajcie moi drodzy.
Przedstawię tu wnętrze starego odtwarzacza DVD Wiwa HD-128U, zaprezentuję jakie części można ze środka odzyskać a potem skupię się na obsłudze jego wyświetlacza 7-segmentowego i klawiatury poprzez implementację protokołu dedykowanego ich kontrolera na platformie Arduino. Będzie to już kolejny temat z serii w której najpierw przedstawiam wnętrze urządzenia, a potem pokazuję, co przydatnego w środku może znaleźć typowy początkujący, zazwyczaj rozpoczynający przygodę z elektroniką i Arduino. Elektronika nie jest drogim hobby, a przydatne części wręcz "leżą na ulicy", wcale nie trzeba zamawiać gotowych modułów wyświetlaczy z Chin, wystarczy się rozejrzeć i wykorzystać to, co ktoś inny mógłby wyrzucić.
Pokrewne tematy z serii.
W tym stylu napisałem już co najmniej kilka tematów, wszystkie przeznaczone raczej dla początkujących i czasem korzystające z Arduino:
Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
Wnętrze odtwarzacza DVD United 7071, wykorzystanie części z Arduino
Wnętrze HP DeskJet 990Cxi C6455A oraz wykorzystanie zasilacza i przetwornicy
Stary tuner sat Kathrein - wnętrze, wykorzystanie części, zabawy z PAL
Stary modem ADSL Acer Surf USB - wnętrze, wykorzystanie przetwornic ze środka
Drugie życie zasilaczy impulsowych ze starych telewizorów CRT
Wnętrze DVD Wiwa HD-128U
Jeszcze przed rozkręceniem sprawdziłem, czy może to DVD działa. Niestety płyt wcale nie czyta, a z pendrivem też chyba nie mogło sobie poradzić, choć to może być z winy złego formatu plików:




Decyzja była szybka - idzie na części. I tak za dużo tego typu odtwarzaczy już mam i nikt i tak nie chce ich przyjmować.


Z przodu mamy wyświetlacz, odbiornik IR (pilota nie zdobyłem do niego), jeden slot na USB (swego czasu to była nowość w odtwarzaczach DVD, mój pierwszy wcale nie miał możliwości czytania USB... a teraz praktycznie każdy telewizor bezpośrednio może z pendrive odtwarzać filmy):

Z tyłu mamy charakterystyczne złącza S-Video i SCART, ale nie ma jeszcze HDMI. To nie te czasy. Sam do złącza SCART podchodzę z dużym sentymentem, porównanie go z HDMI nawet wizualnie nam pokazuje, jak wszystko poszło do przodu.
Pokrywę trzymają śruby typu philips z obu jej stron:


Budowa w środku jest modularna. Standardowo zasilacz (tutaj o dziwo w centrum obudowy, a nie na skraju), osobno płytka z klawiaturą i wyświetlaczem, osobno główny procesor video, osobno płytka ze złączem SCART no i odtwarzacz DVD.
Przedni panel trzymają kolejne śruby po bokach (czasem są tylko same zaczepy):

Cztery przewody (czarny, czerwony, biały, niebieski) to od portu USB.


Ta konstrukcja ma ten plus, że główny wyłącznik całkowicie wyłącza zasilacz, czyli wtedy nie ma żadnego "standby" które by pobierało jakiś mały, ale raczej nie całkowicie pomijalny prąd. Zwrócić jednak należy uwagę na to, że odcinana jest tylko jedna żyła od zasilania, a przy wtyczce taka jak tam jest to jest loteria czy odetniemy zero czy fazę.
Odłączamy:

Wspomniany przycisk ma przyklejoną diodę LED informującą o włączeniu odtwarzacza:


Połączenia:


PCB z wyświetlaczem jest przykręcone do przedniego panelu. Wyświetlacz jest dedykowany do odtwarzaczy, ale mimo wszystko można go będzie użyć. Obecność dwukropków jeszcze powiększa jego użyteczność.


Za tą "kratką" był odbiornik IR od pilota.
Pod naklejką QC passed jest symbol kontrolera klawiaturki i wyświetlacza - SM1628B:


Demontujemy:

Moduł zasilacza
Mamy tu zasilacz impulsowy w topologii flyback, oparty o układ VIPer22A (kontroler przetwornicy ze zintegrowanym tranzystorem kluczującym). Wokół standardowe komponenty, transoptor EL817, układ napięcia referencyjnego TL431 (tworzoną one pętle sprzężenia zwrotnego regulująca napięcie na wyjściu).
Wyjście prostują dwie diody Schottky, które są tutaj równolegle (niby zła praktyka, bo każda dioda ma inne nieco fabrycznie parametry i potem siłą rzeczy jedna się będzie bardziej nagrzewać, a im cieplejsza dioda tym gorsze jej parametry... ale jak widać producenci i tak tak robią).
No i nie zapominajmy o filtrach EMC - tutaj one są obecne, to nie jest typowy chiński zasilacz do kupienia z "darmową przesyłką".







Nota katalogowa VIPer22A i jego nota aplikacyjna rozwiewa wątpliwości:



Napięcie tego zasilacza można w pewnym stopniu zmienić poprzez zmianę dzielnika rezystorowego przy TL431.
Płyta główna
Tu o dziwo też jest trochę przydatnych elementów. Chociażby ten LDO montowany powierzchniowo 1117 3.3V (AMS1117) warto odlutować, pamięć EEPROM S24CS0 w SOIC8 też nawet z Arduino skomunikujemy a jej obudowa to nie problem bo są gotowe konwerterki-płytki "SOIC to DIP8" w sprzedaży. Tranzystory SS8550 są bardzo popularne i też warto je mieć w szufladzie. Oprócz tego jest tu kilka wzmacniaczy operacyjnych F4558 (popularny układ) i nieco mniejszych tranzystorów w SOT-23, np. taki o kodzie J3Y czyli S8050, 2TY czyli S8550 (tworzą one parę PNP i NPN).








Większych układów typu ES8380FAA (procesor DVD Phoenix), HY57V64162 (pamięć DRAM 64Mb), S29AL008D70TF102 (pamięć FLASH 8 Megabit) raczej nie użyjemy. Ciężko by było z tym się "skomunikować" ze zwykłego mikrokontrolera...
Z pozoru szansę na użycie daje jeszcze CD5888CB/AM5888S (driver silników dla napędu DVD/CD), ale obawiam się, że jednak jest on za bardzo dedykowany dla odtwarzania płyt i trudno byłoby go wykorzystać jako driver silników ogólnego zastosowania. A szkoda, gdyby to były dwa osobne układy to byłoby łatwiej:

Do masowego wylutu elementów z takiej płytki starcza hot air gun (zwykły pistolet na gorące powietrze, nie że specjalna stacja lutowniczca), lecz należy to robić na dworze, ze względu na drażniące opary.
Odtwarzacz CD/DVD
Niestety nie jest to nagrywarka DVD, więc mocnego lasera nie uzyskamy. Nie będzie też silnika krokowego - w starszych napędach DVD/CD takie spotykałem, ale już raczej ich się nie stosuje bo tańsze są zwykłe silniki DC.
Przy rozbieraniu możemy jedynie z ciekawości zwrócić uwagę na budowę lasera, a dokładniej to lasera i detektora, gdyż odczyt płyty odbywa się poprzez wysłanie wiązki laserowej w stronę poliwęglowej warstwy płyty i odbiciu się jej od następnej, aluminiowej warstwy, po czym ta wiązka jest odbierana przez detektor.












Zdejmijmy soczewkę z lasera (laser jest za zwierciadłem):



A tak wygląda detektor:




Uruchomienie wyświetlacza
Wyświetlacz obsługuje układ o nazwie SM1628B w charakterystycznej obudowie montowanej powierzchniowo SO28. Wstępne wyszukiwanie znajduje tylko jego chińską notę katalogową, ale to nie znaczy, że musimy się poddawać.
Można próbować szukać pod hasłem "SM1628B English" bądź na przeznaczonych do tego stron z dokumentacją techniczną.
W ten sposób natrafiłem na bliźniaczy (ten sam?) element TM1628. I tu już mamy dokumentację po angielsku, to jest to:


Jak widać układ wymaga trzech linii do komunikacji - zegar (SCLK), dane (DI/O, od data in-out) i STB czyli STROBE.
Sygnały są podpisane na płytce którą mamy, więc nie ma problemu. W przeciwnym razie moglibyśmy prześledzić ścieżki/sprawdzić multimetrem, co gdzie jest wyprowadzone.
Układ obsługuje wyświetlacz 7-segmentowy (sam realizuje multipleksing cyfr; dokładniej to wspiera aż do 11 segmentów w 6 grupach) a dodatkowo obsługuje też klawiaturę, czyli linia DI/O jest dwukierunkowa.
Układ oferuje też poboczne funkcjonalności, przykładowo 8-stopniową regulację jasności.
Widać, że daje on zdecydowanie dużą przewagę nad stosowanymi w takich sytuacjach często rejestrami przesuwnymi, które omawiałem w jednej z poprzednich części.
Rozwiązanie takie jest bardzo wygodne, bo odciąża mikrokontroler, zwalnia nas z obowiązku wykonywania multipleksingu w przerwaniu, itp. itd. Tu tylko wysyłamy raz komendę "wyświetl te i te diody" i zapominamy o problemie.
Komendy wysyłane są poprzez proste manipulacje stanami cyfrowymi pinów:

Szczegóły komunikacji (tzw. timingi) są nieco dalej w nocie katalogowej:

Tutaj widzimy już dokładnie, co ma się dziać na pinach - STB ustawiamy na stan niski i startujemy manipulację pinem zegara. Na DIN ustawiamy bit jaki chcemy wysłać gdy zegar jest w stanie niskim, a potem w momencie przejścia zegara ze stanu niskiego na wysoki układ odbiera ustawiony bit.
Zmiana stanu z niskiego na wysoki to tzw. "rising edge" (a w drugą stronę to z kolei "falling edge").
Łatwo można napisać funkcję, która wysyła w ten sposób bajt. W ramach usprawnienia wysyłany bajt "zjadamy" bit po bicie - po to jest to przesunięcie bitowe:
Code: c
UWAGA - kod powyżej zakłada, że nasze Arduino jest na tyle wolne, że nie musimy sztucznie czekać pomiędzy przerzucaniem zegara na reakcję układu z którym się komunikujemy. W przeciwnym razie, trzeba by dodać delay... bądź zrealizować to sprytniej, choćby na przerwaniu.
Zapomnieliśmy o STB - poszerzając to, można napisać funkcję wysyłającą całą komendę:
Code: c
W ten sposób tworzy się komendy ustawiające tryb pracy:

Komenda zapisu (stanu segmentów) i odczytu (stanu przycisków) jest bardziej złożona:

Jaki bajt trzeba wysłać? Mode Setting ustawiamy na 0 (normal operation), address increment mode na fixed (stały adres) i tryb na displayMode (ustawiamy segmenty). Uzyskujemy: 01xx0100. 'x' to bity które nie mają znaczenia, przyjmijmy 01000100, w szesnastkowym to 0x44.
Wysłanie takiej komendy rozpoczyna ustawianie segmentów, ale jeszcze trzeba wysłać adres i dane.
Code: c
Większość funkcji już składany z przygotowanych wcześniej "klocków". W ten sposób się zapala segment. Mapowanie konkretnych bitów z pamięci na segmenty zależy od połączenia i trybu pracy.
A jak zrealizowany jest odczyt danych, tutaj klawiatury?
Po prostu po wysłaniu komendy należy zmienić tryb pinu DI/O z wyjścia na wejście (pinMode(DIO,INPUT)) a potem kolejno odczytywać bity, też przełączając zegar.
Code: c
Czemu akurat 0x80? 0x80 to 128, a inaczej 1000 0000. Zapalony najbardziej znaczący bit. Po jednokrotnym przesunięciu (>>=) 1000 0000 zamienia się na 0100 0000 i tak dalej.
Tyle teorii starczy. Nie jest to kompletna obsługa TM1628, gdyż trzeba jeszcze np. wysłać komendy ustawiające jasność wyświetlacza, ale myślę, że podstawa została tu dobrze przedstawiona.
Biblioteka TM1628 z Github
Na Githubie istnieją już gotowe biblioteki pod TM1628 dla Arduino, czy można łatwo ich użyć? Wypróbowałem https://github.com/BlockThor/TM1628
Biblioteka ta używa przestarzałej funkcji do ustawiania czasu z Arduino, więc wyświetlanie czasu usunąłem.
Podłączyłem odpowiednio piny STB, SCLK i DI/O i...:

Niestety zapalają się losowe fragmenty i dwie pierwsze cyfry nie działają.
Pewnie było pisane pod nieco inaczej podłączony wyświetlacz.
Przenalizowałem po kolei połączenia i działanie tej biblioteki i znalazłem kilka problemów.
- na starcie brakuje ustawienia trybu pracy: sendCommand(0b11);

- funkcje wysyłające cyfry nie posiadały bloku if else dobierającego adres pierwszych dwóch cyfr:
Code: c
Cały blok if/else musiałem dopisać. Ale to też zależy od konfiguracji wyświetlacza...
- indeksy ikonek się różnią (dobrałem je ręcznie)
Poprawiona biblioteka TM1628
Ostatecznie zdecydowałem się poprawić wspomnianą już wcześniej bibliotekę z Githuba. Nie ma potrzeby wynajdywać koła na nowo. Uzupełniłem ją o wsparcie brakujących cyfr, o ustawienie trybu pracy zgodnego z moim wyświetlaczem oraz na nowo ustawiłem namiary na konkretne ikonki. Przygotowałem też dwa programy demonstracyjne.
Demo sterowania LED - wersja skrócona:
Code: c
Końcowy efekt:
Demo wsparcia klawiszy (można wciskać wiele na raz gdyż są one opisywane jako zapalenie/zgaszenie poszczególnych bitów):
Code: c
Rezultaty:





Jeden przycisk daje wartość 4, drugi 64. Oba wciśnięte razem dają 68. Wartości 1, 2, 4, 8, 16, 32, 64 itd odpowiadają poszczególnym bitom w zapisie binarnym liczby.
Uruchomienie odbiornika IR/pilota
Na płytce z wyświetlaczem jest też odbiornik IR, ale jego uruchomienie omawiałem już w poprzedniej części (biblioteka IRRemote z Arduino).
Podsumowanie
Kolejny odtwarzacz DVD okazał się być nie lada gratką dla początkujących. W środku otrzymujemy nie tylko tak jak zwykle zasilacz, ale też i dobry moduł z wyświetlaczem LED (aż 7 cyfr!) i pięcioprzyciskową klawiaturą, zupełnie za darmo. Co więcej, wyświetlacz ma też dwukropki, czyli nadawać się będzie na zegar. Sama jego barwa też jest przyjemna dla oka.
Chyba pokuszę się o zrobienie jakiegoś prostego DIY w oparciu o ten wyświetlacz, ale to już nie z Arduino. Może podłączę go do BK7231T, by w ten sposób mógł dołączyć do mojej grupy urządzeń IoT.
Zamieszczam poprawioną bibliotekę do obsługi SM1628B (na bazie tej z Github).
Cool? Ranking DIY