利用Saleae逻辑分析仪山寨遥控器-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 21620|回复: 18

利用Saleae逻辑分析仪山寨遥控器

[复制链接]
发表于 2013-7-11 17:06 | 显示全部楼层 |阅读模式
本帖最后由 ardypro 于 2013-7-12 11:47 编辑

数据采集篇

两年前刚学知道怎么用arduino开始,就折腾山寨红外遥控,因为家里的电视机遥控器经常的找不到。最早是用arduino来采集遥控器的编码,因为家里的电视遥控器采用的不是NEC等主流协议,所以只能采集原始的脉冲宽度,,然后依原样发射,就能控制电视机。虽说道理很简单,但是采集数据的时候却并没有那么容易,因为精度、误差等原因,一不小心就非常容易出错。

忍受不了错误太多,于是买了一个SALEAE Logic兼容的逻辑分析仪,淘宝上才30来块钱的那种,虽然很便宜,但的确很好用。下面用图例的方式来一步一步的教你怎么采集原始编码,然后控制家电。

注意,因为是示例项目,所以红外发射管电路中并没有限流电阻,新手的话最好串接一个220欧的电阻。

首先搭建电路,注意发射管的正极要接入D3,MEGA的话要接入9,这是ken的红外类库中规定好的,也可以接其它带有中断功能或者定时器功能的脚,需要你自己去看arduino的pinmapping和修改类库。风险自负{:soso_e144:}
ir schematics.PNG

注意不同型号的接收头的管脚定义不一样的,你需要根据自己手头上的零件决定怎么连线。我用的是这种:

ir.png

实体图:

ir sampling tool small.jpg
(备注:逻辑分析仪的夹子不牢固,自己做了俩憨实的)

拔掉Arduino和逻辑分析仪,带电操作可能会损坏设备!
将逻辑分析仪中GND夹子夹住接收头的GND脚,分析仪中CH0夹子接收头的OUT,然后将arduino和逻辑分析仪接入电脑的USB口,打开软件SALEAE Logic1.1.15

saleae logic waves.PNG

点击Channel0后面的那个按钮中最后的那个位置,将分析仪的channel0设置为下降沿触发,至于上面的那俩选项不用管它,按图示设置或者其它设置都可以。按下start按钮开始采样,将遥控器对准接收头,按下要采集数据的那个按钮,我这里是开机按钮。等上那么分把钟采样结束之后,上面图中channel0位置就会出现采集到的波形,滚动鼠标可以放大缩小。

接着要将数据导出为csv文档

软件右上角有个option,下拉出export菜单:
export.PNG
选择数据来源和格式:
export data timestamps.PNG
注意黄色部分,选择channel0,否则其它通道的空数据也会被导出,数据格式为"Use timestamps",这种格式是以脉冲时间为基础,方便后续处理。

至此采样已经结束,后面就是分析数据。


 楼主| 发表于 2013-7-11 17:07 | 显示全部楼层

数据分析篇

本帖最后由 ardypro 于 2013-7-12 20:25 编辑

(接上集采集篇)

采集到原始数据之后,我们便可以把数据加工整理,然后利用arduino调制,通过红外发射管将编码发射出去,控制家电设备。

刚才导出的数据为csv格式,是一组逗号分隔的脉冲宽度计时数据,还不能直接利用,需要下面的工具irRaw来转换。
打开irRaw软件,按打开...按钮,选择刚才导出的csv文档

openfile.PNG

打开之后,数据会自动加载,注意数据部分只能有两列,第一列是times,第二列是channel,默认就是这种格式,切记不要自己修改那个csv文档,
data.PNG

加载完数据之后,便可以开始转换,转换的最终结果是arduino C++可以认识的数组,因此转换之前可以在窗体的下面填写数组名称以及数据类型,数量那个框中的数字是计算出来的数组长度,不用填。

设置部分,如果是按前面步骤一步一步原样来的话,就可以不动。前面导出数据的时候选择的格式是timestamp,所以选择时间戳;如果是按脉冲数量格式导出的,才选样本数量,而且需要自己设置调整系数,不同频率的载波对应的系数不一样,需要自己试验。字符串宽度是自动换行用的,免得数组定义太宽影响阅读效果,设置为80即可。
config0.PNG     or    config.PNG

convert.PNG

最后按复制raw编码将数组拷贝到内存。
copy.PNG

