极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 111149|回复: 33

Arduino红外遥控系列教程2013——红外转码

[复制链接]
发表于 2013-2-20 21:14:38 | 显示全部楼层 |阅读模式
本帖最后由 幻生幻灭 于 2013-2-21 09:44 编辑

教程三:红外转码教程——用电视遥控器取代机顶盒遥控器



前言
前段时间看到了使用红外遥控的X-Bot机器人[链接],感觉很有意思。最近开始玩Arduino与红外,一方面打算将来用于BOXZ的之间的通讯控制。另一方面源自对家里机顶盒遥控器粗糙手感的小抱怨,而市面上所谓的万能遥控器,不论是做工质量还是识别性能实在都让人不爽。本教程基于Arduino的IRremote库,将教大家用电视红外遥控取代机顶盒遥控器,来操作电视。

关于红外的发射与接收的基础和硬件接线,请参考上一篇 Arduino红外遥控系列教程2013——发射与接收[链接]

控制原理
如图所示,本程序除了主程序负责进行映射运算以外,其他的子程序都是数组,保存了红外发射和接收的编码,按键信息和电脑按键编码。然后通过Mapping.h来实现对数组索引的映射。通过模块化让程序更灵活,如果更换遥控器只需对更换的部分进行代码的更新即可。


对于数组定义如下
1. 数组范围ID[0 to 255]
2. 其中[0 to 99]为默认设置,包括电视机/机顶盒/影碟机等常用按键的定义
3. [100 to 255]为用户自定义设置

准备工作  分别用电视遥控器和机顶盒遥控器记录红外编码
用串口助手AccessPort按顺序记录遥控器的按键,即使有重复按键的也没关系


Arduino红外遥控系列教程2013——发射与接收[链接]

视频教程

视频链接:http://v.youku.com/v_show/id_XNTE2NjU1NTYw.html

正文
本教程主要讲解IR_Lib的操作


第一步 将记录后的红外接收编码全部复制到Step01表中
复制自串口助手AccessPort

第二步 将记录后的红外发射编码全部复制到Step02表中
复制自串口助手AccessPort

第三步 在表main中点击Step03按钮,更新数据
注意,部分编码可能被Excel误识别成诸如1.23E+07的错误代码,是因为代码中特殊位置含有E,需要手工修正
在按键编码前面加入单引号(’)即可解决

第四步 手动输入设备有关信息,并对编码进行Comment的匹配
Comment列根据AccessPort记录的编码按键顺序对号入座即可
Comment的下拉菜单如无,可在lib表的100以后进行自定义

第五步 在Mapping的Fixed栏内对编码匹配进行修正
自动匹配(Atuo Mapping)可以降低Mapping的工作量
但目前只能将红外发射与接收中已有的Comment进行自动匹配定义。
对用户自定义或者无法匹配的则不输出,需要用户手动在Fixed列中修正添加

第六步 点击Step05按钮进行配置导出
点击对应的复制按钮,直接在Arduino对应的子程序中覆盖粘贴即可


待完善的部分
由于本人Excel的水平有限,还无法做到更自动化的操作。
我会努力研究的,但同时也希望有高人指点,大家一起来丰富Arduino的红外应用。
1. Step 05暂不支持批量导出(宏运行代码有问题,暂时屏蔽)
2. Step 05宏未完成,导出中文乱码(需要导出ANSI as UTF-8)
3. 对IRremote库默认编码以外的自定义编码不支持,感兴趣的可以参考的IRremote样例IRrecord

总结
在做红外系列教程之前,在网上也借鉴了大家的红外程序。
于是有通过模块化编程来提高本教程的灵活性,并通过Excel帮助大家自动生成代码。
相信通过时间的积累,大家分享各自家里红外遥控器的编码,实现真正的万能遥控器!

下一篇
Arduino红外遥控系列教程2013——红外转码扩展应用1[链接]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-2-20 22:57:35 | 显示全部楼层
本帖最后由 zcbzjx 于 2013-2-20 23:02 编辑

这个必须顶。。楼主太有耐心了。。大家都用相同的格式分享自己家里的遥控编码。。。另外没仔细看程序,如何让电视知道你是在遥控机顶盒,而不是在遥控它嘞?
回复 支持 1 反对 0

