Sensor IR w standardzie NEC VS1838B

5/5 - (2 votes)

Jak sobie poradzić z tematem odbiornik / sensor IR w standardzie NEC VS1838B?

małe PCB z kondensatorami i pullup do testów sensora VS1838

małe PCB z kondensatorami i pullup do testów sensora VS1838

Powszechnie wiadomo, że Bascom AVR ma wsparcie dla odbioru i nadawania IR w standardzie RC5, oraz nadawania w standardzie RC6 i Sony, dzięki wbudowanym poleceniom. Do dyspozycji mamy: RC5SEND, RC6SEND, RC5SENDEXTSONYSEND, GETRC5. Polecenia do wysyłania danych korzystają z Timera1, a odbierające/dekodujące dane z Timera0 (istnieje możliwość zmiany), i o tym trzeba zawsze pamiętać.

Czujnik 1838T pracuje na częstotliwości nośnej 37,9kHz zasilany w przedziale 2,4 do 5,5V (graniczne 7,5V). Cechuje go niskie zużycie energii 0,85mA, szeroki kąt 35° i odbiór z dalekiej odległości do 11m. Wyjście jest zgodne ze standardem  TTL, i poziomami CMOS, – aktywny stan niski. Temperatura pracy -30 – +80℃
VS1838T zawiera szybką fotodiodę PIN, o wysokiej czułości i niskim zużyciu energii, wysoki zysk przedwzmacniacza IC, a także obudowę z suchej żywicy epoksydowej, odporną na zarysowania, oraz zewnętrzną osłonę anty-scratch, produkt ma certyfikat SGS.

Cechy, które odróżniają pozostałe typy:

VS1838 pracuje na częstotliwości nośnej 38,0kHz, i może być zasilany w przedziale 2,2 do 6,0V. Pobór prądu 0,4mA. Kąt pracy 45° i odbiór z odległości typowo 20m. Temperatura pracy -20 – +85℃.

VS1938B pracuje na częstotliwości nośnej 38,0kHz, i może być zasilany w przedziale 2,7 do 5,5V. Pobór prądu 0,4mA. Kąt pracy 45° i odbiór z odległości typowo 20m. Temperatura pracy -20 – +85℃. To ten zakuty w blachę 😉

Specyfikacja standardu:

  • 8 bitów adresu i 8 bitów polecenia
  • Adres i polecenia przekazywane są dwa razy dla niezawodności
  • Modulacja długości impulsów
  • Częstotliwość nośnej 38kHz
  • Czas trwania bitu 1.125ms lub 2.25ms

Protokół NEC umożliwia kontrolę ponad 256 różnych urządzeń z 256 różnymi poleceniami dla każdego z nich.

widok przebiegu odbieranego komunikatu w standardzie IR NEC, z podziałem na bajty

widok przebiegu odbieranego komunikatu w standardzie IR NEC, z podziałem na bajty

Wracając do powyższego rysunku, nadawanie jest rozpoczynane przez impuls AGC trwający 9ms, który był używany do ustawienia wzmocnienia we wcześniejszych odbiornikach podczerwieni. Przez kolejne 4,5ms trwa przerwa, a później zaczyna być odbierany adres i numer rozkazu.
Nadawane słowa mogą mieć różną zawartość w zależności od tego czy przycisk jest przytrzymywany czy krótko naciśnięty. Każda pierwsza wiadomość zawiera 32 bity z czego (w kolejności odbierania) pierwszy bajt zawiera adres, drugi identyczny adres w postaci zanegowanej, trzeci bajt zawiera numer kodu/rozkazu, a czwarty ten sam kod w postaci zanegowanej. Przy trzymanym przycisku, każda kolejna wiadomość zawiera tylko impuls wstępny i jeden pojedynczy impulsu stopu, wskazujący klucz powtórzeń. Jest to kontynuowane tak długo, jak długo klawisz jest przytrzymywany.

Powtórzone dane w formie zanegowanej, można użyć do weryfikacji poprawności odebranych bitów.Całkowity czas transmisji jest stały! Przy budowie swojego nadajnika w razie potrzeby powtórzone zanegowane dane można ignorować, lub wykorzystać do rozszerzenia długości adresu i rozkazu do 16 bitów …

