摘要
前段時間學習無線電的同時了解到arduino是作為技能尚未成熟技術宅的我繼樹莓派又一個不錯的選擇。於是花了200元購得3塊arduino開發板(2*nano&1*uno)和其他傳感器等,同時看到了315M超再生模塊,因為玩無線電的都知道315M是汽車遙控器,防盜閘門,路橋系統等最常用的信號頻率,所以我就毫不猶豫的下單了。然后就有了今天的成果。Freebuf也有不少此類文章,關於315,433的解碼我已掌握很多方法(其實使用SDR是個不錯的選擇),對滾碼我也有一定研究和破解,本文步驟詳細,思路明確,希望對大家有用。對arduino和315模塊熟悉的可以直接進入第三步。
關鍵詞:315M超再生模塊、arduino。
引言:315MHz遙控器使用廣泛,學習和深入了解其原理和實際操作,在獲得無限樂趣的同時,可以學會防止自己的車被盜,並可以自己開發更安全的遙控鎖設備,在做本項目的過程中我深刻體會到315M遙控系統的不安全性是個嚴重的問題,主要表現在315遙控系統解碼簡單,發射條件簡單,易拷貝。下面是我在此次學習研究中得到的一些淺陋知識,在此詳細描述。
以下是本次學習的原理框架:
框圖說明:接收端接收信號,由arduino單片機解碼,並將解碼信息通過藍牙發送到手機,在手機藍牙串口監視器顯示(解碼過程);手機發送24位遙控碼到單片機,單片機將24位遙控碼通過發射端發出,用於遙控模擬接收端通過接收端PT2272芯片解碼后在LED信號燈得到反饋,模擬接收端由單片機直接供電,發射端發出的信號也可直接有其他遙控接收端接收達到其他目的。
一、基礎知識介紹:
1、Arduino介紹:
Arduino是一款便捷靈活、方便上手的開源電子原型平台,包含硬件(各種型號的Arduino板)和軟件(Arduino IDE)。由一個歐洲開發團隊最早於2005年冬季開發。其成員包括Massimo Banzi,David Cuartielles,Tom Igoe,Gianluca Martino,David Mellis和Nicholas Zambetti。
它構建於開放原始碼simple I/O介面版,並且具有使用類似Java、C語言的Processing/Wiring開發環境。主要包含兩個主要的部分:硬件部分是可以用來做電路連接的Arduino電路板;另外一個則是Arduino IDE,你的計算機中的程序開發環境。你只要在IDE中編寫程序代碼,將程序上傳到Arduino電路板后,程序便會告訴Arduino電路板要做些什么了。
Arduino能通過各種各樣的傳感器來感知環境,通過控制燈光、馬達和其他的裝置來反饋、影響環境。板子上的微控制器可以通過Arduino的編程語言來編寫程序,編譯成二進制文件,燒錄進微控制器。對Arduino的編程是利用 Arduino編程語言 (基於Wiring)和Arduino開發環境(基於 Processing)來實現的。基於Arduino的項目,可以只包含Arduino,也可以包含Arduino和其他一些在PC上運行的軟件,他們之間進行通信 (比如 Flash, Processing, MaxMSP)來實現。(摘自百度百科)
二、硬件介紹:
1、Arduino開發板
Arduino是開源硬件中最受IT行業,技術宅,學生喜愛的單片機開發板,其編程語言使用C語言,並且不像C51單片機的編程語言那么復雜,所以對於單片機的初學者來說無疑是最好的選擇,本課題為簡化實驗流程,縮短開發時間,所以選擇了簡單卻強悍的arduino單片機開發板,arduino開發板有很多硬件平台,常見的 arduino有以下兩種:
(1) arduino UNO (是本文使用的arduino板卡) (2)arduino NANO
2、315M模塊如圖所示,分為發送端(右)和接收端(左)。
3、用於模擬的遙控器和接收機
發射模塊PT2262
接收模塊PT2272
4、串口藍牙模塊
串口藍牙模塊直接使用藍牙設備連接並通過接收ASCII碼並以串口數據的形式傳送至單片機,單片機將數據處理后做出固定反饋,型號為HC-06的藍牙串口模塊的默認名稱為“ HC-06“,默認連接密碼為“0000”,手機使用藍牙調試助手等APP 可直接連接並可與手機直接通信,arduino單片機可直接與電腦進行串口通訊,但為了隨時演示操作,使用手機直接通訊使操作更為方便,HC-06實物圖如下:
三、解碼和模擬
1、連接實物圖:
實物圖說明:左上角是藍牙模塊HC-06用於手機端連接控制,左邊是315接收解碼板以及配備遙控器,解碼板由arduino 供電,連接了5個LED信號燈用於接收的演示,中間是315M超再生模塊的發送端和接收端 ,右邊是arduino UNO 開發板。
2、315M超再生模塊的發送端和接收端連接原理圖
3、模擬測試效果描述:
串口發送A,B,C,D控制發送單次24位遙控二進制碼,實現LED編號A,B,C,D的閃爍;
串口發送a,b,c,d控制連續發送24位遙控二進制碼,實現LED編號A,B,C,D的常亮。
串口發送除以上任意命令實現LED的關閉。
四、解碼驗證及源代碼
1、解碼驗證
當按下遙控器A鍵
●手機串口監視器得到的遙控碼為
“010101010101010100001100”
●專業解碼器顯示的遙控碼如下圖,實際為24位碼(我開始認為最后一位為解碼器設計問題所導致的多余位,沒有最后一位也可以重放,但后來的學習中我發現好多解碼方式都保留了最后一位,實際的信號波形中並沒有最后一位的高電平出現,所以第25位應該是“0”,對於這個問題我還是有疑惑,希望大家幫忙解釋)
●邏輯分析儀分析結果
根據以上三組數據對比,驗證單片機解碼沒有任何問題。
2、arduino源代碼如下:
/*本作品使用的例程中包含RCSwitch庫文件用於信號的解碼和編碼發送*/ #include <RCSwitch.h> RCSwitch mySwitch = RCSwitch(); void setup() { Serial.begin(9600); //串口打印命令幫助信息 Serial.print("HELP:A-flash the lamp A\n B-flash the lamp B\n C-flash the lamp C\n D-flash the lamp D\n"); Serial.print(" a-open the lamp A\n b-open the lamp B\n c-open the lamp C\n d-open the lamp D\n\n"); mySwitch.enableReceive(1); mySwitch.enableTransmit(10);}2 void loop() { if(mySwitch.available()) { output(mySwitch.getReceivedValue(),mySwitch.getReceivedBitlength(), mySwitch.getReceivedDelay(),mySwitch.getReceivedRawdata(),mySwitch.getReceivedProtocol()); mySwitch.resetAvailable(); } /* Same switch as above,but using binary code */ if(Serial.available()>0)//如果串口有數據進入的話 { delay(10); //延時50 可以一次性發送多個命令 char M=Serial.read();//每次讀一個字符,是ASCII碼的 if(M=='A') { Serial.print("Thecommand is A\n"); mySwitch.send("010101010101010100001100");//遙控器-A Serial.print(" OK!!! The LED A has been DONE\n"); } if(M=='a') { Serial.print("The command is a\n"); Serial.print(" OK!!! TheLED A has hlod ON\n"); while(Serial.available()<=0) { mySwitch.send("010101010101010100001100");//遙控器-A 按下不放 } } if(M=='B') { Serial.print("Thecommand is B\n"); mySwitch.send("010101010101010111000000");//遙控器-B Serial.print(" OK!!! The LED B has been DONE\n"); } if(M=='b') { Serial.print("The command is b\n"); Serial.print(" OK!!! The LED B has hlod ON\n"); while(Serial.available()<=0) { mySwitch.send("010101010101010111000000");//遙控器-B 按下不放 } } if(M=='C') { Serial.print("Thecommand is C\n"); mySwitch.send("010101010101010100000011");//遙控器-C Serial.print(" OK!!! The LED C has been DONE\n"); } if(M=='c') { Serial.print("The command is c\n"); Serial.print(" OK!!! TheLED C has hlod ON\n"); while(Serial.available()<=0) { mySwitch.send("010101010101010100000011");//遙控器-C按下不放 } } if(M=='D') { Serial.print("Thecommand is D\n"); mySwitch.send("010101010101010100110000");//遙控器-D Serial.print(" OK!!! The LED D has been DONE\n"); } if(M=='d') { Serial.print("The command is d\n"); Serial.print(" OK!!! TheLED D has hlod ON\n"); while(Serial.available()<=0) { mySwitch.send("010101010101010100110000");//遙控器-D按下不放 } } } }
在整個過程中為了研究方便用到汽車遙控碼解碼器,以方便對本次實驗解碼的正確性進行校驗。
參考文獻:
[1] Steven F.Barrett. arduino高級開發權威指南.2,機械工業出版社:潘鑫磊,2014年
[2] 網絡資料