打印
[STM32F4]

【Nucleo-F413ZH创想】+ 红外编码自学习型遥控器

[复制链接]
1065|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lileiielil|  楼主 | 2016-12-29 20:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  比较想做这个不知道以我的能力能不能实现,还没有具体的方案。
沙发
dongnanxibei| | 2016-12-29 20:23 | 只看该作者
给你找个栗子。

使用特权

评论回复
板凳
dongnanxibei| | 2016-12-29 20:25 | 只看该作者
家用电器如电视、机顶盒、空调等都可以通过红外遥控,Rainbow专为物联网、家居智能而设计的硬件,自然在红外遥控收发方面有很好的支持。
    红外遥控通常是由红外发光二极管发射一定频率的载波,通过载波携带的控制信息,经过调制的信号被接收器接收后再进行解码,根据所接收到的编码再去执行响应的操作,如:切换电视频道、调整空调温度等。家用电器能够接收的基本上都是用38K的载波进行调制后的红外信号,而HX1838则是专门对38K载波进行接收处理的专用模块,Rainbow进行红外接收的时候,需要先在红外接收插口中插入HX1838接收模块。
    Rainbow开发包能够很方便实现对红外遥控信号的接收处理,形成原始的数据,这些数据可以进一步解码或者不用解码,而是通过红外发光二极管发射出去控制家电等。将红外遥控信号记录下来,并能够将记录下来的信号通过红外发光二极管发射出去控制电器,这就是万能学习型红外遥控的基本实现原理,Rainbow开发包提供了红外遥控编码接收和发射函数,同时Rainbow具有网络模块,可以在这个基础上开发出通过手机、网页等实现遥控家电的万能遥控设备。

使用特权

评论回复
地板
dongnanxibei| | 2016-12-29 20:28 | 只看该作者
在软件包的“Projects\IR-Recv”文件夹包含了本文的完整工程,可以直接编译、烧写和调试。这个程序主要展示如何在Rainbow中进行红外遥控原始编码接收,看看main.cpp的代码:
#include "WProgram.h"
#include "IRRemote.h"
int main()
{
   //Rainbow初始化
   boardInit();
   //默认串口初始化
   Serial.begin();
   Serial.println("IR-Recv start...");
   //创建红外遥控接收实例,HX1838接到TIM4的CH1,即:PB6
   IRRecv irRecv;
   irRecv.enableIRIn();
   while(1)
   {
      uint16_t* rawBuf;
      int16_t len = irRecv.available();
      //判断红外采集是否完成
      if(len > 0)
      {
         //取红外采集的原始编码
         rawBuf = irRecv.getRawCode();
         //将接收到的红外原始编码通过默认串口输出
         Serial.print("Frame Length:");
         Serial.print(len);
         Serial.println();
         for(uint16_t i=0; i < len; i++)
         {
            Serial.print(rawBuf);
            if(i != len - 1)
            {
               Serial.print(",");
            }
         }
         Serial.println();
         //准备取下一个红外遥控编码
         irRecv.resume();
      }
   }
}

使用特权

评论回复
5
dongnanxibei| | 2016-12-29 20:29 | 只看该作者
   在Rainbow中进行红外遥控编码接收的流程:
    1、首先需要#include "IRRemote.h",
    2、定义红外遥控接收对象IRRecv irRecv;
    3、开始进行红外遥控接收irRecv.enableIRIn();
    4、如果接收到红外遥控编码的话,irRecv.available()返回原始的红外遥控编码的长度,返回值大于0
    5、通过irRecv.getRawCode()可以提取到原始的红外遥控编码数组,数组长度是irRecv.available()
    6、对红外遥控原始编码处理完毕后,需要调用irRecv.resume(),以便进行下一次红外遥控编码获取
    上面的程序编译无误后,将程序烧写到Rainbow中,并将HX1838红外接收模块插入到Rainbow中专为HX1838设计的接口中,
然后在电脑上运行串口调试工具并和Rainbow连接成功,取一个家用电器的遥控器对准红外接收模块,在遥控器上按下一个按键,
此时在串口调试工具中会将该按键的原始红外遥控编码的长度和内容显示出来。
    接下来我们说说红外遥控原始编码的含义。从串口调试工具中输出的原始编码是类似这样一串字符:
  4486,4428,590,1604,590,534,563,1605,591,1603,592,533,563,535,563,1604,591,535,563,534,564,1606,589,
