利用多个nRF24L01+模块组网通信的实现方式
这里讨论的组网方式,不包含使用6个通道实现的多对1通信方式,因其只限于6个发送端,局限性很大,可以附加其他技术实现更好的组网,暂时这里不讨论。这里分享的是所有nRF24L01+模块都使用通道0,实现的数量远超过6个的组网方式。
经过实战总结,可以实用到落地项目的有轮询方式、时分方式、自主避让方式等几种常用的组网方式,下面会逐一讲解实现原理。
防撞(防冲突)机制的实现原理
其实无论使用那种方式,都会涉及到防止冲突,也就是防止该信道出现多个发射信号冲撞的现象,因为一旦发生,接收方很难接收成功。除了组网内的各模块之间会发生这类现象,而且还要考虑工程密集安装的时候,也会与邻近其他组网的模块出现冲撞,所以防撞机制是必要的。
行之有效的防撞方式,经过实战检验,采用检测信道占用+按编号延迟的方式,可以很好的躲避碰撞。首先通过我的博文“nRF24L01+如何检测信道被占用-RSSI寄存器实战分享”里讲的,在发送之前先检测信道情况。然后如果信道忙,则根据自身编号(每个从机都从1-255进行依次编号)乘以一个时间基数,比如1ms(根据单片机处理相关逻辑的速度可加长),这样每个从机都会在检测到信道忙的时候,延时不同的时间再次检测和发送。如果同时遇到多个一起要发送,也会因为延时不同的原因,接下来就会错开了。
还有一种情况,就是在检测信道的时候是空闲的,但是在进入正式发送的时候,刚好有其他模块发送了,这就真撞上了。但是因为有编号延时机制,那么当检测到发送失败后,各自错开延时再次尝试,也会最终躲避碰撞了。
轮询方式一主多从
轮询方式是最安全可靠的方式,是典型的一主多从的组网方式。所有从机都不会主动发送信息,平时一直处于接收状态。只有主机发送给某个从机询问指令的时候,该从机才会立刻回复一条信息后,立刻再置为接收状态。这样就避免的多个模块随意发产生的频繁碰撞问题,使得每次通信都安全可靠。
但是这种方式是要规定一个轮询的时间间隔,主机定期询问一遍从机,这个时间间隔就影响了数据同步反应的速度。时间设置太短,模块工作太频繁。时间设置太长,从机的变化不能及时反应到主板。而且如果从机数量很多的话,每轮询一轮下来的时间也不可忽视,所以不适用于对从机变化的同步要求高的应用场景。
时分方式一主多从或多主多从
时分方式,是将所有参与组网的模块,按照编号顺序依次分配一个时间段作为发送的时间窗口。只有到模块自己的窗口期才可以发送,否则不能发送,平时都处在接收状态。这种方式也很好的规避了碰撞问题,但是遇到发送失败的话,就要等待下一个窗口期再尝试,否则会影响其它模块的发送。
这种方式就要求各个模块可以发送的时间间隙被确定下来,而且必须有一个时间基准,所有模块再同一个时间基准上开始计算自己的窗口期是哪里。时间基准的同步是这个方式的难点。实战中这种方式需要做一个群发模式,先让所有从机工作在同一个地址上,然后主机或临时主机发送时间基准,所有从机同时接收(不能一个一个发送,因为会有时延)。然后从机再工作在各自的地址上接收。
由于每个模块都分配了属于自己的发送窗口期(窗口期要大于模块发送一组32字节所需要的时间),所以这种方式既可以一主多从,也可以多主多从。但由于窗口期不能设置太短,对数量比较多的组网情况下,每个模块的两个窗口期的间隔可能会很长,所以组网数量不适合太多的应用场景。
自主避让方式一主多从或多主多从
自主避让方式,就是所有模块的发送时间都是没有限制的,有数据需要传送的时候就发,不经过任何主机指挥协调,遇到发送失败或信道占用,就延时躲避再次尝试,直到发送成功。
这种方式即可以一主多从,也可以多主多从。因为谁都可以随时发送,所以不需要主机协调,但是如果组网模块数量比较多的时候,某次碰撞可能会需要延时较长才会错开。因为有的可能接收到信息需要立刻回复,就有可能打乱延时错开的时间顺序造成二次碰撞,但终究是可以错开的。但是这种的稳定性略差,模块工作有时会一直等待,造成如果有需要给这个模块发数据的时候,一直发不进来的情况,继而造成更长时间的等待。
根据实际应用场景综合运用
以上三种方式均通过实战应用测试,在实际项目中,可以根据组网数量和对数据及时性和稳定性的要求,可以将这几种方式组合应用起来,不同的指令和时域可以使用不同的方式,或同时使用两种方式进行处理,会达到更好的效果。
这里只介绍了组网的方式原理,已经通过实战确认的,具体实现代码是需要一个完整的项目应用 场景来描述,这里就先不提供,后面陆续为大家分享更多的nRF24L01+实战应用。