我有DIY一Android遥控-所有开源

时间:2022-12-30 09:52:15

我有DIY一Android遥控-所有开源

1.试用

记得宋宝华在「设备驱动开发具体解释」提出一个这种理论「软件和硬件互相渗透对方的领地」,这次证明还是确实是这样,使用上层APP软件加上简单的更为简单的硬件设计就能够完毕一个遥控器了。

有开发应用程序网友发E-mail问网上那种DIY的红外遥控器是怎样工作的。查了一下眼下有两种方式,一种是基于USB一种是基于耳机孔。就简单的回复了一信息。

说是将音频信号/USB信号转换为红外信号。

事后自己都认为有点敷衍,还好自己硬件了解一些。软件也会开发。就将他们结合一下。

试用次合,如今开发规律比較清晰了。一般就是先试用进而了解大概功能。试用的次合是在网上买一个 耳机插孔式的遥控发射器 例如以下内部图(不要理会线,线是我測量焊接的)。

我有DIY一Android遥控-所有开源

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FuZ2Vhcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

手机上的软件使用提「遥控精灵」(2.9.3版本号),身边的測试电器是创维电视。

软件设计的比較好使用。试用成功,没有其他障碍。

2.DIY硬件

第二步就是DIY了。Google出[DIY]廉价好用-使用耳機孔的IR遙控器(適用可播.WAV的player) 文長圖多手机遥控器,3.5mm耳机接口红外遥控改造解析两篇文章和一篇原理文章遥控器原理.再结合使用示波器測试按键是耳机孔的输出波形,大概理解了其原理以及DIY须要的元件。

DIY所需元件:1. 3.5耳机插头 2. 红外发射管(事实上这个名字也怪,严格意义上它属于发光二极管和一种。可是去电子商城购买时要说前「红外发射管」)

我有DIY一Android遥控-所有开源

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FuZ2Vhcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

接下来的硬件相关实验是部分替换,软件上使用「遥控精灵」上适配好的配置,然后将焊接好的「遥控器」连接上。进行试验。第一次依据第一篇引用文章中将两个二极管正负相连再连接到耳机插头的左右声道 例如以下图:

我有DIY一Android遥控-所有开源

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FuZ2Vhcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

实验结果:成功无误。

第二次实验是 依据第二篇引用文章仅仅焊接一个发射管,实验结果:成功无误。

第三次实验是将正负极颠倒再次測试,实验结果相同是:成功无误。

从上述三个次实验中。清晰了非常多概念,可是也带来非常的疑惑,文章一中说要将19kHz转换为38kHz所以要两个发射管正负互接的。可是第二次实验中,不进行互接也是能够发射信号的。第三次实验中正反互换都没有影响信号正常的发射与接收。这也是一个一点。

第三点是没有接三极管进行放大,相同是能够使用的。先将理论讨论临时放到这里。继续新的实验。

软件上的实验是终于实现自己开发一个APP来发射数据。

第一步是将「遥控精灵」输出的音频录音下来。硬件连接是使用一个公公的耳机插头将「遥控精灵」输出的按键波形录制下来。

将其放到手机中进行播放音频来向电视机发送红外信号。验证通过。

2.DIY软件

总体原理理通顺之后就開始大盘计划,使用编写一个「遥控精灵」的开源版本号,即使用代码来实现活的波形。

信号的各个參数能够调整,这样就能够实现控制不同类型的设备了。

依据遥控器原理得知须要38kHz的正弦波信号。先在Playing an arbitrary tone with Android找到怎样生成正弦波的方法。

測试发现并不能输出38kHz,最高仅仅有20KHz。反过来測试「遥控精灵」的输出频率也是20KHz,那就暂且使用20KHz的信号。稍作修改使其输出20KHz的单通道正弦信号。

我有DIY一Android遥控-所有开源

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FuZ2Vhcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

相同依据)条要求给忽略了。实现了下面方法:getleaderCode, getUserCodeToWave, getDataCodeToWave, getStopBit分别获取各个阶段的波形。

将其结合后第0.1版本号出炉。源代码位于:https://code.csdn.net/kangear/sinewave。

眼下能够控制測试的一台创维电视。

效果图:

我有DIY一Android遥控-所有开源

还有非常多缺陷要完好:

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;

}

}

关于wav的单声道还没有优化。眼下还仅仅能使用单声道的硬件连接方式。

还有一个影响准确率的是硬件上,假设直接接到耳机插口上。电平并没有达到 红外发射管 的最大。就会造成功率不够。

使用自己开发的APP结合网上购买的 红外发射器 已经能够非常好的使用了。

