logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak zasymulować przytrzymanie przycisku pilota IR NEC 38kHz na Arduino?

mperlam 05 Kwi 2012 23:18 6599 13
REKLAMA
  • #1 10762041
    mperlam
    Poziom 9  
    Posty: 31
    Cześć. Mam dość proste pytanie, odpowiedzi jednak nie udało mi się znaleźć. Za pomocą Arduino i czytnika IR zczytałem przycisk (Play/Pause) z oryginalnego pilota, którego przytrzymanie powoduje uśpienie komputera (Mac). Chciałbym zasymulować to samo, jednak jedyne, co udaje mi się zrobić to włączenie muzyki (kliknięcie przycisku, ja "chcę go przytrzymać"). Jeżeli jest to pomocne, pilot pracuje w technologii NEC, 38kHz. Poniżej wklejam kod pojedynczego kliknięcia, jego zapętlanie nic nie daje, tak samo jak zczytanie całej sekwencji "trzymania" przycisku. Będę bardzo wdzięczny za pomoc, męczę się z tym już dość długo a mi bardzo zależy.

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 10763734
    wojtek_84
    Poziom 13  
    Posty: 57
    Pomógł: 7
    Tutaj masz opis protokołu. Zobacz czy opóźnienia i czas wysyłania pulsów jest poprawny.
    Logiczna jedynka to pulsy przez 560 us i później cisza. Podobnie logiczne zero z tym że '1' trwa 2.25 ms, a '0' 1.12 ms.

    Spróbuj pozmieniać opóźnienia tak jest opisane w powyższym linku.
  • REKLAMA
  • #3 10768963
    krzema12
    Poziom 12  
    Posty: 19
    Pomógł: 4
    mperlam napisał:
    jednak jedyne, co udaje mi się zrobić to włączenie muzyki

    Czyli zasymulowanie pojedynczego wciśnięcia za pomocą Twojego układu działa, tak? To by oznaczało, że czasy są raczej w porządku.

    Jaką masz wersję pilota? Bały krótki czy szary długi? Po przebiegu zgaduję, że biały, mam rację?

    Sugerowałbym kilku- albo kilkunastokrotne wykonanie tego fragmentu z końca sekwencji
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ten sygnał jest wysyłany podczas trzymania przycisku.

    Wykres przebiegu z Twojego kodu, może ktoś coś zauważy:
    Jak zasymulować przytrzymanie przycisku pilota IR NEC 38kHz na Arduino?

    @Edit
    Przyszło mi jeszcze do głowy, że dla dużych czasów funkcja opóźniająca w mikrosekundach tak naprawdę wywołuje funkcję opóźniającą w milisekundach, co może jakoś wpłynąć na dokładność opóźnienia. Nie wiem czy jest tak samo w nakładce do Arduino.
    Mam tu na myśli to najdłuższe opóźnienie od końca kodu przycisku do początku kodu opóźnienia (trwające 42740 us). Ono teoretycznie powinno trwać 40 ms. Jeśli poprzednie porady nie zadziałają, to może spróbuj wpisać tam 40000, albo też rozbić tego długiego delaya na kilkanaście krótkich.

    Siedziałem trochę przy tych pilotach, na pewno prędzej czy później damy radę ;)
  • #4 10769118
    mperlam
    Poziom 9  
    Posty: 31
    A więc tak - powyższy kod jest na 100% poprawny. Posiadam uniwersalny pilot Logitech Harmony, który potrafi symulować dowolny pilot (z bazy) więc nie wiem które Apple Remote jest tutaj symulowane. Dla testu zaprogramowałem ten właśnie uniwersalny pilot powyższym kodem (za pomocą diody IR z Arduino) i... usypianie działa jak należy.

    Próbowałem powtarzać końcową sekwencję, niestety to nic nie dało. To, co jednak zauważyłem to fakt, że podczas trzymania przycisku w oryginalnym pilocie dioda nie świeci pomiędzy sekwencjami (podczas "przerwy w pętli") na dłuższą chwilę. Ta z Arduino praktycznie nie mruga. Podejrzewam zatem, że wystarczy powtórzyć powyższą sekwencję, z tym, że powinna być w niej przerwa. Pytanie ile s... - gdyby chodziło tylko o s nie byłoby problemu - sprawdziłbym po kolei, chodzi jednak zapewne o mikosekundy...
  • #5 10769156
    krzema12
    Poziom 12  
    Posty: 19
    Pomógł: 4
    Racja, we wcześniejszym poście wprowadziłem Cię w błąd. Odstęp między kodem przycisku a pierwszym sygnałem powtórzenia to 40 ms, ale między każdymi kolejnymi sygnałami powtórzenia odstęp to już 100 ms. Tyle właśnie powinna być równa ta "dłusza chwila", o ile dobrze zrozumiałem to co napisałeś.

    Jak zasymulować przytrzymanie przycisku pilota IR NEC 38kHz na Arduino?

    Mam nadzieję, że zadziała.
  • #6 10769211
    mperlam
    Poziom 9  
    Posty: 31
    A więc to powinno wyglądać tak:
    1. cały kod z 40 ms na końcu
    2. poniższa sekwencja w pętli
    delayMicroseconds(100000);
    pulseIR(8880);
    delayMicroseconds(2140);
    pulseIR(600); 


    Czyli już bez całego kodu, tylko powtarzanie tego kodu? Jeżeli tak to niestety nadal jest problem. Wydaje mi się, że mimo tych 100 ms mrugnięcia (a raczej wygaśnięcia) są zdecydowanie za krótkie w porównaniu z oryginałem.
  • REKLAMA
  • Pomocny post
    #7 10769311
    krzema12
    Poziom 12  
    Posty: 19
    Pomógł: 4
    Najłatwiej byłoby przeanalizować za pomocą oscyloskopu kod wysyłany przez Harmony i porównać go z sygnałem z Arduino. Zamiast oscyloskopu można też użyć bardzo prostego układu podłączanego pod kartę dźwiękową i nagrać ten sygnał.

    Za pomocą właśnie takiego układu (a konkretnie: bezpośrednio podłączonego fotorezystora IR) nagrałem kiedyś sygnały z pierwszej wersji Apple Remote, plik w załączniku. Proponuję go przeanalizować programem typu Audacity. Kolejność przycisków (z tego co pamiętam): "głośniej", "poprzedni", "play/pause", "następny", "ciszej", "menu".

    Zauważyłem jeszcze, że to opóźnienie 40 ms występuje w kodzie jako trochę dłuższe czyli 42740 us. Może należałoby proporcjonalnie wydłużyć drugi typ opóźnienia, tj. 100000 zamienić na ok. 106850?
    Załączniki:
    • Remote.zip (1.3 MB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #8 10769404
    mperlam
    Poziom 9  
    Posty: 31
    Wg. specyfikacji, którą podesłał Wojtek czyli: http://www.sbprojects.com/knowledge/ir/nec.php
    wynika, że jeden "cykl" powinien wynosić równe 110ms. Każdy kolejny ma zawierać nagłówek i być pusty (nie posiadać ponownie polecenia). Wynika z tego, że wystarczyłoby wysłać najpierw calutki kod, później tylko sam nagłówek i czekać te +/-110 ms (nagłówek też jakiś tam czas trwa). Zrobiłem tak (choć trudno powiedzieć ile nagłówek trwa) i komputer od razu się uśpił. Niestety tylko raz, już nie chce :/
  • Pomocny post
    #9 10769522
    krzema12
    Poziom 12  
    Posty: 19
    Pomógł: 4
    OK, czyli już jest jakiś postęp. Pewnie któryś z czasów jest na styku tolerancji przez odbiornik w komputerze i dlatego na początku akurat się udało.
    Mógłbyś nagrać za pomocą Arduino i wstawić tu kod sygnału wysyłanego podczas trzymania przycisku przez, powiedzmy, 1 sekundę?

    Co do tej specyfikacji: czyli okazuje się, że ten długi odstęp to 98,19 ms. Może spróbuj taki podać, a nuż zadziała.
  • #10 10769544
    mperlam
    Poziom 9  
    Posty: 31
    Trudno powiedzieć ile to trwało :)

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Swoją drogą Wikipedia opisuje nieco całe te czasy: http://en.wikipedia.org/wiki/Apple_Remote
    Jestem więc w zakresie tolerancji, troszkę poprawiłem całość aby było jak w specyfikacji.
  • REKLAMA
  • Pomocny post
    #11 10769642
    krzema12
    Poziom 12  
    Posty: 19
    Pomógł: 4
    A to ciekawe - z tego kodu wynika, że cykle wysyłania kodu powtórzenia trwają nie 100, a 40 ms. To chyba jeszcze inny pilot niż te dwa, które kiedyś rozpracowywałem. Kłóci się też to z tym co piszesz, że przerwy są bardzo długie - w kodzie są jednak dość krótkie.

    Dziwne, że kod nagrany prosto z Arduino, zawierający kody powtórzenia, nie działa. Chyba jednak w ten sposób nie pomogę, ale i tak proponuję przetestować takie coś:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #12 10769651
    mperlam
    Poziom 9  
    Posty: 31
    Niestety podanie odstępu 98,19 nic nie daje. Również powtarzanie sekwencji:
    delayMicroseconds(28844); 
    pulseIR(8880); 
    delayMicroseconds(2140); 
    pulseIR(600); 

    nie skutkuje

    Dodano po 7 [minuty]:

    Przerwy to kwestia bardzo subiektywna - te emulowane przez Arduino są zupełnie niewidoczne - nawet podczas przerwy dioda świeci (może w tym problem). Podobny do Twojego kodu miałem właśnie napisany, oba nie działają a to dziwne...
  • Pomocny post
    #13 10769685
    krzema12
    Poziom 12  
    Posty: 19
    Pomógł: 4
    Skończyły mi się pomysły. Chyba jedynym sposobem na rozwiązanie problemu jest sprawdzenie co rzeczywiście wysyła oryginalny pilot i Arduino oraz porównać te przebiegi. Ten układ pod kartę dźwiękową to koszt rzędu kilku zł (wtyk mini-jack, kawałek dwużyłowego kabla i podłączony do niego fotorezystor IR), proponuję takie coś zbudować.

    @Edit
    Co do świecenia podczas przerw: mam przeczucie, że te dłuższe opóźnienia jakoś niepoprawnie działają. Proponuję rozbić je na krótsze, np. zamiast

    delayMicroseconds(28844);

    napisać
    int i;
    for(i=0; i<28; i++)
    	delayMicroseconds(1000);
    
    delayMicroseconds(844);


    @Edit
    W porządku, więc czekam na postęp w sprawie, jestem ciekaw czemu to tak dziwnie działa. Jeżeli jeszcze nie spróbowałeś to proponuję dać szansę powyższemu pomysłowi (z rozbiciem długich opóźnień).
    Również życzę spokojnych i rodzinnych Świąt :)
  • #14 10769713
    mperlam
    Poziom 9  
    Posty: 31
    Mam potrzebne komponenty w domu, po świętach się pobawię i spróbuję dojść do końca z tym problemem. W razie czego się odezwę. Tymczasem dzięki wielkie za pomoc, troszkę poszedłem do przodu w tej sprawie, może kiedyś się uda :)

    Wesołych Świąt! :)

Podsumowanie tematu

✨ Użytkownik poszukuje sposobu na zasymulowanie przytrzymania przycisku pilota IR NEC 38kHz za pomocą Arduino, aby komputer Mac mógł przejść w stan uśpienia. Po zczytaniu sygnału z pilota, udało mu się jedynie zrealizować pojedyncze kliknięcie, co nie prowadzi do oczekiwanego efektu. W odpowiedziach zasugerowano m.in. analizę opóźnień i długości impulsów, a także powtarzanie sekwencji sygnałów z odpowiednimi przerwami. Użytkownik testował różne kombinacje kodu, jednak napotkał trudności z uzyskaniem stabilnego sygnału, co może być spowodowane różnicami w długości przerw między impulsami. Proponowano również użycie oscyloskopu lub prostego układu do nagrywania sygnałów w celu porównania z oryginalnym pilotem.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA