Intinya pada protokol IR yang umum, biasanya di dahului oleh start bit berupa pulsa awal dengan panjang tertentu. Sebagai contoh untuk protokol ini adalah untuk Sony Infrared Remote Protocol.
Banyak merk TV yang kita kenal seperti yang salah satunya Sony, atau yang lainnya seperti Sanyo, Panasonic, Sharp, Changhong, LG, dan lain-lain. Namun ternyata untuk mencari protokol dari remote TV tersebut cukup sulit. Kebetulan TV di rumah saya bermerk Sharp dan saya berusaha untuk mencari protokol untuk remote tersebut. Setelah mencari akhirnya ada satu situs yang memaparkan tentang protokol dari remote TV Sharp. Setelah melihat protokol tersebut saya kemudian membuat receiver agar bisa membaca data dari remote Sharp. Namun sayangnya data yang saya peroleh masih salah dan sering terjadi error. Dengan melakukan pengaturan waktu pulsa dengan berbagai kemungkinan belum juga menyelesaikan masalah. Saya hampir putus asa.
Akhirnya setelah bingung ide itu muncul. Daripada saya berkutat terus menerus, trial dan error mencoba mengatur delay pulsa maka satu cara yang saya dapat lakukan adalah melakukan dekoding sinyal IR dari output TSOP.
Mungkin jika saya mempunyai osiloskop cara ini saya tidak lakukan. Dengan melakukan pengukuran waktu pulsa dari sinyal IR yang datang maka saya memperoleh pola dari tiap-tiap bit data.
Berikut potongan programnya,
unsigned char countArray[100], count,i; for(i=0;i<100;i+=2) { TCNT0 = 0; while(!(PIND & 0x04)); countArray[i] = TCNT0; TCNT0 = 0; while(PIND & 0x04); countArray[i+1] = TCNT0; } for(i=0;i<101;i++) { printf("%d ",countArray[i]); } printf("\r\r"); delay_ms(1000);Ketika ada pancaran IR maka program akan menjalankan rutin interrupt. Mode interrupt yang digunakan adalah falling edge sehingga rutin interrupt baru dijalankan ketika ada perubahan sinyal dari high menjadi low. Output TSOP pada saat tidak ada pancaran IR adalah high. Baru ketika ada pulsa maka output TSOP menjadi low. Keadaan high dan low ini berkebalikan dari pulsa sebenarnya yang dipancarkan IR.
Saya coba arahkan remote Sharp dengan menekan key 1 dan 9 dan saya sampling 100 data yang dikirimkan melalui serial, untuk data key 1 saya memperoleh,
16 72 16 27 16 27 16 27 14 30 12 76 16 27 16 27 15 28 15 28 15 29 14 29 12 31 16 73 15 29 14 202 16 72 14 30 13 30 12 31 14 29 16 27 16 73 15 73 15 73 16 74 14 74 16 74 11 77 16 27 15 75 15 95 15 74 16 27 16 28 15 28 15 28 15 74 12 31 12 31 14 30 15 28 15 28 15 28 15 28 15 74 16 28 15 200 14 75 17 26 0
Kemudian saya arahkan key berikutnya dan data-data tersebut saya salin ke Ms. Excel, diperoleh
Untuk lengkapnya bisa dilihat di sini.
Akhirnya saya peroleh pola dari susunan bit data dari protokol Sharp. Intinya keadaan high adalah sepanjang total 2 ms dengan 320us pulsa high dan keadaan low adalah sepanjang total 1 ms termasuk 320 us pulsa high. Keterangan waktu tersebut saya peroleh dengan mengkalikan angka di atas dengan perode dari Timer mikrokontroler. Pada protokol ini tidak terdapat pulsa awal dimana data awal langsung dikirimkan. Untuk bit 1 sampai 5 terlihat menunjukan lokasi bit yang sama maka dapat diduga ini data address yang biasanya alat yang dikendalikan remote (TV) dan kemudian bit selanjutnya adalah command sejumlah 8 bit. Sisa dua bit bernilai tetap.
Keunikan dari protokol ini adalah dikirimkannya data yang sama selang waktu 40 ms namun dengan data command dan dua bit tambahan yang di-invert. Dengan adanya data ini dapat dilakukan verifikasi pada data yang dikirimkan apakah data yang benar atau salah.
Setelah saya bandingkan dengan sumber awal saya, ternyata keduanya benar. Setelah saya selidiki ternyata ada beberapa bit-bit aneh yang muncul sehingga membuat percobaan saya pertama terus-menerus gagal.
Dari informasi akhirnya saya dapat mendekoding data remote TV Sharp.
8 comments:
Akhirnya bisa posting dengan include syntax program. Tutorial dari :
http://heisencoder.net/2009/01/adding-syntax-highlighting-to-blogger.html
wow keren ........... :D
keren..
siip..brilliant
klo mw baca modulasi frequencynya gmn gan??
@ANDRA
Cara paling gampang adalah menggunakan Osiloskop :D
gan, bisa kasih penjelasan programnya?
unsigned char countArray[100], count,i;
for(i=0;i<100;i+=2)
{
TCNT0 = 0;
while(!(PIND & 0x04));
countArray[i] = TCNT0;
TCNT0 = 0;
while(PIND & 0x04);
countArray[i+1] = TCNT0;
}
for(i=0;i<101;i++)
{
printf("%d ",countArray[i]);
}
printf("\r\r");
delay_ms(1000);
Post a Comment