如何快速搭建远程控制灯LoRa智能灯控(51单片机篇)?

描述

文章目录

一、概述

二、接线

三、烧录(测试程序)

四、AT指令

五、通信测试

六、远程灯控(开关)

七、远程灯控(指定设备)

01、概述

安信可 LoRa 系列模块,用于超长距离扩频通信,抗干扰性强,能够最大限度降低电流消耗,高灵敏度,传输距离远,可靠性高。(以下教程以安信可Ra-01Ra-01HRa-02为例)

02、接线

如下是Ra-01,Ra-01H,Ra-02对应51测试板的接线:

(LoRa模块上的8线分别与测试板上的,如下图所示)

LoRa模块 MCU
NSS CSN
MOSI MOSI
MISO MISO
SCK SCK
RESET CE
DIO0 IRQ
3.3V VCC
GND GND

03、烧录(测试程序)

(本测试程序是使用51系列的单片机开发的,仅提供测试参考用于验证模块的性能与良好,如需在此程序上进行二次开发,则不提供源码编写支持)

示例固件烧录

示例固件下载地址(https://docs.ai-thinker.com/lora)

测试板烧录方法

●用串口工具连接51测试板RX,TX,GND,连接方法如下图所示(烧录时请对应相应的单片机型号,此程序对应的单片机为为安信可提供的STC15W408AS型号)。

远程控制

●软件下载请到官网上(http://www.stcmcu.com/)下载

●打开STC-ISP工具,点击检测MCU选项,模块会自动完成软件配置

●点击“打开程序文件”,选择MCU的Hex固件,注意输入用户程序运行时的IRC频为22.1184MHz

●点击下载编程后工具会将所选择的固件烧录到单片机里,此时完成下载(注:如果点击监测和下载工具界面无反应,那么请尝试点击以后进行一次复位启动)

远程控制

示例固件测试

固件下载完成后,请重新复位测试板。

插上LoRa转接板,此测试必须要两块测试板,一块用来发送,另外一块用来接收。

当模块上电时不做任何操作,则LoRa模块进入接收模式。当其中一个测试板按下按键,模块进入发送模式,模块右边的灯会亮起,另外一个模块处于接收模块,如果收到数据,左边的灯会闪烁。

远程控制

按照如图所示,在测试板上接入USB转TTL工具,打开串口可以收到模块发送的打印信息

04、AT指令

(本次测试基本参数均为出厂默认参数,均采用Ra-06的出厂固件,在测试串口时,需配置串口默认波特率9600,偶校验才能进行数据收发和AT指令测试)

AT 指令采用基于 ASCII 码的命令行,命令格式如下:

请求消息格式为:AT+[OPTION][para, …][r][n]。可以不加换行符(rn)!

AT指令分为如下几块:

(1)基本执行指令

(2)系统参数设置指令

(3)LoRa参数配置设置指令

(4)数据传输格式指令

详细的指令语法以及参数调配请参照如下链接中的AT指令文档:

https://docs.ai-thinker.com/_media/ra-06_at_command-20191104.pdf

05、通信测试

(本次测试基本参数均为出厂默认参数,均采用Ra-06的出厂固件,在测试串口时,需配置串口默认波特率9600,偶校验才能进行数据收发和AT指令测试,测试时请加装符合规格参数的天线,否则可能导致数据传输错误或者无法通信)

点对点通信

步骤一(主机):

AT+ADDR=2 //设置本机主机地址为2

AT+TADDR=3 //设置目标地址为3

步骤二(节点1):

AT+ADDR=3 //设置本机主机地址为2

AT+TADDR=1 //设置目标地址为1

AT+RECV=1 //接收数据

步骤三(主机):

AT+MSG=Ai-Tinker //主机发送数据

远程控制

一对多广播通信测试示例

步骤一(主机):

AT+ADDR=1 //设置本机主机地址为1

AT+TADDR=65535 //设置目标地址为广播地址

步骤二(节点1):

AT+ADDR=2 //设置本机主机地址为2

AT+TADDR=1 //设置目标地址为1

AT+RECV=1 //接收数据

步骤三(节点2):

AT+ADDR=3 //设置本机主机地址为2

AT+TADDR=1 //设置目标地址为1

AT+RECV=1 //接收数据

步骤四(主机):

AT+MSG=1234567890 //主机发送数据

远程控制

06、远程灯控(开关)

来深度解析一下Lora在照明设备中的应用原理。做过或者接触过物联网设备开发的朋友应该比较清楚,无线模块在这个行业中所占的比重,无线控制其实就是A端发送一个信号,B端收到以后做出相应动作的一个过程。

设备组成

今天用的设备比较简单,就是入门级的STC主控MCU,2个含SX1278芯片的Ra-01模块,2根弹簧天线。

安信可淘宝店是默认一个Ra-01模组配送一根433MHz弹簧天线的,很方便。 推荐bug一个!另外生成的HEX文件,用串口烧录。

远程灯控(开关)

原理分析

目前手上有两个同样的设备,烧录同样的程序,程序运行在MCU中,通过外接的SPI驱动Ra-01射频模块发射和接收数据,接收端接收到这个数据做出响应,实现一个远程控制灯开和关的方案。

基本通信

首先需要两个模组间能够进行通信,代码中需要编辑发射机以及接收机;

这里定义出接收机和发送机的逻辑代码,完成发送和接收,这部分直接放在了主函数中了,可以把它放在单独文件中这样就便于观察条理了。

 

else {
			P32 = 1;
			RF_EX0_STATUS = SX1276ReadBuffer( REG_LR_IRQFLAGS);
if (RF_EX0_STATUS > 0) {
if ((RF_EX0_STATUS & 0x40) == 0x40) {
					CRC_Value = SX1276ReadBuffer( REG_LR_MODEMCONFIG2);
if (CRC_Value & 0x04 == 0x04) {
						SX1276WriteBuffer(REG_LR_FIFOADDRPTR, 0x00);
						SX1278_RLEN = SX1276ReadBuffer(REG_LR_NBRXBYTES);
						lpTypefunc.lpSwitchEnStatus(enOpen);
						lpTypefunc.lpByteWritefunc(0x00);
for (RF_REC_RLEN_i = 0; RF_REC_RLEN_i < SX1278_RLEN;RF_REC_RLEN_i++) {
recv[RF_REC_RLEN_i] = lpTypefunc.lpByteReadfunc();
						}
						lpTypefunc.lpSwitchEnStatus(enClose);
recv[RF_REC_RLEN_i] = '';
						RF_RECEIVE();						
						uartSendString(recv);
						P17 = 0;
					}
				} 
else if ((RF_EX0_STATUS & 0x04) == 0x04) {
if ((RF_EX0_STATUS & 0x01) == 0x01) { //表示CAD 检测到扩频信号 模块进入了接收状态来接收数据
						SX1276LoRaSetOpMode(Stdby_mode);
						SX1276WriteBuffer(REG_LR_IRQFLAGSMASK, IRQN_RXD_Value); //打开发送中断
						SX1276WriteBuffer(REG_LR_HOPPERIOD, PACKET_MIAX_Value);
						SX1276WriteBuffer( REG_LR_DIOMAPPING1, 0X02);
						SX1276WriteBuffer( REG_LR_DIOMAPPING2, 0x00);
						SX1276LoRaSetOpMode(Receiver_mode);
					} 
else {                          
						SX1276LoRaSetOpMode(Stdby_mode);
						SX1276WriteBuffer(REG_LR_IRQFLAGSMASK,IRQN_SEELP_Value);   //打开发送中断
						SX1276WriteBuffer( REG_LR_DIOMAPPING1, 0X00);
						SX1276WriteBuffer( REG_LR_DIOMAPPING2, 0X00);
						SX1276LoRaSetOpMode(Sleep_mode);
//PA_SEELP_OUT();
					}
				}
else {
					SX1276LoRaSetOpMode(Stdby_mode);
					SX1276WriteBuffer(REG_LR_IRQFLAGSMASK, IRQN_RXD_Value);  //打开发送中断
					SX1276WriteBuffer(REG_LR_HOPPERIOD, PACKET_MIAX_Value);
					SX1276WriteBuffer( REG_LR_DIOMAPPING1, 0x02);
					SX1276WriteBuffer( REG_LR_DIOMAPPING2, 0x00);
					SX1276LoRaSetOpMode(Receiver_mode);
				}
				RF_REC_RLEN_i = 0;
				SX1276WriteBuffer( REG_LR_IRQFLAGS, 0xff);
				Delay1s(300);
			} else {
				P17 = 1;
			}
		}

 

编辑通信内容代码

定义两组通信,分别为内容分别为1和2,这个对应后面逻辑中的两个按键。

 

SX1276WriteBuffer( REG_LR_IRQFLAGS, 0xff);
FUN_RF_SENDPACKET("1",1);
Delay1s(1000);
SX1276WriteBuffer( REG_LR_IRQFLAGS, 0xff);

 

 

SX1276WriteBuffer( REG_LR_IRQFLAGS, 0xff);
FUN_RF_SENDPACKET("2",1);
Delay1s(1000);
SX1276WriteBuffer( REG_LR_IRQFLAGS, 0xff);

 

应用层逻辑设计

如上所示,通信步骤就完成了,接下来就是触发逻辑以及响应逻辑的应用层代码了,这一部分需要结合应用设备功能来设计,硬件资源一共有10个LED和两个按键,就以目前资源来来做一个按键控制灯的逻辑。

按照原理图定义IO口

 

#ifndef __GPIO_H
#define __GPIO_H
#define KEY                                  P30
#define KEY2                                 P31
#define led                                  P16
#define led2                                 P35
#define UART_TX_PIN                          P31

 

按键控制逻辑

 

if (P30 == 0) {
P17 = 1;
P32 = 0;
SX1276WriteBuffer( REG_LR_IRQFLAGS, 0xff);
FUN_RF_SENDPACKET("1",1);
Delay1s(1000);
SX1276WriteBuffer( REG_LR_IRQFLAGS, 0xff);
		} 
else if (P31 == 0) {
P17 = 1;
P32 = 0;
SX1276WriteBuffer( REG_LR_IRQFLAGS, 0xff);
FUN_RF_SENDPACKET("2",1);
Delay1s(1000);
SX1276WriteBuffer( REG_LR_IRQFLAGS, 0xff);
		}

 

 

if(recv[0] == '1') 
						{
							P35 = ~P35;
						}
else if(recv[0] == '2')
						{
							P16=0;
							P35=1;
						}

 

至此就完成了远程控制灯开关的逻辑编写了,利用提供的源码稍作修改就能做出这个效果。

07、远程灯控(指定设备)

原理分析

上述的设备应用在实际场景中已经能做到星型组网,但是这个组网的通信方式就不是很符合灯控设备的控制逻辑。

因为在上述所写的代码中,这个设备是全频段通信的,也就是说同一个固件,烧录在不同设备中,只要按下按键,所有的设备都会响应。

所以接下来做的操作就是在这个代码的基础上做出修改让主控可以随意控制多个设备。一对多单个控制方式很多,先来做一种最简单的方法,按键A控制发射在470频段,按键B控制发送在480频段。

主机代码

下面是计算好的频段

 

unsigned char Frequency[3] = { 0x6c, 0x80, 0x00 };//470Mhz
//unsigned char Frequency[3] = { 0x6c, 0x80, 0x00 };//430Mhz 频率设置
//unsigned char Frequency[3] = { 0x6c, 0x80, 0x12 };//475.5Mhz 频率设置
//unsigned char Frequency[3] = { 0x78, 0x10, 0x00 };//480.25Mhz 频率设置
//unsigned char Frequency[3] = { 0x78, 0x20, 0x00 };//480.5Mhz 频率设置

 

在按键B处定义出按键数组,表示按下按键B模块跳到480频段发送数据2

 

} else if (P31 == 0) {
Frequency[0] = 0x78;
Frequency[1] = 0x20;
Frequency[2] = 0x00;
SX1276LoRaSetRrequency();
		    SX1276WriteBuffer( REG_LR_IRQFLAGS, 0xff);
FUN_RF_SENDPACKET("2",1);
Delay1s(1000);
SX1276WriteBuffer( REG_LR_IRQFLAGS, 0xff);
		}

 

 

#define IRQN_TXD_Value                               0xF7
#define IRQN_RXD_Value                               0x9F
#define IRQN_CAD_Value                               0xFA
#define IRQN_SEELP_Value                             0xFF
#define PACKET_MIAX_Value                            0xff
extern unsigned char Frequency[3];

 

从机代码

在这里,要单独生成480和470频段的接收机代码固件,分别烧录到我们的从机模块中,我们只要控制以下代码段就可以完成对不同频段的控制效果。(这里的从机代码,我们可以直接使用第一节中的灯控代码即可)

 

unsigned char Frequency[3] = { 0x6c, 0x80, 0x00 };//470Mhz
//unsigned char Frequency[3] = { 0x6c, 0x80, 0x00 };//430Mhz 频率设置
//unsigned char Frequency[3] = { 0x6c, 0x80, 0x12 };//475.5Mhz 频率设置
//unsigned char Frequency[3] = { 0x78, 0x10, 0x00 };//480.25Mhz 频率设置
//unsigned char Frequency[3] = { 0x78, 0x20, 0x00 };//480.5Mhz 频率设置

 

总结

第一步:要确保能够通信,然后在通信的基础上再来对收到的值进行判断,并且做出相对的输出结果(控制灯的方案),到这里完成了最主要的内容——通信部分。

第二步:考虑需要实现的一个主机控制不同的设备,这样可以把从机工作在不同频段,主机切换频段来完成通信。

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分