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

[Attiny2313V] Mały zasięg pilota IR

djogin 16 Maj 2010 17:38 3379 8
  • #1 8083017
    djogin
    Poziom 10  
    Witam
    Staram się zrobić pilota uniwersalnego do wyłączania i włączania telewizora i dekodera UPC. Dodatkowo chcę w pilocie zrobić coś na podobiznę funkcji SLEEP, mianowicie wyłączać telewizor i dekoder po zadanym czasie.

    Na chwilę obecną utknąłem przy próbie zwiększenia odległości na jaką nadaje pilot. Całość docelowo ma być zasilana 2 akumulatorkami R6 (czyli ok.2.4V). Przy połączeniu tak jak na schemacie zasięg pilota jest ok. 1.5m, a dioda wyraźnie świeci słabiej niż w standardowych pilotach.
    Co mogę zmienić w schemacie by zwiększyć zasięg pilota?

    [Attiny2313V] Mały zasięg pilota IR
  • #2 8083147
    WojtasJD
    Poziom 43  
    W przykładowym pilocie RC-5 zasilanym 2xR6 jest tak:
    R1=100Ω
    R2=1Ω
    T1=BC338-40
    oraz blisko szeregu Ir_LED+R2+ C-E(T1) stoi kondensator 47µF
  • #3 8083940
    hotdog
    Poziom 26  
    Chciałem tylko dodać, że kiepski zasięg też może być spowodowany odchyleniem częstotliwości. Zmierz, czy masz idealną częstotliwość na wyjściu z uC.

    No i R2 koniecznie zmniejsz.

    WojtasJD, ten kondensator normalnie między VCC i GND, tyle że blisko LED,R2 i T1?

    Pozdrawiam Jakub
  • #4 8084782
    WojtasJD
    Poziom 43  
    hotdog napisał:
    ten kondensator normalnie między VCC i GND, tyle że blisko LED,R2 i T1?

    Tak, krótkie wysokoprądowe impulsy będą sobie płynąć w obwodzie C: Ir_LED+R2+ C-E(T1), w tym pilocie baterie były na drugim końcu a ścieżki na PCB cienkie.
    T1 mógłby być małym nMOSfetem tyle, że pewnie będzie problem ze zdobyciem w wersji Low_treshold
  • #5 8085165
    djogin
    Poziom 10  
    Na razie dla testów podłączyłem:
    R1=330Ω
    R2= 0
    i zdecydowanie się poprawiło jednak nie jest to jeszcze to czego oczekuję. Inna sprawa, ze gdy testowałem z R1=68Ω to pilot zaczynał się dziwnie zachowywać. Dioda zaczynała świecić zamiast mrugać, a odbiorniki w ogóle nie reagowały na sygnały.
    Jutro powinienem pójść do sklepu i zakupić rezystory 100Ω i 1Ω i wtedy zdam relację z testów :)

    Odnośnie częstotliwości to nie mam jej za bardzo jak zmierzyć :) Pseudo-oscyloskop (z karty dźwiękowej), który skonstruowałem by odczytać sygnały z oryginalnych pilotów nie wykrywa częstotliwości modulacji fali :) W każdym razie priorytetową sprawą jest wzmocnienie jasności mrugania diody, bo w fabrycznych pilotach daje ona mocno po oczach, a u mnie ledwo się żarzy.

    A teraz pytanie może z innej beczki. Na razie tylko teoretyczne :)
    By ograniczyć zużycie prądu planuję wykorzystywać 3 stany pracy procesora:
    1. normalny - gdy wysyła sygnały itp.
    2. idle mode - gdy odmierza czas po jakim ma wyłączyć odbiorniki. Za notą katalogową: w tym stanie CPU nie pracuje, natomiast Timery działają. Wybudzenie z tego stanu można przeprowadzić za pomocą wewnętrznego przerwania Timer Overflow
    3.Power-down - gdy wyłączy odbiorniki

    Czy takie rozwiązanie jest w jakiś sposób sensowne? Czy odmierzając ok 15-30 minutowe odcinki czasu w Idle Mode osiągnę oszczędność energii i czy jest to możliwe to zrealizowania?

    Proszę poprawić błędy w pisowni.
    Robak
  • #6 8085769
    hotdog
    Poziom 26  
    Hej. Moim zdaniem wyeliminowanie R2 spowoduje na dłuższą metę (o ile już nie spowodowało) uszkodzenie diody. Jedyne co ją teraz ratuje, to że pracuje impulsowo.

    Tak długich odcinków uśpienia nie osiągniesz. Z uśpienia, z tego co pamiętam, może wybudzić tylko WDT (watch dog timer) w trybie przerwania (nie resetu). Tam możesz ustawić maksymalnie 8s.

    Oczywiście nic nie stoi na przeszkodzie żeby zliczać te odcinki 8 sekundowe. Oczywiście domierzanie czasu w ten sposób jest dalekie od ideału - są duże odchylenia w funkcji temperatury i napięcia.

    Żeby osiągnąć takie odcinki trzeba zastosować RTC z ustawionym alarmem. Wyjście alarmu podłączasz wtedy pod przerwanie zewnętrzne.

    No i jeżeli chcesz wprowadzać w uśpienie układ, to przyciski podłącz pod wejścia które mają przerwania zewnętrzne (INTx, INTx lub PCINTx). Wtedy po naciśnięciu przycisku będziesz mógł wybudzić układ.

    Częstotliwość na RC5 jest 36KHz, więc spokojnie powinieneś ją odczytać za pomocą oscyloskopu z karty muzycznej.

    Pozdrawiam
  • #7 8086177
    Nawigator
    Poziom 33  
    djogin jak ty to robisz ze widzisz świecenie diody w podczerwieni?
    W jakim kolorze świeci ta dioda?

    N.
  • #8 8087246
    djogin
    Poziom 10  
    Wyeliminowanie R2 było tylko chwilowe. Wiem, że w ten sposób najłatwiej spalić diodę, ale chwilowo nie mam pod ręką rezystora 1Ω.

    Wykorzystanie RTC to chyba trochę przerost formy nad treścią. Sam RTC, jeśli dobrze popatrzyłem w sklepie, kosztuje tyle co cały pilot, więc to średnio opłacalne. Poza tym wielka dokładność nie jest mi potrzebna (plus minus 5 minut dla odcinka czasu 30 minut jest w zupełności wystarczające).

    Nad zastosowaniem WDT się zastanawiałem i chyba takie rozwiązanie wybiorę. Będę musiał tylko o tym doczytać bo na razie to czarna magia.
    RTC to ostateczność.

    Na podłączanie przycisków do wejść z przerwaniami zewnętrznymi już zwróciłem uwagę.

    Odnośnie oscyloskopu to faktycznie - masz rację. Podłączając wyjście mikrokontrolera powinienem odczytać to bez problemu. Źle skojarzyłem, bo jak na razie korzystałem diody IR podłączonej do karty na którą świeciłem pilotami by odczytać sygnały. W takim rozwiązaniu modulacji nie widziałem.


    @Nawigator patrzę przez aparat cyfrowy.
  • #9 8108015
    djogin
    Poziom 10  
    Witam ponownie

    Wykonałem pilota i wszystko wygląda niby OK, ale pojawił się problem z wyłączaniem telewizora po zadanym czasie.

    Zamieszczam kod obsługi przerwania Watchdoga:
    SIGNAL (SIG_WDT_OVERFLOW) 
     {
      czas--;
      PORTB |= _BV(6);
      if (czas==667) PORTB &= ~_BV(3);
      if (czas ==217) PORTB &= ~_BV(4);
      if (czas == 1) {
    	PORTB &= ~_BV(5);
    	//wylaczanie dekodera i telewizora
    	upc_send(0);     
    	_delay_ms(200);
    	sharp_send();
    	_delay_ms(40);
    	sharp_send();
    	
    	wdt_reset(); 				
    	wdt_disable();				
    	isWDT=0;
    	czas=0;
      }
    	_delay_ms(40);
    	gotosleep();
      }


    Z tego co zaobserwowałem to przy czas=1 jest wykonywana tylko instrukcja zgaszenia diody ( PORTB &= ~_BV(5); ). Czym jest to spowodowane? Gdzieś czytałem, że przerwania powinny być jak najkrótsze, a wysyłanie kodów IR (na delay'ach) do najszybszych nie należy. Czy da się to jakoś obejść?

    Pozdrawiam
REKLAMA