最近接手一个新项目,主要是用stm32做控制芯片,然后利用lora通信,实现相关功能。
- 项目概述
- 硬件设备
- 项目流程
- LORA介绍
- 理论知识
- 调试流程
- 调试中的问题
- 个人反思
整个项目由3个同学协作完成,我主要负责通信部分的调试。
1.项目概述:通过单片机控制lora节点,发送数据给“lora数据集中器”,数据集中器将数据上发给指定服务器,进行软件端的开发。
名称 | 作用 |
WH-L101-L(lora节点) | 单片机通过节点发送数据给集中器 |
LG220(数据集中器) | 集中器将数据上传给指定服务器 |
2.硬件设备:“lora节点”*10, “lora数据集中器”*1,单片机型号为:stm32f103c8t6(自己设计的PCB);
若干USB-TTL模块,lora节点配套底板一块,吸盘天线若干。
3.项目流程:首先确定整个项目所要实现的功能,根据功能背后的硬性要求,寻找对应的硬件设备,制作选型文档,从多维度进行考虑,缩小目标设备的选择范围,先确定几个大概选型,咨询相关技术客服,了解实际的产品型号,最后再下单购买。
4.lora是一种远距离、低功耗通信技术,全称是:Long Range。
找了两个简单的介绍文档,可以留作参考http://www.four-faith.com/2018/industry_0828/683.html (附有各种通信方式特点对照表)https://blog.youkuaiyun.com/Ttian6/article/details/94215277。
LORA的通信距离不等,我选择的芯片支持通信距离为2KM左右,且通信距离可调,芯片功耗很低。lora 模块很多,需要慎重选择。
5.理论知识
介绍一下这套通讯设备之间的关系:单片机控制节点,节点发送数据给数据集中器,集中器将数据上传至服务器。但是,这是在应用时的工作逻辑关系,如何调试这套设备呢?必须先熟悉几个软件以及知识点。
网络调试助手:一共分为串口和网口两个调试端口。一般是将电脑当作本地服务器,通过串口给一端(LORA芯片)发送信息,然后网口一端显示服务器(本地服务器的地址就是电脑的IP地址)接收到的数据(这里的数据是由集中器所上传)。
LORA的通信方式:lora节点与lora数据集中器之间通信,是依靠各自的lora吸盘天线,与网络,基站等等无关;
MQTT协议:https://blog.youkuaiyun.com/anxianfeng55555/article/details/80908795
TCP/TP协议:就是简单的通信协议啦,我在前几篇博客中都有过详细介绍。
服务器端口号:每一个服务器都可以设定几个特定的端口号供自己使用
本地端口号:就是当前设备的端口号
服务器端口号:服务器或者网关开启接口给除它之外的IP连接;本地端口:供其他服务器或者设备连接的接口编号。所以在此处,网络调试助手与集中器之间,关系就应该是:网络调试助手,端口号填写集中器的服务器端口号,集中器端口号与之相反。
6.调试流程:
(1)基于配套底板调试LORA节点,进入AT指令,设置一些主要参数。购买配套底板是为了防止自己画的板子出问题,用作对照实验,且可以极大提升开发效率。小编
(2)调试集中器:成功配置集中器之后,就可以进行简单的连接,以及与配套的透传云实现数据收发。
(3)基于自己设计的PCB板调试LORA节点,也就是通过单片机发送指令,实现AT指令的收发。
(4)实际通信有效距离测试。
最后,也是最重要的一点,一定要学会看芯片使用手册!!!!!!!
小编的调试步骤:
(1)查看芯片快速入门手册以及配套底板的硬件说明,将芯片与配套底板焊接,通过USB-TTL模块连接电脑与底板(已知采用串口通信),打开串口助手,发送指令快速进入AT模式,分别看各个参数的作用,并设置参数。
(2)为数据集中器供电(集中器的天线分别安上),并且电脑连接集中器的WIFI,登陆指定网页:192.168.1.1,账号密码都是:root,然后进入集中器设置界面(如下)。服务器设置:指定集中器数据上传的服务器。基本设置:设定与节点连接的相关参数。通道:就是数据传输的通道,彼此间参数各不相同(主要是频率这部分),防止数据冲突。
7.调试中的问题:
(1)始终无法进入AT指令:WH-L101-L-C型号的lora芯片,进入AT指令,需要严格遵循时序要求。此处,就以最简单的延时函数调试单片机进入AT指令模式:(状态机涉及信息众多,延时,简单粗暴,可靠)
if(USART_RX_STA&0x8000)//接受到中断,就执行保存
{
USART_RX_STA=0;//对数组清零,方便下一次接收
len=USART_RX_STA&0x3fff;//取出u16中的低16 位,得到此次接收到的数据长度
for(t=0;t<len;t++)
{
USART1->DR=USART_RX_BUF[t];//把每一个数据都在串口打印出来
while((USART1->SR&0X40)==0);//等待发送结束
}
USART_RX_STA=0;//对数组清零,方便下一次接收
if(keys==1)
{
printf("%c",j);
delay_ms(200);
printf("%c",j);
delay_ms(100);
printf("%c",j);
delay_ms(100);
}
delay_ms(400);
printf("%c",M);
delay_ms(500);
printf("AT+AID=00000001\r\n");
delay_ms(400);
printf("AT+NID=00013c2d\r\n");
delay_ms(400);
printf("AT+SPD=1\r\n");
delay_ms(400);
printf("AT+CH=72\r\n");
delay_ms(400);
printf("AT+ENTM\r\n");
delay_ms(400);
printf("AT+ENTM\r\n");
LED=!LED;
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
LED=!LED;
// printf("AT+AID\r\n");//可以查询设置的数据
}
自己调试快一周,几在崩溃边缘徘徊,被同伴一语点破,甚幸甚幸呀。(以前用的通信模块,进入AT指令没有严格要求时序问题,更重要的,是暴露了自己的问题,几次怀疑时序,但却没有付诸行动,导致调试耗时巨大)。使用手册,重要部分,一定要精度。
(2)很短时间就调试成功了数据集中器,但是,如何测试“有人公司”产品的实际传输距离呢?这里就涉及到了网络调试助手,以前一直认为网络调试助手只能在一台电脑上实现“串发网收”。因此在此处困惑许久,直至配置服务器连接**公司透传云,都没能进行数据传输测试。老师花了一分钟,小编就明白了如何测试及原理:一台电脑连接"底板+lora芯片",打开网络调试助手的串口部分,另一台电脑打开网络调试助手的网口部分(同时在集中器上设置好服务器地址位本机IP地址,服务器端口及本地端口),一台电脑移动,发送数据,在数据集中器端的电脑即可在网络端口查看数据。
(3)敢于质疑,在利用AD画图的时候,发现芯片手册上存在问题,前后对照之后,果断问了技术支持,更新了原理图的版本。
(4)自己设计的PCB天线电路(外置天线),但是传输距离只有10~20M远,购买的底板+芯片+吸盘天线,在学校内 传输距离达到了1000+(楼层越多,越密集,传输效果越不稳定,信号越弱),正在改进电路,希望下一版,自己设计的天线可以传输更远的距离。
8.个人反思:接手了比较多的通信、物联网相关项目,但是本次还是遇到了问题,足见自己功底不踏实。正如老师所说:想要快起来,必须先让自己慢下来。并且,对于各种协议的理解,远远未达到清晰明了,依旧停留在了解的阶段。
9.项目拓展,如果有n多个lora芯片需要接入同一个集中器,需要将修改集中器的接入节点数量,并且,在每一个单片机中烧录指定程序(每个单片机对应一个芯片,程序中需要修改单片机AT指令中LORA节点的ID),如果已知产品数量,那么,依旧可以采用状态机来解决重复烧录这个问题。
暂时先总结出这么多,希望对读者能有一定帮助。
我曾许下十年,只为最美的遇见。