2016年7月26日 星期二

Arduino UNO學習522.紅外線搖控器控制元件



Arduino UNO學習522.紅外線搖控器控制元件

此篇要用搖控器來控制LED燈及蜂鳴器,
目前ArduBlock與該外部函式庫IRremote無法完全搭配,
因此由ArduBlock編寫部分程式,再手寫修改加入內建範例程式中,
確認已學習安裝IRremote函式庫,並已學會取得搖控器的編碼,
請參考學習520.紅外線搖控器,並將IRrecvDemo的程式碼取出待用,
下圖安裝了2種元件,自行預設搖控器找2個按鍵的編碼作對應,
分別左為紅外線接收器,蜂鳴器,LED燈另外加上野生遙控器一支



完成硬體後,第一步打開內建範例IRremote\IRrecvDemo,上傳後打開監控視窗,
隨便找遙控按鍵取得編碼,取紙張記錄下按鍵的編碼,並將範例檔案取出備用,
#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

第二步,打開ArduBlock編寫部分程式如下,將取得的遙控編碼加上0x00,
FF30CF改為0x00FF30CF,並設定當遙控器碼FF30CF按下時則Pin2燈高3秒,
當遙控器碼FF18E7時Pin4蜂鳴器叫1秒,依圖找出ArduBlock的拼圖塊吧


上傳後先取得由ArduBlock作成的程式碼到筆記本或其他編輯軟體上,
unsigned long _ABVAR_1_IR = 0UL ;
void setup()
{
  pinMode( 2 , OUTPUT);
  pinMode( 4 , OUTPUT);
}

void loop()
{
  if (( ( _ABVAR_1_IR ) == (0x00FF30CFUL ) ))
  {
    digitalWrite(2 , HIGH);
    delay( 3000 );
    digitalWrite(2 , LOW);
  }
  if (( ( _ABVAR_1_IR ) == (0x00FF18E7UL ) ))
  {
    digitalWrite(4 , HIGH);
    delay( 1000 );
    digitalWrite(4 , LOW);
  }
}

第三步要將內建的程式碼和ArduBlock編寫的程式碼二合一修改,
依內建的程式碼為主,加上setup宣告pin2和pin4,並將變數名稱_ABVAR_1_IR
修改為results.value,及ArduBlock的loop部分加入到程式中,變成如下
#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode( 2 , OUTPUT); //設定
  pinMode( 4 , OUTPUT);
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
//加入遙控編碼動作
    if (( (results.value) == ( 0x00FF30CFUL ) ))
  {
    digitalWrite(2 , HIGH);
    delay( 3000 );
    digitalWrite(2 , LOW);
  }
    if (( (results.value) == ( 0x00FF18E7UL ) ))
  {
    digitalWrite(4 , HIGH);
    delay( 1000 );
    digitalWrite(4 , LOW);
  }
    irrecv.resume(); //準備下一訊號
  }
}

上傳後打開監控視窗,按下預設的遙控器鈕,是否可正常操作,
遙控器太遠時會接收到錯誤的編碼,試試家中其他的遙控器吧,
可近一步透過繼電器來控制其他家電啟動,或製作壓按式的自動門試試,




4 則留言:

  1. 你好,請問搖控器可以改跟按扭一樣嗎,按就亮,不按就對亮

    回覆刪除
    回覆
    1. 您好~請先確認動作是要自鎖連續還是點動復位.可修改時間參數.或是加入判斷去作LOW.可參考UNO學習131.內建範例-按鍵控制LED燈.先了解2種不同的控制方式.再帶入遙控編碼即可https://ee543.blogspot.com/2016/01/arduino131-led.html

      刪除
  2. 你好,不好意思,打擾你,要自做天車搖控器在家使用(按鍵分為上,下,前,後),上面程式我使用過(我有試著結合,但是一直沒有成功),要使用紅外線
    按就動(包括按著就連續動做),不按就不動,就跟搖控汽車一樣。
    下面程式我也有試著用你的程式結合,我還是沒有改成功(我前幾天有發過,不知道你有沒有收到再發出)
    #include

    int RECV_PIN = 2;
    int RED_LED = 8;
    int YELLOW_LED =9;


    IRrecv irrecv(RECV_PIN);
    decode_results results;

    void setup() {
    pinMode(RECV_PIN, INPUT);
    pinMode(RED_LED, OUTPUT);
    pinMode(YELLOW_LED, OUTPUT);

    irrecv.enableIRIn();
    Serial.begin(9600);
    }
    void loop() {
    int i=0;
    if (irrecv.decode(&results)) {
    CheckCode();
    irrecv.resume();
    }
    }

    void CheckCode(){

    switch(results.value){

    case 0xFFA25D:
    Serial.println ("Red led ON, Button 1");
    Serial.println(results.value, HEX);
    digitalWrite(RED_LED,HIGH);
    digitalWrite(YELLOW_LED,LOW);


    break;

    case 0xFF629D:
    Serial.println ("Red led OFF, Button 2");
    Serial.println(results.value, HEX);
    digitalWrite(RED_LED,LOW);
    digitalWrite(YELLOW_LED,LOW);

    break;

    case 0xFFE21D:
    Serial.println ("Yellow led ON, Button 3");
    Serial.println(results.value, HEX);
    digitalWrite(YELLOW_LED,HIGH);
    digitalWrite(RED_LED,LOW);

    break;

    case 0xFF22DD:
    Serial.println ("Yellow led OFF, Button 4");
    Serial.println(results.value, HEX);
    digitalWrite(YELLOW_LED,LOW);
    digitalWrite(RED_LED,LOW);

    break;


    default: //
    //Serial.print(" unknown button ");
    Serial.println(results.value, HEX);
    }
    }

    回覆刪除
  3. 您好~抱歉~沒有每天在看留言.基本上控制電機正反轉需要馬達控制器或繼電器等等,才能作4個動作的大電流控制,,不清楚您作到那步驟.用我上的程式若裝LED可動作.則作4個輸出搭配控制器即可,,若無法操作LED則需先取得遙控器編碼,,用你的程式建議先只留1動作測試.其他刪除,因為其他3個也只是複制貼上修改,,另找時間實裝你的程式測試.

    回覆刪除