315Mhz、433Mhz無線遙控信號的解碼分析和模擬

摘要
前段時間學習無線電的同時瞭解到arduino是做爲技能還沒有成熟技術宅的我繼樹莓派又一個不錯的選擇。因而花了200元購得3塊arduino開發板(2*nano&1*uno)和其餘傳感器等,同時看到了315M超再生模塊,由於玩無線電的都知道315M是汽車遙控器,防盜閘門,路橋系統等最經常使用的信號頻率,因此我就堅決果斷的下單了。而後就有了今天的成果。Freebuf也有很多此類文章,關於315,433的解碼我已掌握不少方法(其實使用SDR是個不錯的選擇),對滾碼我也有必定研究和破解,本文步驟詳細,思路明確,但願對你們有用。對arduino和315模塊熟悉的能夠直接進入第三步。
關鍵詞: 315M超再生模塊、arduino。
引言:315MHz遙控器使用普遍,學習和深刻了解其原理和實際操做,在得到無限樂趣的同時,能夠學會防止本身的車被盜,並能夠本身開發更安全的遙控鎖設備,在作本項目的過程當中我深入體會到315M遙控系統的不安全性是個嚴重的問題,主要表如今315遙控系統解碼簡單,發射條件簡單,易拷貝。下面是我在這次學習研究中獲得的一些淺陋知識,在此詳細描述。
如下是本次學習的原理框架:
Clipboard Image.png
框圖說明:接收端接收信號,由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)來實現。(摘自百度百科)
2、硬件介紹:
一、Arduino開發板
Arduino是開源硬件中最受IT行業,技術宅,學生喜好的單片機開發板,其編程語言使用C語言,而且不像C51單片機的編程語言那麼複雜,因此對於單片機的初學者來講無疑是最好的選擇,本課題爲簡化實驗流程,縮短開發時間,因此選擇了簡單卻強悍的arduino單片機開發板,arduino開發板有不少硬件平臺,常見的 arduino有如下兩種:
(1) arduino UNO (是本文使用的arduino板卡)  (2)arduino NANO
 
Clipboard Image.png
Clipboard Image.png
二、315M模塊如圖所示,分爲發送端(右)和接收端(左)。
 
Clipboard Image.png
三、用於模擬的遙控器和接收機
Clipboard Image.png
發射模塊PT2262
Clipboard Image.png
接收模塊PT2272
四、串口藍牙模塊
串口藍牙模塊直接使用藍牙設備鏈接並經過接收ASCII碼並以串口數據的形式傳送至單片機,單片機將數據處理後作出固定反饋,型號爲HC-06的藍牙串口模塊的默認名稱爲「 HC-06「,默認鏈接密碼爲「0000」,手機使用藍牙調試助手等APP 可直接鏈接並可與手機直接通訊,arduino單片機可直接與電腦進行串口通信,但爲了隨時演示操做,使用手機直接通信使操做更爲方便,HC-06實物圖以下:
Clipboard Image.png
3、解碼和模擬
一、鏈接實物圖:
Clipboard Image.png
實物圖說明:左上角是藍牙模塊HC-06用於手機端鏈接控制,左邊是315接收解碼板以及配備遙控器,解碼板由arduino供電,鏈接了5個LED信號燈用於接收的演示,中間是315M超再生模塊的發送端和接收端  ,右邊是arduino UNO 開發板。
二、315M超再生模塊的發送端和接收端鏈接原理圖
Clipboard Image.png
三、模擬測試效果描述:
串口發送A,B,C,D控制發送單次24位遙控二進制碼,實現LED編號A,B,C,D的閃爍;
串口發送a,b,c,d控制連續發送24位遙控二進制碼,實現LED編號A,B,C,D的常亮。
串口發送除以上任意命令實現LED的關閉。
4、解碼驗證及源代碼
一、解碼驗證
當按下遙控器A鍵
●手機串口監視器獲得的遙控碼爲
「010101010101010100001100」
●專業解碼器顯示的遙控碼以下圖,實際爲24位碼(我開始認爲最後一位爲解碼器設計問題所致使的多餘位,沒有最後一位也能夠重放,但後來的學習中我發現好多解碼方式都保留了最後一位,實際的信號波形中並無最後一位的高電平出現,因此第25位應該是「0」,對於這個問題我仍是有疑惑,但願你們幫忙解釋)
Clipboard Image.png
邏輯分析儀分析結果
Clipboard Image.png
根據以上三組數據對比,驗證單片機解碼沒有任何問題。
二、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按下不放       }     }   } }
在整個過程當中爲了研究方便用到汽車遙控碼解碼器,以方便對本次實驗解碼的正確性進行校驗。
Clipboard Image.png Clipboard Image.png
摘要
前段時間學習無線電的同時瞭解到arduino是做爲技能還沒有成熟技術宅的我繼樹莓派又一個不錯的選擇。因而花了200元購得3塊arduino開發板(2*nano&1*uno)和其餘傳感器等,同時看到了315M超再生模塊,由於玩無線電的都知道315M是汽車遙控器,防盜閘門,路橋系統等最經常使用的信號頻率,因此我就堅決果斷的下單了。而後就有了今天的成果。Freebuf也有很多此類文章,關於315,433的解碼我已掌握不少方法(其實使用SDR是個不錯的選擇),對滾碼我也有必定研究和破解,本文步驟詳細,思路明確,但願對你們有用。對arduino和315模塊熟悉的能夠直接進入第三步。
關鍵詞: 315M超再生模塊、arduino。
引言:315MHz遙控器使用普遍,學習和深刻了解其原理和實際操做,在得到無限樂趣的同時,能夠學會防止本身的車被盜,並能夠本身開發更安全的遙控鎖設備,在作本項目的過程當中我深入體會到315M遙控系統的不安全性是個嚴重的問題,主要表如今315遙控系統解碼簡單,發射條件簡單,易拷貝。下面是我在這次學習研究中獲得的一些淺陋知識,在此詳細描述。
如下是本次學習的原理框架:
Clipboard Image.png
框圖說明:接收端接收信號,由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)來實現。(摘自百度百科)
2、硬件介紹:
一、Arduino開發板
Arduino是開源硬件中最受IT行業,技術宅,學生喜好的單片機開發板,其編程語言使用C語言,而且不像C51單片機的編程語言那麼複雜,因此對於單片機的初學者來講無疑是最好的選擇,本課題爲簡化實驗流程,縮短開發時間,因此選擇了簡單卻強悍的arduino單片機開發板,arduino開發板有不少硬件平臺,常見的 arduino有如下兩種:
(1) arduino UNO (是本文使用的arduino板卡)  (2)arduino NANO
 