使用道具 举报

发表于 2013-2-20 22:29:11 | 显示全部楼层
刚刚接触arduino,学习了!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-2-21 08:46:34 | 显示全部楼层
zcbzjx 发表于 2013-2-20 22:57
这个必须顶。。楼主太有耐心了。。大家都用相同的格式分享自己家里的遥控编码。。。另外没仔细看程序,如何 ...

红外接收的编码数组放在IR_Reveive.h 里面
发射的在IR_Send.h里面

至于用什么遥控就把什么放在IR_Reveive.h 里面即可
回复 支持 反对

使用道具 举报

发表于 2013-2-21 09:04:35 | 显示全部楼层
好东西,我也想做一个了呢,感谢楼主分享。。。。
回复 支持 反对

使用道具 举报

发表于 2013-2-21 14:40:22 | 显示全部楼层
这个东东成本有点高。。。
回复 支持 反对

使用道具 举报

发表于 2013-2-25 14:23:45 | 显示全部楼层
支持一下下
回复 支持 反对

使用道具 举报

发表于 2013-3-4 23:07:40 | 显示全部楼层
求教一个问题,我用IRremote库自带的IRecvDump例子,获得到格力空调遥控器的开机键的红外编码,如下所示:
Decoded NEC: 3010040A (32 bits)
Raw (74): 764 8950 -4350 750 -500 700 -500 700 -1550 700 -1550 700 -550 700 -450 750 -450 700 -500 700 -500 700 -500 700 -500 700 -1550 700 -500 700 -500 700 -500 700 -500 700 -500 700 -450 750 -500 700 -450 750 -450 700 -1600 700 -500 700 -500 700 -450 800 -450 650 -500 750 -450 700 -1600 700 -500 700 -1550 700 -500 700 -500 700 -1550 700 -500 700 ,
然后我再写irsend.sendNEC(0x3010040A, 35);无论如何都是不能控制空调打开,这是为什么啊?用同样的方法我已经控制机顶盒成功了,就是不能控制家里的格力空调,求助!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-3-6 15:58:42 | 显示全部楼层
星逝々 发表于 2013-3-4 23:07
求教一个问题,我用IRremote库自带的IRecvDump例子,获得到格力空调遥控器的开机键的红外编码,如下所示:
...

1. NEC是32位的,标准格式irsend.sendNEC(0x3010040A, 32);

2. 尝试修改库文件 IRremote.h
在库头增加
#define DEBUG
#define TEST

再看下结果
回复 支持 反对

使用道具 举报

发表于 2013-3-7 14:45:06 | 显示全部楼层
幻生幻灭 发表于 2013-3-6 15:58
1. NEC是32位的,标准格式irsend.sendNEC(0x3010040A, 32);

2. 尝试修改库文件 IRremote.h

都试了,最开始试验的就是用32位,test和debug都打开了,解码的时候输出很多的东西,有看到NEC字眼,用32的不行
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-3-7 18:25:00 | 显示全部楼层
星逝々 发表于 2013-3-7 14:45
都试了,最开始试验的就是用32位,test和debug都打开了,解码的时候输出很多的东西,有看到NEC字眼,用32 ...

分析过debug模式的数据么?有没有临界值?
回复 支持 反对

使用道具 举报

发表于 2013-3-24 11:30:47 | 显示全部楼层
实在是太好了!
回复 支持 反对

使用道具 举报

发表于 2013-3-26 14:19:43 | 显示全部楼层
星逝々 发表于 2013-3-7 14:45
都试了,最开始试验的就是用32位,test和debug都打开了,解码的时候输出很多的东西,有看到NEC字眼,用32 ...

我也遇到同样问题
回复 支持 反对

使用道具 举报

