查看: 532|回复: 0
打印 上一主题 下一主题

Arduino与nRF24L01+(2.4G) 操作指南【一】基本连接

[复制链接] qrcode

30

主题

35

帖子

106

积分

注册会员

Rank: 2

积分
106
楼主
跳转到指定楼层
发表于 2016-4-19 03:48 PM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

 

看不到图片请戳 这里


本指南共三部分:基本连接、距离测试、跳频模式。第一部分介绍Arduino与nRF24L01+模块连接注意事项和编程方法,后续敬请期待。

玩儿无线,不论2.4G还是WiFI,第一注意事项就是电源,然后是电源,最后还是电源!

强调三点:
  1. 电压在设备范围内(nRF24L01电压1.9~3.6V)
  2. 电流足够(>50mA,带PA的要>350mA)
  3. 滤波!(最好用钽电容滤波,0.1u+10uF并联,距离模块越近越好)

第三点如果没注意,不是距离缩短不短的问题,是根本能不能通信的问题!记住,2.4G,第一要务就是电源!!!

图中黄色方框就是3.3V LDO,可提供3.3V不超过150mA稳定电压。nRF24电源切记要接在3.3V PIN上,不然瞬间发热,马上挂。。

nRF24模块分带PA(功率放大)和不带PA,带PA的电流在150~250MA不等,如果带PA就需要给模块单独做一路供电,比如用LM1117-3.3v,800mA LDO,Arduino板子上的3.3V驱动不够用。

 
这种工作电流在15~35mA,可以直接用Arduino驱动。

 
带PA这种属于质量很好的,最大电流在110~130mA,比较稳定。


这种国产OEM的质量参差不齐,最大电流在80mA~350mA不等,需要额外LDO供电,板载3.3V电流可能不够。

OK,接下来接线,nRF24有8个IO,除IRQ其它都需要(有些2.4G库也需要IRQ)。

UNO接法,我跟图中不同,PIN8接CE(浅蓝色)、PIN9接SCN(棕色),PIN10悬空,这样SPI接口可复用多个设备。


如果使用杜邦线,线比较长,在模块的VCC和GND之间最好焊接一~二个电容,一个10uF(钽电容,小功率可省略),一个0.1uF,分别过滤低频。高频杂波。

硬件接好如此这样,我用的Arduino Nano+扩展板。

安装RF24 Library。我测试过的Library有两个,一个是Arduino安装库提供的,另一个需要自己手动通过GitHub下载,后者是前者的修改。
前者地址:http://tmrh20.github.io/RF24/  后者地址:http://maniacbug.github.io/RF24/ 本文以后者地址为主,这个版本貌似简单些。

下载安装文件 https://github.com/maniacbug/RF24 点击右侧Download按钮


在Arduino 库中安装

创建示例

如果你是完全按照上图方式接线,无需修改radio PIN;如果是用PIN8/9,需要修改一下构造函数。

这段代码需要取消注释,不然测试可能没反应(可能是源代码的BUG)。

这段代码未来版本可能没有注释,我试过不同版本,有的有注释有的没有!关键是else部分,一定要打开读、写监听管道(Pipe),这里,接收模块Pipe0发送,Pipe1接收,发送模块交换这两个地址。有些库这里都是注释状态,不监听肯定是收不到信息的!

分别上传到两个Arduino上,可能是不同的串口。

打开串口调试,你将看到nRF24L01的初始化设置参数。这里大多默认,只有ADDR是我们设置的。


也可以使用同时可以打开双串口的工具软件,我这里用“友善串口调试”,免费版本启动有提示,但可以正常用。

在一侧窗口输入T,则看到另一侧窗口有返回,输入R,返回监听状态。双方可以互相发,但不能同时发,也就是工作在半双工状态。

Arduino简化nRF24L01绝大部分底层细节,所以调试非常Easy。通常,第一次无线实验会失败,原因很多,如果能一次成功,那真是太幸运了!确认以下事情:
  1. 电源3.3V是否足够稳定?
  2. SPI接线有没有错,CE、SCN接口有没有接错?
  3. 串口返回的硬件调试信息是否正确?
  4. 硬件地址是否正确?(前32bits必须相同,只有后8个bits用于标示)
  5. 如果这些都没问题,用scanner代码测试一下频道干扰(Windows上需要删除scanner示例中的output目录)。

接下来,简单研究下示例代码,代码本身很多注释,可以参考。

上面3个不说了,必须包含的头文件,第4个printf.h定义stdout宏,就是把标准控制台输出转向串口Serial,这对调试有很大帮助!如果是Arduino Due或YUN等多串口输出,需要宏定义Serial是哪一个先。下面radio变量,我用的是CE PIN8(片选)、SCN PIN9(数据/命令)。
定义地址,示例中只有前两个,后面是我加的。模块可同时监听6个channel ,地址前4字节是共用的(32比特 需相同),第5个字节区分不同模块。
定义模块工作于发送、还是接收,默认接收(最后一行)。可以一个模块设成发送,另一个设成接收,上电就能通信,不用串口发T改变模式。
模块开始、设置模块自动重试次数和重试间隔,具体查阅nRF24文档。只要不是对通信时延有要求,这个设成15/15都行,也是允许的最大值。

最后一行setPayloadSize(8),如果取消这行注释,你会发现发送模块总会显示发送失败,但接收模块有响应反馈。这是因为,减少Payload会导致CRC验证失败,所以发送端会一直认为没有成功发送,但实际上接收端已经接收成功了。即使设置了retry=15,接收端也不会收到重复发送的信息,这是因为nRF24内部有个自动计数器,每次发送这个值会变,重复收到信息会自动去除。
这段代码原示例中是注释掉的,取消注释!不然提示失败!

原因,用于接收的模块(else部分中)没有打开写入管道地址,无法回送“确认信息”给发送端。但如果切换到T再切换回R,就发现可以正常收发,因为切换部分的代码设置的写入管道地址。 这应该是原示例的一个小BUG,观察调试信息能看到发送、接收的地址。
接收端进入监听模式。最后一行是打印调试信息到STDOUT,因为已经设置成串口了,所以所有输出都到串口。

发送端代码
  • stopListening(必要);
  • 发送4字节的时间;
  • 根据ACK显示发送成功还是失败。nRF24这个功能非常好,可以让发送方知道消息是否送达。
  • startListening(进入监听状态,等待接收端回送收到的消息)
  • 循环检测监听队列中是否有数据,如果有数据则从缓存中读出;
  • 如果200毫秒内还是没有数据,表示客户端没有发送数据或CRC验证失败;
  • 打印消息传送消耗的时间。

接收端代码:
  • 循环检测是否有数据到达;
  • 读取缓存。暂停20毫秒(没明白为啥)
  • stopListening
  • 发送response数据。
  • startListening
串口接收处理,如果输入T or t,本Arduino切换成发送模块,修改发送、接收地址。 发送端 pipe0是发送地址,pip1是接收地址;接收端反过来。

至此,最开始的测试完毕,只要通信成功,接下来可试验更好玩儿的设想!

示例中有scanner例子,我在Windows平台下需要删除output目录先,然后重启Arduino就不会报什么 错。

参考:http://forum.arduino.cc/index.php?topic=215065.0

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表