上一篇簡單介紹了“基于安卓的視頻遙控小車”,這次詳細說說此設計的安卓端的
紅外遙控部分。
手機和小車之間的
通信我用的不是藍牙是紅外遙控,雖然紅外的遙控的控制距離只有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的數據個數要為偶數個,不然報錯。)。
手機端紅外發射功能的程序流程圖如下圖所示。




最后再放兩張圖




還可以參考以下鏈接