我也DIY一个Android遥控器-全部开源

我也DIY一个Android遥控器-全部开源

1.试用

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

       有开发应用程序网友发E-mail问网上那种DIY的红外遥控器是如何工作的,查了一下目前有两种方式,一种是基于USB一种是基于耳机孔。就简单的回复了一信息。说是将音频信号/USB信号转换为红外信号。事后自己都觉得有点敷衍,还好自己硬件了解一些,软件也会开发。就将他们结合一下。

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

我也DIY一个Android遥控器-全部开源_第1张图片

       手机上的软件使用提「遥控精灵」(2.9.3版本),身边的测试电器是创维电视。软件设计的比较好使用,试用成功,没有其它障碍。

 

2.DIY硬件

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

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

 我也DIY一个Android遥控器-全部开源_第2张图片

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

我也DIY一个Android遥控器-全部开源_第3张图片

       实验结果:成功无误。

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

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

 

       从上述三个次实验中,清晰了很多概念,但是也带来很的疑惑,文章一中说要将19kHz转换为38kHz所以要两个发射管正负互接的,但是第二次实验中,不进行互接也是可以发射信号的。第三次实验中正反互换都没有影响信号正常的发射与接收。这也是一个一点。第三点是没有接三极管进行放大,同样是可以使用的。先将理论讨论暂时放到这里。继续新的实验。

 

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

       第一步是将「遥控精灵」输出的音频录音下来。硬件连接是使用一个公公的耳机插头将「遥控精灵」输出的按键波形录制下来。将其放到手机中进行播放音频来向电视机发送红外信号。验证通过。

 

2.DIY软件

       整体原理理通顺之后就开始大盘计划,使用编写一个「遥控精灵」的开源版本,即使用代码来实现活的波形。信号的各个参数可以调整,这样就可以实现控制不同类型的设备了。

 

       根据遥控器原理得知需要38kHz的正弦波信号,先在Playing an arbitrary tone with Android找到如何生成正弦波的方法。测试发现并不能输出38kHz,最高只有20KHz,反过来测试「遥控精灵」的输出频率也是20KHz,那就暂且使用20KHz的信号。稍作改动使其输出20KHz的单通道正弦信号。

 我也DIY一个Android遥控器-全部开源_第4张图片

       同样根据遥控器原理中规定的波形的各个长度,进行编码,不过第(3)条要求给忽略了。实现了以下方法:getleaderCode, getUserCodeToWave, getDataCodeToWave, getStopBit分别获取各个阶段的波形。将其结合后第0.1版本出炉。源码位于:https://code.csdn.net/kangear/sinewave。目前可以控制测试的一台创维电视。效果图:

 我也DIY一个Android遥控器-全部开源_第5张图片

 

 

 

    还有很多缺陷要完善:

1.目前失误率还比较高,4次成功一次。

2.目前只实现一个键,可以通过代码修改usercodedatacode

3.基于单声道的波形,所以只能硬件上连接 左右声道上的一个 和 地。参考软件是可以实现左 右 地之前的任意组合的硬件连接。

20140924更:

    失误率高的原因找到了,多次按键时会偶尔造成波形只剩后半部分。由于这个问题比较模糊,不知道是什么原因,观察了参考软件的波形,其前后添加了一个过滤波形10(low) + 4*(1.69(high) + 0.56(low)) + 10(low)。这样的波形有真正的数据前后都有三个。在代码中实现后,效果明显好转,之前的波形截断虽然还是会有,但是截断不到真正的信号了。

    代码进一步完善,可以方便的修复user codedata 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是不是多打了一个零)。

答:原本的代码写的不是那么容易上人理解,已经更新且加上了代码注释。其实是一个求值的过程,公式是已有的: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遥控器-全部开源_第6张图片
关于正弦波,暂还找到能输出正弦波的APP,说明手机的能力就这些,但是不影响使用。

7. userCode与dataCode代表什么意思

我也DIY一个Android遥控器-全部开源_第7张图片

你可能感兴趣的:(Android)