转自: http://blog.csdn.net/kangear/article/details/39376105
1.试用
记得宋宝华在「设备驱动开发详解」提出一个这样的理论「软件和硬件互相渗透对方的领地」,
这次证明还是确实是这样,使用上层APP软件加上简单的更为简单的硬件设计就可以完成一个遥控器了。
有开发应用程序网友发E-mail问网上那种DIY的红外遥控器是如何工作的,查了一下目前有两种
方式,一种是基于USB一种是基于耳机孔。就简单的回复了一信息。说是将音频信号/USB信号转换为
红外信号。事后自己都觉得有点敷衍,还好自己硬件了解一些,软件也会开发。就将他们结合一下。
试用次合,现在开发规律比较清晰了,一般就是先试用进而了解大概功能。试用的次合是在网上
买一个 耳机插孔式的遥控发射器
如下内部图(不要理会线,线是我测量焊接的)。
手机上的软件使用提「遥控精灵」(2.9.3版本),身边的测试电器是创维电视。软件设计的比较好使用,
试用成功,没有其它障碍。
2.DIY硬件
[DIY]便宜好用-使用耳機孔的IR遙控器(適用可播.WAV的player) 文長圖多
和手机遥控器,3.5mm耳机接口红外遥控改造解析两篇文章和一篇原理文章遥控器原理.再结合使用
示波器测试按键是耳机孔的输出波形,大概理解了其原理以及DIY需要的元件。
DIY所需元件:1. 3.5耳机插头 2. 红外发射管(其实这个名字也怪,严格意义上它属于
发光二极管和一种,但是去电子商城购买时要说前「红外发射管」)
接下来的硬件相关实验是部分替换,软件上使用「遥控精灵」上适配好的配置,然后将焊接好
的「遥控器」连接上,进行试验。
第一次根据第一篇引用文章中将两个二极管正负相连再连接到耳机插头的左右声道 如下图:
实验结果:成功无误。
第二次实验是 根据第二篇引用文章只焊接一个发射管,实验结果:成功无误。
第三次实验是将正负极颠倒再次测试,实验结果同样是:成功无误。
从上述三个次实验中,清晰了很多概念,但是也带来很的疑惑,文章一中说要将19kHz转换为38kHz所以要
两个发射管正负互接的,但是第二次实验中,不进行互接也是可以发射信号的。第三次实验中正反互换都没有
影响信号正常的发射与接收。这也是一个一点。
第三点是没有接三极管进行放大,同样是可以使用的。先将理论讨论暂时放到这里。继续新的实验。
软件上的实验是最终实现自己开发一个APP来发射数据。
第一步是将「遥控精灵」输出的音频录音下来。硬件连接是使用一个公公的耳机插头将「遥控精灵」
输出的按键波形录制下来。将其放到手机中进行播放音频来向电视机发送红外信号。验证通过。
2.DIY软件
整体原理理通顺之后就开始大盘计划,使用编写一个「遥控精灵」的开源版本,即使用代码来实现活的波形。
信号的各个参数可以调整,这样就可以实现控制不同类型的设备了。
根据遥控器原理得知需要38kHz的正弦波信号,先在Playing an arbitrary tone with Android找到如何生成
正弦波的方法。测试发现并不能输出38kHz,最高只有20KHz,反过来测试「遥控精灵」的输出频率也是20KHz,
那就暂且使用20KHz的信号。
稍作改动使其输出20KHz的单通道正弦信号。
同样根据遥控器原理中规定的波形的各个长度,进行编码,不过第(3)条要求给忽略了。
实现了以下方法:getleaderCode, getUserCodeToWave, getDataCodeToWave, getStopBit分别获取各个阶段的波形。
将其结合后第0.1版本出炉。源码位于:https://code.csdn.net/kangear/sinewave。目前可以控制测试的一台创维
电视。效果图:
还有很多缺陷要完善:
1.目前失误率还比较高,4次成功一次。
2.目前只实现一个键,可以通过代码修改usercode和datacode。
3.基于单声道的波形,所以只能硬件上连接 左右声道上的一个 和 地。参考软件是可以
实现左 右 地之前的任意组合的硬件连接。
20140924更:
失误率高的原因找到了,多次按键时会偶尔造成波形只剩后半部分。由于这个问题比较模糊,
不知道是什么原因,观察了参考软件的波形,其前后添加了一个
过滤波形10(low) + 4*(1.69(high) + 0.56(low)) + 10(low)。这样的波形有真正的数据前后都有三个。
在代码中实现后,效果明显好转,之前的波形截断虽然还是会有,但是截断不到真正的信号了。
代码进一步完善,可以方便的修复user code和data code。
public void onClick(View v) {
switch (v.getId()) {
case R.id.volume_add_button:
mWaveService.sendSignal((short)0x00ff, (byte)0x28);
break;
case R.id.volume_sub_button:
mWaveService.sendSignal((short)0x00ff, (byte)0x01);
break;
default:
break;
}
}
关于 wav 的单声道还没有优化,目前还只能使用单声道的硬件连接方式。
另一个影响准确率的是硬件上,如果直接接到耳机插口上,电平并没有达到 红外发射管 的最大,
就会造成功率不够。使用自己开发的APP结合网上购买的 红外发射器 已经可以很好的使用了。
关于 Repeat Code,真正的遥控器是会在按键按下的时候每隔110ms发送一个repeat code的。
通过这个实现「按下不松开连接发射信号的功能」,比如按下声音+键不松开就可以实现连续加音量。
不过「遥控精灵」也并没有实现,这样的意义有多大暂时还不清楚。