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

[tiny2313][c]Pilot podczerwony

carkar 02 Lip 2010 17:55 2517 26
REKLAMA
  • #1 8254891
    carkar
    Poziom 15  
    Witam.
    Chcę zrobić pilot IR.
    Zacznę od nadajnika:
    dioda IR podłączony --- attiny2313.

    np. jeżeli chcemy wysłać sygnał 1 to wysyłamy sygnał[zapalamy diodę] na 10ms.
    następnie gasimy.
    Jeżeli 2 to zapalmy diodę na 10 ms gasimy i znów zapalamy na 10ms i gasimy.
    itd.

    odbiornik:
    fototranzystor -- attiny 2313 --- przekaźnik
    i teraz:
    cały czas sprawdza czy jest obecność promieniowania IR jezeli tak to: czeka 10ms i znów sprawdza, jeżeli nie ma już promieniowania to znaczy że był to sygnał 1 jeżeli sygrał się utrzymuje to znaczy że jest to sygnał dalszy itd...

    I teraz czy zna ktoś lepszy sposób??
    Czy ten który ja wymyśliłem nie będzie obarczony błędem??
  • REKLAMA
  • Pomocny post
    #2 8255111
    OlekM
    Poziom 17  
    Gorąco polecam dodanie modulacji do przesyłanych danych.
    Przedstawione rozwiązanie z fototranzystorem będzie podatne na obecność stałych źródeł promieniowania podczerwonego. Zastosowanie sygnału modulowanego, pozwala na łatwe wyodrębnienie w odbiorniku sygnału użytecznego.

    Podczas nadawania musiałbyś wystawić na diodę sygnał o częstotliwości np. 36kHz. Dość łatwo można to zrobić wykorzystując timer w trybie CTC. Jako odbiornik, proponuję zastosować układ, który zajmie się całą analogową obróbką sygnału - taki jak TSOP1736. Na jego wyjściu otrzymasz przebiegi już po demodulacji, zatem bez tej dodatkowej częstotliwości.

    Co do samego algorytmu kodowania, to oczywiście jego złożoność zależy od tego, ile informacji zamierzasz nim przenieść. Zaproponowana koncepcja, chyba nie posiada "śmiertelnie poważnych" wad. Tym niemniej, kiedy projekt już pierwszy raz zadziała, proponuję rozważyć zastosowanie jakiegoś powszechnie uznanego kodowania (jak RC5 czy SIRC) :-)

    Wiele ciekawych informacji na ten temat, można znaleźć na stronach SB-Projects.
  • REKLAMA
  • #3 8255429
    carkar
    Poziom 15  
    No dzięki. W sumie to potrzeba mi tylko 2 przyciski. ON i OFF.
    Chcę z kanapy np. zgasić światło.
    Cytat:
    Przedstawione rozwiązanie z fototranzystorem będzie podatne na obecność stałych źródeł promieniowania podczerwonego.

    Jakie??
    Cytat:
    "TSOP1736"
    jak to działa??

    Dodano po 51 [sekundy]:

    Jak przełączyć diodę w 36MHz??
  • Pomocny post
    #4 8255515
    OlekM
    Poziom 17  
    Co do źródeł promieniowania podczerwonego, to najoczywistszym jest Słońce, dalej wszystkie żarowe źródła światła, no i ostatecznie wszystkie inne piloty IR :-)

    TSOP1736 odbiera podczerwień i z odebranego sygnału wybiera tą część, która przejdzie przez filtr o częstotliwości około 36 kHz. Dzięki temu nie zareaguje na słońce lub żarówkę. Na jego wyjściu będzie 0 gdy układ "widzi Twoją podczerwień" i 1 gdy nic się nie dzieje.

    Dołączasz do niego +5V i masę a trzecie wyjście do mikrokontrolera. W mikrokontrolerze na nóżce sensora włączasz rezystor pull-up. I to tyle jeśli chodzi o połączenia.

    Co do sterowania diody - to ma być "tylko" 36 kHz :-)
    Aby dioda migała z taką częstotliwością, musimy zmieniać stan jej pinu 72000 razy na sekundę.

    Zakładam, że pracujesz z rezonatorem 8MHz. Wówczas, stan pinu musisz zmieniać co 8000000 / 72000 = 111 cykli zegara. Zatem konfigurujesz timer w tryb CTC, i ustawiasz, że ma liczyć do wartości 111 (albo 110, nie pamiętam). Za każdym razem gdy timer się przepełnia - niech zmieni stan nóżki z diodą - wówczas dioda będzie migać z częstotliwością 36 kHz. Proponuję wybrać TIMER0 a diodę podłączyć do nóżki PD5 lub PB2 (które mogą być wyjściami timera).
  • #5 8255533
    carkar
    Poziom 15  
    Nie pracuje bez rezonatora, 1MHz.
    Czy mógłbyś mi napisać prosty program, bo po prostu nic nie rozumiem :)

    Dodano po 45 [sekundy]:

    Czy TIMER0 to przerwanie??

    Dodano po 10 [minuty]:

    Aha. Już rozumiem!! :)
    Dzięki!!
  • Pomocny post
    #6 8255646
    OlekM
    Poziom 17  
    To będzie coś w takim stylu:

    
    #include <avr/io.h>
    #include <util/delay.h>
    
    void ir_on(void)
    {
    	//zacznij od 0
    	TCNT0 = 0;
    	//tryb CTC, zmień stan OC0B (czyli PD5) po każdym przepełnieniu
    	TCCR0A = (1<<COM0B0) | (1<<WGM01); 
    	//na pełnej prędkości rezonatora
    	TCCR0B = (1<CS00);
    	//1MHz / 72kHz = 14 - do tylu ma liczyć
    	OCR0A = 14; 
    }
    
    void ir_off(void)
    {
    	TCCR0B = 0; //stop
    	TCCR0A = 0; //puść pin z diodą
    	PORTD &= ~(1<<5); //ustaw PD5 na 0
    }
    
    int main(void) {	
    	DDRD = (1<<5); //PD5 jako wyjście
    	
    	//tylko do celów demonstracyjnych
    	while(1) { 
    		ir_on(); //zacznij wysyłać
    		_delay_ms(10); //poczekaj chwilę
    		ir_off(); //zgaś diodę
    
    		_delay_ms(200);
    	}
    }
    
    


    Niestety nie mam pod ręką TINY2313, żeby to przetestować - więc mogą być jakieś błędy. W każdym razie się kompiluje :-)
  • #7 8255765
    carkar
    Poziom 15  
    Proszę o kilka zdań wyjaśnień:
    Cytat:
    //zacznij od 0
    TCNT0 = 0;

    Rozumiem że zaczynasz licznik timera od 0 [JAK WIDZISZ BŁĄD W MOIM ROZUMOWANIU PISZ]
    Cytat:

    //tryb CTC, zmień stan OC0B (czyli PD5) po każdym przepełnieniu
    TCCR0A = (1<<COM0B0) | (1<<WGM01);

    Tu niestety nic nie rozumiem. :(
    Cytat:

    //na pełnej prędkości rezonatora
    TCCR0B = (1<CS00);

    Rezonator 1Mhz/
    Cytat:

    //1MHz / 72kHz = 14 - do tylu ma liczyć
    OCR0A = 14;

    Robienie częstotliowści 36 MHz

    Cytat:

    void ir_off(void)
    {
    TCCR0B = 0; //stop
    TCCR0A = 0; //puść pin z diodą
    PORTD &= ~(1<<5); //ustaw PD5 na 0
    }

    Wszystko jasne poza TYM: PORTD &= ~(1<<5); nie lepiej: PORTD &=~0x05 ??
    Cytat:

    ir_on(); //zacznij wysyłać
    _delay_ms(10); //poczekaj chwilę
    ir_off(); //zgaś diodę

    Czyli to jest wysłanie pakietu wg mojego sposobu??
  • Pomocny post
    #8 8255879
    OlekM
    Poziom 17  
    carkar napisał:

    Rozumiem że zaczynasz licznik timera od 0

    Dokładnie

    carkar napisał:

    Cytat:

    //tryb CTC, zmień stan OC0B (czyli PD5) po każdym przepełnieniu
    TCCR0A = (1<<COM0B0) | (1<<WGM01);

    Tu niestety nic nie rozumiem. :(


    CTC znaczy Count To Capture. W tym trybie timer liczy w górę aż osiągnie pewną ustaloną wartość. W tej konfiguracji, wartość ta jest przechowywana w rejestrze OCR0A. Za moment wpiszę tam 14, zatem timer będzie liczył od 0 do 14.
    (prawdę mówiąc, to chyba powinno być 13, ale w tej chwili tego nie poprawię, by nie zaciemniać przykładu).

    Ustawienie bitu COM0B0 spowoduje, że po każdym dojściu timera do wartości przechowywanej w OCR0A stan pinu OC0B zmieni się na przeciwny.

    Ostatecznie liczenie w timerze będzie wyglądać tak:
    1. policz do 14
    2. zmień stan diody
    3. idź do punktu 1 :D

    carkar napisał:

    Cytat:
    //na pełnej prędkości rezonatora
    TCCR0B = (1<CS00);

    Rezonator 1Mhz/


    Tak, ustawienie tego bitu "wpuści" do timera taki sam zegar jaki taktuje rdzeń procesora - czyli w tym przypadku 1MHz.

    carkar napisał:

    Cytat:

    //1MHz / 72kHz = 14 - do tylu ma liczyć
    OCR0A = 14;

    Robienie częstotliowści 36 MHz


    Tu tylko zaznaczę, że chodzi o kHz :-)

    Mamy rezonator 1 MHz, kiedy będziemy w jego takt liczyć do 14, to w efekcie będziemy zaczynać liczenie ponownie 71428 razy na sekundę (ze wzoru 1 MHz / 14). Z taką częstotliwością będziemy zmieniać stan pinu do którego dołączona powinna być dioda. Na jeden okres "jej migania" przypadają dwie zmiany stanu - raz ją załączamy, drugi raz wyłączamy. Ostatecznie dioda miga z częstotliwością 35,7 kHz, co zaproponowany układ bez problemu wykryje.

    carkar napisał:

    Cytat:

    void ir_off(void)
    {
    TCCR0B = 0; //stop
    TCCR0A = 0; //puść pin z diodą
    PORTD &= ~(1<<5); //ustaw PD5 na 0
    }

    Wszystko jasne poza TYM: PORTD &= ~(1<<5); nie lepiej: PORTD &=~0x05 ??


    (1<<5) oznacza 0b00100000 czyli 0x20, zatem tą linijkę mógłbym zapiać jako:
    PORTD &= ~0x20;

    Wolę zapis w stylu (1<<5) ponieważ widzę od razu, że będzie dotyczył 5 pinu jakiegoś portu. Ale to kwestia jedynie nawyku :-)

    carkar napisał:

    Cytat:

    ir_on(); //zacznij wysyłać
    _delay_ms(10); //poczekaj chwilę
    ir_off(); //zgaś diodę

    Czyli to jest wysłanie pakietu wg mojego sposobu??


    Mniej więcej, tak :-)
  • #9 8256478
    carkar
    Poziom 15  
    Jeżeli wyjdzie nam te 35,7 kHz to ten sam układ to wykryje??
    Nie jestem tego do końca przekonany wiem że są różne modele tego układu
    http://www.datasheetcatalog.org/datasheets/208/301092_DS.pdf
    zaraz na pierwszej stronie widać że chyba tak nie jest.

    Dodano po 22 [minuty]:

    A jaki będzie zasięg tego pilota??

    Dodano po 1 [godziny] 28 [minuty]:

    I jeszcze jedno:
    Jak będę to ja odczytywał na 2 układzie pod odbiornikiem....
    Czy pomimo tego że ta dioda miga ja będę widział ją w układzie[w drugiej attiny2313] jak migajaca czy sygnal ciągły??
  • #10 8257391
    OlekM
    Poziom 17  
    carkar napisał:
    Jeżeli wyjdzie nam te 35,7 kHz to ten sam układ to wykryje??
    Nie jestem tego do końca przekonany wiem że są różne modele tego układu
    http://www.datasheetcatalog.org/datasheets/208/301092_DS.pdf
    zaraz na pierwszej stronie widać że chyba tak nie jest.


    Ale już czwarta strona tego PDF'a daje nam nadzieję :-)
    Zobaczmy jaką częścią pożądanej częstotliwości jest nasze 35,7 kHz. Dzielę 35,7 kHz przez 36 kHz i okazuje się, że otrzymana częstotliwość stanowi 0.9917 oczekiwanej. Teraz proszę o rzut oka na "Figure 1" na stronie 4 pdf'a.

    Jak widać takie odstrojenie, (poniżej 1%) nie robi układowi prawie żadnej różnicy. Jego czułość spadnie może do 98% :-)

    Ok. A teraz coś z praktyki. Kiedy nie wiadomo, czy twój pilot działa na 36 kHz czy 40 kHz, kupujesz odbiornik na 38 kHz - i on "po prostu działa" niezależnie od typu pilota.

    carkar napisał:

    A jaki będzie zasięg tego pilota??


    Na to pytanie, odpowiedź jest bardzo prosta. Ponieważ zasięg zależy tylko od prądu, którym zasili się diodę nadawczą, od jej charakterystyki promieniowania, od charakterystyki kierunkowej i diody i odbiornika, od kąta pod jakim się trzyma pilot do odbiornika, od czułości odbiornika, od dokładności dostrojenia częstotliwości do filtru w odbiorniku i od warunków środowiskowych (jak obce źródła promieniowania), z czystym sumieniem mogę powiedzieć, że nie wiem :D

    carkar napisał:

    I jeszcze jedno:
    Jak będę to ja odczytywał na 2 układzie pod odbiornikiem....
    Czy pomimo tego że ta dioda miga ja będę widział ją w układzie[w drugiej attiny2313] jak migajaca czy sygnal ciągły??


    Kiedy nadajnik, będzie wysyłał do diody przebieg o częstotliwości 36 kHz, na wyjściu odbiornika będzie panowało 0 logiczne.

    Kiedy nadajnik przestanie migać diodą, na wyjściu odbiornika będzie jedynka logiczna.

    Proszę jedynie pamiętać o podciągnięciu wyjścia nadajnika do plusa zasilania. Można to zrobić z procesora, wewnętrznym rezystorem pull-up, lub rezystorem o wartości np. 10k poza procesorem.

    Co do układu nadajnika...

    [tiny2313][c]Pilot podczerwony

    Z powyższego obrazka proponuję "skopiować" obwód wyjściowy. Dosłownie rzecz biorąc R4, R5, D1, T2. Znalezienie tranzystora T2 jest drobnym wyzwaniem :D
  • #11 8257553
    carkar
    Poziom 15  
    Czy to musi być takie skomplikowane??????????
    Myślałem że po prostu dioda do układu, a widzę że to opiera się na układach 4047. Po co??
  • REKLAMA
  • Pomocny post
    #12 8257556
    Konto nie istnieje
    Poziom 1  
  • #13 8257598
    carkar
    Poziom 15  
    Aha. Dzięki. Czyli:
    AtTiny2313 - R4 - T2[baza]
    Vcc - D1 - R5 - T2[emiter]
    GND - T2[kolektor]

    Dobrze myślę??
  • #14 8257635
    OlekM
    Poziom 17  
    carkar napisał:
    Aha. Dzięki. Czyli:
    AtTiny2313 - R4 - T2[baza]
    Vcc - D1 - R5 - T2[emiter]
    GND - T2[kolektor]

    Dobrze myślę??


    Zamieniłeś nóżki tranzystora. Poprawnie będzie tak:

    AtTiny2313 - R4 - T2[baza]
    Vcc - D1 - R5 - T2[kolektor]
    GND - T2[emiter]
  • REKLAMA
  • #15 8257690
    carkar
    Poziom 15  
    Dzięki. Myślę że już sobie poradzę.

    Dodano po 8 [minuty]:

    Jednak nie. :) Jak to będzie przy odbiorniku.
    Czy może tak.(Oczywiście układ jest inny ale to nie ważne)
    [tiny2313][c]Pilot podczerwony
  • #16 8257707
    Konto nie istnieje
    Poziom 1  
  • #17 8257715
    carkar
    Poziom 15  
    Cytat:
    Co do sterowania diody - to ma być "tylko" 36 kHz
    Aby dioda migała z taką częstotliwością, musimy zmieniać stan jej pinu 72000 razy na sekundę.

    Dlaczego 72000. Skąd się to bierze??

    Dodano po 17 [minuty]:

    Cytat:

    (prawdę mówiąc, to chyba powinno być 13, ale w tej chwili tego nie poprawię, by nie zaciemniać przykładu).

    Jaka jest różnica??
  • #18 8257896
    OlekM
    Poziom 17  
    carkar napisał:
    Cytat:
    Co do sterowania diody - to ma być "tylko" 36 kHz
    Aby dioda migała z taką częstotliwością, musimy zmieniać stan jej pinu 72000 razy na sekundę.

    Dlaczego 72000. Skąd się to bierze??


    To dość intuicyjne - tak mi się wydaje. Jeśli mam przebieg o częstotliwości 36 kHz, to on 36000 razy na sekundę zmienia stan z 0 na 1 i także 36000 razy na sekundę zmienia stan z 1 na 0. Zatem w ciągu sekundy następuje 72000 zmian jego stanu.

    Patrząc na to od drugiej strony: jeśli będziemy zmieniać stan jakiejś nóżki 72000 razy na sekundę, to pojawi się na niej przebieg o częstotliwości 36 kHz.

    carkar napisał:
    Cytat:

    (prawdę mówiąc, to chyba powinno być 13, ale w tej chwili tego nie poprawię, by nie zaciemniać przykładu).

    Jaka jest różnica??


    Jeśli liczymy 0,1,2,....,13,0,1,2,....,13,0,1,2,....,13 to mijamy wartość zero co każde 14 zliczeń. Kiedy będziemy liczyć 0,1,2,....,14,0,1,2,....,14,0,1,2,....,14 to wówczas mijamy zero co 15 zliczeń. Krótko mówiąc, te sposoby liczenia różni częstotliwość z jaką zaczynamy zliczanie od początku.

    Dlaczego tak ważne jest "mijanie zera"? Bo wówczas nóżka mikrokontrolera będzie zmieniać stan na przeciwny. Dlatego zastanawiamy się jak często wypadnie zero. W jednym przypadku będzie to co 14 taktów zegara, w drugim przypadku co 15 taktów zegara (zatem mniej często).
  • #19 8257976
    carkar
    Poziom 15  
    Mówiłeś coś o PULL - UPie. Jak to zrobić.
    Czy możesz mi narysować shemat odbiornika??
    A czy możesz przy okazji polecić mi jakiś przekaźnik aby:
    - cewka wytwarzała pole magnetyczne już w 5 V
    - styki mogły osłuzyć nawet napięci gniazdkowe[230V]
  • #20 8258052
    OlekM
    Poziom 17  
    Załóżmy, że podłączysz odbiornik do pinu PD4 a przekaźnik do PB0.
    Aby włączyć rezystor pull-up na tym pinie, po prostu piszesz tak:
    
    PORTD |= (1<<4);
    


    Oczywiście, ten pin musi być ustawiony jako wejście. Ale o ile sam tego nie przestawisz (pisząc DDRD = ...), to nie trzeba nic więcej pisać.

    Teraz, jeśli chcesz odczytać wartość tego pinu, robisz tak:

    
    if(PIND & (1<<4)) {
      //to się wykona, gdy na PD4 jest '1', zatem brak sygnału podczerwieni
    } else {
      //to się wykona, gdy na PD4 jest '0', zatem odbiornik wykrywa sygnał
    }
    


    Twój ostateczny kod, zapewne będzie wyglądał podobnie do tego:

    
    int main(void)
    {
      PORTD |= (1<<4); //włącz pull-up
      DDRB |= (1<<0); //PB0 - ustaw jako wyjście
      while(1) //główna i niekończąca się pętla
      { 
        while(PIND & (1<<4)) { } //czekaj w tej pętli na nadejście impulsu
        _delay_ms(10);
        if(!(PIND & (1<<4))
        {
          //jeśli impuls wciąż trwa, wykonaj swoją akcję
          PORTB ^= (1<<0); //zmień stan PB0
          _delay_ms(300); //zignoruj możliwe kolejne impulsy
        }
      }
    }
    


    Co do przekaźnika, to warto "zapytać lokalnego dystrybutora" :-)
    A jeśli to nic nie pomoże, to może: tme.pl albo maritex.com.pl
    Generalnie, sugeruję by wszystkie testy robić bez wysokiego napięcia. Podłączenie całości do 230 V możesz wykonać tylko pod bezpośrednią opieką kogoś bardziej doświadczonego, kto zweryfikuje układ (a przynajmniej zna się na pierwszej pomocy przy wypadkach z prądem). Bezpieczeństwo przede wszystkim.
  • #21 8258063
    carkar
    Poziom 15  
    A ile A[amperów] jest w gniazdku?? :0
    Dzięki za wszystko.

    Dodano po 5 [minuty]:

    Cytat:

    Cytat:


    A jaki będzie zasięg tego pilota??


    Na to pytanie, odpowiedź jest bardzo prosta. Ponieważ zasięg zależy tylko od prądu, którym zasili się diodę nadawczą, od jej charakterystyki promieniowania, od charakterystyki kierunkowej i diody i odbiornika, od kąta pod jakim się trzyma pilot do odbiornika, od czułości odbiornika, od dokładności dostrojenia częstotliwości do filtru w odbiorniku i od warunków środowiskowych (jak obce źródła promieniowania), z czystym sumieniem mogę powiedzieć, że nie wiem Very Happy

    prąd taki jaki sam podałes czyli: 5v przechodzi przez T2 to dokładnie......... nie wiem :)
    chrakterystyka promieniowania: jaka jest najlepsza
    charakterystyka kierunkowa : to co wyżej
    czułośc odbiornika: no właśnie jak jest cxzułość tego TSOP1736?
    od dokładności dostrojenia częstotliwości do filtru: jak to nastrojić.


    :D

    Dodano po 41 [minuty]:

    No tak TESTY TO na np. diodzie..........................podłączonej do 500V :D
  • #22 8258258
    Konto nie istnieje
    Poziom 1  
  • #23 8258855
    carkar
    Poziom 15  
    Nie rozumiesz idei przekaźnika chyba.
    1. W nadajniku NIE BĘDZIE ŻADNEGO PRĄDU Z GNIAZDKA. TYLKO 5V.
    2. Odbiornik będzie działał PODOBNIE Z TYM ŻE:
    przekaźnik składa się z cewki[którą można zasilać małą energią. Jej celem jest wytworzenie pola magnetycznego, który przyciągnie syki przęłącznika obok tym samym włączy przepływ. Przekaźnik ma 2 najważniejsze cechy:
    - napięcie cewki[w moim przypadku 5v]
    - napięcie styków[chcę żeby były na 230V]
    Są do 2 rzeczy odzielone.

    Dodano po 10 [minuty]:

    http://pl.wikipedia.org/wiki/Przeka%C5%BAnik

    Dodano po 14 [minuty]:

    Jaki jest opór R5, bo przeczytać nie mogę.
  • #24 8258930
    Konto nie istnieje
    Poziom 1  
  • #25 8258933
    carkar
    Poziom 15  
    Dlaczego??
  • #26 8258969
    Konto nie istnieje
    Poziom 1  
  • #27 8260691
    carkar
    Poziom 15  
    Cytat:

    if(!(PIND & (1<<4))
    {
    //jeśli impuls wciąż trwa, wykonaj swoją akcję
    PORTB ^= (1<<0); //zmień stan PB0
    _delay_ms(300); //zignoruj możliwe kolejne impulsy

    Jezeli TSOP1736 daje 0 gdzy widzi sygnał to czy to na pewno jest poprawnie?>??

    EDIT: No tak poprawnie.
REKLAMA