315Mhz、433Mhz⽆线遥控信号的解码分析和模拟
摘要
前段时间学习⽆线电的同时了解到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");
void loop()
{
if(mySwitch.available())
{
ReceivedValue(),ReceivedBitlength(), ReceivedDelay(),ReceivedRawdata(),ReceivedProtocol());
}
/* Same switch as above,but using binary code */
if(Serial.available()>0)//如果串⼝有数据进⼊的话
{ delay(10);          //延时50 可以⼀次性发送多个命令
char ad();//每次读⼀个字符,是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] ⽹络资料