摘要
前段時間學習無線電的同時瞭解到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)來實現。(摘自百度百科)
2、硬件介紹:
一、Arduino開發板
Arduino是開源硬件中最受IT行業,技術宅,學生喜好的單片機開發板,其編程語言使用C語言,而且不像C51單片機的編程語言那麼複雜,因此對於單片機的初學者來講無疑是最好的選擇,本課題爲簡化實驗流程,縮短開發時間,因此選擇了簡單卻強悍的arduino單片機開發板,arduino開發板有不少硬件平臺,常見的 arduino有如下兩種:
(1) arduino UNO (是本文使用的arduino板卡) (2)arduino NANO
二、315M模塊如圖所示,分爲發送端(右)和接收端(左)。
三、用於模擬的遙控器和接收機
發射模塊PT2262
接收模塊PT2272
四、串口藍牙模塊
串口藍牙模塊直接使用藍牙設備鏈接並經過接收ASCII碼並以串口數據的形式傳送至單片機,單片機將數據處理後作出固定反饋,型號爲HC-06的藍牙串口模塊的默認名稱爲「 HC-06「,默認鏈接密碼爲「0000」,手機使用藍牙調試助手等APP 可直接鏈接並可與手機直接通訊,arduino單片機可直接與電腦進行串口通信,但爲了隨時演示操做,使用手機直接通信使操做更爲方便,HC-06實物圖以下:
3、解碼和模擬
一、鏈接實物圖:
實物圖說明:左上角是藍牙模塊HC-06用於手機端鏈接控制,左邊是315接收解碼板以及配備遙控器,解碼板由arduino供電,鏈接了5個LED信號燈用於接收的演示,中間是315M超再生模塊的發送端和接收端
,右邊是arduino UNO 開發板。
二、315M超再生模塊的發送端和接收端鏈接原理圖
三、模擬測試效果描述:
串口發送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」,對於這個問題我仍是有疑惑,但願你們幫忙解釋)
●
邏輯分析儀分析結果
根據以上三組數據對比,驗證單片機解碼沒有任何問題。
二、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按下不放
} } } }
在整個過程當中爲了研究方便用到汽車遙控碼解碼器,以方便對本次實驗解碼的正確性進行校驗。
摘要
前段時間學習無線電的同時瞭解到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)來實現。(摘自百度百科)
2、硬件介紹:
一、Arduino開發板
Arduino是開源硬件中最受IT行業,技術宅,學生喜好的單片機開發板,其編程語言使用C語言,而且不像C51單片機的編程語言那麼複雜,因此對於單片機的初學者來講無疑是最好的選擇,本課題爲簡化實驗流程,縮短開發時間,因此選擇了簡單卻強悍的arduino單片機開發板,arduino開發板有不少硬件平臺,常見的 arduino有如下兩種:
(1) arduino UNO (是本文使用的arduino板卡) (2)arduino NANO
二、315M模塊如圖所示,分爲發送端(右)和接收端(左)。
三、用於模擬的遙控器和接收機
發射模塊PT2262
接收模塊PT2272
四、串口藍牙模塊
串口藍牙模塊直接使用藍牙設備鏈接並經過接收ASCII碼並以串口數據的形式傳送至單片機,單片機將數據處理後作出固定反饋,型號爲HC-06的藍牙串口模塊的默認名稱爲「 HC-06「,默認鏈接密碼爲「0000」,手機使用藍牙調試助手等APP 可直接鏈接並可與手機直接通訊,arduino單片機可直接與電腦進行串口通信,但爲了隨時演示操做,使用手機直接通信使操做更爲方便,HC-06實物圖以下:
3、解碼和模擬
一、鏈接實物圖:
實物圖說明:左上角是藍牙模塊HC-06用於手機端鏈接控制,左邊是315接收解碼板以及配備遙控器,解碼板由arduino供電,鏈接了5個LED信號燈用於接收的演示,中間是315M超再生模塊的發送端和接收端
,右邊是arduino UNO 開發板。
二、315M超再生模塊的發送端和接收端鏈接原理圖
三、模擬測試效果描述:
串口發送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」,對於這個問題我仍是有疑惑,但願你們幫忙解釋)
●
邏輯分析儀分析結果
根據以上三組數據對比,驗證單片機解碼沒有任何問題。
二、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按下不放
} } } }
在整個過程當中爲了研究方便用到汽車遙控碼解碼器,以方便對本次實驗解碼的正確性進行校驗。