刚刚放假,老爸就给了我一个任务,让我写个简易的app,用手机红外遥控他公司要用的单片机。之前在JetsonTx2小车的项目里有用过蓝牙和socket通信,还没尝试过红外,研究了一下,发现并不难。整个app两个小时就写好了,当然也没做什么界面的美化,主要还是把精力放在功能的实现上。
Android部分
Android有现成的红外类ConsumerIrManager
可以用,代码都很简单,关键在于红外码的解读。
红外的编码格式一般为:引导码+用户编码低8位+用户编码高8位+数据码(8位)+数据码的反码(8位,校验用)
以我老爸的单片机为例:
- 引导码:
9ms
的高电平+4.5ms
的低电平 - 用户编码:这个要看你自己的,我们的单片机为
00000000 ffffffff
- 数据码:这个要看你想传什么,以传
16
为例,就是0001 0110
,前4位表示1
,后4位表示6
- 数据码的反码:看名字就知道要干嘛,还是以传
16
为例,就是1110 1001
- 载波:
38KHz
最后要把1
和0
用高低电平表示,在我老爸的单片机上,560ms
的高电平+565ms
的低电平表示0
,560ms
的高电平+1690ms
的低电平表示1
activity_main.xml
|
|
AndroidManifest.xml
加上这两句:
|
|
MainActivity.java
|
|
代码写的不好,不同的数据我就硬编码了,没动脑子。。。这里就不全贴出来,用”其余类似“表示了
实际操作中,数据码的传送要左右颠倒,比如16
的数据码是00010110
,那你就得写成01101000
。我不知道为什么要这样,可能是我老爸的单片机接受数据的方式就是这样,开始一直不对,我也是试了几次才发现了这个规律。
还有个坑是发射时数据会少一位,所以我补了一位,这个问题也是仁者见仁,你可能压根遇不到这个问题。
单片机部分
这个咱也不知道是咋写的,咱也不敢问。反正老爸都写好了,用C语言写了一千多行,咱也不想看。