Witam wszystkich mam problem z Arduino i pilotem IR.
A mianowicie mam pilota od starego sprzętu audio teraz buduję do tego sprzętu retro odtwarzacz CD i chciałbym sterować go oryginalnym pilotem.
Problem w tym że ten pilot nie nadaje w żadnym znanym standardzie obsługiwanych transmisji, biblioteka IRremote w Arduino nie wykrywa danych.
Zgrałem wszystkie dostępne biblioteki z Arduino i na jednej odczytuje takie coś.
Jak widać 6x nacisnąłem ten sam przycisk raz błędnie pokazało, jednak problem polega na tym że dwa inne przyciski mają taki sam odzew w monitorze portu szeregowego.
Więc szybko zrozumiałem że to nie tędy droga.
Spróbowałem na piechotę, jako że w sprzęcie jest odbiornik podczerwieni jako metalowa puszka dosyć duża w środku pewnie elementy wzmacniacza sygnału na tranzystorach.
Z odbiornika wychodzą trzy przewody zasilanie wyjście i masa, odbiornik zasilany jest napięciem 12V i wyjście linia out też jest na logice 12V.
Podpatrzyłem jak to jest zrobione w oryginale np przy magnetofonie i skopiowałem układ formowania impulsów dla moich potrzeb. Oto schemat.
Jak widać szyna resetu jest dwukierunkowa odbiór pilota jest na rysunku na pinie 9 Arduino i jest to zanegowany sygnał więc na szynie resetu po lewej stronie normalnie panuje 0V czyli stan niski, po stronie Arduino jest to za tranzystorem BC238 użytym jako negator panuje stan wysoki 5V pin podciągnięty zewnętrznym rezystorem 2.2k do zasilania Arduino 5V - to jest stan normalny.
Teraz gdy naciskamy pilota na szynie resetu pojawiają się szpilki 12V ale to mnie mniej interesuje, bardziej interesuje mnie to co dzieje się na pinie Arduino. Podłączyłem zatem analizator stanów logicznych i przechwytuję, no i są ramki na logice 5V. Poniżej screen.
Jak się przyjrzeć temu to widać krótkie impulsy logiczne 0V oraz długi inicjujący początek transmisji potem dane oraz długi kończący transmisję.
Czasy tych stanów poniżej.
No to teraz odpaliłem Arduino i chcę pomierzyć czasy trwania tych sygnałów na pinie użyłem funkcji pulseIn podobno działa ona od 10us więc powinno działać no i napisałem taki prosty kod.
Chciałem aby na początek pomierzył czasy i wyświetlił mi je na serial monitorze.
Ku mojemu zdziwieniu wyświetlił tylko 6 czasów trzy długie i trzy krótki po przejściu całej ramki.
Czyli otrzymałem to
39 - Krotki
80 - Dlugi
30 - Krotki
201 - Dlugi
32 - Krotki
83 - Dlugi
32 - Krotki
Czasy te w żaden sposób nie odpowiadają ramce, pytanie do Was. Gdzie jest problem jak odczytać poprawnie ramkę z tego pilota i zapisać np do tabeli.
Patrząc na powyższą ramkę można by długim sygnałem wyszukiwać ciągu po odnalezieniu długiego około 340us sygnału logicznego 1 spisywać do tabeli kolejne sygnały z przedziału około 100us jako 0 i z przedziału 200us jako 1 taki ciąg sygnałów potem już bez problemu można by było wykorzystywać do sterowania funkcjami programu.
Pytanie jest zasadnicze czemu wszystkie czasy mi nie wyświetla na serial monitorze.
Może ktoś by mi pomógł i napisał prosty programik aby przechwycał dane w powyższy opisany sposób ?
Myślałem i do głowy mi jeszcze przyszło że realny przebieg może być zniekształcony analizator sobie z tym radzi a Arduino nie więc zapiąłem oscyloskop, przebieg złapany Triggerem wygląda ładnie lekko nachylone zbocza ale poza tym jest ładny nie powinien to być problem zobaczcie sami.
Do tej pory z biblioteką IRremote sobie radziłem, czytałem że można zrobić to na przerwaniach ale ja tego nie umiem napisać dlatego proszę Was o pomoc lub chociaż wskazówki jak do tego podejść.
Z góry dziękuję za pomoc.
Pozdrawiam...
A mianowicie mam pilota od starego sprzętu audio teraz buduję do tego sprzętu retro odtwarzacz CD i chciałbym sterować go oryginalnym pilotem.
Problem w tym że ten pilot nie nadaje w żadnym znanym standardzie obsługiwanych transmisji, biblioteka IRremote w Arduino nie wykrywa danych.
Zgrałem wszystkie dostępne biblioteki z Arduino i na jednej odczytuje takie coś.
Kod: Text
Jak widać 6x nacisnąłem ten sam przycisk raz błędnie pokazało, jednak problem polega na tym że dwa inne przyciski mają taki sam odzew w monitorze portu szeregowego.
Więc szybko zrozumiałem że to nie tędy droga.
Spróbowałem na piechotę, jako że w sprzęcie jest odbiornik podczerwieni jako metalowa puszka dosyć duża w środku pewnie elementy wzmacniacza sygnału na tranzystorach.
Z odbiornika wychodzą trzy przewody zasilanie wyjście i masa, odbiornik zasilany jest napięciem 12V i wyjście linia out też jest na logice 12V.
Podpatrzyłem jak to jest zrobione w oryginale np przy magnetofonie i skopiowałem układ formowania impulsów dla moich potrzeb. Oto schemat.
Jak widać szyna resetu jest dwukierunkowa odbiór pilota jest na rysunku na pinie 9 Arduino i jest to zanegowany sygnał więc na szynie resetu po lewej stronie normalnie panuje 0V czyli stan niski, po stronie Arduino jest to za tranzystorem BC238 użytym jako negator panuje stan wysoki 5V pin podciągnięty zewnętrznym rezystorem 2.2k do zasilania Arduino 5V - to jest stan normalny.
Teraz gdy naciskamy pilota na szynie resetu pojawiają się szpilki 12V ale to mnie mniej interesuje, bardziej interesuje mnie to co dzieje się na pinie Arduino. Podłączyłem zatem analizator stanów logicznych i przechwytuję, no i są ramki na logice 5V. Poniżej screen.
Jak się przyjrzeć temu to widać krótkie impulsy logiczne 0V oraz długi inicjujący początek transmisji potem dane oraz długi kończący transmisję.
Czasy tych stanów poniżej.
No to teraz odpaliłem Arduino i chcę pomierzyć czasy trwania tych sygnałów na pinie użyłem funkcji pulseIn podobno działa ona od 10us więc powinno działać no i napisałem taki prosty kod.
Kod: C / C++
Chciałem aby na początek pomierzył czasy i wyświetlił mi je na serial monitorze.
Ku mojemu zdziwieniu wyświetlił tylko 6 czasów trzy długie i trzy krótki po przejściu całej ramki.
Czyli otrzymałem to
39 - Krotki
80 - Dlugi
30 - Krotki
201 - Dlugi
32 - Krotki
83 - Dlugi
32 - Krotki
Czasy te w żaden sposób nie odpowiadają ramce, pytanie do Was. Gdzie jest problem jak odczytać poprawnie ramkę z tego pilota i zapisać np do tabeli.
Patrząc na powyższą ramkę można by długim sygnałem wyszukiwać ciągu po odnalezieniu długiego około 340us sygnału logicznego 1 spisywać do tabeli kolejne sygnały z przedziału około 100us jako 0 i z przedziału 200us jako 1 taki ciąg sygnałów potem już bez problemu można by było wykorzystywać do sterowania funkcjami programu.
Pytanie jest zasadnicze czemu wszystkie czasy mi nie wyświetla na serial monitorze.
Może ktoś by mi pomógł i napisał prosty programik aby przechwycał dane w powyższy opisany sposób ?
Myślałem i do głowy mi jeszcze przyszło że realny przebieg może być zniekształcony analizator sobie z tym radzi a Arduino nie więc zapiąłem oscyloskop, przebieg złapany Triggerem wygląda ładnie lekko nachylone zbocza ale poza tym jest ładny nie powinien to być problem zobaczcie sami.
Do tej pory z biblioteką IRremote sobie radziłem, czytałem że można zrobić to na przerwaniach ale ja tego nie umiem napisać dlatego proszę Was o pomoc lub chociaż wskazówki jak do tego podejść.
Z góry dziękuję za pomoc.
Pozdrawiam...