极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: Ansifa

Arduino学习笔记A16 - Arduino连接nRF24L01无线收发模块

  [复制链接]
发表于 2015-6-23 21:38:42 | 显示全部楼层
还有,我把 63.        if(adata != oldadata) 这个判断去掉了

应该不会发送一次,就收到很多次吧。
回复 支持 反对

使用道具 举报

发表于 2015-6-24 01:48:27 | 显示全部楼层
zhangdeyue1 发表于 2015-3-26 11:32
谢谢!
最近在做双向通讯的时候出现一个问题
就是开始是打算主机发送指令,从机接到后返回一个固定指令 ...

这个功能模块就有,叫自动应答,不用自己做的,查一下寄存器的表,打开它就行!
回复 支持 反对

使用道具 举报

发表于 2015-6-24 01:55:40 | 显示全部楼层
pumpitup 发表于 2015-6-23 21:38
还有,我把 63.        if(adata != oldadata) 这个判断去掉了

应该不会发送一次,就收到很多次吧。

取决于你开自动重发和应答没有,如果来了,自动应答信号不是每次都传到从机,所以虽然主机接受到信息,但由于从机没有收到自动应答信号,从机会自动重发,这样就会收到多个。模块本身也会去重,取决于PID和CRC码
回复 支持 反对

使用道具 举报

发表于 2015-6-24 21:05:14 | 显示全部楼层
本帖最后由 pumpitup 于 2015-6-24 21:06 编辑
gh03hjc 发表于 2015-6-24 01:55
取决于你开自动重发和应答没有,如果来了,自动应答信号不是每次都传到从机,所以虽然主机接受到信息,但 ...


看来想用好,得学好多东西啊。

不过感觉这个if有点山寨。我做了个遥控小车的,其实从机是在不断发送信息,但是由于没有动电位器所以发的都是一样的,然后不变的内容都被主机忽略了。

对了,Serial.begin(9600)在nRF24L01的使用中是必须的么?为什么我主机端需要接USB才能收到信息呢?去掉Serial.begin这句就会报错。

还有就是,如果没有开从机,主机复位的时候也会收到信息。我上面的很大的数可能就是这么来的。
回复 支持 反对

使用道具 举报

发表于 2015-6-29 06:53:56 | 显示全部楼层
pumpitup 发表于 2015-6-24 21:05
看来想用好,得学好多东西啊。

不过感觉这个if有点山寨。我做了个遥控小车的,其实从机是在不断发送 ...

看来你还不是很通Arduino 的函数,Serial.begin()是一定要的,它开启Arduino 和电脑之间联系之门!
然后你说什么从机不开?Nrf24哪有主从之分?我猜你可能是指发射机不开,但接收机仍然有数据?那不可能吧,除非你是关了发射机Arduino 的电但没有关发射机Nrf 24的电吧!
回复 支持 反对

使用道具 举报

发表于 2015-6-29 07:07:55 | 显示全部楼层
pumpitup 发表于 2015-6-24 21:05
看来想用好,得学好多东西啊。

不过感觉这个if有点山寨。我做了个遥控小车的,其实从机是在不断发送 ...

看来你还不是很通Arduino 的函数,Serial.begin()是一定要的,它开启Arduino 和电脑之间联系之门!
然后你说什么从机不开?Nrf24哪有主从之分?我猜你可能是指发射机不开,但接收机仍然有数据?那不可能吧,除非你是关了发射机Arduino 的电但没有关发射机Nrf 24的电吧!
回复 支持 反对

使用道具 举报

发表于 2015-6-29 10:42:33 | 显示全部楼层
gh03hjc 发表于 2015-6-29 06:53
看来你还不是很通Arduino 的函数,Serial.begin()是一定要的,它开启Arduino 和电脑之间联系之门!
然后 ...

Serial只是用来debug用的。

调试好了当然要去掉所有的Serial的东西了。我可以用其它的东西来查看程序运行正确与否。

有两个问题:

Serial与RF24L01的使用有没有关系。

Serial的使用会不会影响0、1口的使用。是不是如果我想用0、1口就必须不使用Serial。
回复 支持 反对

使用道具 举报

发表于 2015-6-29 11:08:06 | 显示全部楼层
pumpitup 发表于 2015-6-29 10:42
Serial只是用来debug用的。

调试好了当然要去掉所有的Serial的东西了。我可以用其它的东西来查看程序运 ...

Nrf24与serial没有直接关系,但你要用Serial就要用0.1
回复 支持 反对

使用道具 举报

发表于 2015-6-29 22:43:09 | 显示全部楼层
gh03hjc 发表于 2015-6-29 11:08
Nrf24与serial没有直接关系,但你要用Serial就要用0.1

问题就在这里。

被控机接在电脑上的时候,一切正常。一旦拔下Usb线,那就无法遥控了。不知道是怎么回事儿。
回复 支持 反对

使用道具 举报

发表于 2015-7-10 11:07:03 | 显示全部楼层
LZ,RADDR是不是就是本机的名字,TADDR是不是就是对方的名字?