Clipboard Image.png
Clipboard Image.png
二、315M模塊如圖所示,分爲發送端(右)和接收端(左)。
 
Clipboard Image.png
三、用於模擬的遙控器和接收機
Clipboard Image.png
發射模塊PT2262
Clipboard Image.png
接收模塊PT2272
四、串口藍牙模塊
串口藍牙模塊直接使用藍牙設備鏈接並經過接收ASCII碼並以串口數據的形式傳送至單片機,單片機將數據處理後作出固定反饋,型號爲HC-06的藍牙串口模塊的默認名稱爲「 HC-06「,默認鏈接密碼爲「0000」,手機使用藍牙調試助手等APP 可直接鏈接並可與手機直接通訊,arduino單片機可直接與電腦進行串口通信,但爲了隨時演示操做,使用手機直接通信使操做更爲方便,HC-06實物圖以下:
Clipboard Image.png
3、解碼和模擬
一、鏈接實物圖:
Clipboard Image.png
實物圖說明:左上角是藍牙模塊HC-06用於手機端鏈接控制,左邊是315接收解碼板以及配備遙控器,解碼板由arduino供電,鏈接了5個LED信號燈用於接收的演示,中間是315M超再生模塊的發送端和接收端   ,右邊是arduino UNO 開發板。
二、315M超再生模塊的發送端和接收端鏈接原理圖
Clipboard Image.png
三、模擬測試效果描述:
串口發送A,B,C,D控制發送單次24位遙控二進制碼,實現LED編號A,B,C,D的閃爍;
串口發送a,b,c,d控制連續發送24位遙控二進制碼,實現LED編號A,B,C,D的常亮。
串口發送除以上任意命令實現LED的關閉。
4、解碼驗證及源代碼
一、解碼驗證
當按下遙控器A鍵
●手機串口監視器獲得的遙控碼爲
「010101010101010100001100」
●專業解碼器顯示的遙控碼以下圖,實際爲24位碼(我開始認爲最後一位爲解碼器設計問題所致使的多餘位,沒有最後一位也能夠重放,但後來的學習中我發現好多解碼方式都保留了最後一位,實際的信號波形中並無最後一位的高電平出現,因此第25位應該是「0」,對於這個問題我仍是有疑惑,但願你們幫忙解釋)
Clipboard Image.png
邏輯分析儀分析結果
Clipboard Image.png
根據以上三組數據對比,驗證單片機解碼沒有任何問題。
二、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按下不放       }     }   } }
在整個過程當中爲了研究方便用到汽車遙控碼解碼器,以方便對本次實驗解碼的正確性進行校驗。
Clipboard Image.png
Clipboard Image.png
相關文章
相關標籤/搜索