Arduino教程(提高篇)——红外遥控(发射篇)-Arduino中文社区 - Powered by Discuz!
查看: 108092|回复: 42

Arduino教程(提高篇)——红外遥控(发射篇)

  [复制链接]

该用户从未签到

发表于 2012-8-2 07:48 | 显示全部楼层 |阅读模式
本帖最后由 海神 于 2013-1-9 14:28 编辑

上一篇提到了红外编码的原理,此篇用arduino软件模拟发出38K的载波信号配合红外发射头,发出带有载波信号的38K红外光,使arduino变成红外遥控器,配合红外接收就用此可以遥控各家电。
例程1:红外发射模块(取缔红外遥控器)配合arduino制作成红外遥控器,用串口输入一个数字,遥控器发射出一段编码,一边用红外接收模块,显示出接收到的编码(红外接收参照http://www.arduino.cn/thread-1220-1-1.html此贴)
连线示意图:
3.jpg
[mw_shl_code=c,true]
#define ADD 0x00
int IR_S =  8;     //接arduino 8号引脚
void setup()
{
  pinMode(IR_S, OUTPUT);
  Serial.begin(9600); // 9600 波特率
}
void loop()
{
  uint8_t dat,temp;
  if ( Serial.available()) {
    temp = Serial.read();//?
   
    IR_Send38KHZ(280,1);//发送9ms的起始码
    IR_Send38KHZ(140,0);//发送4.5ms的结果码
   
    IR_Sendcode(ADD);//用户识别码
    dat=~ADD;
    IR_Sendcode(dat);//用户识别码反吗
   
    IR_Sendcode(temp);//操作码
    dat=~temp;
    IR_Sendcode(dat);//操作码反码
   
    IR_Send38KHZ(21,1);//发送结束码
  }
  delay(200);
}
void IR_Send38KHZ(int x,int y) //产生38KHZ红外脉冲
{
for(int i=0;i<x;i++)//15=386US
{
           if(y==1)
           {
     digitalWrite(IR_S,1);
            delayMicroseconds(9);
     digitalWrite(IR_S,0);
            delayMicroseconds(9);
           }
           else
           {
     digitalWrite(IR_S,0);
            delayMicroseconds(20);
           }            
}
}
void IR_Sendcode(uint8_t x) //
{
    for(int i=0;i<8;i++)
     {
       if((x&0x01)==0x01)
        {
           IR_Send38KHZ(23,1);
           IR_Send38KHZ(64,0);            
        }
        else
         {
            IR_Send38KHZ(23,1);
            IR_Send38KHZ(21,0);  
         }
       x=x>>1;
     }  
}[/mw_shl_code]
打开串口,随意发送一个数字,红外发射头会发出带编码的38K红外波, 另一方面用一个红外接收头就可以接收到此码,将其解码就会知道遥控器是按的哪个按键。
接收方面,arduino+红外接收模块进行解码
红外遥控函数库: IRremote.zip (23.84 KB, 下载次数: 2139)
[mw_shl_code=c,true]

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); //初始化红外遥控
  pinMode(12,1);
}

void loop() {
  if (irrecv.decode(&results)) {
if(results.value==16753245)      //确认接收到的第一排按键1的编码,此码是预先读出来的按键编码。
  {
  digitalWrite(12,1);                //点亮LED
   Serial.println("turn on LED"); //串口显示开灯
  }
  else if(results.value==16736925)   //确认接收到的第一排按键2的编码
  {
   digitalWrite(12,0);            //熄灭LED
    Serial.println("turn off LED");    //串口显示关灯
  }
    irrecv.resume(); // 接收下一个值
  }
}[/mw_shl_code]
例程2:arduino模拟SONY遥控器,用arduino串口发送一个字符便可以遥控SONY家电的开关。

/*********红外发射头接arduino的3号数字口**************************/
[mw_shl_code=c,true]

#include <IRremote.h>

IRsend irsend;

void setup()
{
  Serial.begin(9600);
}

void loop() {
  if (Serial.read() != -1) {
    for (int i = 0; i < 3; i++) {
      irsend.sendSony(0xa90, 12); // Sony TV power code
      delay(100);
    }
  }
}
[/mw_shl_code]

红外控制库发布地址:https://github.com/shirriff/Arduino-IRremote

该用户从未签到

