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

Sterowanie telewizora komputerem

iceCocoo 30 Sie 2009 02:54 3538 4
REKLAMA
MediaMarkt Black Week
  • #1 6959340
    iceCocoo
    Poziom 10  
    Witam,

    Jak widać po ilości postów jestem nowy na forum, więc nie bijcie za mocno ;)

    Chciałbym zrobić układ sterujący telewizorem przy pomocy komputera. Coś a'la skrzyneczka, która sobie leży skierowana w odbiornik i za pomocą komend np. przełącza kanały (kiedy sobie zażyczę). Na początku myślałem, żeby przerobić pilot albo samemu zbudować na mikrokontrolerze. W ogóle zapomniałem, że istnieje coś takiego jak IRDA.
    Pytania to:
    Po pierwsze, czy przy pomocy IRDA byłbym w stanie nadawać odpowiedni sygnał do TV?
    Po drugie, co będzie prostsze do wykonania: 'pilot' oparty na mikrokontrolerze podłączony kablem do komputera czy IRDA (o ile to da radę).

    Docelowo będzie to na telwizor SONY (protokół http://www.sbprojects.com/knowledge/ir/sirc.htm).

    Nie jestem laikiem elektronicznym, ani informatycznym, ale wolałbym abyście traktowali mnie jako 'zielonego' :)

    Proszę nie pisać, by kupić jakiś gotowy, albo dać sobie spokój. Chciałbym to sam zrobić.

    Pozdrawiam
  • REKLAMA
    MediaMarkt Black Week
  • #2 6968194
    acid12
    Poziom 21  
    mnie sie wydaje że pomysł użycia uC + program na PC jest lepszym rozwiazaniem :)

    taki 'pilocik' to kwestia chwili, nawet na elektrodzie gdzies byly projekty, tego jest pelno na necie.
    Do tego konwerter z uart na usb (FTDI) i podpinasz do PC, tam prosty programik, chociazby pseudo pilot z guzikami :)
  • REKLAMA
    MediaMarkt Black Week
  • #3 6973351
    iceCocoo
    Poziom 10  
    Dzięki za odpowiedź :)

    Szukam i szukam, znaleźć nie mogę. Możliwe, że nie umiem szukać. Czy byłby ktoś podrzucić te linki ? Byłbym wdzięczny.
  • #5 6988135
    iceCocoo
    Poziom 10  
    Oczywiście dziękuję za pomoc. Bardzo się przydało. Nawet nie wiem czemu, ale myślałem, że to będzie cięższe.

    Z tego co mi podrzuciłem zrobiłem coś takiego (jak na schemacie). Gdzie R2 = 68ohm, a R1 = 1k (wcześniej 10k). Póki co porty TxD i RxD zostawiłem w spokoju, bo jeszcze nie mam przejściówki do USB kupionej. Kod do 'pilota' Sony sam napisałem w C. Nie jest to górnolotna wersja, po prostu pisałem na szybkiego, żeby zadziało. Czy działa to nie wiem, bo ani nie mam teraz nigdzie urządzenia Sony, ani nie do końca działa to co zrobiłem.

    Problem jest z diodą IR. Gdy podłączam zwykłą diodę (czerwona, 3mm) to fajnie mryga (na jakimś innym kodzie testującym). Natomiast po podłączeniu tej mojej diody IR nic nie widać (oczywiście, spoglądając przez aparat lub kamerę internetową). Nie wiem czy to wina np. małego natężenia, czy samej diody. Jakie są parametry takich IRek? Kiedy świecą i ile wytrzymują (natężenia, mocy)?


    Coś tutaj pozmieniać? coś polepszyć?

    #define F_CPU           1000000ul    // częstotliwość zegara w Hz
    #define UART_BAUD       19200ul                // prędkość transmisji bit/s
    
    #include <avr/io.h>             
    #include <avr/interrupt.h>
    #include <util/delay.h>
    
    #define LED_DDR			DDRB
    #define LED_PORT        PORTB                // port diody LED
    #define LED_BIT			0x01
    
    #define LED_ON  (LED_PORT = LED_BIT)
    #define LED_OFF (LED_PORT = 0x00)
    
    #define UART_CONST        (F_CPU/(16ul*UART_BAUD)-1)
    
    // Preprocesory
    void USART_send(uint16_t Data);
    uint8_t USART_receive(void);
    void init(void);
    void led_flashing(uint16_t data);
    
    
    void start_signal(void);
    void command_signal(uint16_t data);
    void adress_signal(void);
    
    void logic_1(void);
    void logic_0(void);
    
    void init(void)
    {
    	UCSRB = _BV(RXEN);
    	LED_DDR = LED_BIT;
    	LED_OFF;
    
    }
    
    
    int main(void)                        
    {
      init();
      uint16_t data;
    
    
      while(1)
      {
    
        //data = USART_receive();
    
    	data = 0x0Fa3;
    	//data = 0x0000;
    	led_flashing(data);
      }
    }
    
    // Definicje funkcji
    
    void led_flashing(uint16_t data)
    {
    	// start section
    	start_signal();
    	// signal received
    	command_signal(data);
    	// adress
    //	adress_signal();
    }
    
    void start_signal(void)
    {
    	LED_ON;
    	_delay_ms(2);
    	_delay_us(100);
    	_delay_us(100);
    	_delay_us(100);
    	_delay_us(99);
    	asm("nop");
    	asm("nop");
    
    	LED_OFF;
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(125);
    }
    
    void command_signal(uint16_t data)
    {
    	int i=12;
    	while(i)
    	{
    		if(data &0x01) 
    		{	// trzeba dodac nop, bo robi mniej clocka
    			asm("nop");
    			logic_1();
    		}
    		else logic_0();
    		data >>= 1;
    		--i;
    	}
    }
    
    void adress_signal(void)
    {
    	// For TV adress is 0001
    	logic_1();
    	logic_0();
    	logic_0();
    	logic_0();
    
    }
    
    void logic_1(void)
    {
    	LED_ON;
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(146);
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    
    	LED_OFF;
    	_delay_us(100);
    	_delay_us(100);
    	_delay_us(100);
    	_delay_us(100);
    	_delay_us(100);
    	_delay_us(86);
    }
    
    void logic_0(void)
    {
    	LED_ON;
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(144);
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    
    	LED_OFF;
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(132);
    }
    	
    
    
    void USART_send(uint16_t Data){
    	while((UCSRA&(1<<UDRE)) == 0);
    	UDR = Data;	
    }
    
    uint8_t USART_receive(void){
    	while((UCSRA&(1<<RXC)) == 0) ;
    	return UDR;
    }
    
REKLAMA