Mam problem, musze zrobic urzadzenie które działa na pilota nie pracujacego w stantardzie rc5. Korzystajac z procedury get rc5 otrzymuje ciągle wynik 255 zarówno adres jak i komenda. Jest jakaś alternatywa na to?? Pilot jest od starej wiezy Samsung i chyba on nie ma zadnego standartu. Jak sie za to zabrac?
Pilot jest od starej wiezy Samsung i chyba on nie ma zadnego standartu. Jak sie za to zabrac?
żadnego standardu to nie ma np szum kosmiczny. Natomiast każdy pilot IR działa w oparciu o jakiś standard kodowania. I nawet jeśli nie jest oparty na podstawach jednego z podstawowych typów kodowania IR jak: biphase (np piloty Philipsa w tym RC5), space (np Sony) czy pulse (np JVC) to na pewno działają w oparciu o charakterystyczny tylko dla nich standard.
jak się za to zabrać? ano podejść do tematu nieco głębiej a nie tylko tak powierzchownie. Dowiedzieć się najpierw na jakiej zasadzie działa samo RC5 a dzięki temu zrobić pierwszy krok w kierunku poznania tego całego zresztą jakże przyjemnego zagadnienia.
potem poczytać o innych sposobach kodowania i najważniejsze, nie przerażać się, że to skomplikowane i że można to zrobić tylko w asemblerze albo w C. W Bascomie także się da - zapewniam cię - tylko trzeba chcieć i poczytać. Ale nie zaprzeczę też, że odkąd zacząłem się uczyć C - to oprogramowanie dowolnego rodzaju pilota stało się dla mnie tzw pikusiem.
w związku z powyższym zapoznaj się ze stronką, po tysiąckroć przytaczaną tu na elektrodzie:
na niej ku swojemu ogromnemu zdumieniu odnajdziesz na pewno także standard kodowania swojego pilota samsunga - bo to bardzo popularne piloty i są nieźle tam opisane
próbowałem róznych metod, te strony znałem już wcześniej, mimo to nie udało mi sie uzyskac zadowalających efektów. najbardziej sensowna chyba była by metoda np co ok 800 us sprawdzac stan wejscie do któego jest podpiety odbiornik ale nie wiem czemu mi sie to zapętla i jak odbierze kod z pilota to leci bez końca. oto kod
Tu już mozna zadeklarować wszystkie przyciski ale nie jest to dokładne. Kod zmienia sie gdy pilota ustawi sie pod innym kontem lub zmienia sie odległosc. Jak sie centralnie celuje w czujnik jest ok ale jest to pewne utrudnienie. Jak wybrnąć z tego i napisać coś co będzie działąć idealnie??
Podchodzisz do tego w najprostszy z możliwych sposobów i dlatego nie wychodzi albo bardzo kiepsko wychodzi.
1. Zapomnij o stosowaniu poleceń typu waitms itp
2. Synchronizuj się wraz z odbieranym sygnałem programowo - np poprzez zobocza narastające czy opadające lub jedne i drugie wtedy nie będziesz miał problemów, że jak pilot jest pod innym kątem to coś nie działa. Bez synchronizacji tak na prawdę pomijasz tak ważne zagadnienie jak odporność na zakłócenia
użyj jakiegoś wejścia typu INTx lub wejścia ICP jednego z Timerów - i właśnie dokładnie za pomocą Timerów odmierzaj odpowiednie czasy a nie takimi pętelkami z waitms itp. To wtedy coś zacznie ci wychodzić
pomyślałem że wykorzystam 2 przerwania, złączyłęm razem int0 i int1. jedno bedzie wykrywac opadajace zbocze a drugie rosnące. efektem miał być ciąg licz np "345,12,345,32,463,12" gdzie kazda liczba oznaczałą by długość kolejnego impulsu otrzymywanego z czujnika.
napisałem kod:
Stop Timer1
Lcd "brak zm. sygnalu/end"
Wait 2
Return
w efekcie otrzymuje wynik "15" i na tym sie konczy. Mierzy tylko jedną wartość któa za kazdym wcisnieciem przycisku waha sie +/- 1. Po paru przycisnieciach guzika od pilota wiesza sie i przestaje reagować. Zmiana zakresu pracy timera1 nie wiele pomaga. Czemu nie zczytuje kolejnych wartosci tylko jedną? Gdyby udało mi sie tak zmierzyć cały przebieg sygnału miałbym później prostą sprawe w konfiguracji sygnału na postać 0/1.
Wieża to samsung max 550, pilot ma w sobie układ BU2478-2Z. Próbowałem przy pomocy Timera, co ok 500 us w przerwaniu Timera sprawdzałem stan wejścia sygnałowego od czujnika 0/1. W pętli dodawałem daną wartośc do ciągu znaków. W efekcie otrzymałem "analize" sygnału którą trzeba troszkę dostroić Timerem i wydobyć z tego interesujący nas fragment. Działa to nawet niezle na AtMega8 i 1Mhz zegarze, ale to nie jest zrobione tak jak trzeba, bo przestanie działać przy zmianie zegara i trzeba bedzie się znowu bawić w dostrajanie a to dość czasochłonne. Może ma ktoś pomysł na uniwersalny kod który czytałby każdego pilota i dostrajał się do niego np po bicie startu? Myslałem o połączeniu 2 przerwań INT0 i INT1 z czego jedno uruchamia timer opadającym zboczem a drugi zatrzymuje rosnącym, ale jakoś nie chciało mi to działąś, Timer ruszał ale już sie nie zatrzymywał.
Może ma ktoś pomysł na uniwersalny kod który czytałby każdego pilota i dostrajał się do niego np po bicie startu?
sorki, ale może za chwilkę jeszcze zachcesz gwiazgę z nieba hmmm??
.... coś mocno mylisz pojęcia.
1. Można zrobić uniwerslanego pilota - albo na zasadzie "uczenia" go nadlatujących sygnałów z klawiszy pilota od którego ma on się "uczyć". I to polega na próbkowaniu sygnału - zapisaniu tych próbek do pamięci - a następnie wyemitowaniu tychże próbek, które mają "udawać" naciśnięcie klawisza oryginalnego pilota. Jak chcesz uniwersalny pomysł - to wykorzystaj scalak z jakiegoś dowolnego zakupionego tzw uniwersalnego pilota. A jak chcesz to sam zrobić to kombinuj dalej, szukaj w necie podobnych rozwiązań skoro sam nie możesz do tego dojść aby móc się potem na nich wzorować. Ten algorytm, który ci powyżej opisałem jest bardzo ogólny ale tak działają piloty uniwersalne i programy, które się uczą. Kiedyś znalazłem w necie nawet program i opis takiego pilota na AVRku, który ze względu na niewielką ilość swojej pamięci EEPROM zapamiętywał tylko kilka klawiszy - tzn się ich uczył. Nie pamiętam stronki ale to był chyba nawet jakiś artykuł z EdW.
2. Jeśli natomiast chcesz zrobić urządzonko, które potrafi rozpoznawać po Headrze (czyli czasie trwania nagłówka) standard nie tylko kodowania IR ale także pilota ( a jest to możliwe ) to musisz sobie poczytać sporo na temat różnych standardów kodowania a potem spróbować zakodować w procesorze wszystkie rozpoznane piloty z tego linku który ci już wcześniej podawałem:
jak widzisz jest ich mnóstwo, więc twój procek musiałby być chyba co najmniej ATmega128 - chyba, żeby pokusić się o jakieś mocne sparametryzowanie takiej procedury. Też kiedyś o tym myślałem - zrobiłem nawet procedurkę w asemblerze, która autoamtycznie rozpoznaje 3 rodzaje pilotów: RC5, SONY, JVC.
ale jak zapoznasz się choć z częścią opisów z lirc'a to zobaczysz, że spora część tych opisów jest w trybie RAW - co gigantycznie komplikuje sprawę - zresztą po jakimś czasie dochodzi się do wniosku, że zrobienie urządzenia, które potrafi rozpoznać każdy możliwy wyprodukowany na świecie - kiedyś , teraz i w przyszłości pilot, jest całkowicie bez sensu - no chyba, że tak dla zabawy jak się ma sporo czasu i lubi się robić rzeczy, które i tak później do niczego nie są potrzebne. Ale też w takiej sytuacji dochodzi się do wniosku, że lepiej wrócić do punktu nr.1 czyli zrobić pilota samouczącego się i już