<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=23&amp;t=18602&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2019-07-10T19:28:15+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=23&amp;t=18602&amp;mode</id>
<entry>
<author><name><![CDATA[yalbi]]></name></author>
<updated>2019-07-10T19:28:15+01:00</updated>
<published>2019-07-10T19:28:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=220322#p220322</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=220322#p220322"/>
<title type="html"><![CDATA[Re: Budujemy uniwersalny odbiornik IR do Kodi cz. 1]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=220322#p220322"><![CDATA[
ooo super, ten kod sie kompiluje, wielkie dzięki! <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br /><br />tak, tak, teraz bawiłem się ze zmianą na ATMEGA 328P i stąd te 12 MHz <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20721">yalbi</a> — 10 lip 2019, o 19:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2019-07-10T19:18:28+01:00</updated>
<published>2019-07-10T19:18:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=220321#p220321</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=220321#p220321"/>
<title type="html"><![CDATA[Re: Budujemy uniwersalny odbiornik IR do Kodi cz. 1]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=220321#p220321"><![CDATA[
Hmm ciekawe nie mam u siebie takich funkcji <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Może wrzuciłem jakiś stary kod...<br />Daję do załącznika to co mi się kompiluje, zaimportuj nowy projekt do workspace i zobacz.<br />Tak w ogóle to nadal masz 12 MHz (-DF_CPU=12000000UL), ma być 16,5 MHz dla Attiny.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 10 lip 2019, o 19:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[yalbi]]></name></author>
<updated>2019-07-10T18:44:33+01:00</updated>
<published>2019-07-10T18:44:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=220319#p220319</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=220319#p220319"/>
<title type="html"><![CDATA[Re: Budujemy uniwersalny odbiornik IR do Kodi cz. 1]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=220319#p220319"><![CDATA[
ok, ok, dzięki za odpowiedź <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />używałem marsa, ale z ciekawości odpaliłem na photonie i dalej ta sama sytuacja :/<br /><br />ustawiłem autokalibrację i przerwania PCINT, ale dalej wywala błędy<br />co masz na myśli pisząc o zmniejszeniu obsługiwanych protokołów? <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />edit. aaa, już wiem które protokoły miałeś na myśli SAMSG NEC RC5 itd. ograniczyłem do jednego i dalej to samo<br /><br />[syntax=c]'Building file: ../lib/sw_ir_manage.c'<br />'Invoking: AVR Compiler'<br />avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=attiny85 -DF_CPU=12000000UL -MMD -MP -MF&quot;lib/sw_ir_manage.d&quot; -MT&quot;lib/sw_ir_manage.o&quot; -c -o &quot;lib/sw_ir_manage.o&quot; &quot;../lib/sw_ir_manage.c&quot;<br />In file included from ../lib/V-USB/../../usbdrv/usbportability.h:124:0,<br />                 from ../lib/V-USB/../../usbdrv/usbdrv.h:13,<br />                 from ../lib/V-USB/usb_sw_layer.h:4,<br />                 from ../lib/sw_ir_manage.h:14,<br />                 from ../lib/sw_ir_manage.c:9:<br />../lib/sw_ir_manage.c: In function 'sw_settings_strings_to_usb':<br />../lib/sw_ir_manage.c:326:39: error: 'settings' undeclared (first use in this function)<br />   unsigned char *ptr = pgm_read_word( settings+i );   // Pobieramy z FLASH kolejny wskaĹşnik do nazwy kodu[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20721">yalbi</a> — 10 lip 2019, o 18:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2019-07-10T17:25:54+01:00</updated>
<published>2019-07-10T17:25:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=220318#p220318</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=220318#p220318"/>
<title type="html"><![CDATA[Re: Budujemy uniwersalny odbiornik IR do Kodi cz. 1]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=220318#p220318"><![CDATA[
Skompilowałem u siebie i nie było błędów w Eclipse Photon.<br />Najlepiej ręcznie usunąć <strong>zawartość </strong>katalogu Release, żeby stare pliki oboektowe nie mieszały.<br />Na początek w ustawieniach projektu zmienić na ATtiny85 i ustawić zegar na 16500000 oraz włączyć przerwania od PCINT:<br />[syntax=c]#define USB_PCINT_ON1//Ustalamy czy korzystamy z przerwania PCINT[/syntax]<br />Niestety dla 8 KB flash trzeba ograniczyć ilość obsługiwanych protokołów IR. Dla 2 powinno zadziałać.<br />Trzeba koniecznie pamiętać, że przy wgrywaniu wsadu zasilanie musi być brane z USB - taki oto niezamierzony &quot;ficzer&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 53 minutyach ]</span></strong><br /><br />A i jeszcze jedna opcja dla ATtiny:<br />[syntax=c]#define ATTINY_AUTO_CALIBRATE1[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 10 lip 2019, o 17:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[yalbi]]></name></author>
<updated>2019-07-10T17:03:57+01:00</updated>
<published>2019-07-10T17:03:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=220317#p220317</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=220317#p220317"/>
<title type="html"><![CDATA[Re: Budujemy uniwersalny odbiornik IR do Kodi cz. 1]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=220317#p220317"><![CDATA[
@Zealota, dziękuję <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />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<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20721">yalbi</a> — 10 lip 2019, o 17:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2019-07-06T20:04:43+01:00</updated>
<published>2019-07-06T20:04:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=220282#p220282</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=220282#p220282"/>
<title type="html"><![CDATA[Re: Budujemy uniwersalny odbiornik IR do Kodi cz. 1]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=220282#p220282"><![CDATA[
Kod znajdziesz na moim blogu:<br /><!-- m --><a class="postlink" href="http://zealota74.blogspot.com/2017/10/uniwersalny-odbiornik-podczerwieni-do.html" >http://zealota74.blogspot.com/2017/10/u ... ni-do.html</a><!-- m --><br />Na samym dole.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 6 lip 2019, o 20:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[yalbi]]></name></author>
<updated>2019-07-06T14:15:49+01:00</updated>
<published>2019-07-06T14:15:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=220280#p220280</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=220280#p220280"/>
<title type="html"><![CDATA[Re: Budujemy uniwersalny odbiornik IR do Kodi cz. 1]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=220280#p220280"><![CDATA[
bardzo zaciekawił mnie ten projekt, ale nigdzie nie mogę pobrać pełnego kodu, stąd moja prośba do autora tematu o udostępnienie <br />Z góry dzięki <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20721">yalbi</a> — 6 lip 2019, o 14:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2017-06-12T07:55:01+01:00</updated>
<published>2017-06-12T07:55:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=190573#p190573</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=190573#p190573"/>
<title type="html"><![CDATA[Re: Budujemy uniwersalny odbiornik IR do Kodi cz. 1]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=190573#p190573"><![CDATA[
Bardzo fajny projekt i realizacja - miałem okazję to zobaczyć na własne oczy i ponieważ znam Kodi to tym bardziej doceniam <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br /><br />Sent from my Mi-4c using Tapatalk<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 12 cze 2017, o 07:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-06-11T22:14:14+01:00</updated>
<published>2017-06-11T22:14:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=190570#p190570</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=190570#p190570"/>
<title type="html"><![CDATA[Re: Budujemy uniwersalny odbiornik IR do Kodi cz. 1]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=190570#p190570"><![CDATA[
Chciałbym jeszcze dodać, że tym razem oprócz &quot;tych Kodi&quot;, jest pewne nawiązanie do tematyki ostatnich poradników Mirka, chodzi o kalibrację zegara:<br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />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:<br /><!-- m --><a class="postlink" href="http://vusb.wikidot.com/examples" >http://vusb.wikidot.com/examples</a><!-- m --><br /></div><br />Prace nad opisem zintensyfikowałem właśnie po &quot;owych poradnikach&quot;, tak by trochę się przy nich &quot;ogrzać&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Ważne jest też to, że łatwiej się programuje to, co się rozumie oraz jest potrzebne <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 11 cze 2017, o 22:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-06-11T21:59:57+01:00</updated>
<published>2017-06-11T21:59:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=190569#p190569</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=190569#p190569"/>
<title type="html"><![CDATA[Re: Budujemy uniwersalny odbiornik IR do Kodi cz. 1]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=190569#p190569"><![CDATA[
Ja może się nie znam aż na tyle na tym KODI, ale zapewniam was, że z tego projektu już sam widok &quot;terminala&quot; w notatniku windows - po prostu powala na kolana! <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />To co kolega autor wyprawia tu z tymi KODI itp to normalnie jakiś pogrom ! <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... 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ą ...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 11 cze 2017, o 21:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-06-11T21:54:33+01:00</updated>
<published>2017-06-11T21:54:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=190567#p190567</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=190567#p190567"/>
<title type="html"><![CDATA[Budujemy uniwersalny odbiornik IR do Kodi cz. 1]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18602&amp;p=190567#p190567"><![CDATA[
W tym tygodniu kontynuuję prezentację projektów związanych z Kodi (Xbmc).<br />Jak wiecie z mojego poprzedniego opisu: <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic18562.html" >topic18562.html</a><!-- l --><br />sprzęt multimedialny klasy HTPC to jest mój konik <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Jeśli jeszcze o tym nie wiecie, to zapraszam do powyższego opisu, w którym skoncentrowałem się na aspektach sprzętowych.<br />Dzisiaj, natomiast, poświęcę nieco więcej czasu aspektom dotyczącym samego programowania.<br />Zanim jednak dojdziemy do kodu, to trzeba liznąć nieco teorii <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /> <br /><strong>I.Wstęp.</strong><br />Odbiornik przeznaczony jest do sterowania odtwarzaczem multimedialnym <strong>Kodi </strong>(dawniej <strong>XBMC</strong>).<br />Jako medium transmisyjne wykorzystano podczerwień. Zastosowano popularne w sprzęcie konsumenckim odbiorniki IR pracujące na fali nośnej o częstotliwości <strong>38kHz</strong>. Parametr ten nie jest krytyczny i można z powodzeniem zastosować odbiorniki o innej częstotliwości np. <strong>36kHz </strong>lub <strong>40kHz</strong>.<br />Ż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 (<strong>IRMP</strong>) można skorzystać z bardzo dużej gamy dostępnych na rynku urządzeń nadawczych.<br />Wyboru pilota można dokonać na etapie kompilacji programu, ustalając <strong>tablicę kodów IR</strong> oraz podczas użytkowania odbiornika, dzięki &quot;zaszytej&quot; w kodzie funkcji uczenia kodów. Oprócz powyższej funkcji, odbiornik może pracować jeszcze w dwóch kolejnych trybach, podstawowym, jako <strong>klawiatura IR </strong>i dodatkowym, <strong>logowania IR</strong>. W pamięci flash odbiornika umieszczono również plik konfiguracyjny <strong>keyboard.xml</strong>, który jest częścią integralną programu <strong>Kodi</strong>. W ten sposób, niejako „pod ręką”, mamy możliwość rozszerzenia możliwości odbiornika o dodatkowe funkcje, przydatne m.in. w trybie <strong>LiveTV </strong>odtwarzacz Kodi.<br /><br />Część sprzętową odbiornika oparto na popularnej rodziny mikrokontrolerów<strong> AVR firmy Atmel</strong>. 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.<br />  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.<br />  Minimalne wymagania, co do ilości pamięci programu, ustalono na <strong>8K bajtów</strong>. 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 <strong>IRMP </strong>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 <strong>PIC </strong>czy <strong>STM32</strong>.<br /> 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.<br /> Drugą, również niezbędną biblioteką, jest <strong>V-USB</strong>. 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 <strong>HID</strong>. Wspierane i przetestowane platformy zostaną krótko opisane w dalszej części dokumentu. Wspomniana wyżej biblioteka umożliwiła stworzenie<strong> pseudo-terminala</strong>, dzięki któremu urządzenie nie potrzebuje do komunikacji z użytkownikiem dodatkowego interfejsu jak wyświetlacz <strong>LED</strong>, <strong>LCD</strong>, czy <strong>dedykowanej aplikacji</strong>. Rolę interfejsu tutaj będzie pełnić dowolny <strong>edytor tekstowy</strong>. Idea tego rozwiązania została zaczerpnięta stąd:<br /><!-- m --><a class="postlink" href="https://www.mikrocontroller.net/articles/USB_IR_Remote_Receiver" >https://www.mikrocontroller.net/article ... e_Receiver</a><!-- m -->.<br /><br />  Podsumowując pracując nad urządzenie postawiono na:<br /> - uniwersalność,<br /> - prostotę użytkowania,<br /> - łatwość wykonania modułu odbiornika.<br /> <br /><strong>II.Koncepcja obsługi odtwarzacza Kodi.</strong><br />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.  <br />Kodi współpracuje z klawiaturami, myszkami, dżojstikami, <strong>odbiornikami podczerwieni</strong> 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 <strong>klawiaturami PC</strong>, zarówno przewodowymi jak i bezprzewodowymi. Stąd właśnie wybór pracy odbiornika <strong>IR </strong>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 <strong>HID </strong>pozwoli użytkować odbiornik pod systemem Windows, Linux, Android czy nawet iOS. <br />Takie rozwiązanie ma znaczną przewagę w stosunku do obsługi realizowanej dzięki <strong>Lirc </strong>czy <strong>Eventlirc</strong>, bowiem zapewnia dużą przenośność między urządzeniami i właściwie pracuje w trybie Plug&amp;Play.<br />Zaletę tę szczególnie docenią użytkownicy próbujący przystosować odtwarzacz <strong>Kodi </strong>do zdalnej obsługi w systemie Windows, na przykład za pomocą <strong>EventGhost</strong>.<br />Praca ze standardowymi pilotami ma właściwie tylko dwie wady, trudność z przekazywaniem danych tekstowych, druga to konieczność &quot;celowania w odbiornik&quot;. Obie te wady zwykle tracą na znaczeniu przy codziennym, standardowym użytkowaniu.<br />Odtwarzacz Kodi do podstawowego swojego działania wymaga tylko kilku komend sterujących, tych zgrupowanych wokół poruszania się po <strong>menu </strong>odtwarzacza.<br />Są to: <em><span style="color: #0080FF">Menu Up, Menu Down, Menu Left, Menu Right, Menu OK, Previous Menu, Back</span></em>. Pilot podczerwieni powinien być wyposażony, w co najmniej 7 przycisków, co zaprezentowano na obraku:<br /> <br /><a href="https://obrazkiforum.atnel.pl/16487/f13a47bc6015640d73d45595a5bb6b05.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/f13a47bc6015640d73d45595a5bb6b05.jpg" alt="Obrazek" /></a><br /><br />Takie minimalistyczne podejście mocno ograniczy ergonomię użytkowania, zatem projektując odbiornik do <strong>Kodi </strong>przyjąłem inne założenie. <br />Do podstawowych kodów dołożono kod <em><span style="color: #0080FF">Power </span></em>i opierając się na wymogach wygodnego użytkowania odtwarzacza w trybie <strong>LiveTV </strong>przyjęto ilość przycisków na <strong>46</strong>. Ilość klawiszy wynika wprost z konstrukcji jednego z popularniejszych pilotów uniwersalnych tzn. <strong>Logitech i300</strong>. 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. <br />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. <br />Z minimalnej ilości niezbędnych komend wynika również zachowanie odbiornika w <strong>trybie uczenia kodów IR</strong>, gdzie po zapamiętaniu sekwencji pierwszych 8 kodów możliwe jest wyjście z trybu uczenia (komenda <em><span style="color: #0080FF">Previous Menu)</span></em> oraz można pominąć niepożądane komendy (zarejestrowana komenda <em><span style="color: #0080FF">Menu Down</span></em>).<br />Podsumowując, pierwszych 8 komend, aż do <em><span style="color: #0080FF">Previous Menu</span></em>, należy zaprogramować, żeby ułatwić proces uczenia kodów i również zachować minimalną ergonomię użytkowania.<br />Takie zachowanie oprogramowania inspirowane było trybem uczenia skrótów klawiaturowych zastosowane w <strong>VDR </strong>(<strong>Video Disk Recorder</strong>). <br /> <br /><strong>III.Tryby pracy odbiornika.</strong><br /><em><span style="color: #008080">1.Tryb klawiatury IR.</span></em><br />Taki tryb pracy jest podstawowy dla całego urządzenia. W trybie tym następuje przekazywanie kodów <strong>IR </strong>z pilota podczerwieni do odbiornika, następnie dekodowanie na odpowiadające im kody <strong>HID </strong>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.<br /><br /><em><span style="color: #008080">2.Tryb logowania kodów IR.</span></em><br />Jest to dodatkowy tryb pozwalający przeanalizować kody dowolnego pilota i określić wartości <strong>kodów IR</strong>, <strong>adresu IR</strong> oraz nazwę zastosowanego systemu kodowania. Dzięki tak zebranym danym można przygotować własną <strong>tablicę kodów IR</strong> i użyć na etapie kompilacji programu, czy wręcz w innych projektach wykorzystujących sterowanie podczerwienią. <br />Żeby skorzystać z tego trybu należy odbiornik przełączyć w <strong>tryb logowania IR</strong> (patrz punkt IV.2). W oknie edytora tekstowego będzie można podglądnąć, aktualnie wykryte, kody z pilota.<br /><br /><em><span style="color: #008080">3.Tryb uczenia kodów pilota.</span></em><br />Dzięki temu trybowi pracy można przystosować odbiornik do współpracy z każdym pilotem obsługiwanym przez bibliotekę <strong>IRMP</strong>. 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 <strong>pamięci eeprom</strong>. <br />Żeby zaprogramować odbiornik do obsługi konkretnego pilota należy przełączyć odbiornik w <strong>tryb uczenia</strong> (patrz punkt IV.2). Wcześniej, w systemie operacyjnym, należy uruchomić dowolny <strong>edytor tekstowy</strong>, żeby można było odczytać komendy odbiornika. W niniejszym opisie użyto standardowo dostępnego w systemie Windows 8.1 Notatnika (notepad.exe). <br /><br />Oprócz powyższych trybów ważnym aspektem działania odbiornika jest sterowanie transoptorem, który pozwala w wersjach <strong>V.3</strong> oraz <strong>V.5</strong> sterować sygnałem <strong>Power On</strong> dowolnej płyty głównej klasy PC.<br /><br /><em><span style="color: #008080">4.Tryb generowania pliku keyboard.xml.</span></em><br />W pamięci <strong>flash </strong>mikrokontrolera zaszyto kod tekstowy pliku <strong>keyboard.xml</strong>, który jest częścią programu <strong>Kodi</strong>. 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.<br /><br />Konkretny sposób działania przedstawiono na poniższym filmie.<br /><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><br /><br /><br /><strong>IV.Inne, ważne funkcje odbiornika.</strong><br /><br /><em><span style="color: #008080">1.Funkcja pseudo-terminala.</span></em><br />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ą.<br /><strong>Pseudo-terminal </strong>wykorzystywany jest w trybach 2, 3 oraz 4 (patrz punkt III). <br />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, &quot;<strong>bombardowanym</strong>&quot; przekazywanym tekstem. <br /><br /><em><span style="color: #008080">2.Przełączanie między trybami pracy odbiornika.</span></em><br />W zależności od wykonania sprzętowego oraz zaimplementowanej obsługi programowej odbiornika zmiany trybów pracy można wykonać: <br />- za pomocą zamontowanego w odbiorniku przycisku,<br />- za pomocą podłączonej do komputera klawiatury (klawisz <strong>Capslock</strong>).<br /><br />Żeby zmienić tryb działania odbiornika, wyposażonego w obsługę przycisku (może być też <strong>jumper </strong>lub <strong>zwora</strong>), 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 <strong>diodę LED</strong>. Powinna zacząć migać, przez kilka sekund, po czym włączyć się na stałe, następnie znowu migać, ale szybciej. Zwolnienie przycisku w trakcie <strong>wolnego migania diody</strong> przełączy odbiornik w <strong>tryb logowania IR</strong>, zwolnienie przycisku, gdy dioda będzie świecić światłem ciągłym, w <strong>tryb uczenia kodów IR</strong>, zwolnienie przycisku w trakcie szybkiego migania przełączy odbiornik w<strong> tryb generowania tekstu</strong> do pliku <strong>keyboard.xml</strong>.<br /><br />Jeżeli do oprogramowania modułu zaszyto obsługę klawisza <strong>Capslock</strong>, podłączonej do <strong>PC </strong>klawiatury, to należy wykonać sekwencję od kilku do kilkunastu zapaleń i zgaszeń diody od <strong>Capslock’a</strong>, pamiętając, że każda sekwencja musi zakończyć się zgaszeniem diody. Nie zastosowanie się do tego sposobu spowoduje, że po <strong>1s</strong> świecenia diody próbę trzeba będzie powtórzyć.<br />Podczas naciskania przycisku <strong>Capslock </strong>należy obserwować diodę zamontowaną w odbiorniku. W jaki tryb odbiornik zostanie przełączony zależy od ilości sekwencji:<br /> - 1 sekwencja – odbiornik wraca do trybu nr 1 (III.1),<br /> - od 2 do 5 sekwencji – odbiornik wchodzi do trybu nr 2 (III.2),<br /> - od 6 do 10 sekwencji – odbiornik wchodzi do trybu nr 3 (III.3),<br /> - więcej niż 10 sekwencji – wchodzi do trybu nr 4 (III.4)<br /><br />Sposób zmiany trybów za pomocą <strong>Capslock'a </strong>(a jest to tryb preferowany) przedstawiono również na powyższym filmie.<br /><br /> <br /><strong>V.Praktyczne przykłady realizacji odbiornika podczerwieni.</strong><br /><br />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ń.<br /><br /><em><span style="color: #008080">1.Gotowy moduł z procesorem ATtimy85 (Digispark ATtiny85).</span></em><br />Wygląd odbiornika wraz z modyfikacjami prezentują zdjęcia:<br /><br /><a href="https://obrazkiforum.atnel.pl/16487/a762f671f1262201ab392f7d6d4e3b4d.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/a762f671f1262201ab392f7d6d4e3b4d.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/16487/82810b54469d51a217cbfe32eafd579d.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/82810b54469d51a217cbfe32eafd579d.png" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/16487/baafb487f55a3c836f6383775b6d554e.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/baafb487f55a3c836f6383775b6d554e.jpg" alt="Obrazek" /></a><br /><a href="https://obrazkiforum.atnel.pl/16487/f54d29f912960aeffc6923443bc99da2.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/f54d29f912960aeffc6923443bc99da2.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/16487/f5abdaa70b3e8911d718d9eea630addc.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/f5abdaa70b3e8911d718d9eea630addc.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/16487/d78d21d56b124a6f87256ee66ed0493a.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/d78d21d56b124a6f87256ee66ed0493a.jpg" alt="Obrazek" /></a><br /><br />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. <br />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:<br />- PB0 - port wejściowy współpracujący z odbiornikiem podczerwieni<br />- PB1 - port wyjściowy przeznaczony do sterowania diodą LED,<br />- PB2 - port wejściowy przygotowany do obsługi pojedynczego klawisza (zworki),<br />- PB3, PB4 - porty, do których podłączono interfejs USB, odpowiednio D- i D+.<br />W niniejszym rozwiązaniu nie zastosowano rezonatora kwarcowego, w zamian, w programie głównym, zaimplementowano <strong>automatyczną kalibrację urządzenia</strong>, która dzięki <strong>wewnętrznej pętli PLL</strong> mikrokontrolera pozwala ustalić częstotliwość zegara, na zgodną z <strong>V-USB </strong>wartość, tzn. <strong>16,5 MHz</strong>. 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ń <strong>AVR </strong>w trybie <strong>PCINT</strong>. Sposób obsługi kalibracji zaczerpnięto z:<br /><!-- m --><a class="postlink" href="http://vusb.wikidot.com/examples" >http://vusb.wikidot.com/examples</a><!-- m --><br /><br />Żeby nie komplikować zanadto dodatkowej elektroniki, w postaci<strong> odbiornika IR</strong> i jego peryferiów, zrezygnowano, z zalecanej przez producenta modułu IR, <strong>prawidłowej filtracji napięcia zasilania</strong>, 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 &quot;przejściówka&quot; – brak gniazda w standardzie Kanda) oraz utrudniła również proces zmiany trybu pracy odbiornika, dzięki <strong>brakowi mikro przełącznika</strong> 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 <strong>PB2 </strong>do masy i postępować wg punktu <strong>IV.2. </strong><br />Na zdjęciach zmodyfikowanego modułu, widać wszystkie potrzebne elementy do złożenia odbiornika IR.<br />Wymienione trudności są niewielkie zważywszy, że trybu uczenia, czy logowania IR nie wykonuje się zbyt często podczas normalnego użytkowania odbiornika.<br /><br /><span style="color: #FF00FF">UWAGI:</span><br /><strong><span style="color: #FF00FF">o</span></strong>W tym rozwiązaniu próby implementacji użycia <strong>Capslocka</strong>, jako „wyzwalacza” zmiany trybów odbiornika, nie powiodły się. Ten moduł należy programować z obsługą zworki.<br /><strong><span style="color: #FF00FF">o</span></strong>Żeby <strong>auto-kalibracja</strong>, do żądanej częstotliwości<strong> 16.5 MHz</strong> udała się, należy wiedzieć, że podczas programowania pamięci flash za pomocą programatora, zasilanie musi być podane <strong>poprzez złącze USB</strong>, nie poprzez programator.<br /><br /><em><span style="color: #008080">2.Gotowy moduł z mikrokontrolerem <strong>ATmega328P </strong>wraz z modyfikacjami.</span></em><br />Do wykonania odbiornika użyto popularnego moduł<strong> Arduino Pro Mini </strong>z rezonatorem kwarcowym <strong>16 MHz</strong> 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:<br /><a href="https://obrazkiforum.atnel.pl/16487/0d44fc756765f765d91bc5d7be971c49.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/0d44fc756765f765d91bc5d7be971c49.jpg" alt="Obrazek" /></a><br /><a href="https://obrazkiforum.atnel.pl/16487/fbb5d65d4e127a8613dbc0185f378d22.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/fbb5d65d4e127a8613dbc0185f378d22.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/16487/98bee3ec716d82d8e1df1562a2ad87f0.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/98bee3ec716d82d8e1df1562a2ad87f0.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/16487/6b7604bee2ebf35601b26a9d3050c5aa.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/6b7604bee2ebf35601b26a9d3050c5aa.jpg" alt="Obrazek" /></a><br /><a href="https://obrazkiforum.atnel.pl/16487/2a868de3867acc053dea3e2d00262ec5.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/2a868de3867acc053dea3e2d00262ec5.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/16487/c88f2f39fabe099c8b4c52bd8755f101.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/c88f2f39fabe099c8b4c52bd8755f101.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/16487/116b3c631d28ff81601a2a37f71979c2.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/116b3c631d28ff81601a2a37f71979c2.jpg" alt="Obrazek" /></a><br /><a href="https://obrazkiforum.atnel.pl/16487/6272e746c0bfa11e6d8b760b6ab113ee.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/6272e746c0bfa11e6d8b760b6ab113ee.jpg" alt="Obrazek" /></a><br /><br /><em><span style="color: #008080">3.Projekt PCB z wykorzystaniem ATmega328P.</span></em><br />Jest to właściwie gotowy do produkcji projekt, wyposażony w otwory montażowe. <br />Odbiornik zaprezentowano na zdjęciach:<br /><a href="https://obrazkiforum.atnel.pl/16487/7660ac1172094814f4f7ed681d263ed3.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/7660ac1172094814f4f7ed681d263ed3.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/16487/830f121ff6f73d145bf2f11acb5a57f9.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/830f121ff6f73d145bf2f11acb5a57f9.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/16487/9f04f34906dfd81e6b42f39181cea8be.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/9f04f34906dfd81e6b42f39181cea8be.jpg" alt="Obrazek" /></a><br /><a href="https://obrazkiforum.atnel.pl/16487/d641eb9e94932804d75e48a0c3be0b1a.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/d641eb9e94932804d75e48a0c3be0b1a.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/16487/cd5cc9e7b8d09383e12cab166b625465.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/cd5cc9e7b8d09383e12cab166b625465.jpg" alt="Obrazek" /></a><br /><br /><span style="color: #008080"><em>4.Gotowy moduł Arduino Pro Micro z procesorem ATmega32U4.</em></span><br />Na zakończenie propozycja innego podejścia do odbiornika IR. <br />Tym razem zamiast programowej obsługi USB można skorzystać z czysto sprzętowej, dostępnej m.in. w mikrokontrolerze <strong>ATmega32U4</strong>, dzięki projektowi LUFA:<br /><!-- m --><a class="postlink" href="http://www.fourwalledcubicle.com/LUFA.php" >http://www.fourwalledcubicle.com/LUFA.php</a><!-- m --><br />Taki podejście do projektu mocno uprości urządzenie, po zakupie np. Arduino Pro Micro wystarczy tylko dołączyć odbiornik IR i gotowe.<br />Projekt takiego rozwiązania jest jeszcze we wczesnej fazie, ale pierwsze próby wypadły obiecująco.<br /><br /><span style="color: #008080"><em>5.Przykład gotowego urządzenia klasy mini PC.</em></span><br />W tym przypadku mamy już konkretny sposób wykorzystania odbiornika. Został, bowiem zaszyty w panelu sterującym wykorzystanym w odtwarzaczu multimedialnym przeznaczonym &quot;<strong>do salonu</strong>&quot;. 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 <strong>VFD</strong>. Całość urządzenia oczywiście współpracuje z <strong>Kodi </strong>na kilka sposobów, poprzez <strong>odbiornik IR</strong>, <strong>klawiaturę </strong>oraz <strong>enkoder</strong>.<br />Pełny opis można znaleźć tutaj:<br /><!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic18562.html" >topic18562.html</a><!-- l --><br /> <br /><strong>VII.Trochę słów o kodzie.</strong><br />Pełen kod, wraz z krótkim opisem przedstawię w następnej części publikacji.<br />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 <strong>V.3</strong><br /><br />Na zakończenie tej części dodaję jeszcze zrzut struktury programu w postaci drzewa projektu Eclipse.<br /><a href="https://obrazkiforum.atnel.pl/16487/e4f02c200d5a7d08c63887846757d07e.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/e4f02c200d5a7d08c63887846757d07e.jpg" alt="Obrazek" /></a><br /><br />oraz plik główny projektu:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/wdt.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br /><br />#include &quot;usbdrv/usbdrv.h&quot;<br />#include &quot;kodi_ir_config.h&quot;<br />#include &quot;lib/IRMP/irmp.h&quot;<br />#include &quot;lib/sw_ir_manage.h&quot;<br />#include &quot;lib/SW_AVR_PERIPHS/timers.h&quot;<br />#include &quot;macros.h&quot;<br /><br /><br />uint8_tledState = 0;// Domyslny tryb miganie diody, jedno mignięcie<br />uint8_t tmp = 0;<br />/* ====================================================== MAIN ==========================================================*/<br />int main( void ) {<br /><br />uint8_t mode = IR_SEND_MODE;// Domyślny tryb pracy odbiornika<br />uint8_tusbCheckActivity = 0;// Flaga działania transmisji USB<br /><br />/*************************************************** Sekcja INIT *******************************************/<br />#if USB_SEND_MODE<br />#ifdef TRANS_POWER<br />sw_transoptor_init();<br />#endif<br />#endif<br />#if __AVR_ATtiny85__ &amp;&amp; USB_PCINT_ON<br />sw_keyboard_init();<br />#endif<br />sw_led_init();<br />sw_led_off();<br /><br />sw_data_init();// Inicjalizujemy tablicę kodów i obsługę IR<br />timer1_init();// inicjalizacja timer1 do irmp<br /><br />#if IRMP_USE_CALLBACK<br />irmp_set_callback_ptr( led_callback );// Miganie diodą wbudowane w IRMP<br />#endif<br /><br />#if SOFT_TIMERS<br />#if defined (__AVR_ATmega328P__) || defined (__AVR_ATtiny85__)<br />timer0_init();// inicjalizacja timer0 do timerów programowych<br />#else<br />timer2_init();<br />#endif<br />#endif<br />/**********************************************************************************************************/<br />PORTB &amp;= ~(1&lt;&lt;PB2);<br /><br />sei();// Włączenie przerwań<br />/*************************** USB routines **************************/<br />usbInit();<br />clearReport();// Czyscimy raport USB na wstepie<br />usbDeviceReconnect();<br />/*******************************************************************/<br /><br />#if  defined (__AVR_ATtiny85__)<br />/************** Kalibrujemy zegar dla ATtiny85 *********************/<br />#ifATTINY_AUTO_CALIBRATE<br />atTiny_calibrate();<br />#else<br />OSCCAL = 102;<br />#endif<br /><br />/*******************************************************************/<br />#endif<br /><br />while ( !sw_usb_check_activity(usbSofCount) ) {// Czekamy aż ruszy transmisja USB<br />usbPoll();<br />}<br /><br />/* ========================================== GLÓWNA PĘTLA ===================================================== */<br />wdt_enable(WDTO_1S);// Włączenie watchdoga na 1s<br />while(1) {<br />wdt_reset();// Reset watchdoga<br />usbPoll();<br /><br />#if __AVR_ATtiny85__ &amp;&amp; USB_PCINT_ON &amp;&amp; !USB_CFG_IMPLEMENT_FN_WRITE<br />mode = sw_get_mode( &amp;keyboard, &amp;ledState, mode );// Ustalamy tryb pracy urządzenia<br />#else<br />mode = sw_get_mode( &amp;softTimer5, &amp;ledState, mode );<br />#endif<br />sw_led_blink( &amp;softTimer1, &amp;ledState);<br />usbCheckActivity = sw_usb_check_activity( usbSofCount );// Sprawdzamy czy jest transmisja USB<br /><br />#ifdef TRANS_POWER// Obsługa transoptora<br />mode = sw_switch_mode( mode, &amp;ledState, usbCheckActivity, &amp;tmp );// Przełączamy tryb pracy<br />if ( tmp == TRANS_POWER ){<br />sw_power_manage( tmp );// Wyłączenie jest z poziomu Kodi<br />} else<br />sw_power_manage( 0 );// Wyłączenie jest z poziomu Kodi<br /><br />#else<br />mode = sw_switch_mode( mode, &amp;ledState, usbCheckActivity, &amp;tmp );<br />#endif<br /><br />}// End of main loop while()<br />/* ============================================================================================================= */<br />return 0;<br />}// End of main()[/syntax]<br /><br />Jeszcze zajrzyjmy do pliku konfiguracyjnego:<br />[syntax=c]/*<br /> * kodi_ir_config.h<br /> *<br /> *  Created on: 8 paź 2016<br /> *      Author: simon<br /> */<br /><br />#ifndef KODI_IR_CONFIG_H_<br />#define KODI_IR_CONFIG_H_<br /><br /><br />/*********************** Zmniejszamy zajętość pamięci FLASH **********************/<br />#define LOW_MEMORY 0<br />/*********************************************************************************/<br /><br />/*********************** Włączamy obsługę logowania kodów IR *********************/<br />#define USB_LOG_MODE1<br />/*********************************************************************************/<br /><br />/*********************** Włączamy obsługę uczenia kodów IR ***********************/<br />#define USB_LEARN_MODE1<br />/*********************************************************************************/<br /><br />/*********************** Włączamy obsługę uczenia kodów IR ***********************/<br />#define USB_SEND_MODE1<br />/*********************************************************************************/<br /><br />/********** Czas między kolejnymi repetycjaminaciśnięcia klawisza ****************/<br />#define AUTOREPEAT_MS100<br />/*********************************************************************************/<br /><br />/*********************** Włączamy autokalibrację zegara da ATtiny85 **************/<br />#define ATTINY_AUTO_CALIBRATE0<br />/*********************************************************************************/<br /><br />/*************************** Konfiguracja diody LED ******************************/<br />#if defined __AVR_ATtiny85__<br />#define LED_PORTPORTB<br />#define LED_PIN1<br />#else<br />#if defined (__AVR_ATmega8__) ||  defined (__AVR_ATmega328P__) || defined (__AVR_ATmega32__)<br />#define LED_PORT PORTB<br />#define LED_PIN  1<br />#endif<br />#endif<br />/***************** Definiujemy gaszenie i zapalenie LED **************************/<br />#define sw_led_off()LED_PORT |=  (1&lt;&lt;LED_PIN)// Anoda do pinu<br />#define sw_led_on()LED_PORT &amp;= ~(1&lt;&lt;LED_PIN)<br />#define sw_led_xor()LED_PORT ^=  (1&lt;&lt;LED_PIN)<br />/*********************************************************************************/<br /><br />/*************************** Konfiguracja Transoptora ****************************/<br />#define TRANS_POWERHID_KEY_S// Ustalamy kod HID, który będzie sterował transoptorem,<br />#ifdef TRANS_POWER// zarazem definiujemy czy mamy transoptor<br />#define TRANS_PORTPORTB<br />#define TRANS_PIN2<br />#define transoptor_on()TRANS_PORT |=   (1&lt;&lt;TRANS_PIN)// Włączamy transoptor<br />#define transoptor_off()TRANS_PORT &amp;=  ~(1&lt;&lt;TRANS_PIN)// Wyłaczamy transotor<br />#define TRANS_TIMEtime_base_ms(100)// Ustawiamy timer na odliczanie 400 ms<br />#endif<br />/*********************************************************************************/<br /><br />/*********************************** Sekcja dotycząca V-USB ********************************/<br />#define USB_CFG_IMPLEMENT_FN_WRITE      1// Potrzebne do sterowania Capslockiem<br />/* Set this to 1 if you want usbFunctionWrite() to be called for control-out<br /> * transfers. Set it to 0 if you don't need it and want to save a couple of<br /> * bytes.<br /> */<br />#define USB_PCINT_ON0//Ustalamy czy korzystamy z przerwania PCINT<br /><br />/****************************** Definiujemy porty dla V-USB ********************************/<br />#if defined __AVR_ATmega32__<br />#define USB_CFG_IOPORTNAME      D<br />#define USB_CFG_DMINUS_BIT      2<br />#define USB_CFG_DPLUS_BIT       0<br />#endif<br />#if defined __AVR_ATmega8__<br />#define USB_CFG_IOPORTNAME      D<br />#define USB_CFG_DMINUS_BIT      2<br />#define USB_CFG_DPLUS_BIT       0<br />#endif<br />#if defined __AVR_ATtiny85__<br />#define USB_CFG_IOPORTNAME      B<br /><br />#if USB_PCINT_ON<br />#define USB_CFG_DMINUS_BIT      3// 3<br />#define USB_CFG_DPLUS_BIT       4// 4<br />#else<br />#define USB_CFG_DMINUS_BIT      2<br />#define USB_CFG_DPLUS_BIT       1<br />#endif<br />#endif<br />#if defined __AVR_ATmega328P__<br />#define USB_CFG_IOPORTNAME      D<br />#if USB_PCINT_ON<br />#define USB_CFG_DMINUS_BIT      0<br />#define USB_CFG_DPLUS_BIT       1<br />#else<br />#define USB_CFG_DMINUS_BIT      2<br />#define USB_CFG_DPLUS_BIT       1<br />#endif<br />#endif<br /><br /><br />/****************** Konfiguracja przerwania dla V-USB ****************/<br />// Dane domyślne dla INT0 dla różnych procesorów<br />/* #define USB_INTR_CFG            MCUCR */<br />/* #define USB_INTR_CFG_SET        ((1 &lt;&lt; ISC00) | (1 &lt;&lt; ISC01)) */<br />/* #define USB_INTR_CFG_CLR        0 */<br />/* #define USB_INTR_ENABLE         GIMSK */<br />/* #define USB_INTR_ENABLE_BIT     INT0 */<br />/* #define USB_INTR_PENDING        GIFR */<br />/* #define USB_INTR_PENDING_BIT    INTF0 */<br />/* #define USB_INTR_VECTOR         INT0_vect */<br /><br />/**/<br />#if (defined __AVR_ATtiny85__) &amp;&amp; USB_PCINT_ON //PCINT3 default<br /> #define USB_INTR_CFG            PCMSK<br /> #define USB_INTR_CFG_SET        (1 &lt;&lt; PCINT3)<br /> #define USB_INTR_CFG_CLR        0<br /> #define USB_INTR_ENABLE         GIMSK<br /> #define USB_INTR_ENABLE_BIT     PCIE<br /> #define USB_INTR_PENDING        GIFR<br /> #define USB_INTR_PENDING_BIT    PCIF<br /> #define USB_INTR_VECTOR         PCINT0_vect<br />#endif<br />/**/<br />/**/<br />#if (defined __AVR_ATmega328P__) &amp;&amp; USB_PCINT_ON<br /> #define USB_INTR_CFG            PCMSK2<br /> #define USB_INTR_CFG_SET        (1 &lt;&lt; PCINT16)<br /> #define USB_INTR_CFG_CLR        0<br /> #define USB_INTR_ENABLE         PCICR<br /> #define USB_INTR_ENABLE_BIT     PCIE2<br /> #define USB_INTR_PENDING        PCIFR<br /> #define USB_INTR_PENDING_BIT    PCIF2<br /> #define USB_INTR_VECTOR         PCINT2_vect<br />#endif<br />/**/<br />/**///        ATMEGA32  INT2 działa!!<br />#if defined __AVR_ATmega32__<br /> #define USB_INTR_CFG            MCUCSR<br /> #define USB_INTR_CFG_SET        (1 &lt;&lt; ISC2) //rising edge<br /> #define USB_INTR_CFG_CLR        0<br /> #define USB_INTR_ENABLE         GICR<br /> #define USB_INTR_ENABLE_BIT     INT2<br /> #define USB_INTR_PENDING        GIFR<br /> #define USB_INTR_PENDING_BIT    INTF2<br /> #define USB_INTR_VECTOR         INT2_vect<br />#endif<br />/*******************************************************************************************************/<br />\<br />/************** Fragment biblioteki IRMP ****************************************<br /> * Zaznaczamy, które z protokołów mają być obsługiwane.<br /> */<br />/*---------------------------------------------------------------------------------------------------------------------------------------------------<br /> * Change F_INTERRUPTS if you change the number of interrupts per second,<br /> * Normally, F_INTERRUPTS should be in the range from 10000 to 15000, typical is 15000<br /> * A value above 15000 costs additional program space, absolute maximum value is 20000.<br /> * On PIC with XC8/C18 Compiler, use 15151 as the correct value.<br /> *---------------------------------------------------------------------------------------------------------------------------------------------------<br /> */<br />#ifndef F_INTERRUPTS<br />#  define F_INTERRUPTS                          15000   // interrupts per second, min: 10000, max: 20000, typ: 15000<br />#endif<br /><br />/*---------------------------------------------------------------------------------------------------------------------------------------------------<br /> * Change settings from 1 to 0 if you want to disable one or more decoders.<br /> * This saves program space.<br /> *<br /> * 1 enable  decoder<br /> * 0 disable decoder<br /> *<br /> * The standard decoders are enabled per default.<br /> * Less common protocols are disabled here, you need to enable them manually.<br /> *<br /> * If you want to use FDC or RCCAR simultaneous with RC5 protocol, additional program space is required.<br /> * If you don't need RC5 when using FDC/RCCAR, you should disable RC5.<br /> * You cannot enable both DENON and RUWIDO, only enable one of them.<br /> *---------------------------------------------------------------------------------------------------------------------------------------------------<br /> */<br /><br />// typical protocols, disable here!             Enable  Remarks                 F_INTERRUPTS            Program Space<br />#define IRMP_SUPPORT_SIRCS_PROTOCOL             1       // Sony SIRCS           &gt;= 10000                 ~150 bytes //<br />#define IRMP_SUPPORT_NEC_PROTOCOL               1       // NEC + APPLE          &gt;= 10000                 ~300 bytes //<br />#define IRMP_SUPPORT_SAMSUNG_PROTOCOL           1       // Samsung + Samsg32    &gt;= 10000                 ~300 bytes //<br />#define IRMP_SUPPORT_RC5_PROTOCOL               1       // RC5                  &gt;= 10000                 ~250 bytes //<br /><br />// more protocols, enable here!                 Enable  Remarks                 F_INTERRUPTS            Program Space<br />#define IRMP_SUPPORT_KASEIKYO_PROTOCOL          1       // Kaseikyo             &gt;= 10000                 ~250 bytes //<br />#define IRMP_SUPPORT_JVC_PROTOCOL               1       // JVC                  &gt;= 10000                 ~150 bytes //<br />#define IRMP_SUPPORT_NEC16_PROTOCOL             1       // NEC16                &gt;= 10000                 ~100 bytes //<br />#define IRMP_SUPPORT_NEC42_PROTOCOL             1       // NEC42                &gt;= 10000                 ~300 bytes //<br />#define IRMP_SUPPORT_MATSUSHITA_PROTOCOL        1       // Matsushita           &gt;= 10000                  ~50 bytes //<br />#define IRMP_SUPPORT_DENON_PROTOCOL             1       // DENON, Sharp         &gt;= 10000                 ~250 bytes //<br />#define IRMP_SUPPORT_RC6_PROTOCOL               1       // RC6 &amp; RC6A           &gt;= 10000                 ~250 bytes //<br />#define IRMP_SUPPORT_IR60_PROTOCOL              0       // IR60 (SDA2008)       &gt;= 10000                 ~300 bytes //<br />#define IRMP_SUPPORT_GRUNDIG_PROTOCOL           0       // Grundig              &gt;= 10000                 ~300 bytes //<br />#define IRMP_SUPPORT_SIEMENS_PROTOCOL           0       // Siemens Gigaset      &gt;= 15000                 ~550 bytes<br />#define IRMP_SUPPORT_NOKIA_PROTOCOL             0       // Nokia                &gt;= 10000                 ~300 bytes //<br /><br />// exotic protocols, enable here!               Enable  Remarks                 F_INTERRUPTS            Program Space<br />#define IRMP_SUPPORT_BOSE_PROTOCOL              0       // BOSE                 &gt;= 10000                 ~150 bytes //<br />#define IRMP_SUPPORT_KATHREIN_PROTOCOL          0       // Kathrein             &gt;= 10000                 ~200 bytes //<br />#define IRMP_SUPPORT_NUBERT_PROTOCOL            0       // NUBERT               &gt;= 10000                  ~50 bytes<br />#define IRMP_SUPPORT_FAN_PROTOCOL               0       // FAN (ventilator)     &gt;= 10000                  ~50 bytes //<br />#define IRMP_SUPPORT_SPEAKER_PROTOCOL           0       // SPEAKER (~NUBERT)    &gt;= 10000                  ~50 bytes //<br />#define IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL      0       // Bang &amp; Olufsen       &gt;= 10000                 ~200 bytes //<br />#define IRMP_SUPPORT_RECS80_PROTOCOL            0       // RECS80 (SAA3004)     &gt;= 15000                  ~50 bytes //<br />#define IRMP_SUPPORT_RECS80EXT_PROTOCOL         0       // RECS80EXT (SAA3008)  &gt;= 15000                  ~50 bytes //<br />#define IRMP_SUPPORT_THOMSON_PROTOCOL           0       // Thomson              &gt;= 10000                 ~250 bytes //<br />#define IRMP_SUPPORT_NIKON_PROTOCOL             0       // NIKON camera         &gt;= 10000                 ~250 bytes //<br />#define IRMP_SUPPORT_NETBOX_PROTOCOL            0       // Netbox keyboard      &gt;= 10000                 ~400 bytes (PROTOTYPE!)<br />#define IRMP_SUPPORT_ORTEK_PROTOCOL             0       // ORTEK (Hama)         &gt;= 10000                 ~150 bytes<br />#define IRMP_SUPPORT_TELEFUNKEN_PROTOCOL        0       // Telefunken 1560      &gt;= 10000                 ~150 bytes //<br />#define IRMP_SUPPORT_FDC_PROTOCOL               0       // FDC3402 keyboard     &gt;= 10000 (better 15000)  ~150 bytes (~400 in combination with RC5)<br />#define IRMP_SUPPORT_RCCAR_PROTOCOL             0       // RC Car               &gt;= 10000 (better 15000)  ~150 bytes (~500 in combination with RC5)<br />#define IRMP_SUPPORT_ROOMBA_PROTOCOL            0       // iRobot Roomba        &gt;= 10000                 ~150 bytes<br />#define IRMP_SUPPORT_RUWIDO_PROTOCOL            0       // RUWIDO, T-Home       &gt;= 15000                 ~550 bytes<br />#define IRMP_SUPPORT_A1TVBOX_PROTOCOL           0       // A1 TV BOX            &gt;= 15000 (better 20000)  ~300 bytes //<br />#define IRMP_SUPPORT_LEGO_PROTOCOL              0       // LEGO Power RC        &gt;= 20000                 ~150 bytes<br />#define IRMP_SUPPORT_RCMM_PROTOCOL              0       // RCMM 12,24, or 32    &gt;= 20000                 ~150 bytes<br />#define IRMP_SUPPORT_LGAIR_PROTOCOL             0       // LG Air Condition     &gt;= 10000                 ~300 bytes //<br />#define IRMP_SUPPORT_SAMSUNG48_PROTOCOL         0       // Samsung48            &gt;= 10000                 ~100 bytes // (SAMSUNG must be enabled!)<br />#define IRMP_SUPPORT_MERLIN_PROTOCOL            0       // Merlin               &gt;= 15000 (better 20000)  ~300 bytes<br />#define IRMP_SUPPORT_PENTAX_PROTOCOL            0       // Pentax               &gt;= 10000                 ~150 bytes //<br />#define IRMP_SUPPORT_S100_PROTOCOL              0       // S100                 &gt;= 10000                 ~250 bytes<br />#define IRMP_SUPPORT_ACP24_PROTOCOL             0       // ACP24                &gt;= 10000                 ~250 bytes<br />#define IRMP_SUPPORT_TECHNICS_PROTOCOL          0       // TECHNICS             &gt;= 10000                 ~250 bytes //<br />#define IRMP_SUPPORT_PANASONIC_PROTOCOL         0       // PANASONIC Beamer     &gt;= 10000                 ~250 bytes<br />#define IRMP_SUPPORT_RADIO1_PROTOCOL            0       // RADIO, e.g. TEVION   &gt;= 10000                 ~250 bytes (experimental)<br /><br /><br />#endif /* KODI_IR_CONFIG_H_ */[/syntax]<br /><br /><br /><br /><br /><strong><span style="color: #008080">VIII.Podsumowanie:</span></strong><br />No cóż, po raz kolejny udało się zrealizować wstępne założenia projektu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />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 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ) i z kilkoma ciekawymi &quot;ficzerami&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Co należy jeszcze poprawić?<br />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 <strong>IRMP</strong>, tak by jeszcze uprościć kod.<br /><br />2. Warto zastanowić się nad poprawą implementacji <strong>V-USB</strong>. 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 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />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 <strong>PC</strong>, która będzie zarządzała skrótami klawiaturowymi i przyporządkowywała je kodom IR, następnie &quot;wgrywała&quot; do odbiornika, tak by dopasować działanie nawet do innych aplikacji.<br /><br /><br />To by było na razie wszystko <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Mam nadzieję, że miłośników Kodi, na forum Atnel, jeszcze przybędzie<br /><br /><strong><span style="color: #008080">VIII.Źródła:</span></strong><br /><br />IRMP: <!-- m --><a class="postlink" href="http://www.mikrocontroller.net/articles/IRMP_-_english#top" >http://www.mikrocontroller.net/articles ... nglish#top</a><!-- m --><br /><br />V-USB: <!-- m --><a class="postlink" href="https://www.obdev.at/products/vusb/index.html" >https://www.obdev.at/products/vusb/index.html</a><!-- m --><br /><!-- m --><a class="postlink" href="http://eleccelerator.com/tutorial-about-usb-hid-report-descriptors/" >http://eleccelerator.com/tutorial-about ... scriptors/</a><!-- m --><br /><!-- m --><a class="postlink" href="http://code.birkler.se/usb-ir-hid/" >http://code.birkler.se/usb-ir-hid/</a><!-- m --><br /><!-- m --><a class="postlink" href="http://codeandlife.com/2012/06/18/usb-hid-keyboard-with-v-usb/" >http://codeandlife.com/2012/06/18/usb-h ... ith-v-usb/</a><!-- m --><br /><br />KODI: <!-- m --><a class="postlink" href="http://kodi.wiki/view/keymap" >http://kodi.wiki/view/keymap</a><!-- m --><br /><!-- m --><a class="postlink" href="http://wiki.openelec.tv/index.php/Main_Page" >http://wiki.openelec.tv/index.php/Main_Page</a><!-- m --><br /><br />HID: <!-- m --><a class="postlink" href="http://www.usb.org/developers/hidpage/Hut1_12v2.pdf" >http://www.usb.org/developers/hidpage/Hut1_12v2.pdf</a><!-- m --><br /><br />VDR: <!-- m --><a class="postlink" href="https://www.linuxtv.org/vdrwiki/index.php/Main_Page" >https://www.linuxtv.org/vdrwiki/index.php/Main_Page</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 11 cze 2017, o 21:54</p><hr />
]]></content>
</entry>
</feed>