打开arduino IDE,新建一个sketch
arduino code.PNG
在合适的位置按paste,就可以将原始编码数据粘贴过来, 记得根据注释中的数组长度修改下面语句中的长度就可以了irSend.sendRaw(PowerOn,279,38);

[mw_shl_code=cpp,true]#include <IRremote.h>

//raw codes for GREE fan's poweron command
unsigned int PowerOn[]={
1248,458,1243,460,442,1329,1245,473,1242,473,442,1339,442,1333,442,1333,442,1332,443,
1333,1244,473,442,8055,1245,458,1244,460,441,1330,1245,473,1241,473,442,1340,442,1333,
442,1333,442,1333,442,1333,1245,472,442,8057,1246,458,1243,460,441,1332,1244,473,1244,
473,439,1340,442,1333,443,1332,443,1333,442,1334,1243,476,439,8059,1244,459,1244,459,
442,1332,1244,473,1244,473,442,1339,442,1333,443,1332,444,1333,442,1333,1245,473,442,
57643,9238,4585,552,1719,551,587,552,585,552,586,551,587,551,586,551,586,552,595,552,
586,551,1719,551,1719,554,1718,554,1717,554,1719,551,1720,551,1725,552,1719,553,1718,
554,1719,551,586,554,586,551,586,551,587,552,593,551,586,554,586,551,586,551,1719,
551,1720,553,1719,552,1719,551,1718,547,42304,9246,4587,552,1719,551,587,552,585,552,
587,551,586,551,588,551,586,551,596,551,586,551,1719,554,1718,553,1720,553,1718,554,
1718,553,1719,554,1724,554,1719,551,1719,554,586,551,587,552,585,552,587,551,1719,
552,593,554,586,551,586,553,1718,554,1719,551,1719,552,1719,554,585,552,1715,550,42298,
9248,4587,551,588,551,586,553,586,551,588,551,586,551,587,552,585,554,593,552,1719,
554,1717,554,1719,554,1718,553,1720,551,1719,554,1719,551,1725,552,1721,552,1719,553,
586,552,587,551,586,551,587,552,587,550,596,551,587,551,586,554,1719,551,1720,553,
1719,554,1719,551,1720,553,1716,540
};  //共有299条数据

IRsend irSend;

void setup()
{
irSend.sendRaw(PowerOn,299,38); //备注:发帖的时候数组长度为279,虽然经验证也可以控制,但为了保持一致,改为299
}

void loop()
{
}[/mw_shl_code]

把程序upload到arduino之后,将红外发射管对准家电,按arduino上的reset键,如果编码对的话,就能看到风扇开始转动,凉风徐徐而来 {:soso_e121:}

  


















 楼主| 发表于 2013-7-11 18:33 | 显示全部楼层
本帖最后由 ardypro 于 2013-7-11 18:37 编辑

下载irRaw工具 irRaw.zip (664.43 KB, 下载次数: 254)

备注:这个工具只对SALEAE Logic以及兼容的分析仪导出的数据有效,其它分析仪的数据格式不一定相同,可能会不兼容。
发表于 2013-7-11 18:58 | 显示全部楼层
耶,好贴,正好学习了~~~~~~~~
发表于 2013-7-11 21:49 | 显示全部楼层
在fritzing中搜索“ir”  就有红外一体接收管了
发表于 2013-7-11 22:13 | 显示全部楼层
ardypro 发表于 2013-7-11 17:07
(接上集采集篇)

采集到原始数据之后,我们便可以把数据加工整理,然后利用arduino调制,通过红外发射管 ...

哇,好样的;
mark 一下,这样就可以利用我那直升机的现成遥控器了遥控我的四轴了。。。
发表于 2013-7-12 02:50 | 显示全部楼层
高手。。
发表于 2013-7-12 09:04 | 显示全部楼层
强人!!
发表于 2013-7-12 10:17 | 显示全部楼层
好贴,有个疑问  irSend.sendRaw(PowerOn,279,38);这三个参数分别为数组地址,数据长度,红外方波频率,不是299个数据么,怎么这里是279?
 楼主| 发表于 2013-7-12 11:37 | 显示全部楼层
海神 发表于 2013-7-12 10:17
好贴,有个疑问  irSend.sendRaw(PowerOn,279,38);这三个参数分别为数组地址,数据长度,红外方波频率,不 ...

sendRaw函数的原型是这样的
  void sendRaw(unsigned int buf[], int len, int hz);

第一个是编码数组,第二个是数组的长度,第三个是载波的频率
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-29 06:40 , Processed in 0.085810 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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