ADS

2013年4月4日 星期四

[Arduino]紅外線收發-IRremote.h

由於我想要在Android上建立一個萬用遙控器的程式,所以我開始在Arduino上做遙控器解碼和遙控器發送的實驗,關於這些實驗在網路上Cooper Maa大大都有提供很多的教學分享那麼我在這邊就來寫一些我所測試的過程、心得和發現吧!



IRremote函式庫的下載,電路很簡單就是一般的紅外線LED串連50歐姆的電阻然後接到Arduino UNO pin3我一開始是用Mega ADK但是完全沒反應後來得知要接在pin9,關於這些腳位的設置是來自於IRremote函式庫的腳位設置,程式都是使用Arduino-IRremote-Example裡面的,首先我要先做個遙控器紅外線解碼之後,再發射紅外線去控制電視,所以先使用IRrecvDump範例來抓取值和協定方式,遙控器有很多種協定,我家有三台電視,分別是LG、大同、TECO只有LG是NEC的協定其他兩間都是UNKNOW,對於初學者的我還是先從已知的協定下手。
畫面中我遙控器的電源開關code是 NEC:20DF10EF 32bit 有些遙控器你一直壓著會出現另一組相同的code(FFFFFFFF)來告訴接收器持續按壓著,據說這樣比重發一組相同的code來著的省電,不過我另外一台遙控器就是單純的重發,各家都不太一樣。如此一來知道了開關的code之後開啟另外一個範例,IRsendDemo你會看到程式碼是發送sony的協定,並且是當你在serial monitor發送命令後才會令紅外線LED通訊,這樣子遙控電視還要帶著電腦有點麻煩,所以我改成Button按下發送訊號。

#include <IRremote.h>

IRsend irsend;

void setup()
{
  Serial.begin(9600);
  pinMode(2,INPUT);
}

void loop() {
  if (digitalRead(2) == 1) {
      irsend.sendNEC(0x20DF10EF, 32); // Sony TV power code
      delay(40);
    
  }

以下函式庫是IRremote.h裡面擷取出來的各協定發送函式
 void sendNEC(unsigned long data, int nbits);
  void sendSony(unsigned long data, int nbits);
  // Neither Sanyo nor Mitsubishi send is implemented yet
  //  void sendSanyo(unsigned long data, int nbits);
  //  void sendMitsubishi(unsigned long data, int nbits);
  void sendRaw(unsigned int buf[], int len, int hz);
  void sendRC5(unsigned long data, int nbits);
  void sendRC6(unsigned long data, int nbits);
  void sendDISH(unsigned long data, int nbits);
  void sendSharp(unsigned long data, int nbits);
  void sendPanasonic(unsigned int address, unsigned long data);
  void sendJVC(unsigned long data, int nbits, int repeat); // *Note instead of sending the REPEAT constant if you want the 

如果你無法遙控你的電視的話你可以用照相機去照一下你的紅外線LED然後按一下按鈕,看他有沒有發光,如果沒有的話你可以檢查一下你的電路和腳位,最後我發現有些遙控器的LED會加個蓋子然後不管朝哪個方向都可以控制電視,沒有的就相當具有指向性一定要朝著接收器方向發射訊號,才能夠控制。用這個範例做的感覺射程約1公尺,不然就是需要對的非常準。



沒有留言:

張貼留言