当前位置:   article > 正文

基于安卓的视频遥控小车——红外遥控部分_android音频转红外

android音频转红外

上一篇简单介绍了“基于安卓的视频遥控小车”,这次详细说说此设计的安卓端的红外遥控部分。
手机和小车之间的通信我用的不是蓝牙是红外遥控,虽然红外的遥控的控制距离只有10m左右,无法绕过障碍物进行遥控。但发射红外遥控信号的手机就架在小车上,可以将手机的红外发射器和红外接收器放在一块固定住。虽然并不是所有的安卓手机都有红外发射器,但都有3.5mm的耳机接口,红外信号的38kHz频率在音频范围内,可以用耳机接口外接的红外发光二极管发射红外遥控信号。如果使用蓝牙来完成对小车的控制,小车上需要配备蓝牙模块与手机进行配对通信。而且并不是所有的手机都支持蓝牙,早期的一些安卓智能手机就不支持蓝牙。而且蓝牙需要配对连接,红外遥控无需配对连接,省去等待时间。相比蓝牙模块,红外模块成本更低。所以采用红外遥控模式。

上边说的都是后话了,当初之所以用红外,是因为我一开始用的不是OPPO A51 ,用的是酷派8076D。那会儿A51还用着呢,这个酷派手机有WiFi但没有蓝牙,所以手机和单片机之间的通信就成了问题。

当时的小车还是这个样子

我从网上搜了好多解决方案,智能手机是开发完成的产品,留出的接口不多,也只有USB口和耳机口:

一,用手机的USB口,但我发现酷派8076D不支持OTG,然后又从网上搜说是厂家只是删除了配置文件,我试了试,还是不行,它硬件上应该也没有升压电路(手机电池一般3.7V,USB是5V供电)。这部分参考使用android IOIO和安卓手机制作视频遥控小车(控制灯的开关、实时视频传输、方向控制)

二,用耳机口,这个网上也有例子一文读懂Android/iOS手机如何通过音频接口与外设通信,他这种方案是双工通信,但这个吧,涉及到信号处理,和数学打交道,鄙人数学渣渣。再者得买个这种外设,no money啊。然后我之前研究过遥控精灵(ZaZaRemote),不支持红外遥控的手机,在耳机孔插个红外发射头(smart zaza)就行了。这种方案是单工通信,小车配套上红外一体化接收头就可以遥控小车移动。不过不同手机的耳机口驱动力不一样,有的驱动不了红外发光二极管(压降1.4V左右),我的酷派就驱动不了,我直接把二极管接在手机喇叭上。

最后,选择了音频口发射红外信号这种方案。其实造车之前,就开始在研究红外了,那会儿考四六级和期末英语考试都是用的红外耳机,就想着期末英语怎么作弊(^_−)☆,因为听力就是课本上的。教室有个红外发射器,后来查了些资料发现就是音频范围,把喇叭拆了接上红外发光二极管,就能用红外耳机听到声音。不过没用在作弊上,因为功率太小了(酷派手机喇叭改的),盖不过教室的。

音频转红外这块,我还没做好,我只是录了红外遥控信号的音频文件,然后播放。但我发现准确率大概只有八成,感觉这东西涉及到傅里叶变换,音频是正弦波,红外信号是方波,直接用音频驱动是有误差的吧,我也不是很懂,数学不好。网上我搜到这篇是用安卓实现的安卓手把手教你学习并实现 安卓耳机口音频转红外发射,但我是用底层C语言实现的,用的C4droid写的在手机上运行,参考的这篇 OpenSL ES范例,无java代码,纯C

再后来,OPPO A51不用了,就把它用在小车上。OPPO A51支持红外遥控,所以不用那么麻烦。参考这篇Android编程红外编程——红外码详析
单片机红外解码程序参考Android遥控器开发,这个后边有单片机红外解码程序。

因为Android4.4及以上才有ConsumerIrManager类用来操控红外设备,所以以下程序是基于Android 5.1系统的OPPO A51手机开发和测试的。

首先从系统服务中获取到ConsumerIrManager服务。

IR=(ConsumerIrManager)getSystemService(CONSUMER_IR_SERVICE);

然后将要发送的红外码存入数组中 

  1. //0x73
  2.     int[] pattern2 = { 9000, 4500
  3.             560, 560,     560, 560,     560, 560,     560, 560,     560,560,     560, 560,     560, 560,     560, 560
  4.             560, 1690,     560, 1690,     560, 1690,    560, 1690,     560, 1690,     560, 1690,     560, 1690,     560, 1690
  5. /*0001 1000*/560, 560,    560, 560,     560, 560,     560, 1690,     560, 1690,     560, 560,     560, 560,     560, 560
  6.             560, 1690,     560, 1690,     560, 1690,     560, 560,     560, 560,     560, 1690,     560, 1690,     560, 1690
  7.             560, 42020, 9000, 2250, 560, 98190 };

一种交替的载波序列模式,通过毫秒测量
 引导码,地址码,地址码,数据码,数据反码

第三行数据码反置,比如0x12=0001 0010反置为 0100 1000
可能和接收有关系,只有反置了之后才能接收正常

最后通过如下方法最终发送红外信号。

mCIR.transmit(hz, pattern2);//后 

transmit(int carrierFrequency, int[] pattern)  :此方法控制手机产生 carrierFrequency为频率的,以pattern为红外开关的时间数组,发送红外信号。(例如:transmit(38000,{100,200,300,400})    将会产生一个频率为38KHz的红外信号,信号的电平高低为 100us高电平,200us低电平,300us高电平,400us低电平。注意pattern的数据个数要为偶数个,不然报错。)。

手机端红外发射功能的程序流程图如下图所示。

最后再放两张图

还可以参考以下链接

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

手机当万能遥控器-自制“遥控精灵”外设

摄像头开发部分详见基于安卓的视频遥控小车——车载安卓开发详解

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/546884
推荐阅读
相关标签
  

闽ICP备14008679号