Bascom: Zdalne sterowanie za pomocą pilota od telewizora

rc5Sterowanie pilotem jest bardzo przydatną rzeczą bo pozwala nam to na robienie wielu rzeczy bez wstawania z naszego ulubionego fotela tj. przełączanie programów TV, regulacja głośności, włączania świateł w pokoju itp. ;) Jednak naszym celem nie będzie zmienienie programu TV lecz zapalanie diód led w mini układzie do nauki programowania na ATTiny2313.


Piloty wysyłają komendy w znanych im standardach. Do takich najpopularniejszych należą RC5, RC6. Są jeszcze standardy wysyłania opracowane przez firmy dla swoich produktów, lecz my zajmiemy się RC5. Potrzebujemy zatem pilota który nadaje w takim standardzie, ja mam pilot firmy Goldstar, który w takim standardzie nadaje (Jeżeli nie masz takiego to musisz kupić „pilot nadający w standardzie RC5”, czasami piloty uniwersalne nadają w RC5). Sygnał jest wysyłany za pomocą promieniowania podczerwonego, jest modulowany co oznacza, że komendy są wysyłane za pomocą impulsów prostokątnych o częstotliwości 36kHz.
Nadajnik, który pracujące według standardu RC5 transmituje 14-bitowe słowa danych, kodowane w formacie bi-phase, zwanym także kodem Manchester. Pierwsze dwa bity słowa są zawsze jedynkami i tworzą razem sygnał startu.
Następny bit jest bitem kontrolnym (toggle bit), zmienianym w kolejnych nadawanych słowach, gdy użytkownik przytrzyma klawisz pilota ? umożliwia to powtarzanie komend.
Kolejne 5 bitów reprezentuje adres urządzenia, które ma być właściwym odbiornikiem transmisji. Dla przykładu: odbiorniki telewizyjne maja zazwyczaj adres 0, a magnetowidy adres 5.
Ostatnie 6 bitów reprezentuje jedną z 64 możliwych komend. Żeby to wszystko sprawnie działało to musimy wykorzystać odbiornik podczerwieni, taki który odbiera sygnał o częstotliwości 36kHz. W moim układzie jest zamontowany TSOP1736.
Skoro wiemy jak to działa w teorii to nie pozostaje nic innego jak przejść do praktyki ;). Program standardowo zaczynamy instrukcjami deklaracji procesora i jego prędkości:

  1. $regfile „attiny2313.dat”                               ‚procesor Attiny2313
  2. $crystal = 4000000                                      ‚kwarc 4MHz

Teraz należy zadeklarować piny wejścia i wyjścia, czyli nasze diody to wyjścia a odbiornik podczerwieni to wejście. TSOP’a możemy zadeklarować na dwa sposoby:

  1. Config  Portb.0 = Input
  2. ‚albo
  3. Config RC5 = Portb.0

Jednak ja wybiorę ten co jest w 3.linijce ze względów  estetycznych, co prawda to nie jest duży program ale jakby było potrzeba zadeklarowania większej ilości wejść to byłoby widać, które wejście to odbiornik podczerwieni. Diody deklarujemy jak w Bascom: Pierwszy program.
W tym momencie musimy zdefiniować zmienne jako bajty używając intrukcji Dim, działa on na takiej zasadzie :

  1. Dim nazwa as typ
  2. ‚nazwa-  nazwa zmiennej
  3. ‚typ- typ zmiennej, np. byte, bit, word, string itd.

lecz jeśli nasza deklaracja zmiennych jest większa niż jedna zmienna to następne piszemy obok oddzielając przecinkiem. Także nasza definicja wygląda tak:

  1. Dim Adres As Byte , Komenda As Byte                     ‚definicja zmiennych

potrzebujemy jeszcze włączyć globalne przerwania za pomocą instrukcji:

  1. Enable Interrupts                             ‚włączenie globalnych przerwań

Zakończyliśmy już ustawienie podstawowych parametrów pracy procesora, pozostało nam zacząć główną pętle używając intrukcji Do, teraz musimy zasygnalizować mikokontrolerowi, że „jest gotowy” na odbieranie sygnału Rc5 przy pomoc instrukcji GetRC5:

  1. Getrc5(adres , Komenda)                            ‚gotowy do odbioru adresu
  2. Komenda = Komenda And &B01111111                   ‚i komendy