534,563,535,563,1604,590,1603,592,535,563,1604,591,1607,588,535,563,1605,590,1607,588,1604,591,
1632,564,1602,593,1605,591,534,563,1602,593,534,563,534,563,534,563,535,563,534,563,534,563,1604,
591,534,563,1632,563,534,564,1604,590,1605,590,534,563,534,564,534,563,1605,591,533,563,1604,591,
535,563,534,563,1605,590,1604,592,5263,4512,4427,592,1602,593,534,563,1602,593,1632,563,535,563,
534,563,1605,590,535,564,533,563,1607,589,534,563,534,563,1604,592,1602,593,534,563,1604,591,1630,
564,534,563,1631,564,1604,591,1604,592,1603,592,1604,591,1633,563,534,563,1604,592,534,563,535,563,
510,587,534,563,534,564,510,587,1630,565,510,587,1631,564,511,586,1603,592,1604,591,511,587,511,
587,509,588,1605,590,510,587,1603,593,510,587,511,587,1603,592,1604,591

使用特权

评论回复
6
dongnanxibei| | 2016-12-29 20:32 | 只看该作者
这其实上面的字符串就是打开美的空调,并将温度设置到28度、制热的红外遥控原始编码,它是由一系列16位的整数构成的,到底是些什么意义呢?
    前面我们说到了红外遥控发射是通过一定频率的载波对红外编码进行调制后通过红外发光二极管发射出去的,说起“调制”这个词有些抽象,我们可以理解为在指定的时间内发送载波与不发送载波,载波就是一个产生一定频率的波形发生器,只要一通电就通过一条电线向红外发光二极管输送信号,让红外发光二极管按照这个频率的波形发光(发送),而调制过程就好比我们有一个电子开关,开关打开的时候,波形发生器就通电,驱动红外发光二极管发光,开关关闭的时候波形发生器就关闭,红外发光二极管就不发光。
    说到这里,前面那一段原始红外遥控编码就好解释了,首先这些数字是表示时间的,单位是us,他们就是表示电子开光打开和关闭的时间,即调制过程。这些数字中,奇数的数字表示电子开关打开的时间,即发送38K载波的时间,偶数的数字表示关闭发送载波的时间。以美的空调开机那个编码的前几个数字4486,4428,590,1604为例:表示发送38K载波4486us,然后停止发送载波4428us, 再发送590us的载波,然后再停止发送1604us载波,以此类推。

使用特权

评论回复
7
dongnanxibei| | 2016-12-29 20:34 | 只看该作者
有了前文《红外遥控:智能学习红外遥控编码》的介绍,接下来如果要通过Rainbow的红外遥控取控制家电就非常简单了。
    首先我们可以通过红外接收程序取得遥控器相应按键的原始编码,然后让Rainbow产生38K载波,再按照原始编码中的时间序列去控制载波发送和停止发送,即可以实现对家电的控制。
    STM32是3.3V低功耗MCU,GPIO管脚的电流一般在8mA左右,如果直接去推动红外发光二极管发送红外指令的话,红外发射功率很小,距离稍微远点(1m左右)、角度对得不准的话,家电就无法接收到红外信号,表现为家电对发送的红外指令不理会。为了解决这一问题,Rainbow中专门增加了红外放大电路,让红外发送功率增加,使得Rainbow像普通红外遥控器一样对家电进行控制。
    本文主要涉及到红外发射部分,红外原始编码的获取可以通过前文《红外遥控:智能学习红外遥控编码》介绍的程序提取。本文增加了串口接收功能,可以接收来自上位机串口传来的数据,并根据上位机传来的数据控制开关空调:上位机上发送1,开空调;发送0关空调。本文的程序在美的空调上测试通过,在软件包的“Projects\IR-Send”文件夹包含了本文的完整工程,可以直接编译、烧写和调试。这个程序主要展示如何在Rainbow中接收来自上位机指令并遥控空调,看看main.cpp的代码:
