上一篇简单介绍了“基于安卓的视频遥控小车”,这次详细说说此设计的安卓端的
红外遥控部分。
手机和小车之间的
通信我用的不是蓝牙是红外遥控,虽然红外的遥控的控制距离只有10m左右,无法绕过障碍物进行遥控。但发射红外遥控信号的手机就架在小车上,可以将手机的红外发射器和红外接收器放在一块固定住。虽然并不是所有的安卓手机都有红外发射器,但都有3.5mm的耳机
接口,红外信号的38kHz频率在
音频范围内,可以用耳机接口外接的红外发光
二极管发射红外遥控信号。如果使用蓝牙来完成对小车的控制,小车上需要配备蓝牙模块与手机进行配对通信。而且并不是所有的手机都支持蓝牙,早期的一些安卓智能手机就不支持蓝牙。而且蓝牙需要配对连接,红外遥控无需配对连接,省去等待时间。相比蓝牙模块,红外模块成本更低。所以采用红外遥控模式。
上边说的都是后话了,当初之所以用红外,是因为我一开始用的不是OPPO A51 ,用的是酷派8076D。那会儿A51还用着呢,这个酷派手机有WiFi但没有蓝牙,所以手机和单片机之间的通信就成了问题。
我从网上搜了好多解决方案,智能手机是开发完成的产品,留出的接口不多,也只有USB口和耳机口:
二,用耳机口,这个网上也有例子
一文读懂Android/iOS手机如何通过音频接口与外设通信,他这种方案是双工通信,但这个吧,涉及到信号处理,和数学打交道,鄙人数学渣渣。再者得买个这种外设,no money啊。然后我之前研究过遥控精灵(ZaZaRemote),不支持红外遥控的手机,在耳机孔插个红外发射头(
smart zaza)就行了。这种方案是单工通信,小车配套上红外一体化接收头就可以遥控小车移动。不过不同手机的耳机口驱动力不一样,有的驱动不了红外发光二极管(压降1.4V左右),我的酷派就驱动不了,我直接把二极管接在手机喇叭上。
最后,选择了音频口发射红外信号这种方案。其实造车之前,就开始在研究红外了,那会儿考四六级和期末英语考试都是用的红外耳机,就想着期末英语怎么作弊(^_−)☆,因为听力就是课本上的。教室有个红外发射器,后来查了些资料发现就是音频范围,把喇叭拆了接上红外发光二极管,就能用红外耳机听到声音。不过没用在作弊上,因为功率太小了(酷派手机喇叭改的),盖不过教室的。
因为Android4.4及以上才有
ConsumerIrManager类用来操控红外设备,所以以下程序是基于Android 5.1系统的OPPO A51手机开发和测试的。
首先从系统服务中获取到ConsumerIrManager服务。
IR=(ConsumerIrManager)getSystemService(CONSUMER_IR_SERVICE);
然后将要发送的红外码存入数组中
//0x73 int[] pattern2 = { 9000, 4500, 560, 560, 560, 560, 560, 560, 560, 560, 560,560, 560, 560, 560, 560, 560, 560, 560, 1690, 560, 1690, 560, 1690, 560, 1690, 560, 1690, 560, 1690, 560, 1690, 560, 1690, /*0001 1000*/560, 560, 560, 560, 560, 560, 560, 1690, 560, 1690, 560, 560, 560, 560, 560, 560, 560, 1690, 560, 1690, 560, 1690, 560, 560, 560, 560, 560, 1690, 560, 1690, 560, 1690, 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的数据个数要为偶数个,不然报错。)。
手机端红外发射功能的程序流程图如下图所示。
最后再放两张图
还可以参考以下链接