关于 Repeat Code,真正的遥控器是会在按键按下的时候每隔110ms发送一个repeat code的。

通过这个实现「按下不松开连接发射信号的功能」,比方按下声音+键不松开就能够实现连续加音量。

只是「遥控精灵」也并没有实现,这种意义有多大临时还不清楚。

问与答

(20150127)近期关注这一篇文章的人開始多了起来,我也开启这篇文章的「问与答」吧。

1.c语言生成一个wava文件而你使用正弦波转化。放到数组中怎样生成WAVE文件?

答:是先有了需求才去实现的,了解了红外发射管须要的波形:38kHz的方波。

再来看手机的能力,因为手机的属性,一般将音频限制为人耳听力范围20~20kHz,这明显不够呢,怎样办?不怎么办,仅仅管试试。就播放最高的20KHZ看怎样?測试结果是可行。(这说明不能全然信手冊上,还是要自己动手做一下)

    目的是播放20KHZ音乐,产生波形,可是API默认生成的是正弦波,假设要用软件实现那么须要再经过傅立叶变化为方波。显得相当麻烦。那么别人是怎样实现的呢?查看了一个成品软件,測量了一下输出波形果真也是只正弦波,那么我就放心地使用了正弦波。

    关于怎样播放,假设你了解Android开发。你会明确不须要生成WAV文件。直接在内存中生成并播放也是一种播放音频的方式。当然音频文件的方式我是尝试过的。也是可行的。不相信权威勇敢尝试,一切要比书本上要明确的更深。



2.假设要自己改动发射的码是否是仅仅要更改 usercode和datacode呢,我在看红外线遥控原理的时候看到的是 用户反码+用户码+数据码+数据反码?

答:这个就更简单了,是我封装了一下。当提供用户码的时候 怎么转换其反码,数据同理。假设你看代码了的话。就不会有这个疑问了。。)

(20150426)

3.44.1Khz是什么的频率?

答:44.1kHz是音频信号的採样频率,详见:http://en.wikipedia.org/wiki/44,100_Hz

4.sin函数里面传的參数是什么意思呀,(sampleRate/freqOfTone)是什么意思。为什么那两个要相除,(private final double freqOfTone = 200000; // hz 200000=>20khz(50us) 最高这里面20KHz是不是多打了一个零)。

答:原本的代码写的不是那么easy上人理解,已经更新且加上了代码凝视。

事实上是一个求值的过程。公式是已有的:y(t) = A * sin (2πft + φ),当中:

* A: 振幅,这里为1;

       * f: 频率。这里为freqOfTone;

       * t: 时间,这里为(i/sampleRate);

       * φ: 初相位,这里为0;

那句代码事实上就是依据这个公式写的,这个公式的介绍见:http://en.wikipedia.org/wiki/Sine_wave

所以好理解的写法是这种:sample[i] = Math.sin(2 * Math.PI * freqOfTone * (i / sampleRate));

关于是否多打一个零,我想应该是的。

5.载波频率38KHz(也就是楼主用的20KHz)指的是什么,不是指每次跳变是1/38KHz嘛。

按楼主写的好像是数组中的每一位是1/44.1KHz。

答:载波频率就是正弦波的频率,周期就是1/38Khz。详细的公式介绍已经在上一个问题中进行了解说。

6.(20150616)问:我如今想做一个控制空调的功能,从网上查到我的空调的红外信号是依照下面规定来的:

0的电平宽度为:600μs低电平+600μs高电平

1的电平宽度为:600μs低电平+1600μs高电平

起始码 S电平宽度 为:9000us低电平+4500us高电平

连接码C电平宽度为:600us低电平+20000us高电平

请问假设我要实现01sc这四个的话,在您封装的函数是能够直接调用的么?还是须要改动什么參数。

另外我用两个公头的线录下了其它成品软件控制我空调的录音,用cooledit打开看到的貌似也是正弦波

答:从信号宽度上来看和我文章中的那个时序图差点儿相同,应该是一个标准。我再次整理代码,将这个几个时序參数整理成常量到一起,这样想自己改一些參数也能够非常好的更改。也加上了凝视方便理解。

你须要自行结合图上的时序图和下图凝视来找到你信号宽度相应:(事实上你搜索这些參数和文中的參考文档中有都提到。红外信号协议一般不会区分设备类型:电视,空调,投影仪。至于怎么改适合你你得自己搞清楚了)

我有DIY一Android遥控-所有开源

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FuZ2Vhcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

关于正弦波。暂还找到能输出正弦波的APP,手机的能力来解释这些,但不影响使用。

版权声明:本文博主原创文章,博客,未经同意不得转载。