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

Atmega8 - Skonstruowanie urządzenia sterowanego z nieużywanych przycisków pilota

madiz08 28 Sty 2015 20:12 2409 16
REKLAMA
  • #1 14378044
    madiz08
    Poziom 14  
    Posty: 517
    Pomógł: 4
    Ocena: 172
    Witam
    Mój pilot TV ma wiele przycisków, które nie działają bezpośrednio
    Atmega8 - Skonstruowanie urządzenia sterowanego z nieużywanych przycisków pilota
    jak np. A B C D, które mógłbym wykorzystać do sterowania czymś innym, jak np. załączenie światła ipt.
    Do dekodowania kodu z pilota chciałbym użyć mikrokontrolera Atmega8, ale najpierw muszę zbadać sam kod który wysyła dany przycisk i tu mam niemały problem.
    mój pilot to Samsung AA59-00790A. Trochę czytałem o RC-5 i innych, ale nijak to się ma do kodów z mojego pilota, a nigdzie nie mogę znaleźć informacji o jego dekodowaniu:
    Atmega8 - Skonstruowanie urządzenia sterowanego z nieużywanych przycisków pilota
    takie wykresy zaobserwowałem na swoim oscyloskopie (lekkie niedokładności przez sklejanie screenów w paincie) no i nie jest to informacja parunasto-bitowa.

    Czy w taki sposób należy to odczytywać?
    Atmega8 - Skonstruowanie urządzenia sterowanego z nieużywanych przycisków pilota
    czy dobrze zaznaczyłem 1 bit, który ma okres 1,14ms?
    Hmm, sporo tych bitów i dopiero po jakimś czasie różnią się od siebie. Czy wogóle jeżeli mam zrobioną płytkę pod atmegę8 na wewnętrznym RC, to warto się za takie coś zabierać?, czy musiałby być koniecznie jakiś kwarc.
    Samo napisanie programu pewnie nie będzie takie proste, wydaje mi się że zaczynałoby się od przerwania zewnętrznego o zboczu opadającym, ale dalej żeby ustawić timer jako zegar wewnętrzny to już dobrze trzeba chyba zaznajomić się z tym kodem.
  • REKLAMA
  • Pomocny post
    #2 14378718
    djfarad02
    Poziom 19  
    Posty: 509
    Pomógł: 7
    Ocena: 675
    Pomoże Ci mój mały projekcik na szybko: https://www.elektroda.pl/rtvforum/topic2887392.html

    Napisałem tam dekoder rozkazów w bliźniaczym standardzie. Dekoder jest w plikach ir.c oraz ir.h Używany też jest timer (inicjalizacja w main). Program do super eleganckich nie należy gdyż nie korzysta on ze sprzętowego przerwania (akurat nie miałem na płytce wyprowadzonych odpowiednich pinów procesora).

    To co widzisz na oscyloskopie to impuls (nagłówek) startowy i po nim 32 bity - 4 bajty. dłuższy stan wysoki do pary z niskim oznacza 1 a krótszy oznacza 0. Pierwsze dwa bajty to nagłówek rozkazu (taki sam dla wszystkich klawiszy), trzeci to rozkaz a czwarty to też rozkaz tylko zanegowany (w celu wykrycia błędów).

    Będziesz musiał zmodyfikować kod w miejscu oznaczonym komentarzem 'check frame'. Mój pilot miał nagłówek składający się z bajtów 0x00 oraz 0xFF. Twój ma 0xE0, 0xE0.
    Do tego będzie potrzebna poprawka definicji czasów w pliku ir.h
    Może obejdzie się bez ruszania czasów bitów ale już widzę, że Twój pilot ma inny impuls startowy. Na dzień dobry musisz więc edytować te czasy, spróbuj wprowadzić takie:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    ir.c:
    Modyfikacja dla nagłówka 0xE0 0xE0

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #3 14378767
    sopeleek
    Poziom 12  
    Posty: 66
    Pomógł: 6
    Ocena: 3
    Nie wiem czy takie rozwiązanie Cie zainteresuje, ale można do tego celu wykorzystać arduino (wgrać bootloader na atmege8) i bibliotekę IrRemote, której wykorzystanie jest banalnie proste. Jednak wtedy chyba lepiej z zewnętrznym kwarcem.
  • REKLAMA
  • #4 14379034
    madiz08
    Poziom 14  
    Posty: 517
    Pomógł: 4
    Ocena: 172
    Już myślałem że to jest rozszyfrowane, ale trochę przeanalizowałem
    Atmega8 - Skonstruowanie urządzenia sterowanego z nieużywanych przycisków pilota
    i jednak jak widać na obrazku nie trzyma się to kupy co napisałeś djfarad02. Po tych dwóch dłuższych impulsach są nie 4 a 6 bajtów i przedostatni z ostatnim wcale nie są zanegowane, chociaż zauważyłem, że nigdy nie ma dwóch jedynek, także może chodzi o jakiś co drugi bit zanegowany?
    Ale faktycznie, tak jak napisałeś po tych dwóch impulsach dłuższych, zliczając do końca wychodzą równe bajty, tylko jeżeli jest ich 6 a nie 4 to jakie poszczególne bajty spełniają funkcje?
  • #6 14380262
    madiz08
    Poziom 14  
    Posty: 517
    Pomógł: 4
    Ocena: 172
    Aha, nie przyszło by mi do głowy, że bity mogą być o różnej długości, ale teraz taka analiza ułatwia dużo napisanie programu. Po tym starcie każde zbocze opadające załączy wewnętrzny timer i przy kolejnych przerwaniach na zboczu opadającym wartość timera będzie porównywana z jakąś liczbą. Jeżeli jest mniejsza to 0, a jeżeli dłuższa to 1. Oczywiście po tym odczycie timer jest zerowany i zlicza na nowo do kolejnego przerwania zboczem opadającym.

    Dzięki wielkie, bardzo cenna informacja, teraz juz na pewno poradzę sobie na wewnętrznym RC.
  • #7 14384266
    madiz08
    Poziom 14  
    Posty: 517
    Pomógł: 4
    Ocena: 172
    Na chwilę małymi krokami wziąłem się za pisanie programu, podłączając wyjście TSOP do pinu PD2 jako przerwanie zewnętrzne o zboczu opadającym i na samym początku mam problem.

    Mam PORTB podłączony pod 8 ledów i dlaczego tak napisany program
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    gdzie ilość "i" jest to liczba przerwań, nic nie pokazuje mi na porcieB, a taki napisany poniżej już tak.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    i teraz ledy zliczają binarnie ilość przerwań, a jak polecenie PORTB=i; było w funkcji main to ledy były cały czas zgaszone i naciskanie przycisków nic nie dawało.

    Przecież jak każde przerwanie sie zakończy to "i" jest zwiększane o 1, a potem jest powrót do funkcji skąd te przerwanie nastąpiło czyli main, a zmienna "i" jest zmienną globalną to nie rozumiem niestety dlaczego tak się dzieje
  • Pomocny post
    #8 14384292
    landy13
    Poziom 31  
    Posty: 1418
    Pomógł: 195
    Ocena: 259
    A magiczne słowo na "v" przed "int i"?
  • REKLAMA
  • #9 14384330
    madiz08
    Poziom 14  
    Posty: 517
    Pomógł: 4
    Ocena: 172
    volatile i działa. Mam braki, muszę zaznajomić się z tym znaczeniem. Podziękował
  • Pomocny post
    #10 14385861
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    No to jeszcze dwie uwagi dot:
    F_CPU: http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html
    SIGNAL, bo przestarzałe - używaj ISR i nowych wektorów: http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
  • #11 14402377
    madiz08
    Poziom 14  
    Posty: 517
    Pomógł: 4
    Ocena: 172
    Zabrałem się do pisania programu w następujący sposób
    Atmega8 - Skonstruowanie urządzenia sterowanego z nieużywanych przycisków pilota
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Na końcu każdego przerwania zmienna "i" jest zwiększana o 1, dlatego na początku obsługi przerwania
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    jeżeli i=17 to w tym momencie załączam timer1 i tutaj od razu miałbym pytanie czy po załączaniu timera1, jego wartość jest zawsze równa 0, czy też zapamiętuje swoją wartość przed wyłączeniem i później po ponownym włączeniu liczy od zapamiętanej wartości?
    Przy kolejnym przerwaniu sprawdzana jest wartość timera, dla wartości 0 jest to około 1140 cykli, dla jedynki 2x dłużej, czyli za wartość sprawdzaną przyjąłem 1800. Jeżeli stan licznika jest mniejszy niż 1800 oznacza że 0, a jak większy to 1.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jak widać czy będzie 0 czy 1 w tym sprawdzeniu, to zmienna "a" jest zwiększana o 1 i dodatkowo jeżeli wartość timera1 jest większa od 1800 to jedynka jest zapisywana w bicie zmiennej "zmienna", numer tego bitu określa zmienna "a".

    W ten sposób zmiennej "zmienna" zostaje przypisana 16-bitowa wartość.
    Teraz w nieskończonej pętli głównej while(1)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jeżeli a=16, wyłączam przerwania cli() i porównuję zgodność zmienna do wartości 936C. Jeżeli zgadza się na sekundę zapali się dioda 1, a jak nie będzie się zgadzać to na sekundę dioda nr4.

    Sprawdziłem i program działał. Jednak na razie, żeby dokonać kolejnego wciśnięcia i zaobserwować wynik musiałem resetować mikrokontroler.
    Na parenaście sposobów próbowałem ponownie załączać przerwania, zerować zmienne i timer1 w różnych miejscach i cały czas mam problem, aby po tej sekundzie zaświecenia się diody ponownie wcisnąć przycisk pilota i zaboserwować poprawny wynik.
    Poniżej cały program w całości, chciałbym poprosić o pomoc jak najlepiej to napisać, żebym po sekundzie zaświecenia diody mógł ponownie wcisnąć przycisk pilota i zobaczyć ponowny wynik.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #12 14402469
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    madiz08 napisał:
    czy po załączaniu timera1, jego wartość jest zawsze równa 0, czy też zapamiętuje swoją wartość przed wyłączeniem i później po ponownym włączeniu liczy od zapamiętanej wartości?

    Jeśli przez włączenie timera rozumiesz włączenie dowolnego z niezerowych trybów preskaler, a przez jego wyłączenie rozumiesz ustawienie preskalera na zero, to sam możesz odpowiedzieć sobie na to pytanie patrząc na schemat preskalera i timera.

    Dodać tutaj należy, że można (a czasami nawet należy) zerować preskaler - ale uwaga (!) przyglądnij się schematowi preskalera, bo jest tam pewien haczyk. :)
  • #13 14405456
    madiz08
    Poziom 14  
    Posty: 517
    Pomógł: 4
    Ocena: 172
    Niestety schemat mi nie pomógł. Poniżej wstawiam niedziałający (nie wiem dlaczego) program
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Przerwanie tak jak opisałem wcześniej ustawia bity w zmiennej "zmienna" i gdy a=16 (czyli po 34-tym przerwaniu zbocza opadającego), w pętli głównej przerwania są blokowane i sprawdzana jest poprawność odczytu. (na razie jedynie dla przycisku A).
    Może wrzucę też krótki filmik pokazujący o co mi chodzi



    Atmega8 - Skonstruowanie urządzenia sterowanego z nieużywanych przycisków pilota
    Prawidłowy odczyt następuje tylko, kiedy za pierwszym razem nacisnę A, naciskając A drugi raz, mikrokontroler odczytuje złą kombinację i trzeba resetować.
    Wydawało mi się, że gdy zmienna a=16, zatrzymałem przerwania, potem wyzerowałem wszystko i ponownie po sprawdzeniu warunku załączyłem przerwania, to bedę mógł powtórzyć wynik, ale nic z tego.

    Po prostu chodzi mi o to, żeby po tym sekundowym zaświeceniu diody nr1, gdy ponownie wcisnę przycisk A, dioda nr1 znowu się zaświeciła, czyli, żebym za każdym razem mógł poprawnie odczytywać kod przycisku. Jak na razie mogę to zrobić jedynie po resecie mikrokontrolera i to tylko przy pierwszym wciśnięciu przycisku A.
  • Pomocny post
    #14 14405480
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    madiz08 napisał:
    Niestety schemat mi nie pomógł.

    Ależ pomógł, bo nie znalazłeś w nim żadnych zależności dot. kasowania timera przy jego wyłączaniu poprzez ustawienie preskalera zero. Jest to logiczne, ponieważ gdyby licznik timera był automatycznie kasowany, to zmniejszałoby jego możliwości, bo nie można byłoby go "puścić dalej"

    Schemat preskalera pokazuje natomiast, że jego kasowanie (zerowanie) powoduje wyzerowanie zarówno preskalera timer1 jak i timer0.

    Skoro na początku spełnionego warunku if() zerujesz timer, to powinieneś także wyzerować preskaler, a tego nie robisz. A już tak całkiem dokładnie, to kolejność czynności powinna być inna:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Podobnie w funkcji przerwania gdzie także zerujesz timer.

    Dlaczego nadal definiujesz F_CPU w kodzie programu?

    Przyglądnij się może jak realizowane jest dekodowanie RC5 także na pinie INT:
    http://mikrokontrolery.blogspot.com/2011/03/I...dczerwien-transmisja-standard-pilot-kurs.html

    ... no i jeszcze Bit Toggle - o ile występuje w tym standardzie - to także jest opisane w linku wyżej.
  • #15 14407630
    madiz08
    Poziom 14  
    Posty: 517
    Pomógł: 4
    Ocena: 172
    Już poprawiłem w mfile definiowanie procesora i świetnie, pierwszy raz nie wyskoczyła mi informacja "warning", także dziękuję za ta informację.
    Zakładam, że tym brakującym wielokropkiem było:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    o którym dzisiaj się dowiedziałem.

    Dalej jednak program nie działa prawidłowo. Nie jestem pewien czy o takie podstawienia chodziło, ale teraz wygląda to tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    W pętli while(1) dodałem jeszcze jeden warunek, gdy zmienna "zmienna" będzie miała wartość 0, to zapalam na sekundę wszystkie diody i tu jest problem.
    Zawsze za drugim przyciśnięciem obojętnie jakiego przycisku zapalają się wszystkie diody, czyli wniosek, że tylko za pierwszym razem po zresetowaniu, ustawiane jest odpowiednio 16 bitów w zmiennej "zmienna" i zapala się albo pierwsza dioda kiedy wcisnę A, albo zapala się czwarta kiedy wcisnę dowolny inny przycisk. Każde kolejne wciśnięcie dowolnego przycisku nie wypełnia bitów "zmienna" i ma ona zawsze wartość 0, co powoduje, że zapalają się na sekundę wszystkie diody.
    Nie wiem dlaczego

    Dodano po 5 [minuty]:

    usuwając z warunków tą linijkę
    Atmega8 - Skonstruowanie urządzenia sterowanego z nieużywanych przycisków pilota
    zaobserwowałem, że jak na początku wcisnę A, to za każdym nastepnym wciśnięciem dowolnego przycisku zawsze zapala się dioda nr1, czyli tak jakby "zmienna" jest zatrzaskiwana za pierwszym razem
  • #16 14444013
    madiz08
    Poziom 14  
    Posty: 517
    Pomógł: 4
    Ocena: 172
    Witam
    Udało mi się napisać kod, dzięki któremu czterema przyciskami załączam 4 niezależne od siebie diody. Wrzucam kod, może komuś sie przyda:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    A teraz chciałbym zapytać o praktyczne wykonanie urzadzenia, które za sprawą pilota będzie mi załączało i wyłączało np. światło, wentylator itp.
    Chciałbym, aby cała elektronika była zasilana z baterii. Mam kilka szt Atmega8L, które moge zasilać z dwóch paluszków i w trybie uśpienia, taki mikrokontroler będzie pobierał znikomy prąd. Jako części wykonawcze chciałbym wykorzystać przekaźniki bistabilne. Ich pobór prądu jest spory, ale będą tylko na ułamek sekundy przełączane z jednego stanu na drugi.

    Najbardziej ciekawi mnie czy ktoś może mógłby mi doradzić, jaki odbiornik podczerwieni na 3V wybrać o jak najniższym poborze prądu w stanie spoczynku.
    Znalazłem np. taką notę http://www.vishay.com/docs/82459/tsop48.pdf
    czy zaznaczone poniżej Atmega8 - Skonstruowanie urządzenia sterowanego z nieużywanych przycisków pilota na czerwono to jest typowy pobór prądu?
  • REKLAMA
  • #17 14460718
    madiz08
    Poziom 14  
    Posty: 517
    Pomógł: 4
    Ocena: 172
    Zmieniłem jednak zdanie i postanowiłem wsadzić do swojego układu transformatorek. Pierwszy raz używałem transformatora, dlatego zapytałem w temacie
    https://www.elektroda.pl/rtvforum/topic2990408.html
    Na razie prowizorycznie wszystko podłączyłem w taki układ:
    Atmega8 - Skonstruowanie urządzenia sterowanego z nieużywanych przycisków pilota
    (diody przy cewkach przekaźników od spodu) Użyłem przekaźników bistabilnych. Po wykryciu kodu z danego przycisku, na 200ms załączana jest dana cewka załączająca lub rozłączająca styk.
    W tym linku o transformatorze wstawiłem pod koniec filmik, bardziej słychać przeskoki przekaźników niż muzykę z podłączonego radia, ale działa na prawdę fajnie i to na sporą odległość.
    Dzięki za podpowiedzi w pisaniu programu i w rozszyfrowaniu kodu pilota (bitu toggle tu nie ma). Jeszcze tylko porządna obudowa pod to wszystko i mam koniec.

Podsumowanie tematu

✨ Użytkownik poszukuje sposobu na wykorzystanie nieużywanych przycisków pilota Samsung AA59-00790A do sterowania innymi urządzeniami, używając mikrokontrolera Atmega8. W trakcie dyskusji omawiane są metody dekodowania sygnałów IR, w tym różnice w długości bitów oraz struktura przesyłanych danych. Uczestnicy dzielą się kodami źródłowymi oraz wskazówkami dotyczącymi programowania, w tym użycia przerwań i timerów. Ostatecznie użytkownik z powodzeniem zaimplementował kod, który pozwala na sterowanie diodami LED za pomocą przycisków pilota, a także planuje dalsze rozwinięcie projektu z użyciem przekaźników.
Wygenerowane przez model językowy.
REKLAMA