跳到主要内容

24L01 2.4G 点对点通信

2.4G系列模组目前主要有进口,台产和邦定三个系列, 能够满足不同客户群体的需求。可广泛应用于各种物联网场合,适用于无线鼠标、无线遥控、体感设备、有源RFID、 NFC、低功耗自组网无线传感网节点等,是物联网应用的理想解决方案。

安信可提供一系列2.4G模组产品,对ShineBlink来说代码都兼容,开发者可以结合成本、通信距离、以及封装尺寸的需求,来选型:

pic1

一、本实验例程用的模块

本实验以最常用的NF-01-S模组为例进行开发,如果开发者需要通信更远信号更强的,可以考虑选择带PA放大的NF-02-PA。

pic2

pic3

二、本例程实现功能介绍

《开发板1》 每隔1秒向《开发板2》发送一包数据,《开发板2》收到数据之后将开发板发来的数据全部加1并返回给《开发板1》。

以上过程中开发者会看到如下现象:

  • 《开发板2》收到《开发板1》发来的数据,《开发板2》板子上的LED1灯会闪烁一下
  • 不管《开发板1》还是《开发板2》,只要收到对方发来的数据,就会通过USB虚拟串口向电脑打印收到的数据

三、 Core提供的函数功能介绍

Core已将2.4G的操作封装成三个简单的API函数,分别为:LIB_24G_Config(),LIB_24G_Send(),LIB_24G_Recv()。您只需要调用这三个API即可实现2.4G通信。

  • LIB_24G_Config():初始化
  • LIB_24G_Send():发送数据
  • LIB_24G_Recv():接收数据

四、接线图

layout

五、材料清单

名称推荐购买链接(或者您可以自己制作)模块/芯片硬件资料下载
24L01/24R1 2.4G通信模组https://anxinke.taobao.com/https://docs.ai-thinker.com/2.4g
声明:这里推荐的购买链接仅供参考,您完全可以去其他商家或渠道购买,只要功能相似即可。

六、完整代码

发送端代码:

--配置USB以虚拟串口模式工作,这样调用print()函数就会在电脑串口终端打印输出
LIB_UsbConfig("CDC")
--发送模块和接收模块的地址Addr必须一样
Addr = {0x01,0x02,0x03,0x04,0x05}
--设置SI24R1 2.4G无线模块占用MOSI,MISO,CLK,cs,以及D5引脚
--通信信道在2480Mhz,速率125K,发射功率为最大的7dB
LIB_24G_Config("D5", Addr, 80, "125Kpbs", "7dB")
tab = {1,2,3,4,5}
while(GC(1) == true)
do
--每隔1秒向对端发送一包5字节的数据,实际上是32字节,只是多余的字节都会为0
LIB_24G_Send(tab)
LIB_DelayMs(1000)
--查询是否收到数据,如果收到就print打印收到的数据,固定为32个
recv_flag,recv_tab = LIB_24G_Recv()
if recv_flag == 1 then
print(string.format("receive %d bytes", #recv_tab))
for i, v in ipairs(recv_tab) do
print(i, v)
end
end
end
如果感兴趣,上面代码中出现的LIB开头的库函数可以在 API文档 中通过Ctrl+F查询。

接收端代码:

--配置USB以虚拟串口模式工作,这样调用print()函数就会在电脑串口终端打印输出
LIB_UsbConfig("CDC")
--发送模块和接收模块的地址Addr必须一样
Addr = {0x01,0x02,0x03,0x04,0x05}
--设置SI24R1 2.4G无线模块占用MOSI,MISO,CLK,cs,以及D5引脚
--通信信道在2480Mhz,速率125K,发射功率为最大的7dB
LIB_24G_Config("D5", Addr, 80, "125Kpbs", "7dB")
--配置D8端口为普通输出(Core电路板上的LED1灯和D8端口是固定连接的)
LIB_GpioOutputConfig("D8","STANDARD")
tab = {1,2,3,4,5}
while(GC(1) == true)
do
--查询是否收到数据,如果收到就print打印收到的数据,固定为32个
recv_flag,recv_tab = LIB_24G_Recv()
if recv_flag == 1 then
print(string.format("receive %d bytes", #recv_tab))
for i, v in ipairs(recv_tab) do
print(i, v)
end
LIB_GpioToggle("D8")--LED1闪烁
--然后将收到的数据全部加1返回给发送端
for i = 1 , 32 do --这里用32,是因为包长已经固定成32字节了
recv_tab[i] = recv_tab[i] + 1
end
LIB_24G_Send(recv_tab)--回传
end
end
如果感兴趣,上面代码中出现的LIB开头的库函数可以在 API文档 中通过Ctrl+F查询。

Tips1:以上代码中LIB_24G_Config调用的参数Addr以及80(2480Mhz)通信频段参数是保证两个节点通信不被打扰的关键配置参数,如果现场有多个2.4G模块通信网络,可以让不需要通信的模组网络内的节点设置不同的Addr以及不同的频段

Tips2:以上代码中LIB_24G_Config调用的参数"125Kpbs"通信速率还可以设置成"1Mpbs"和"2Mpbs",速率越高传输抗干扰越差

Tips3:以上代码中LIB_24G_Config调用的参数"7dB"发射功率还可以设置成"-12dB","-6dB","-4dB","0dB","1dB","3dB","4dB",dB值越低发射功耗越低,但传输抗干扰越差

Tips4:2.4G模组通信每包固定是32个字节,所以不管每次发送多少字节,实际都是32字节,只是多余的字节都会为0。

总结:Tips1~Tips3中任何一个参数发生变化,都需要在发送端和接收端保持相同的参数

七、代码运行结果

下图左边为发送端开发板的USB串口打印数据,右边为接收端开发板的USB串口打印数据:

首先是右边的接收端收到数据,然后将数据全部加1后返回给发送端,即如左边的图所示。

pic4

同时,接收端每次收到数据后,开发板上的LED1灯会闪烁一次,如下图:

pic6