przebieg z zobrazowanym czasem trwania sygnału logicznej jedynki i zera

przebieg z zobrazowanym czasem trwania sygnału logicznej jedynki i zera

Jak widać na obrazku, protokół NEC wykorzystuje kodowanie długości impulsów bitów. Każdy impuls o czasie trwania 560μs jest serią nośnej 38kHz (ok. 21 cykli). Logiczna „1” trwa 2.25ms transmisji, gdy logiczne „0” jest tylko połową tego czasu, jako 1.125ms.

Jak już wiemy, gdy określony przycisk nie jest krótko naciśnięty, tylko przytrzymany, adres i rozkaz nie są już nadawane. W takim przypadku nadawany jest rozkaz powtórzenia. Trwa to dopóki dopóty klawisz jest wciśnięty. Ten rozkaz to po prostu 9ms impuls AGC a następnie przerwa 2.25ms i seria nośnej trwająca 560μs powtarzane co 110ms, do czasu puszczenia przycisku w nadajniku. Zobrazowano to na rysunkach poniżej.

przebieg nagłówka z powtórzeniem

przebieg nagłówka z powtórzeniem

przebieg ze zobrazowaną serią rozkazów powtórzenia

przebieg ze zobrazowaną transmisją,
na początku schematycznie przedstawiony normalny przebieg transmisji
a potem seria rozkazów powtórzenia

Protokół NEC stał się tak popularny, że szybko wszystkie możliwe adresy zostały wykorzystane i zarezerwowane dla poszczególnych urządzeń. Poświęcając redundancję adresu, rozszerzono zakres z 256 możliwych do około 65000 różnych adresów. Zrezygnowano z zanegowanego powtórzenia adresu. W ten sposób zakres został wydłużony z 8 bitów do 16 bitów bez zmiany innych właściwości protokołu.
Rozszerzając zakres adresu w ten sposób całkowity czas komunikatu nie jest już stały. Jest teraz zależny od ogólnej liczby 1 i 0 w komunikacie.
Jeżeli chcemy zachować stały całkowity czas wiadomości, ważne aby upewnić się czy liczba jedynek w polu adresu wynosi 8 (to automatycznie oznacza, że liczba 0 również wynosi 8). Zabieg ten spowoduje zmniejszenie maksymalnej liczby różnych adresów do około 13000.

Przy dekodowaniu nieznanego adresu należy dokładnie zbadać, czy nie zastosowano protokołu rozszerzonego przez porównanie odebranego adresu z adresem zanegowanym. Sprawdzenie chyba najprościej wykonać przez dodanie tych wartości, w przypadku zgodności wynik powinien wynieść 255.

Dla zestawienia podstawowej różnicy między nadajnikiem a odbiornikiem zamieszczę dodatkowy rysunek.

różnice między odbiornikiem i nadajnikiem w generowanym przebiegu

różnice między odbiornikiem i nadajnikiem w generowanym przebiegu

Mamy już podstawowe informacje o standardzie NEC więc możemy zabrać się za odbieranie i dekodowanie danych „złapanych” przez sensor VS1838 😉

A więc do dzieła.

Postępując według starej prawdy: chcesz coś zrobić to sprawdź czy już ktoś tego nie zrobił, umiesz to zrobić lepiej więc zrób od nowa … wpadłem w czeluści internetu, długo nie mogłem znaleźć czegoś co by mi odpowiadało.
Po długotrwałych poszukiwaniach wyłowiłem sobie działający kod Bascom AVR. Odpowiada mnie dlatego, że nie zawierał wstawek asemblerowych w związku z czym będzie działał na różnych µC i jest przejrzysty. Nie ma tam żadnej czarnej magii ;-p Oto on

 i drugi,

 który był pierwszy/źródłowy nie wiem, ale drugi jest bardziej rozwinięty. Więc moim zdaniem dał podwaliny temu pierwszemu, oczywiście nie twierdzę, że ktoś przygarnął sobie czyjąś pracę …