Jak już wiemy, adres jest wysłany wraz z komendą, co nam ułatwia zadanie- musimy tylko zadeklarować jaką komendę chcemy odbierać i tutaj musimy użyć instrukcji IF oraz zmienną komenda, którą wcześniej zdefiniowaliśmy:

 

  1. If Komenda = 1 Then
  2.      Pinb.4 = 1                           ‚jezeli odberana komenda
  3.      Waitms 150                         ‚to 1 to wlacz diode
  4.                                                  ‚i czekaj 150ms
  5. Elseif Komenda = 2 Then        ‚jeżeli zostanie wcisiniety
  6.      Pinb.3 = 1                            ‚ten sam przycisk na
  7.      Waitms 150                         ‚na pilocie to stan
  8.                                                  ‚wyprowadzenia zostanie
  9. Elseif Komenda = 3 Then        ‚zanegowany
  10.      Pinb.2 = 1                            ‚czyli w tym przypadku dioda zgasnie
  11.      Waitms 150
  12. Elseif Komenda = 4 Then
  13.      Pinb.1 = 1
  14.      Waitms 150

Skąd wiedzieć za co jaka komenda odpowiada ?

rc5send

Pozostało nam już tylko zakończyć instrukcję IF, zamknąć pętle i zakończyć program:

  1. End If
  2. Loop     ‚zamkniecie petli
  3. End      ‚koniec programu


