上一篇簡單介紹了“基于安卓的視頻遙控小車”,這次詳細(xì)說說此設(shè)計(jì)的安卓端的
紅外遙控部分。
手機(jī)和小車之間的
通信我用的不是藍(lán)牙是紅外遙控,雖然紅外的遙控的控制距離只有10m左右,無法繞過障礙物進(jìn)行遙控。但發(fā)射紅外遙控信號的手機(jī)就架在小車上,可以將手機(jī)的紅外發(fā)射器和紅外接收器放在一塊固定住。雖然并不是所有的安卓手機(jī)都有紅外發(fā)射器,但都有3.5mm的耳機(jī)
接口,紅外信號的38kHz頻率在
音頻范圍內(nèi),可以用耳機(jī)接口外接的紅外發(fā)光
二極管發(fā)射紅外遙控信號。如果使用藍(lán)牙來完成對小車的控制,小車上需要配備藍(lán)牙模塊與手機(jī)進(jìn)行配對通信。而且并不是所有的手機(jī)都支持藍(lán)牙,早期的一些安卓智能手機(jī)就不支持藍(lán)牙。而且藍(lán)牙需要配對連接,紅外遙控?zé)o需配對連接,省去等待時(shí)間。相比藍(lán)牙模塊,紅外模塊成本更低。所以采用紅外遙控模式。
上邊說的都是后話了,當(dāng)初之所以用紅外,是因?yàn)槲乙婚_始用的不是OPPO A51 ,用的是酷派8076D。那會兒A51還用著呢,這個(gè)酷派手機(jī)有WiFi但沒有藍(lán)牙,所以手機(jī)和單片機(jī)之間的通信就成了問題。
當(dāng)時(shí)的小車還是這個(gè)樣子






我從網(wǎng)上搜了好多解決方案,智能手機(jī)是開發(fā)完成的產(chǎn)品,留出的接口不多,也只有USB口和耳機(jī)口:
二,用耳機(jī)口,這個(gè)網(wǎng)上也有例子
一文讀懂Android/iOS手機(jī)如何通過音頻接口與外設(shè)通信,他這種方案是雙工通信,但這個(gè)吧,涉及到信號處理,和數(shù)學(xué)打交道,鄙人數(shù)學(xué)渣渣。再者得買個(gè)這種外設(shè),no money啊。然后我之前研究過遙控精靈(ZaZaRemote),不支持紅外遙控的手機(jī),在耳機(jī)孔插個(gè)紅外發(fā)射頭(
smart zaza)就行了。這種方案是單工通信,小車配套上紅外一體化接收頭就可以遙控小車移動。不過不同手機(jī)的耳機(jī)口驅(qū)動力不一樣,有的驅(qū)動不了紅外發(fā)光二極管(壓降1.4V左右),我的酷派就驅(qū)動不了,我直接把二極管接在手機(jī)喇叭上。


最后,選擇了音頻口發(fā)射紅外信號這種方案。其實(shí)造車之前,就開始在研究紅外了,那會兒考四六級和期末英語考試都是用的紅外耳機(jī),就想著期末英語怎么作弊(^_−)☆,因?yàn)槁犃褪钦n本上的。教室有個(gè)紅外發(fā)射器,后來查了些資料發(fā)現(xiàn)就是音頻范圍,把喇叭拆了接上紅外發(fā)光二極管,就能用紅外耳機(jī)聽到聲音。不過沒用在作弊上,因?yàn)楣β侍×耍ǹ崤墒謾C(jī)喇叭改的),蓋不過教室的。
因?yàn)锳ndroid4.4及以上才有
ConsumerIrManager類用來操控紅外設(shè)備,所以以下程序是基于Android 5.1系統(tǒng)的OPPO A51手機(jī)開發(fā)和測試的。
首先從系統(tǒng)服務(wù)中獲取到ConsumerIrManager服務(wù)。
IR=(ConsumerIrManager)getSystemService(CONSUMER_IR_SERVICE);

然后將要發(fā)送的紅外碼存入數(shù)組中
//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 };

一種交替的載波序列模式,通過毫秒測量
引導(dǎo)碼,地址碼,地址碼,數(shù)據(jù)碼,數(shù)據(jù)反碼
第三行數(shù)據(jù)碼反置,比如0x12=0001 0010反置為 0100 1000
可能和接收有關(guān)系,只有反置了之后才能接收正常
最后通過如下方法最終發(fā)送紅外信號。
mCIR.transmit(hz, pattern2);//后

transmit(int carrierFrequency, int[] pattern) :此方法控制手機(jī)產(chǎn)生 carrierFrequency為頻率的,以pattern為紅外開關(guān)的時(shí)間數(shù)組,發(fā)送紅外信號。(例如:transmit(38000,{100,200,300,400}) 將會產(chǎn)生一個(gè)頻率為38KHz的紅外信號,信號的電平高低為 100us高電平,200us低電平,300us高電平,400us低電平。注意pattern的數(shù)據(jù)個(gè)數(shù)要為偶數(shù)個(gè),不然報(bào)錯(cuò)。)。
手機(jī)端紅外發(fā)射功能的程序流程圖如下圖所示。




最后再放兩張圖




還可以參考以下鏈接