是不是每台机器都要有本机的名字,如果是发送放则需要设置对方的名字?

接受是,对方的目的与本机的名字要一样,通道也要一样对吧。
回复 支持 反对

使用道具 举报

发表于 2015-7-16 10:40:49 | 显示全部楼层
非常好的例子,写的也很详细,谢谢楼主!
回复 支持 反对

使用道具 举报

发表于 2015-8-12 00:39:41 | 显示全部楼层
楼主你好,我想请教下,如果一次发送多个传感器的数据该怎么改呢?我试着改了一下你的程序,但是只能接收到第一个传感器的数据,第二个传感器的数据一直不对,能帮我看下吗?谢谢了
发送端程序
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
void setup()
{
    Serial.begin(9600);

    Mirf.cePin = 8;                //设置CE引脚为D9
    Mirf.csnPin = 7;        //设置CE引脚为D10
    Mirf.spi = &MirfHardwareSpi;
    Mirf.init();  //初始化nRF24L01               

        //设置接收标识符"Sen01"
    Mirf.setRADDR((byte *)"Sen01");
    Mirf.payload = sizeof(unsigned int);
    Mirf.channel = 3;
    Mirf.config();

        //注意一个Arduino写Sender.ino,另一个写Receiver.ino。
        //这里标识写入了Sender.ino
    Serial.println("I'm Sender...");
}
unsigned int adata = 0;
unsigned int bdata = 0;
void loop()
{
        //读取A0值到adata
    adata = analogRead(A0);
    bdata = analogRead(A1);

    //由于nRF24L01只能以byte单字节数组形式发送Mirf.payload个数据,
    //所以必须将所有需要传输的数据拆成byte。
    //下面定义byte数组,存放待发数据,因为Mirf.payload = sizeof(unsigned int);
    //实际下面等于byte data[2];
    byte data[Mirf.payload];

    //adata是unsigned int双字节数据,必须拆开。
    //将adata高低八位拆分:
    data[0] = adata & 0xFF;                //低八位给data[0],
    data[1] = adata >> 8;    //高八位给data[1]。
  data[2] = bdata & 0xFF;                //低八位给data[0],
    data[3] = bdata >> 8;
    //设置向"serv1"发送数据
    Mirf.setTADDR((byte *)"Rec01");
    Mirf.send(data);
    //while死循环等待发送完毕,才能进行下一步操作。
    while(Mirf.isSending()) {}
    Serial.println(adata);
    Serial.print("*****");
    Serial.println(bdata,DEC);
    delay(3000);
}

接收端程序:

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

    //定义一个变量adata存储最终结果,oldadata存储旧结果,防止相同结果刷屏。
    unsigned int adata = 0, bdata = 0;

void setup()
{
    Serial.begin(9600);

    //---------初始化部分,不可随时修改---------
    Mirf.cePin = 8;     //设置CE引脚为D9
    Mirf.csnPin = 7;   //设置CE引脚为D10
    Mirf.spi = &MirfHardwareSpi;
    Mirf.init();  //初始化nRF24L01

    //---------配置部分,可以随时修改---------
    //设置接收标识符"Rev01"
    Mirf.setRADDR((byte *)"Rec01");
    //设置一次收发的字节数,这里发一个整数,
    //写sizeof(unsigned int),实际等于2字节
    Mirf.payload = sizeof(unsigned int);
    //发送通道,可以填0~128,收发必须一致。
    Mirf.channel = 3;
    Mirf.config();

    //注意一个Arduino写Sender.ino,另一个写Receiver.ino。
    //这里用来辨别写入了Receiver.ino程序
    Serial.println("I'm Receiver...");
}

void loop()
{
    //定义一个暂存数组,大小为Mirf.payload。
    byte data[Mirf.payload];
    if(Mirf.dataReady())    //等待接收数据准备好
    {
        Mirf.getData(data);    //接收数据到data数组
        //data[1]<左移8位与data[0]并,重组数据。
        adata = (unsigned int)((data[1] << 8) | data[0]);
  bdata = (unsigned int)((data[3] << 8) | data[2]);
   
      
            
          Serial.println(adata);
    Serial.print("*****");
    Serial.println(bdata,DEC);
    }
}

求指教,十分感谢!
回复 支持 反对

使用道具 举报

发表于 2015-8-23 20:23:21 | 显示全部楼层
大神求指点!怎么从主机串口读入字符串,从机串口输出字符串呢??求代码
回复 支持 反对

使用道具 举报

发表于 2015-8-23 22:31:31 | 显示全部楼层
学习一下,谢谢楼主
回复 支持 反对

使用道具 举报

发表于 2015-11-29 20:45:09 | 显示全部楼层
本帖最后由 ariel 于 2015-11-29 20:52 编辑

楼主,我直接复制的代码,还是接收不到,感觉是因为adata和olddata一直一样的关系。
第一段发送代码,setRADDR的值为什么跟接收中的setRADDR不一样啊,
对了,还有,getData()里面那个spi里面的东西找不到啊
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2019-9-19 15:14 , Processed in 0.050462 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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