Na tej podstawie po małej optymalizacji opracowałem swój odbiornik IR według specyfikacji NEC, i zaszczepiam go do projektu sterownika dwóch źródeł światła led sterowanych przez PWM na ATtiny44. Prace trwają … (AD2013-12-07). Po ich zakończeniu przedstawię moją wersję kodu odbiornika i trochę go omówię co tam się dzieje.

A.D. 2014-09-27 Miałem dopisać co i jak bo naobiecywałem …. i co?


Nota katalogowa VT1838Tpdf.pdf (3892 pobrania )
Nota katalogowa VS1838.pdf (3787 pobrań )
Nota katalogowa VS1838B.pdf (3753 pobrania )

Rysunki z przebiegami, oraz duża dawka wiedzy o protokole NEC zaczerpnięta z tej witryny, z działu baza wiedzy.

Otagowano , , , , , , , .Dodaj do zakładek Link.

12 odpowiedzi na „Sensor IR w standardzie NEC VS1838B

  1. MIICHALUS komentarz:

    Witam

    Istnieje możliwość zoptymalizowania kodu odbiornika abym mógł go wgrać na ATMEGA8 lub mniejszego?

    Mam tylko jeden pin wyjściowy (włącz wyłącz) bez obsługi wyświetlacza.

     

  2. MIICHALUS komentarz:

    Jeszcze może głupie pytanie, ale pod jaki pin podpinamy czujnik IR w drugiej wersji programu ??

    • kaktus komentarz:

      Wiesz co odpowiem w dwóch częściach. Najpierw nie na temat … który Cię interesuje.
      Jest takie przysłowie: „nie ma głupich pytań, są tylko głupie odpowiedzi”
      Co może oznaczać, że nawet złe, lub źle zadane pytanie, o ile uzyskamy dobrą odpowiedź czyni nas mądrzejszymi. Tylko głupie odpowiedzi są złe, z głupich pytań można coś wynieść.
      Teraz do rzeczy 😀
      Z kodu wynika, że obsługa jest inicjowana przez zewnętrzne przerwanie Int1.

      Config Timer0 = Timer , Prescale = 256 '8000000/256=31250 Hz
      Config Int1 = Falling 'Interruption on Falling
      Stop Timer0
      Enable Timer0
      Enable Int1
      On Timer0 Tikers 'work on timer
      On Int1 Infrared

      Więc musisz tam doprowadzić odpowiedni sygnał sterujący. Inaczej mówiąc odszukaj w swoim µC pin o takiej nazwie, i tam doprowadź wygnał ze swojego sensora.

  3. MIICHALUS komentarz:

    Niestety brak reakcji przy Int1

    Posprawdzałem piny wszystkie i jedyna reakcja była przy resecie:D

  4. pit_i_mat komentarz:

    Co trzeba zmienić w kodzie aby pilot działał z kwarcem 11.0592MHz?

    • pit_i_mat komentarz:

      Chodzi mi o pierwszy kod, ten mniej rozbudowany 😉

      • kaktus komentarz:

        Witam.
        Musisz dostroić system przerwań tak by działał zgodnie z komentarzami w kodzie.
        Config Timer0 = Timer , Prescale = 256 '8000000/256=31250 Hz
        Chodzi o to by uzyskać częstotliwość generowanego przerwania = 31250Hz. W razie rozbieżności konieczne może okazać się „dostrojenie” wartości tik w liniach:
        If Tik >= 139 And Tik < 150 Then 'if has happenned from 139 before 150 teaks - "START"
        oraz
        If Tik >= 116 And Tik < 139 Then 'if has happenned from 116 before 138 teaks - "REPETITION"
        kolejnej:
        If Tik >= 22 And Tik < 116 And Start_flag = 1 Then 'if has happenned from 22 before 115 teaks - have taken "1"
        i tej:
        If Tik >= 10 And Tik < 22 And Start_flag = 1 Then 'if has happenned from 10 before 21 teaks - have taken "0"
        Dlatego najlepiej będzie pochylić się i dobrze wybrać czas generowanego przerwania, by był jak najbardziej zbliżony do 8,192ms.

        Zwróć też uwagę na fakt iż w obsłudze przerwania autor obcina czas:
        Timer0 = 253 '31250/(256-253)=10416,66 Hz (96 een)
        W razie komplikacji z konfiguracją systemu przerwań, tu też należy nanieść stosowną zmianę.

        Jeśli masz problem z obliczeniem wartości dla konfiguracji timerów polecę Twojej uwadze to narzędzie: AVR Timer oblicza co trzeba i generuje kod dla Bascom AVR.

  5. pit_i_mat komentarz:

    Ślicznie dziękuję za tak obszerną odpowiedź co należy zrobić, ale jestem zbyt cienki w uszach aby to zrobić. Myślałem, że będzie to prostsze 🙁

    • kaktus komentarz:

      W takim razie może jeszcze prościej 😉
      Kliknij w witrynkę, jest w obcym języku ale to nie szkodzi.
      W okienku podpisanym Quarzfrequenz: wpisz 11.0592, kolejnie tam gdzie jest podpis Wunschzeit/Frequenz: wpisz 8.192. Zaznacz Timer0.
      Zaobserwuj jak się zmienia przykład kodu w poniżej ramce, wraz z obfitymi komentarzami. Nowe obliczenia zawierają nieznaczny odchył, od założeń.
      Te nastawy dotyczą wstępnej konfiguracji timera.

      Po poprawieniu swojego kodu o prezentowane wartości, zrób próby, jak wszystko będzie działało to nie trzeba nic więcej zmieniać, w przeciwnym wypadku pomyślimy.

      • pit_i_mat komentarz:

        Zrobiłem coś takiego, ale pilot ani drgnie.

        $regfile = "m32def.dat"
        $crystal = 11059200
        (...)
        Const Timer0_preload = 168

        Config Timer0 = Timer , Prescale = 1024 '8000000/256=31250 Hz
        Config Int1 = Falling 'Interruption on Falling
        Stop Timer0
        Timer0 = Timer0_preload
        Enable Timer0
        Enable Int1
        Enable Interrupts
        On Timer0 Tikers 'work on timer
        On Int1 Infrared 'work on interruption
        Dim Got As Bit
        Dim Tik As Word 'counter of teaks of timer
        Dim Byt As Byte 'counter accepted bit
        Dim Repeat_flag As Bit 'flag of repetition
        Dim Start_flag As Bit 'flag of start condition
        Dim Address_1 As Byte 'direct byte of address
        Dim Command_1 As Byte 'direct byte of command
        Dim Address_0 As Byte 'indirect byte of address
        Dim Command_0 As Byte 'indirect byte of command
        Dim Summa As Word
        Dim Address_nec As Byte , Command_nec As Byte
        Cursor Off 'Switch Off cursor

        • kaktus komentarz:

          To teraz w linii: Timer0 = 253 '31250/(256-253)=10416,66 Hz (96 een)
          popraw na Timer0 = 253 na 255
          Heehh ten komentarz ’31250/(256-253)=10416,66 Hz już jest nie na miejscu … zresztą tak jak i poprzedni. Po modyfikacji kody wprowadza w błąd.

          Sęk w tym, że „prawdziwa nastawa” timera do dekodowania, ukryta jest w obsłudze jego przerwania.
          Do licznika ładowana jest wartość określająca czas przepełnienia, i wywołania przerwania. Teraz z uwagi na wyśrubowanie timmingu (żwawszy inny rezonator) wyszło trochu ekstremalnie i do licznika ładowana jest jego maksymalna wartość, czyli przerwanie występuje za każdym razem po zwiększeniu licznika ;-D

          Spowodowane jest to mniejszą pojemnością licznika 8-bitowego (który użyłeś), w porównaniu do 16-to bitowego. W razie gdybyś chciał można wszystko przełożyć na inny timer – o większej pojemności.
          Czasy są teraz mniej precyzyjne od poprzednich. Przetestuj dokładnie wszystko by później nie było wpadki.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

cztery + 18 =

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.