发表于 2014-6-12 15:00 | 显示全部楼层
qiuyuzhe 发表于 2014-6-11 15:21
为什么我用手机摄像模式无法检测到IR LED 发光。是不是不成功啊?如果直接把 IR LED 接到VCC,是可以在手机 ...

原因找到了,我使用 IRremote 库,板是 Leonardo ,输出定义在了 13 I/O 口,而不是 3号口。
头像被屏蔽

该用户从未签到

发表于 2012-8-5 16:02 | 显示全部楼层
请教一下,我按照IRremote的example里的例子,将家里的遥控器解码,类型是NEC 32Bbit的

用IRremote的红外发射例子,测试不成功
下面这段是按照IRremote的IRsendDemo例子改写的
[mw_shl_code=c,true]/*
* IRremote: IRsendDemo - demonstrates sending IR codes with IRsend
* An IR LED must be connected to Arduino PWM pin 3.
* Version 0.1 July, 2009
* Copyright 2009 Ken Shirriff
* http://arcfn.com
*/

#include <IRremote.h>

IRsend irsend;

void setup()
{
  Serial.begin(9600);
}

void loop() {
  if (Serial.read() != -1) {
    for (int i = 0; i < 3; i++) {
        irsend.sendNEC(0xFF807F, 32); // Sony TV power code
        delay(100);
    }
  }
}[/mw_shl_code]

帮忙看一下有什么问题

该用户从未签到

发表于 2012-8-6 11:51 | 显示全部楼层
老师,能否详细说明一下下面这个函数调用各参数的确切含义:
irsend.sendSony(0xa90, 12); // Sony TV power code

该用户从未签到

发表于 2012-8-6 11:52 | 显示全部楼层
maple_0702 发表于 2012-8-5 16:02
请教一下,我按照IRremote的example里的例子,将家里的遥控器解码,类型是NEC 32Bbit的

用IRremote的红外 ...

maple_0702:
irsend.sendNEC(0xFF807F, 32); // Sony TV power code
这个调用里各个参数的意义是什么呀
头像被屏蔽

该用户从未签到

发表于 2012-8-6 12:16 | 显示全部楼层
IRremote里的IRrecvDump例子运行,解码出遥控器的类型、bits和按键的编码

irsend.sendNEC(0xFF807F, 32),函数名就是遥控器的编码类型,参数是按键的编码和bits

你试试,你的能成功不?

该用户从未签到

发表于 2012-9-15 00:52 | 显示全部楼层
maple_0702 发表于 2012-8-6 12:16
IRremote里的IRrecvDump例子运行,解码出遥控器的类型、bits和按键的编码

irsend.sendNEC(0xFF807F, 32), ...

怎么样?解决了么?我的也不成功。我家里的电视是RC5协议。

该用户从未签到

发表于 2012-9-15 13:34 | 显示全部楼层
必须接PMW PIN 3口才行吧
头像被屏蔽

该用户从未签到

发表于 2012-9-16 16:49 | 显示全部楼层
想问问楼主,你的那个"连线示意图"是用什么软件画的?  可否说一下 呵呵

该用户从未签到

发表于 2012-10-3 12:29 | 显示全部楼层
先帮海参顶一下。。。

该用户从未签到

发表于 2013-1-6 21:56 | 显示全部楼层
按照15 => 386us的关系:

9ms和4.5ms应该是:
    IR_Send38KHZ(350,1);//发送9ms的起始码   
    IR_Send38KHZ(175,0);//发送4.5ms的结果码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

【Arduino】168种传感器模块系列实验(159)---MAX9814咪头传感器
【Arduino】168种传感器模
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
【Arduino】108种传感器模块系列实验(61)---WS2812直条8位模块
【Arduino】108种传感器模
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
【Arduino】108种传感器系列实验(06)---声音传感器模块
【Arduino】108种传感器系
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
有没有大佬用过CC1101 模拟433遥控器的 来帮忙解答一下感谢
有没有大佬用过CC1101 模
主控用的是 ESP-WROOM-02(ESP8266) CC1101 用的是这个!对应ESP8266的脚位图 库用
开学季新/老会员回馈活动!
开学季新/老会员回馈活动
开学季:社区会员回馈活动!Arduino中文社区联合openjumper推出开学季会员福利回馈活
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表