RSS

Interface Mikrokontroler AVR dengan Remote TV

24 Oct

A. Pendahuluan

Ide utama otomatisasi adalah meminimalkan tenaga manusia yang digunakan dalam melakukan beberapa pekerjaan. Dengan melakukan kontrol terhadap peralatan pada jarak tertentu tentu memudahkan manusia untuk tidak perlu berpindah tempat menuju alat yang dituju.

Dengan menggunakan TSOP penerima IR dapat dirancang sistem yang dapat membaca data dari remote TV. Rangkaian TSOP ini kemudian dihubung dengan mikrokontroler untuk mengolah sinyal yang ditangkap sehingga informasi dari kode remote dapat dibaca.

Terdapat banyak protokol IR yang ada. Setiap produk elektronik yang dilengkapi remote biasanya memiliki protokol unik sendiri. Salah satunya adalah televisi. Tiap merk TV memiliki protokol yang berbeda-beda seperti misalnya Sharp, Sony, Samsung, Changhong dan lain-lain. Pada tutorial ini dibahas mengenai pembacaan data remote menggunakan Sony Infrared Remote Control (SIRC)

B. Tujuan

Pada tutorial ini dibahas mengenai

  1. Cara membuat rangkaian penerima sinyal Infrared (IR) dengan TSOP
  2. Program Untuk membaca data IR yang ditangkap mikrokontroler

 

C. Detail Aplikasi

  1. Deskripsi

Langkah-langkah yang perlu dilakukan adalah

  1. Menyiapkan komponen yang diperlukan

Komponen yang diperlukan

–          TSOP 4838/1738 dengan frekuensi modulasi 36-40 kHz

 

Berbagai bentuk komponen TSOP yang digunakan

Perhatikan fungsi pin yang digunakan. Cari datasheet yang sesuai.

–          Remote TV

Remote yang digunakan adalah remote TV Sony

Atau bisa juga menggunakan remote TV Universal

–          Resistor  100 Ohm

–          Kapasitor 4.7 uF

–          Konektor

–          PCB

  1. Membuat skematik rangkaian
  2. Menghubungkan dengan Mikrokontroler
  3. Debugging data receiver dengan remote TV
  1. Skematik

Berikut ini adalah skematik rangkaian penerima IR dengan TSOP

Mikrokontroler yang digunakan adalah tipe AVR. Pin data pada TSOP masuk ke interrupt

Berikut adalah program yang digunakan untuk membaca data dari mikrokontroler. Data yang diperoleh kemudian ditampilkan melalui UART.

