W tym tygodniu kontynuuję prezentację projektów związanych z Kodi (Xbmc). Jak wiecie z mojego poprzedniego opisu: topic18562.html sprzęt multimedialny klasy HTPC to jest mój konik Jeśli jeszcze o tym nie wiecie, to zapraszam do powyższego opisu, w którym skoncentrowałem się na aspektach sprzętowych. Dzisiaj, natomiast, poświęcę nieco więcej czasu aspektom dotyczącym samego programowania. Zanim jednak dojdziemy do kodu, to trzeba liznąć nieco teorii
I. Wstęp. Odbiornik przeznaczony jest do sterowania odtwarzaczem multimedialnym Kodi (dawniej XBMC). Jako medium transmisyjne wykorzystano podczerwień. Zastosowano popularne w sprzęcie konsumenckim odbiorniki IR pracujące na fali nośnej o częstotliwości 38kHz. Parametr ten nie jest krytyczny i można z powodzeniem zastosować odbiorniki o innej częstotliwości np. 36kHz lub 40kHz. Żeby móc skorzystać z mocy drzemiącej w odbiorniku należy użyć, odpowiedniego do tego celu, pilota na podczerwień. Dzięki zastosowaniu w projekcie zaawansowanej biblioteki do obsługi podczerwieni (IRMP) można skorzystać z bardzo dużej gamy dostępnych na rynku urządzeń nadawczych. Wyboru pilota można dokonać na etapie kompilacji programu, ustalając tablicę kodów IR oraz podczas użytkowania odbiornika, dzięki "zaszytej" w kodzie funkcji uczenia kodów. Oprócz powyższej funkcji, odbiornik może pracować jeszcze w dwóch kolejnych trybach, podstawowym, jako klawiatura IR i dodatkowym, logowania IR. W pamięci flash odbiornika umieszczono również plik konfiguracyjny keyboard.xml, który jest częścią integralną programu Kodi. W ten sposób, niejako „pod ręką”, mamy możliwość rozszerzenia możliwości odbiornika o dodatkowe funkcje, przydatne m.in. w trybie LiveTV odtwarzacz Kodi.
Część sprzętową odbiornika oparto na popularnej rodziny mikrokontrolerów AVR firmy Atmel. Podstawowe schematy elektryczne odbiornika można znaleźć w dalszej części dokumentu. Kod źródłowy przygotowano dla kilku tanich i ogólnie dostępnych przedstawicieli rodziny AVR. Ilość niezbędnych komponentów elektronicznych zredukowano do niezbędnego minimum tak, by nawet początkujący elektronik mógł wykonać urządzenie we własnym zakresie. W dalszej części przedstawiono kilka praktycznych przykładów wykonania. Minimalne wymagania, co do ilości pamięci programu, ustalono na 8K bajtów. Taka wielkość pamięci programu gwarantuje już dużą uniwersalność urządzenia, szczególnie co do możliwości obsługi jak największej ilości pilotów. Dzięki elastyczności biblioteki IRMP zajętość pamięci programu można łatwo modyfikować, wyłączając obsługę niektórych standardów kodowania. Warto zauważyć, że biblioteka ta wspiera także inne platformy jak PIC czy STM32. W dalszej części dokumentu opisano jeszcze inne sposoby, modyfikacji kodu źródłowego programu, służące do ograniczania zajętości pamięci flash. Pełna funkcjonalność urządzenia wymaga zastosowania mikrokontrolera, z co najmniej 16K bajtów. Drugą, również niezbędną biblioteką, jest V-USB. Dzięki niej możliwa była komunikacja odbiornika z komputerem w różnych systemach operacyjnych, na różnych platformach sprzętowych, dzięki emulacji urządzeń typu HID. Wspierane i przetestowane platformy zostaną krótko opisane w dalszej części dokumentu. Wspomniana wyżej biblioteka umożliwiła stworzenie pseudo-terminala, dzięki któremu urządzenie nie potrzebuje do komunikacji z użytkownikiem dodatkowego interfejsu jak wyświetlacz LED, LCD, czy dedykowanej aplikacji. Rolę interfejsu tutaj będzie pełnić dowolny edytor tekstowy. Idea tego rozwiązania została zaczerpnięta stąd: https://www.mikrocontroller.net/article ... e_Receiver.
Podsumowując pracując nad urządzenie postawiono na: - uniwersalność, - prostotę użytkowania, - łatwość wykonania modułu odbiornika.
II. Koncepcja obsługi odtwarzacza Kodi. Odtwarzacz Kodi jest programem o bardzo dużych możliwościach, praktycznie w każdym aspekcie jego działania. Nie inaczej jest również od strony interfejsu wejściowego użytkownika. Kodi współpracuje z klawiaturami, myszkami, dżojstikami, odbiornikami podczerwieni różnego rodzaju. Nie każde z tych rozwiązań cechuje się jednakową uniwersalnością. W mojej ocenie najlepiej na tym polu sprawdza się współpraca ze standardowymi klawiaturami PC, zarówno przewodowymi jak i bezprzewodowymi. Stąd właśnie wybór pracy odbiornika IR właśnie w tym trybie. Takie rozwiązanie daje bardzo dużą przenośność między różnymi platformami sprzętowymi i systemowymi. Poprawna praca interfejsu HID pozwoli użytkować odbiornik pod systemem Windows, Linux, Android czy nawet iOS. Takie rozwiązanie ma znaczną przewagę w stosunku do obsługi realizowanej dzięki Lirc czy Eventlirc, bowiem zapewnia dużą przenośność między urządzeniami i właściwie pracuje w trybie Plug&Play. Zaletę tę szczególnie docenią użytkownicy próbujący przystosować odtwarzacz Kodi do zdalnej obsługi w systemie Windows, na przykład za pomocą EventGhost. Praca ze standardowymi pilotami ma właściwie tylko dwie wady, trudność z przekazywaniem danych tekstowych, druga to konieczność "celowania w odbiornik". Obie te wady zwykle tracą na znaczeniu przy codziennym, standardowym użytkowaniu. Odtwarzacz Kodi do podstawowego swojego działania wymaga tylko kilku komend sterujących, tych zgrupowanych wokół poruszania się po menu odtwarzacza. Są to: Menu Up, Menu Down, Menu Left, Menu Right, Menu OK, Previous Menu, Back. Pilot podczerwieni powinien być wyposażony, w co najmniej 7 przycisków, co zaprezentowano na obraku:
Takie minimalistyczne podejście mocno ograniczy ergonomię użytkowania, zatem projektując odbiornik do Kodi przyjąłem inne założenie. Do podstawowych kodów dołożono kod Power i opierając się na wymogach wygodnego użytkowania odtwarzacza w trybie LiveTV przyjęto ilość przycisków na 46. Ilość klawiszy wynika wprost z konstrukcji jednego z popularniejszych pilotów uniwersalnych tzn. Logitech i300. Taka ich ilość, oraz pewna wprawa w użytkowaniu, zostawia w tyle, co do sprawności i szybkości, inne rozwiązania, choćby te oparte na smartfonach. Zaproponowaną przeze mnie ilość przycisków można łatwo zmodyfikować na etapie kompilacji źródeł programu. Zmniejszając ilość obsługiwanych przycisków można zaoszczędzić nieco na pamięci flash. Z minimalnej ilości niezbędnych komend wynika również zachowanie odbiornika w trybie uczenia kodów IR, gdzie po zapamiętaniu sekwencji pierwszych 8 kodów możliwe jest wyjście z trybu uczenia (komenda Previous Menu) oraz można pominąć niepożądane komendy (zarejestrowana komenda Menu Down). Podsumowując, pierwszych 8 komend, aż do Previous Menu, należy zaprogramować, żeby ułatwić proces uczenia kodów i również zachować minimalną ergonomię użytkowania. Takie zachowanie oprogramowania inspirowane było trybem uczenia skrótów klawiaturowych zastosowane w VDR (Video Disk Recorder).
III. Tryby pracy odbiornika. 1. Tryb klawiatury IR. Taki tryb pracy jest podstawowy dla całego urządzenia. W trybie tym następuje przekazywanie kodów IR z pilota podczerwieni do odbiornika, następnie dekodowanie na odpowiadające im kody HID i przesyłane poprzez interfejs USB do urządzenia głównego. W obecnej wersji oprogramowania możliwe jest przekazywanie pojedynczych kodów (klawiszy) – brak możliwości tworzenia skrótów klawiaturowych. Nie powinno być problemu z modyfikacją kodu, by można było przesyłać kombinacje klawiszy z Ctrl, Alt itp.
2. Tryb logowania kodów IR. Jest to dodatkowy tryb pozwalający przeanalizować kody dowolnego pilota i określić wartości kodów IR, adresu IR oraz nazwę zastosowanego systemu kodowania. Dzięki tak zebranym danym można przygotować własną tablicę kodów IR i użyć na etapie kompilacji programu, czy wręcz w innych projektach wykorzystujących sterowanie podczerwienią. Żeby skorzystać z tego trybu należy odbiornik przełączyć w tryb logowania IR (patrz punkt IV.2). W oknie edytora tekstowego będzie można podglądnąć, aktualnie wykryte, kody z pilota.
3. Tryb uczenia kodów pilota. Dzięki temu trybowi pracy można przystosować odbiornik do współpracy z każdym pilotem obsługiwanym przez bibliotekę IRMP. W trybie tym następuje przypisanie, zdefiniowanym w programie funkcjom sterowania programem Kodi, odpowiednich kodów pilota, a następnie zapisanie tych wartości do pamięci eeprom. Żeby zaprogramować odbiornik do obsługi konkretnego pilota należy przełączyć odbiornik w tryb uczenia (patrz punkt IV.2). Wcześniej, w systemie operacyjnym, należy uruchomić dowolny edytor tekstowy, żeby można było odczytać komendy odbiornika. W niniejszym opisie użyto standardowo dostępnego w systemie Windows 8.1 Notatnika (notepad.exe).
Oprócz powyższych trybów ważnym aspektem działania odbiornika jest sterowanie transoptorem, który pozwala w wersjach V.3 oraz V.5 sterować sygnałem Power On dowolnej płyty głównej klasy PC.
4. Tryb generowania pliku keyboard.xml. W pamięci flash mikrokontrolera zaszyto kod tekstowy pliku keyboard.xml, który jest częścią programu Kodi. Dzięki temu każdy użytkownik odbiornika IR będzie miał „pod ręką” stosowny plik konfiguracyjny, który uzupełni możliwości konfiguracyjne odbiornika.
Konkretny sposób działania przedstawiono na poniższym filmie.
IV. Inne, ważne funkcje odbiornika.
1. Funkcja pseudo-terminala. Do interakcji odbiornika z użytkownikiem, jak napisano we wstępie, zastosowałem prosty sposób wykorzystujący dane czysto tekstowe, zatem do otrzymania stosownych informacji należy użyć dowolnego edytora tekstowego. Takie rozwiązanie ma jeszcze tę zaletę, że zaraz po interakcji z odbiornikiem, uzyskane dane można zapisać do pliku tekstowego, pod dowolną nazwą. Pseudo-terminal wykorzystywany jest w trybach 2, 3 oraz 4 (patrz punkt III). W powyższych trybach należy koniecznie przełączyć się na aktywny edytor tekstowy, żeby otrzymać wszystkie przekazywane dane oraz uniknąć pewnego bałaganu w systemie operacyjnym, "bombardowanym" przekazywanym tekstem.
2. Przełączanie między trybami pracy odbiornika. W zależności od wykonania sprzętowego oraz zaimplementowanej obsługi programowej odbiornika zmiany trybów pracy można wykonać: - za pomocą zamontowanego w odbiorniku przycisku, - za pomocą podłączonej do komputera klawiatury (klawisz Capslock).
Żeby zmienić tryb działania odbiornika, wyposażonego w obsługę przycisku (może być też jumper lub zwora), należy po włączeniu zasilania (włożeniu wtyczki USB do gniazda) nacisnąć przycisk i przytrzymać w takiej pozycji, obserwując zarazem zamontowaną w odbiorniku diodę LED. Powinna zacząć migać, przez kilka sekund, po czym włączyć się na stałe, następnie znowu migać, ale szybciej. Zwolnienie przycisku w trakcie wolnego migania diody przełączy odbiornik w tryb logowania IR, zwolnienie przycisku, gdy dioda będzie świecić światłem ciągłym, w tryb uczenia kodów IR, zwolnienie przycisku w trakcie szybkiego migania przełączy odbiornik w tryb generowania tekstu do pliku keyboard.xml.
Jeżeli do oprogramowania modułu zaszyto obsługę klawisza Capslock, podłączonej do PC klawiatury, to należy wykonać sekwencję od kilku do kilkunastu zapaleń i zgaszeń diody od Capslock’a, pamiętając, że każda sekwencja musi zakończyć się zgaszeniem diody. Nie zastosowanie się do tego sposobu spowoduje, że po 1s świecenia diody próbę trzeba będzie powtórzyć. Podczas naciskania przycisku Capslock należy obserwować diodę zamontowaną w odbiorniku. W jaki tryb odbiornik zostanie przełączony zależy od ilości sekwencji: - 1 sekwencja – odbiornik wraca do trybu nr 1 (III.1), - od 2 do 5 sekwencji – odbiornik wchodzi do trybu nr 2 (III.2), - od 6 do 10 sekwencji – odbiornik wchodzi do trybu nr 3 (III.3), - więcej niż 10 sekwencji – wchodzi do trybu nr 4 (III.4)
Sposób zmiany trybów za pomocą Capslock'a (a jest to tryb preferowany) przedstawiono również na powyższym filmie.
V. Praktyczne przykłady realizacji odbiornika podczerwieni.
Dzięki dużej uniwersalności mikrokontrolerów z rodziny AVR, ilość gotowych rozwiązań sprzętowych, realizujących ideę odbiornika IR USB, jest wręcz nieograniczona. Poniżej przedstawiono kilka prostych rozwiązań.
1. Gotowy moduł z procesorem ATtimy85 (Digispark ATtiny85). Wygląd odbiornika wraz z modyfikacjami prezentują zdjęcia:
Zmontowany moduł Digispark ATtiny85 Mini USB znakomicie nadaje się na tego typu urządzenie. Zawiera w sobie mikrokontroler o wystarczającej pamięci programu jak i danych. Moduł zawiera 5 dostępnych portów (nie licząc pinu reset), co jest wystarczające w użyciu modułu jako odbiornika IR. Porty pełnią następujące funkcje: - PB0 - port wejściowy współpracujący z odbiornikiem podczerwieni - PB1 - port wyjściowy przeznaczony do sterowania diodą LED, - PB2 - port wejściowy przygotowany do obsługi pojedynczego klawisza (zworki), - PB3, PB4 - porty, do których podłączono interfejs USB, odpowiednio D- i D+. W niniejszym rozwiązaniu nie zastosowano rezonatora kwarcowego, w zamian, w programie głównym, zaimplementowano automatyczną kalibrację urządzenia, która dzięki wewnętrznej pętli PLL mikrokontrolera pozwala ustalić częstotliwość zegara, na zgodną z V-USB wartość, tzn. 16,5 MHz. Takie rozwiązanie pozwoliło zaoszczędzić 2 porty mikrokontrolera potrzebne do obsługi USB i dzięki temu powstała możliwość uruchomienia odbiornika na tym module, korzystając ze sprzętowej obsługi przerwań AVR w trybie PCINT. Sposób obsługi kalibracji zaczerpnięto z: http://vusb.wikidot.com/examples
Żeby nie komplikować zanadto dodatkowej elektroniki, w postaci odbiornika IR i jego peryferiów, zrezygnowano, z zalecanej przez producenta modułu IR, prawidłowej filtracji napięcia zasilania, w zamian zastosowano tylko kondensator filtrujący SMD, widoczny na zdjęciach. Wielokrotne próby wykazały, że przy zastosowanym scalonym odbiorniku podczerwieni, nie zaobserwowano niepokojących objawów podczas działania przy takiej, niepełnej filtracji. Pewna hermetyczność rozwiązania, w postaci gotowego modułu jako bazy, skomplikowała nieco proces programowania mikrokontrolera (potrzebna jest dedykowana "przejściówka" – brak gniazda w standardzie Kanda) oraz utrudniła również proces zmiany trybu pracy odbiornika, dzięki brakowi mikro przełącznika na module. Dodatkowo sam scalony odbiornik IR musi być tak dołączony do modułu Digispark by, na czas programowania kodów, można go było zdemontować. Zamiast przełącznika należy użyć dowolnej zworki (przewodu) i zewrzeć pin PB2 do masy i postępować wg punktu IV.2. Na zdjęciach zmodyfikowanego modułu, widać wszystkie potrzebne elementy do złożenia odbiornika IR. Wymienione trudności są niewielkie zważywszy, że trybu uczenia, czy logowania IR nie wykonuje się zbyt często podczas normalnego użytkowania odbiornika.
UWAGI: o W tym rozwiązaniu próby implementacji użycia Capslocka, jako „wyzwalacza” zmiany trybów odbiornika, nie powiodły się. Ten moduł należy programować z obsługą zworki. o Żeby auto-kalibracja, do żądanej częstotliwości 16.5 MHz udała się, należy wiedzieć, że podczas programowania pamięci flash za pomocą programatora, zasilanie musi być podane poprzez złącze USB, nie poprzez programator.
2. Gotowy moduł z mikrokontrolerem ATmega328P wraz z modyfikacjami. Do wykonania odbiornika użyto popularnego moduł Arduino Pro Mini z rezonatorem kwarcowym 16 MHz i zasilaniem 5V. Żeby moduł zrealizował funkcję odbiornika dla Kodi użytkownik, we własnym zakresie, powinien wykonać drobną modyfikację w postaci układu wejściowego USB wraz z obwodem zasilania dla układu odbiorczego IR. Całość zmian przedstawiono zdjęciach:
3. Projekt PCB z wykorzystaniem ATmega328P. Jest to właściwie gotowy do produkcji projekt, wyposażony w otwory montażowe. Odbiornik zaprezentowano na zdjęciach:
4. Gotowy moduł Arduino Pro Micro z procesorem ATmega32U4. Na zakończenie propozycja innego podejścia do odbiornika IR. Tym razem zamiast programowej obsługi USB można skorzystać z czysto sprzętowej, dostępnej m.in. w mikrokontrolerze ATmega32U4, dzięki projektowi LUFA: http://www.fourwalledcubicle.com/LUFA.php Taki podejście do projektu mocno uprości urządzenie, po zakupie np. Arduino Pro Micro wystarczy tylko dołączyć odbiornik IR i gotowe. Projekt takiego rozwiązania jest jeszcze we wczesnej fazie, ale pierwsze próby wypadły obiecująco.
5. Przykład gotowego urządzenia klasy mini PC. W tym przypadku mamy już konkretny sposób wykorzystania odbiornika. Został, bowiem zaszyty w panelu sterującym wykorzystanym w odtwarzaczu multimedialnym przeznaczonym "do salonu". Cała konstrukcja to elektryczna i mechaniczna przeróbka uszkodzonego magnetofonu i stanowi część większego projektu, oprócz odbiornika urządzenie obsługuje klawisze na panelu czołowym oraz wyświetlacz VFD. Całość urządzenia oczywiście współpracuje z Kodi na kilka sposobów, poprzez odbiornik IR, klawiaturę oraz enkoder. Pełny opis można znaleźć tutaj: topic18562.html
VII. Trochę słów o kodzie. Pełen kod, wraz z krótkim opisem przedstawię w następnej części publikacji. W pisanym kodzie starałem się mocno skoncentrować na podziale aplikacji wg warstw, a szczególnie zależało mi na oddzieleniu tzw. warstwy sprzętowej. Nie mam niestety jeszcze dużej wprawy w programowaniu, ale już teraz czuję podskórnie, że to dobra droga. Myślenie o warstwach pozwoliło mi wstępnie na zamianę programowej obsługi USB na sprzętową, o czym pisałem w punkcie V.3
Na zakończenie tej części dodaję jeszcze zrzut struktury programu w postaci drzewa projektu Eclipse.
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
VIII. Podsumowanie: No cóż, po raz kolejny udało się zrealizować wstępne założenia projektu Dostaliśmy odbiornik niewielki, sprytny, łatwy w obsłudze (aczkolwiek zdaję sobie sprawę, że na pewno dla twórcy, dla użytkowników pewnie się okaże ) i z kilkoma ciekawymi "ficzerami"
Co należy jeszcze poprawić? 1. Na pewno należy powalczyć jeszcze z kodem. Odbiornik powstał ok. roku temu, kiedy to jeszcze nie potrafiłem stosować callbacków ani zdarzeń. Warto te techniki programowania zastosować do obsługi biblioteki IRMP, tak by jeszcze uprościć kod.
2. Warto zastanowić się nad poprawą implementacji V-USB. Obsługę, którą zastosowałem robiłem trochę po omacku. Dopiero liznąłem tę tematykę i trochę działałem metodą prób i błędów, po omacku
3. Odbiornik właściwie nadaje się tylko do Kodi, a można by pomyśleć o bardziej zaawansowanej obsłudze np. można stworzyć dedykowaną aplikację na PC, która będzie zarządzała skrótami klawiaturowymi i przyporządkowywała je kodom IR, następnie "wgrywała" do odbiornika, tak by dopasować działanie nawet do innych aplikacji.
To by było na razie wszystko Mam nadzieję, że miłośników Kodi, na forum Atnel, jeszcze przybędzie
Ja może się nie znam aż na tyle na tym KODI, ale zapewniam was, że z tego projektu już sam widok "terminala" w notatniku windows - po prostu powala na kolana!
To co kolega autor wyprawia tu z tymi KODI itp to normalnie jakiś pogrom ! ... czytając to wszystko wyżej aż chciałoby się rzucić gdzieś w kąt wszystko czym się teraz zajmuję i .... i oddać się rozkoszy zajęcia tą właśnie tematyką ...
Chciałbym jeszcze dodać, że tym razem oprócz "tych Kodi", jest pewne nawiązanie do tematyki ostatnich poradników Mirka, chodzi o kalibrację zegara:
Zealota napisał(a):
W niniejszym rozwiązaniu nie zastosowano rezonatora kwarcowego, w zamian, w programie głównym, zaimplementowano automatyczną kalibrację urządzenia, która dzięki wewnętrznej pętli PLL mikrokontrolera pozwala ustalić częstotliwość zegara, na zgodną z V-USB wartość, tzn. 16,5 MHz. Takie rozwiązanie pozwoliło zaoszczędzić 2 porty mikrokontrolera potrzebne do obsługi USB i dzięki temu powstała możliwość uruchomienia odbiornika na tym module, korzystając ze sprzętowej obsługi przerwań AVR w trybie PCINT. Sposób obsługi kalibracji zaczerpnięto z: http://vusb.wikidot.com/examples
Prace nad opisem zintensyfikowałem właśnie po "owych poradnikach", tak by trochę się przy nich "ogrzać"
Ważne jest też to, że łatwiej się programuje to, co się rozumie oraz jest potrzebne
a podpowiesz czy cos trzeba zmienić w kodzie jeśli chce sie używać digispark? Kiedy kompiluje na ATMEGA328P wszystko ładnie działa, a jeśli ten kod ustawie na attiny85 to już nie działa, tylko sypie błędami
Skompilowałem u siebie i nie było błędów w Eclipse Photon. Najlepiej ręcznie usunąć zawartość katalogu Release, żeby stare pliki oboektowe nie mieszały. Na początek w ustawieniach projektu zmienić na ATtiny85 i ustawić zegar na 16500000 oraz włączyć przerwania od PCINT:
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Niestety dla 8 KB flash trzeba ograniczyć ilość obsługiwanych protokołów IR. Dla 2 powinno zadziałać. Trzeba koniecznie pamiętać, że przy wgrywaniu wsadu zasilanie musi być brane z USB - taki oto niezamierzony "ficzer"
Hmm ciekawe nie mam u siebie takich funkcji Może wrzuciłem jakiś stary kod... Daję do załącznika to co mi się kompiluje, zaimportuj nowy projekt do workspace i zobacz. Tak w ogóle to nadal masz 12 MHz (-DF_CPU=12000000UL), ma być 16,5 MHz dla Attiny.
Załączniki:
Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.
Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość
Nie możesz rozpoczynać nowych wątków Nie możesz odpowiadać w wątkach Nie możesz edytować swoich postów Nie możesz usuwać swoich postów Nie możesz dodawać załączników