发表于 2013-3-28 12:34:14 | 显示全部楼层
Attempting NEC decode
Testing mark 8950 vs 9000: 136 <= 179 <= 228
Testing space 4500 vs 4500: 66 <= 90 <= 111
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 1700 vs 1600: 22 <= 34 <= 38
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 1700 vs 1600: 22 <= 34 <= 38
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 600 vs 1600: 22 <= 12 <= 38
Testing space 600 vs 560: 6 <= 12 <= 12
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 600 vs 1600: 22 <= 12 <= 38
Testing space 600 vs 560: 6 <= 12 <= 12
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 600 vs 1600: 22 <= 12 <= 38
Testing space 600 vs 560: 6 <= 12 <= 12
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 560: 6 <= 11 <= 12
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 560: 6 <= 11 <= 12
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 1700 vs 1600: 22 <= 34 <= 38
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 600 vs 1600: 22 <= 12 <= 38
Testing space 600 vs 560: 6 <= 12 <= 12
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 1700 vs 1600: 22 <= 34 <= 38
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 1700 vs 1600: 22 <= 34 <= 38
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 600 vs 1600: 22 <= 12 <= 38
Testing space 600 vs 560: 6 <= 12 <= 12
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 560: 6 <= 11 <= 12
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 600 vs 1600: 22 <= 12 <= 38
Testing space 600 vs 560: 6 <= 12 <= 12
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 600 vs 1600: 22 <= 12 <= 38
Testing space 600 vs 560: 6 <= 12 <= 12
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 600 vs 1600: 22 <= 12 <= 38
Testing space 600 vs 560: 6 <= 12 <= 12
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 560: 6 <= 11 <= 12
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 560: 6 <= 11 <= 12
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 1700 vs 1600: 22 <= 34 <= 38
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 560: 6 <= 11 <= 12
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 560: 6 <= 11 <= 12
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 560: 6 <= 11 <= 12
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 560: 6 <= 11 <= 12
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 560: 6 <= 11 <= 12
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 1650 vs 1600: 22 <= 33 <= 38
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 1750 vs 1600: 22 <= 35 <= 38
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 560: 6 <= 11 <= 12
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 560: 6 <= 11 <= 12
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 560: 6 <= 11 <= 12
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 560: 6 <= 11 <= 12
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 550 vs 1600: 22 <= 11 <= 38
Testing space 550 vs 560: 6 <= 11 <= 12
Testing mark 600 vs 560: 9 <= 12 <= 17
Testing space 1650 vs 1600: 22 <= 33 <= 38
C16020C1
空调遥控器离接收头近了,出来这个。遥控器远了就出这个
Attempting NEC decode
Testing mark 8850 vs 9000: 136 <= 177 <= 228
Testing space 4600 vs 4500: 66 <= 92 <= 111
Testing mark 450 vs 560: 9 <= 9 <= 17
Testing space 1800 vs 1600: 22 <= 36 <= 38
Testing mark 500 vs 560: 9 <= 10 <= 17
Testing space 1750 vs 1600: 22 <= 35 <= 38
Testing mark 550 vs 560: 9 <= 11 <= 17
Testing space 600 vs 1600: 22 <= 12 <= 38
Testing space 600 vs 560: 6 <= 12 <= 12
Testing mark 500 vs 560: 9 <= 10 <= 17
Testing space 650 vs 1600: 22 <= 13 <= 38
Testing space 650 vs 560: 6 <= 13 <= 12
Attempting Sony decode
Testing mark 8850 vs 2400: 37 <= 177 <= 63
Attempting RC5 decode
Testing: 14 <= 177 <= 25
Testing: 28 <= 177 <= 47
Testing: 41 <= 177 <= 70
Attempting RC6 decode
Testing mark 8850 vs 2666: 41 <= 177 <= 70
0
谁能告诉我为什么了
回复 支持 反对

使用道具 举报

发表于 2013-3-29 22:46:08 | 显示全部楼层
星逝々 发表于 2013-3-4 23:07
求教一个问题,我用IRremote库自带的IRecvDump例子,获得到格力空调遥控器的开机键的红外编码,如下所示:
...

Decoded NEC: 1A90040A (32 bits)
Raw (74): 8940 9100 -4450 700 -500 700 -500 700 -500 700 -1650 650 -1700 650 -550 650 -1700 600 -600 600 -1750 600 -600 600 -600 600 -1750 600 -600 600 -600 600 -600 600 -600 600 -600 600 -600 650 -600 600 -600 600 -600 600 -1700 650 -600 600 -600 600 -600 600 -600 600 -600 600 -600 600 -1750 600 -600 600 -1750 600 -600 600 -600 600 -1750 600 -600 600

我的也不成功,不知为什么?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-23 14:31 , Processed in 0.084002 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表