#include "WProgram.h"
#include "IRRemote.h"
int main()
{
    //初始化Rainbow
    boardInit();
    //初始化默认串口
    Serial.begin();
    Serial.println("IR-Send start...");
    //定义红外发射对象,红外发光二极管接到TIM2的CH1,即:PA0
    IRSend irSend;
    //美的空调:开
    uint16_t rawData_1[] =       {4486,4428,590,1604,590,534,563,1605,591,1603,592,533,563,535,563,1604,591,535,563,534,564,1606,
589,534,563,535,563,1604,590,1603,592,535,563,1604,591,1607,588,535,563,1605,590,1607,588,1604,591,
1632,564,1602,593,1605,591,534,563,1602,593,534,563,534,563,534,563,535,563,534,563,534,563,1604,
591,534,563,1632,563,534,564,1604,590,1605,590,534,563,534,564,534,563,1605,591,533,563,1604,591,
535,563,534,563,1605,590,1604,592,5263,4512,4427,592,1602,593,534,563,1602,593,1632,563,535,563,
534,563,1605,590,535,564,533,563,1607,589,534,563,534,563,1604,592,1602,593,534,563,1604,591,1630,
564,534,563,1631,564,1604,591,1604,592,1603,592,1604,591,1633,563,534,563,1604,592,534,563,535,563,
510,587,534,563,534,564,510,587,1630,565,510,587,1631,564,511,586,1603,592,1604,591,511,587,511,
587,509,588,1605,590,510,587,1603,593,510,587,511,587,1603,592,1604,591};
    //美的空调:关
    uint16_t rawData_0[] =
  {4464,4451,567,1628,567,532,565,1628,567,1629,567,531,565,532,567,1626,568,531,566,532,565,1628,
568,532,565,532,566,1627,568,1630,565,532,566,1627,568,532,566,1629,566,1628,567,1629,567,1628,567,
532,565,1629,567,1627,568,1628,567,531,567,531,565,532,566,532,565,1627,568,531,566,532,566,1628,
567,1629,566,1627,568,533,565,532,565,532,566,531,566,532,566,531,565,533,565,532,565,1627,568,
1629,567,1629,567,1628,567,1627,568,5286,4489,4452,567,1629,566,532,566,1628,568,1627,568,531,566,
531,566,1628,568,530,566,531,565,1629,567,532,565,532,565,1630,566,1629,567,532,565,1628,567,533,
565,1629,567,1628,567,1628,592,1604,590,508,577,1616,577,1620,590,1603,567,533,589,508,589,509,589,
508,589,1603,592,508,590,507,590,1603,591,1633,562,1543,652,509,589,509,588,509,589,508,590,508,
589,508,590,507,589,508,589,1605,590,1604,591,1604,591,1604,592,1604,592};
    uint16_t len1 = sizeof(rawData_1)/sizeof(uint16_t);
    uint16_t len0 = sizeof(rawData_0)/sizeof(uint16_t);
    //用38K的载波进行调制
    irSend.enableIROut(38);
    //根据串口输入情况发射红外编码,输入1打开空调,输入0关闭空调
    while(1)
    {
        if(Serial.available())
        {
            switch(Serial.read())
            {
                case 0x30:
                    //关空调
                    irSend.sendRaw(rawData_0, len0);
                    Serial.println("Close conditioner...");
                    break;
                case 0x31:
                    //开空调
                    irSend.sendRaw(rawData_1, len1);
                    Serial.println("Open conditioner...");
                    break;
            }
        }
    }
}

使用特权

评论回复
8
dongnanxibei| | 2016-12-29 20:34 | 只看该作者
通过Rainbow发送红外遥控原始编码非常简单,只需要经过以下几个简单步骤:
    1、定义红外发送对象:IRSend irSend;
    2、设置载波的频率:irSend.enableIROut(38),这里38表示载波频率是38K
    3、准备红外遥控原始编码,可以通过遥控接收程序直接取得
    4、调用发送函数按照原始编码的定义发送出去:irSend.sendRaw(rawData_0, len0)
    上面的程序编译无误后,将程序烧写到Rainbow中,并将红外发光二极管插入到Rainbow中专为红外发光二极管设计的接口中,将红外发光二极管对准空调,然后在电脑上运行串口调试工具并和Rainbow连接成功,在串口调试工具中输入1发送到Rainbow,此时美的空调将会滴的一声打开了;再输入0发送出去,美的空调将会滴的一声,然后关闭电源。

使用特权

评论回复
9
lileiielil|  楼主 | 2017-1-1 17:10 | 只看该作者
dongnanxibei 发表于 2016-12-29 20:34
通过Rainbow发送红外遥控原始编码非常简单,只需要经过以下几个简单步骤:
    1、定义红外发送对象:IRSe ...

多谢啦,我看看。。

使用特权

评论回复
10
zhu51231| | 2018-8-12 22:09 | 只看该作者
mark

使用特权

评论回复
11
zhu51231| | 2018-8-13 07:24 | 只看该作者
mark

使用特权

评论回复
12
xuanhuanzi| | 2018-8-13 09:56 | 只看该作者
红米手机自带红外遥控器,你可以看看那个软件怎么实现自学习

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

53

帖子

0

粉丝