Dzięki za uwagę, jak chcesz być na bieżąco z postami to kliknij ‚Lubię to !‚.
Pozdrawiam ;)

  • Very interesting project! I am waiting on next from these series.

  • Złożyłem układ na płytce stykowej (czyli attiny2313, tsop2236 36khz, rezystory, diody led, kondensator elektrolityczny + zaprogramowany uC) i jak na chwilę obecną nie chce działać sprawdzałem na trzech pilotach od tv: Funai, Panasonic, Orion. Nie wiem, czy są to piloty Rc5.

  • Pokaż schemat bo bez niego trudno coś jest wywnioskować.

  • Schemat jest taki sam jak tego "mini układu na attiny2313", u mnie jest tylko tsop, ledy, rezystory do lewód, kondensator do tsop'a + rezystor i to wszystko.

  • sprawdź połączenia między TSOP'em, a uC tak samo ledów

  • Wydaje się być wszystko ok.

  • Sprawdziłbym czy w ogóle diody się zaświecą. Pętle główną zmień żeby wszystkie diody się świeciły.

  • Dałem większe zasilanie do pilota i coś się ruszyło.

  • Działa jak należy czy jeszcze jest coś nie tak ?

  • Nie, nie działa jak należy. Zmieniłem kod, żeby wszystkie diody się zapalily to wszystkie się palą, później zmieniłem taktowanie uC z 1MHz na 4MHz i dalej nic.

  • No jak na złość coś programator nic chce coś działać… Po kliknięciu "erase chip" w khazama programmer to wyskakuje błąd: Error while operating…
    error: programm enable: terget doesn't answer 1
    initialization failed, rc=-1
    AVR device initialized any ready to accept instructions
    Device signature = 0X000000
    Yikes! Invalid device singature
    Expected signature for Attiny2313 is 1E 91 0A

    done. Thank you.

    Kiedyś miałem właśnie taki problem wystraczyło zrestartować kompa i działało, a teraz coś niezbyt.

    • sprawdź połączenia miedzy programatorem, a uC nawet kabel ISP sprawdź

  • Sprawdziłem, są połączone.

    • spróbuj gdzieś włączyć funkcję "slow SCK". albo zobacz na programatorze, który switch odpowiada za slow SCK i daj w tryb ON

  • Ok, już działa programator :]

  • Aktualnie sprawdzam układ, ale też niezbyt chce działać, może po prostu pilot jest zły?? (no to czemu wcześniej działy się cuda z diodami led??)

    • Właśnie miałem Ci napisać, że to raczej pilot jest winny skoro wszystko inne działa, nawet możesz pójść do sklepu elektronicznego i tam sprawdzić na pilocie albo kupić pilot RC5 za 10zł nawet nie ;)

  • No pewnie kupie pilot Rc5, albo Philips'a bo podobno to jego jest kod Rc5. Tylko teraz diody led zapalają się i gasną, pierwsza i ostatnia, druga i trzecia się nie zapalają, no chyba,że coś je najdzie to się zapalą. To znaczy, że TSOP zbiera jakieś "śmieci"??

    • "śmieci" raczej nie wyłapuje no chyba że masz coś obok co wysyła sygnał podczerwony. Spróbuj w tych nie działających diodach, pozmieniac w programie przyciski.

    • Sprawdzałem, czy coś w ogóle na działanie układu wpływa. Odłączyłem TSOP'a i jego rezystor wraz z kondensatorem i podłączyłem układ do zasilania tylko z diodami led i rezystorami do nich. Włączyłem układ i zapaliła się ostatnia (u mnie) dioda led, poczekałem trochę – zgasła i zapaliła się pierwsza (u mnie), tak więc po stwierdzeniu takiego czegoś odłączyłem zasilanie.

    • Jak dobrze zrozumiałem, to po odłączeniu TSOPa diody się zapalały same z siebie ?

  • Tak.

  • przedstaw w jaki sposób filtrujesz zasilanie

  • Przy uC mam tylko 1 kondensator 100nF, jest blisko VCC. No i mam jeszcze kondensator 100uF przy TSOP'ie.

  • Standardowo i prawidłowo powinno być jeszcze 100uF przy uC. Do tsopa oczywiście masz rezystor.

  • Tak do TSOP'a mam rezystor.

    • także wlutuj ten elektrolit i problemu z zasilaniem nie powinno być.

  • Dałem koło uC (blisko VCC) kondensator 2,2uF tak jak tu —>
    http://mirekk36.blogspot.com/2012/12/filtrowanie-zasilania-dlaczego-tak-wazne.html
    I podłączyłem zasilanie, na początku nic się nie działo aż w końcu ostatnia dioda się zapaliła i zgasiła, a zapaliła się trzecia. Więc dałem jeszcze na zasilanie kondensator 100uF i nic się nie działo. (miejmy nadzieje, że już nic nie będzie wariować)

  • Zrobiłem to samo ja Ty: http://feriar-lab.blogspot.com/2012/11/kurs-bacom-3-pierwszy-program.html z tymi kondensatorami tak jak pisałem wyżej i działa normalnie.

  • no to jeden problem z głowy ;) teraz jak już wszystko sprzętowo jest dobrze zrobione to chyba wina leży po stronie pilota.

  • To teraz pozostaje mi kupić pilot rc5, ale znalazłem pilot od Belstara może będzie działa. (później sprawdzę)

  • No niestety z pilotem od Belstara też nie działa.

  • To co siedzi w pilocie od Belstara to PCA8521 datasheet –> http://www.datasheetcatalog.com/datasheets_pdf/P/C/A/8/PCA8521.shtml i tam pisze, że to jest "Infrared remote control transmitter RC5"

  • ehhh… Sprawdź połączenie tsopa i sprawdź w BASCOMie na który piny jest zadeklarowany.

  • Zmieniłem w kodzie tylko to: Config Rc5 = portb.0 na Config Rc5 = PIND.5 i działa jak należy z pilotem od Belstara :)

  • Dzięki :)

  • Anonimowy

    Witam,

    Mam problem. Połączenia – OK; program jak wyżej (testowałem również własną, nieco zminimalizowaną formę, ale dla wykluczenia blędu, posługuję się powyższym wzorcem). Testowałem zarówno na wewnętrznym oscylatorze jak i zewnętrznym rezonatorze kwarcowym. Problem jest następujący: pilot załącza raz za 1 razem, raz za 3 naciśnięciem przycisku. Nie jest to kwestia pilota, bo mam podpiętą również diodę pod wyjście z układu TSOP i widzę jak bezbłędnie odbiornik podaje masę. Co może być tego przyczyną? Z góry dziękuję za wszelkie sugestie.

    • Witam,
      z czego zasilany jest układ ? oraz czy dobrze jest filtrowane napiecie? (kondensator przy TSOPie i rezystor)

    • Anonimowy

      Witam,

      Dziękuję za reakcję. Odpowiadam:

      1) Wykorzystuję płytkę ZL11AVR z wbudowanym uC Attiny2313; zasilałem ją zarówno z programatora USBASP jak i z zasilacza 12V – w obu przypadkach napięcie przechodzi przez typową aplikację LM7805.

      2) Kondensator przy TSOP zgodnie ze schematem; czyli 100 uF między GND i VCC oraz 200R na szynie VCC (w moim przypadku akurat dwa rezystory 100R połączone szeregowo).

      Próbowałem już zmieniać wartość kondensatora; rezystora; wreszcie uzyłem innego TSOP'a (również 1736). Efekt ten sam, czyli: załącza i wyłącza za 1 razem, a przy drugim teście np. za 3 lub i za szóstym, zależnie od kaprysu.
      Mogę dołączyć zdjęcie, choć nie sądzę aby cokolwiek wnosiło. Jakiś jeszcze pomysł, co tu może nie grać?

    • Podłącz TSOPa pod pin PD6 i zmien w programie na :

      Config Portd.6 = Input
      'albo
      Config RC5 = Portd.6

    • Anonimowy

      Przerabiałem już to, ale zgodnie z Twoją sugestią zmieniłem na Config RC5=Portd.6 i przepiałem wyjście z TSOP. Jest to samo, z taką różnicą, że widzę (tak jak w okrojonym programie, który sam napisałem) na wyświetlaczach 7-segmentowych impulsy odbierane przez TSOP. Czyli sygnał dochodzi z pilota za każdym razem, tylko kicha się zaczyna przy załączeniu.
      No nic, jutro spróbuję jeszcze złożyć wszystko na stykówce, z pominieciem ZL11AVR, bo powoli mi się koncepcje kończą. Dziękuję za chęć pomocy.

    • Faktycznie dobrze by spróbować zrobić to na stykówce bo peryferia w ZL mogą blokować przejście sygnału. Nie ma spraw. Jak masz problem to pisz ;)

    • Anonimowy

      Złożyłem zestaw na płytce stykowej z zewnętrznym kwarcem i…. DZIAŁA bez zastrzeżeń. Teraz jednak mam pytanie – chciałbym uniknąć użycia zewnętrznego kwarcu i skorzystać z wewnętrznego oscylatora 4MHz. Ustawiam fusy, usuwam klauzulę CRYSTAL z kodu i…. znowu się zaczyna problem, czyli przełącza jak mu się zechce, raz za 1, raz za 5 razem. Jak zmienić kod, by uniknąć zewnętrznego kwarcu? Z góry serdeczne dzięki za podpowiedź.

    • No i właśnie robisz błąd ;) Crystal musi zostać bez względu na to czy używasz wewnętrzny czy zewnętrzny zegar ;) we fusebitach ustawiasz, z którego sprzętowo ma korzystać zegar, natomiast w programie "informujesz" mikrokontroler o jakiej częstotoliwości jest podłączony zegar :)

    • Anonimowy

      Problem rozwiązałem. Poniżej prezentuję wnioski (może zaktualizujesz tutorial):

      1) Deklaracja CRYSTAL jest zbędna. Jeśli fusebity zostaną właściwie ustawione, to zarówno Z jak i BEZ tego wpisu, program działa właściwie.

      2) Przyczyną moich kłopotów z przełączaniem był brak właściwego parametru w kodzie, który to parametr obowiązuje dla najnowszej (a taką posiadam) wersji oprogramowania BASCOM.

      UWAGA!
      Właściwy zapis deklaracji pinu odpowiedzialnego za odbiór sygnału z odbiornika TSOP:

      Config RC5=Pind.2, Wait=2000

      Właśnie parametr Wait=2000 rozwiązuje powyższe kłopoty z niepewnym przełączaniem. Z kolei jego brak prowadzi do wałkowania historii jak wyżej.

      Mam nadzieję, że tym razem to ja pomogłem ;)

      Pozdrawiam!