001 /* @author : saripudin
002    @date   : Sep 2011
003    @desc   : this program aim to read data signal from sony tv remote
004              using xtal 11.059200 MHz
005 */
006 #include <mega8.h>
007 #include <delay.h>
008 #include <stdlib.h>
009 #include <stdio.h>
010 #include <sleep.h>
011
012 #define ENABLE_INT0      GICR |= 0x40
013 #define DISABLE_INT0     GICR &= ~0x40   
014
015 unsigned char code, address;
016 char lcd1[16],lcd2[16];
017
018 // Declare your global variables here
019 unsigned int read_IR (void)
020 {
021     unsigned char pulseCount=0,  code = 0, address = 0, timerCount;
022     unsigned int IR_input;
023
024      // Jika data 1:1.2 ms    ____
025      //            0:0.6 ms  _|    |_
026
027     // 0...6 command
028      while(pulseCount < 5)
029     {
030        //jika OUT high menunggu, break apabila OUT low
031        while(PIND & 0x04);
032        TCNT0 = 0;
033
034        //menunggu OUT LOW
035        while(!(PIND & 0x04));
036        pulseCount++;
037
038        timerCount = TCNT0;
039
040        if(timerCount > 50)
041           code = code | (1 << (pulseCount-1));
042        else
043          code = code & ~(1 << (pulseCount-1));
044      }
045
046      // 0...4 address
047      pulseCount = 0;
048      while(pulseCount < 6)
049      {
050          while(PIND & 0x04);
051          TCNT0 = 0;
052
053          while(!(PIND & 0x04));
054          pulseCount++;
055
056          timerCount = TCNT0;
057
058          if(timerCount > 50)
059               address = address | (1 << (pulseCount-1));
060          else
061              address = address & ~(1 << (pulseCount-1));
062      }
063
064      IR_input = (((unsigned int)code) << 8) | address;
065
066      return(IR_input);
067 }
068
069 interrupt [EXT_INT0] void ext_int0_isr(void)
070 {
071      unsigned char count;
072     unsigned int IR_input;
073
074     TCNT0 = 0;
075     //menunggu delay selama 2.4 ms
076     while(!(PIND & 0x04));
077     count = TCNT0;
078
079     if(count < 35)         //to verify start pulse (2.4 ms long)
080     {                          //jika tidak maka interrupt lagi
081          delay_ms(20);
082          ENABLE_INT0;
083          return;
084     }
085
086     TCNT0 = 0;
087     //menunggu delay selama 2.4 ms
088     while(!(PIND & 0x04));
089     count = TCNT0;
090
091     if(count < 35)         //to verify start pulse (2.4 ms long)
092     {                          //jika tidak maka interrupt lagi
093          delay_ms(20);
094          ENABLE_INT0;
095          return;
096     }
097
098     //jika data diterima
099     IR_input = read_IR ();
100
101     code = (unsigned char) ((IR_input & 0xff00) >> 8);
102     address = (unsigned char) (IR_input & 0x00ff);
103
104      printf("%d %d\r",code,address);
105      delay_ms(50);
106
107     //keluarkan data
108     delay_ms(200);
109
110 }
111
112 void main(void)
113 {
114 /*
115 //8-bit timer for measuring delay between IR pulses
116 TCCR0 = 0x03; //CLK / 64  --->> 15625
117 TCNT0 = 0; //reset the timer
118
119 MCUCR = 0x02;
120 GICR  = 0x40;
121 TIMSK = 0x00; //timer interrupt sources
122 SEI(); //re-enable interrupts
123 */
124
125 DDRC = 0x03;
126 PORTC = 0x00;
127
128 PORTD = 0x00;
129 DDRD  = 0x00; //LED, for testing purpose
130
131 // Timer/Counter 0 initialization
132 // Clock source: System Clock
133 // Clock value: 43.200 kHz
134 TCCR0=0x04;
135 TCNT0=0x00;
136
137 // USART initialization
138 // Communication Parameters: 8 Data, 1 Stop, No Parity
139 // USART Receiver: On
140 // USART Transmitter: On
141 // USART Mode: Asynchronous
142 // USART Baud Rate: 9600
143 UCSRA=0x00;
144 UCSRB=0x18;
145 UCSRC=0x86;
146 UBRRH=0x00;
147 UBRRL=0x47;
148
149 // External Interrupt(s) initialization
150 // INT0: On
151 // INT0 Mode: Falling Edge
152 // INT1: Off
153 GICR=0x40;
154 MCUCR=0x02;
155 GIFR=0x40;
156
157 TIMSK = 0x00;
158
159 //delay_ms(100);
160 //#asm("cli")
161 //lcd3w_init();
162
163 printf("IR Receiver\r");
164 delay_ms(500);
165 printf("Waiting data...");
166 delay_ms(500);
167
168 code = 0;
169 address = 0;
170
171 #asm("sei")
172
173 while(1);
174
175 }

E. Penutup

Hal yang perlu diperhatikan dalam pembuatan rangkaian remote TV,

  1. Perhatikan jenis TSOP yang digunakan dan pin yang ada
  2. Debugging data sangat diperlukan untuk mengetahui apakah kode remote dapat dibaca atau tidak
  3. Jika tegangan kurang dari 5 V biasanya respon dari TSOP menjadi kurang dan sering gagal dalam melakukan dekoding data

http://rnt.uiroboticsteam.net/

 
Leave a comment

Posted by on October 24, 2012 in Robotics

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: