极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 30206|回复: 13

nrf24l01通信问题

[复制链接]
发表于 2018-5-21 12:29:05 | 显示全部楼层 |阅读模式
本帖最后由 amiao 于 2018-5-31 11:40 编辑

大家好,我最近在用nrf24l01做一对多通信,因为之前没用过这个东西,
所以在网上找了很多资料,
我按照网上的步骤一步一步连接起来,但是最后就是不能实现通讯。
我暂时是尝试一对一通信,等有进展再进行一对多通信
网上说可能因为驱动板型号问题,我用的是两个正版的arduino unor3的驱动吧,两个型号都是一样的
不知道哪里出了问题,请各位大佬多多指导。


另外,我最近会持续研究这个板子,有什么进展,也会第一次时间在这里发布,希望大家多多讨论。


今天试了一下两个nano的板子通信,但是还是不行,接收到的都是空字符。




.............................................2018年5月30号新...........................................


今天买了两个新的nrf模块,用正版的uno连接测试了一下,能实现通信,但是接收到的都是空格。不知道是什么原因。

这是测试代码


接受代码
[kenrobot_code]#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
void setup(){
Serial.begin(9600);

Mirf.spi = &MirfHardwareSpi;
Mirf.init();

Mirf.setRADDR((byte *)"serv1"); // 本地名
Mirf.payload = 5; // 长度
Mirf.channel = 3; // 信道

Mirf.config();

}
void loop(){

byte data[Mirf.payload];
if(!Mirf.isSending() && Mirf.dataReady()){ //存在数据

Mirf.getData(data);


int i;
String Temp;
for (i = 0; i < Mirf.payload; i++) //把收到的信息拼起来,到一个串里面
{
Temp += char(data);
}
Serial.print("Get:");
Serial.print(Mirf.payload);
Serial.print(" ");
Serial.println(Temp);

/**
Mirf.setTADDR((byte *)"clie1");
Mirf.send(data);
**/
}
}



[/kenrobot_code]


发送代码
[kenrobot_code]#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

char tempx[6]="00000";
int x=0;

void setup(){
Serial.begin(9600);
Mirf.spi = &MirfHardwareSpi;
Mirf.init();

Mirf.setRADDR((byte *)"clie1"); // 标记本地名,用于接收
Mirf.payload = 5; //对话的长度,用于约定双方对话的缓冲窗口大小,这个代表5个字节
Mirf.channel = 3; // 信道,测试了一下,不同的信道也能接收但即时性很差,不知是不是存在自动寻道匹配机制

Mirf.config();
}
void loop(){
unsigned long time = millis();

Mirf.setTADDR((byte *)"serv1"); // 标记对方的地址
//Sends("hello"); //发送了一个5字节的hello


if(x<10)tempx[4]=x+48;
else if(x>9 && x<100){
  tempx[4]=x%10+48;
  tempx[3]=x/10+48;
}else if(x>99 && x<999){
  tempx[4]=x%10+48;
  tempx[3]=(x/10)%10+48;
  tempx[2]=x/100+48;
}

Sends(tempx);
x++;
if(x==1000){
  x=0;
   for(int col=0;col<5;col++)tempx[col]=48;
}

delay(100);
}


void Sends(char *str)
{
int lens;
lens=strlen(str);

char msg[lens];
int i;
for (i=0;i<lens;i++)
{
msg= int(str);
}
Mirf.send((byte *)&msg);

while(Mirf.isSending()){}



}
[/kenrobot_code]




...............................2018年5月31.......................................................

喜大普奔,终于实验成功了,我在每个nrf板子上的正负极两端各接一个10uf的电容,就突然成功了。谢谢各位。
驱动板用的uno正版板。


本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2018-5-21 12:30:53 | 显示全部楼层
不知道怎么发图片啊,好急
回复 支持 反对

使用道具 举报

发表于 2018-5-21 12:50:34 | 显示全部楼层
先尝试1对1,通了再试一对多
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-22 08:45:49 | 显示全部楼层
275891381 发表于 2018-5-21 12:50
先尝试1对1,通了再试一对多

对对,我现在就是尝试着一对一,但是就是不可以不知道为什么,板子用的都是正版uno的,一直不行
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-22 10:13:17 | 显示全部楼层
amiao 发表于 2018-5-22 08:45
对对,我现在就是尝试着一对一,但是就是不可以不知道为什么,板子用的都是正版uno的,一直不行

大哥你是用的什么板子啊,uno的吗
回复 支持 反对

使用道具 举报

发表于 2018-5-23 09:16:32 | 显示全部楼层
切换地址或者频段应该是可以的,你是用的什么方式
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-23 20:46:10 | 显示全部楼层
本帖最后由 amiao 于 2018-5-23 20:47 编辑
Hackerpro 发表于 2018-5-23 09:16
切换地址或者频段应该是可以的,你是用的什么方式


就是按照网上的教程连接的,spi连接,用的是mirf库,感觉一切都没问题啊,就是互相不能通信
回复 支持 反对

使用道具 举报

发表于 2018-5-24 09:52:36 | 显示全部楼层
amiao 发表于 2018-5-23 20:46
就是按照网上的教程连接的,spi连接,用的是mirf库,感觉一切都没问题啊,就是互相不能通信

没用过那个库,贴上代码看看吧
回复 支持 反对

使用道具 举报

发表于 2018-6-18 17:51:30 | 显示全部楼层
本帖最后由 a461624201 于 2018-6-18 17:53 编辑

楼主的经验很有用,我用另外2个帖子的库(糊涂塔克学习笔记01 Arduino+nRF24L01  ,Arduino DIY航模遥控器第一步 ---搞定nRF24L01!)开始也是不能通讯,查看,代码,寄存器都没有问题,0X07寄存器老是收不到接收中断,后来淘宝买了个USB-NRF的东东,发现有时用手触碰天线,才可以正常发给电脑,才发现不同的NRF板子, 存在这个现象,因为我用的是328P最小系统,自己焊接的340G TTL,那么可以排除代码和这些问题,所以遇到最后一步无法通讯的问题,主要还是NRF的电源电容或者天线的差异性问题,这个也会影响到发射距离。
回复 支持 反对

使用道具 举报

发表于 2018-6-18 17:54:59 | 显示全部楼层
本帖最后由 a461624201 于 2018-6-18 17:56 编辑

其实这个2个帖子,比Mirf更好,虽然模拟的SPI,但是SPI代码和寄存器的表述还是很清晰的,Mirf的引用的库比较多,好像SPI脚必须是13,12,11吧,没法修改吧?
回复 支持 反对

使用道具 举报

发表于 2018-6-18 23:29:21 | 显示全部楼层
发送代码:57行是错的。msg= int(str);更正见文件。

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2018-6-20 08:06:33 | 显示全部楼层
本帖最后由 a461624201 于 2018-6-20 08:07 编辑

厂家给出的试验板,也是3节电池启动的,所以不存在电容的问题,还有其他问题。
贴出我改动代码,使用TL431做基准,电阻分压,检查电源电压,在没有串口输入的命令,就发送电压到接收端,发送长度双机都设定是8个,可以修改更长,手动串口发送格式是fxxxxxxxx;   xxxxxxxx是实际发送内容,可以是8个或者1个,发送时会补齐为8个,接收端增加发光二极管,有信号就会闪烁,代码借鉴(这个和Arduino DIY航模遥控器第一步 ---搞定nRF24L01!),因为代码不多,没进行注释。

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2018-6-20 13:03:18 | 显示全部楼层
本帖最后由 a461624201 于 2018-6-20 17:22 编辑

趁着心血来潮,在发一个改进,双工代码,原理是,接收收到8个字符(字符长度可以更改),然后在发给发射端,双方通讯正确,2个7脚发光二极管会闪烁,双方串口都可以看到接收字符,这样的话,就非常方便,插上就能用,也可以快速判断好坏。但遇到问题是,当TX端发送比如4个char类型字符,那么接收虽然显示是4个字符,但实际是8个CHAR类型字符,而接收端发回到发送端时,字符也为8个,显示4个字符后为乱码,不知道该怎么解决。

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-25 06:42 , Processed in 0.053193 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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