网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
04月03日
漏签
0
天
arduino吧
关注:
75,228
贴子:
229,863
看贴
图片
吧主推荐
视频
游戏
1
2
下一页
尾页
15
回复贴,共
2
页
,跳到
页
确定
<<返回arduino吧
>0< 加载中...
【arduino】把nRF24L01当Zigbee用——廉价物联网无线连接方案
取消只看楼主
收藏
回复
精钢白菜
闻名一方
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
[正式发布]让你节约钱的一个协议。由于目前学业紧张,故一周一上网,请耐心等待。这个项目目前已经暂停,程序凌乱,明年上了大学再把它封装为一个库,为人类物联网发展献一份力,届时将秒杀Mirf等所有此类库。
精钢白菜
闻名一方
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
本文本来是参加科技竞赛的论文
1.概述
物联网是继计算机、互联网和移动通信之后的又一次信息产业的革命性发展,也是将会改变我们生活方式的火爆新兴产业。但现在的物联网技术在网关和传感器的连接之间还存在空白,目前主流的Zigbee系统价格昂贵,制约了它的普及和应用。
本文旨在介绍我专为廉价MCU设计的无线自组网协议及其基于arduino和nRF24L01无线模块的无线系统的实现。包括无线网络协议和为其定制的开发板。
深圳市绿都电子有限公司
国民技术授权代理商绿都电子,为您提供国民技术N32L406系列低功耗单片机,基于Arm M4F内核,高性能,超低功耗,内置LCD屏驱,集成丰富的接口和模拟外设,适用于超低功耗产品应用
2025-04-03 12:22
广告
立即查看
精钢白菜
闻名一方
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
2.项目背景
智能家庭与物联网技术密切相关,目前已经有较为成熟的物联网应用平台,如乐为物联,yeelink,但在智能家庭、智能农业等传感器终端与网关的连接构建方面却有些空白。能实现这个功能的目前有WIFI、Zigbee、蓝牙,但它们都有一定的局限性。
WIFI协议因为门槛低而被许多公司用作物联网终端的联接,但由于其硬件价格昂贵,功耗大,支持的总设备数量很少,不适合量大的传感器终端。
Zigbee协议已经较为成熟和完善,被许多人视作是未来智能家庭的主要解决方案,但它最初是为工业应用设计的,但硬件(图一)价格非常高昂。Zigbee协议很复杂且不开源,对于一个电子爱好者来说,想要用好它有一定难度。
Ad hoc(无线对等网络)网络是一种特殊的无线移动网络,最早应用与军事。网络中所有节点的地位平等(网络程序一样),无需设置任何的中心控制节点。网络中的节点不仅具有普通移动终端所需的功能,而且具有数据转发能力。它适合被用于无法或不便预先铺设网络设施的场合、需快速自动组网的场合等。它的这些特点非常适合物联网的应用。但现在的AD-HOC协议大都很复杂,只能在较好的单片机上运行,要降低成本,就要开发一种更加轻量化的协议。
Arduino是一个开源平台,已有十年的发展,入门的门槛低,容易学习,更重要的是这个开源平台上库文件非常多,而且很方便使用。Arduino的MCU不仅有AVR,更有ARM(图二),甚至是X86。入门不久的我也能使用ARM了。Arduino常见的MCU是AVR系列的Atmega328,与8051相比,主要的优点是稳定,速度较快,数字引脚驱动能力强,能提供20mA 拉电流,40mA灌电流,用它可以直接驱动一个有源蜂鸣器或多个LED。
Noric公司的nRF24L01无线单收发芯片工作在2.4G(ISM频段),可以买到1000M和100M传输距离两种版本(图三,下方的是100m版),两版本可直接互换,内置auto ACK(自动应答)和丢失自动重发功能,价格便宜,速度快,可扩展性好,但目前常用于一对一或一对多通信,多数航模遥控器用的正是这款芯片。我使用了Arduino系列中最小的promini(图四),并设计了一块PCB板子。
精钢白菜
闻名一方
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
注:以上图就不补了,相信大家也知道
精钢白菜
闻名一方
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
2.2研究目的
基于Arduino平台和nRF24L01无线芯片开发一种要求低的无线协议,大幅降低建造一个无线网络的成本,提高其易用性,以促进物联网走进千家万户。
2.3主要创新点
1.使用电压降延迟,巧妙地解决了电量控制的问题,使电量较少的节点承担更少的任务,延长网络的寿命。常规方法是将电量信息加入泛洪的路由信息中,让节点生成路由表时将电量、距离、时间延迟等进行计算,这种方式计算复杂且计算本身也会耗电,这正是AD HOC网络设计的主要难题之一。
2.备用下一跳列表(addr_second)增大了系统的鲁棒性,只带来很少的运算量。
3.结合了nRF24L01芯片自带的auto ACK(自动应答)和自动重发数据包功能,单片机与无线芯片共同承担工作,提高了性能。
3.无线协议部分
精钢白菜
闻名一方
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
3.1无线协议的基本构思
要想在低端单片机上运行,我将此无线协议的特点定位为:简单、方便、高效、稳定,适用于节点数在100个以为内的场合,并且尽量减少内存占用。因此我使用了一个字节的地址,它是静态地址,并且可以通过串口进行设置,存在flash中(以后会发展为无线设置地址,设置后将会存在EEPROM中)。
为了使得无线协议能够简化,我将其节点分为主节点(参与泛洪及动态路由)和寄生节点(只能发出或接受数据包,不进行转发)
设计寄生节点,主要针对的是电池供电的传感设备,他们只需要在使用的时候发出路由请求(仅泛洪一次模式)即可。我主要针对的是传感器网络,这也是廉价单片机的主要用途之一,它需要周期性地发送数据,故使用先验式路由协议效果更好。
为了使无线协议能够高效运行,我没有使用最优路径算法,而是在发送泛洪数据包的同时构建了路由表,并在这个过程中通过延时巧妙地减轻电量较低的设备的负荷(针对电池供电的主节点)。
这个无线协议中,我将数据的发送模式分为3类:完全泛洪,仅泛洪一次,直接链接(此时开启自动应答和自动重发数据包)
无线协议部分我创新地开创了备用下一跳列表,使得系统更加健壮,运算要求又不至于提高过多。
为了防止广播风暴等问题,每一数据包上都有PID校验位和发出者地址位,同一个数据包在一个节点上只能被处理一次。我没有像OLSR(最优链路状态协议)那样使用MPR集,因为这对于廉价的单片机而言,运算量相对较大,占用的内存大,同时也不适合我采用的路由表构建方式。
最终的程序大约1000行,使用C语言编写。
精钢白菜
闻名一方
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
3.2数据格式
由于nRF24L01的一个数据包长为32字节,因为我必须很好地安排链路层命令。
[0]:传输模式
[1]:目的地址
[2]:发出者地址
[3]:PID校验位(先读一空引脚值,再依次加1)
[4]:上一跳地址
[5]:应用层指令
[6]~[30]:数据
[31]:校验位
注:这样的安排现在看来并不好用,应该吧所有控制位都放到末尾才好。
精钢白菜
闻名一方
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
3.3避免在发送信号时产生碰撞的三个防撞机制:
1.CD(载波检测)用于检测当前信道是否已被占用。
2.电压下降延时:这一处延时可以利用延时长度来计算路由开销,增长电池供电节点存活期。
3.自身的地址延时:用于在其它两个延时不起作用时作为防碰撞机制,地址“大”的推迟发射。
发射过程:
载波等待--压降延时--地址延时--配置芯片转发。
配置底层芯片的发送函数代码:
void tx_send(unsigned char addr){//new
Serial.println("tx_send");
digitalWrite(MYCE, 0);
unsigned long timecast=millis();
SPI_RW_Reg(FLUSH_TX,0);
while(SPI_Read(CD)) // Dealy for CD(载波)
{Serial.println("CDwait!");
digitalWrite(MYCE, 1);
delayMicroseconds(500);
digitalWrite(MYCE, 0);
if((millis()-timecast)>my_address*70)
{
Serial.println("CD BREAK!!");
break;
}
}
digitalWrite(MYCE, 1);
delay_with_power(); //delay for power (电压降)
delayMicroseconds(my_address*100); //delay for address(地址)
digitalWrite(MYCE, 0);
if(addr==0xFF)
{
SPI_Write_Buf(WRITE_REG + TX_ADDR,ALL_ADDR, 5);
SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);
Serial.println("Send to All")
熊猫办公
熊猫办公单片机,全新AI技术,快速创作文档类内容,让您轻松搞定!单片机,领先的AI写作工具,支持工作办公/互联网电商/教育培训/等各场景需求使用。
2025-04-03 12:22
广告
立即查看
精钢白菜
闻名一方
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
3.4泛洪的实现
泛洪是网络中一个常见的操作,将信息发送给网络中所有节点的操作,是AD HOC网络协议的基本功能,要求将数据发送给每一个节点而不重复,因此我采用了循环冗余校验(PID)和地址同时比较的方法来排除重复数据。
泛洪过程框图如下:
注:调整PID表顺序是防止重复的数据包过多导致过快地刷新PID-地址列表数组导致旧数据包被认为是新的。
精钢白菜
闻名一方
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
爪机无力,发不了文件里的图
精钢白菜
闻名一方
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
发一些图解馋
精钢白菜
闻名一方
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
@春泥蛋炒饭,我的新帖迁到了这里,请加精。
精钢白菜
闻名一方
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
电压降延迟进行电量控制的原理:
在hello消息泛洪的过程中,电量越低的节点延时越多,因此数据包在这条路线上花的时间更多,对于其他节点将更迟接收到这个hello包。在路由表的建立过程中只需要简单地将第一次接收到数据包的上一跳节点作为到达源节点的最优下一跳,就会使总电量较低的路径所对应的下一跳节点有更大几率被排除在around表外,因此,电量低的节点就会分担更少的工作。这种控制电量的方式几乎不增加计算量和算法的复杂程度,也不会对路由表的建立时间造成延迟。
精钢白菜
闻名一方
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
相关部分程序如下:
/********************************************************/
void check_lists(void){ //检查节点新鲜度子程序
if(millis()>END_TIME) //END_TIME是已经定义的时间限度
{
unsigned long timecut=(millis()-END_TIME);
for(unsigned char l=0;l<POINTS_NUM;l++)
{
if(((addr_timer[l]<timecut)&&(addr_list[l]!=0xFF))||(addr_list[l]==my_address)) //过期或为自己
{ //清除路由表相关列
addr_list[l]=0;
addr_around[l]=0xFF;
addr_second[l]=0xFF;
addr_timer[l]=0;
}
}
}
}
/**********************************/
void write_lists(void){ ///写路由表子程序
char new_f=0;
unsigned char points;
for(unsigned char i=0;i<POINTS_NUM;i++)
{if(rx_buf[2]==addr_list[i])
{
new_f=1;
points=i;
Serial.println("point new_f");
break;
}
}
if(new_f==0) //新节点
{
for(unsigned char i=0;i<POINTS_NUM;i++)
{
if(ad
精钢白菜
闻名一方
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
3.6路由的实现过程
1.要将1个数据包发送到目的节点,首先需要在路由地址总表(addr_list)中寻找这个节点的信息(如找到addr_list[5]存储的地址是目的节点)。如果没有找到,则使用仅泛洪一次模式,让自己的邻居来帮忙寻找。
2.当找到目的节点信息后,使用直接连接模式(开启自动应答和自动重发数据包),将数据包发送至下一跳节点(接着上文,就是addr_around[5]所存储的地址)。下一跳节点接收到后重复路由实现过程,直到到达目的节点。
3.如果达到最大重发次数,仍没有发送成功则数据包用直接连接模式发送至备用下一跳节点(addr_second[5]所存储的地址)。
4.如果还未成功或addr_second所存储的地址为空,则使用仅泛洪一次模式发出数据包。
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示