Arduino连接nRF24L01无线收发模块

nRF24L01是一款工作在 2.4~2.5GHz 世界通用ISM频段的单片无线收发器芯片,输出功率、频道选择和协议的设置可以通过SPI接口进行设置。有极低的电流消耗,当工作在发射模式下发射功率为-6dBm时电流消耗为9.0mA,接收模式时为12.3mA。掉电模式和待机模式下电流消耗更低。
nRF24L01参考数据:供电电压:1.9 V~3.6V;最大发射功率:0 dBm;最大数据传输率:2000 kbps;发射模式下电流消耗(0dBm时):11.3 mA;接收模式下电流消耗(2000kbps):12.3 mA;接收模式数据传输率为1000kbps下的灵敏度:-85 dBm;掉电模式下电流消耗:900 nA。

淘宝上面有两种nRF24L01模块,一种是单纯的nRF24L01模块,号称传输距离250m的,几块钱就有交易;另外一种是NRF24L01+PA+LNA模块,包含放大,号称可以传输1000m,价格几十块。实际距离视地形和障碍物而定,是否够远只能通过试用确定。

下面用廉价的第一种单纯nRF24L01模块做示例:

一、nRF24L01硬件连接:
此模块是使用SPI方式连接,在标准SPI口基础增加CE和CSN引脚: 
nRF24L01 Arduino UNO
VCC <-> 3.3V
GND <-> GND
CE <-> D9
CSN <-> D10
MOSI<-> D11
MISO<-> D12
SCK <-> D13
IRQ <-> 不接

还有就是nRF24L01属于对传模块。每块芯片既是发射器,也是接收器。所以一般来说,要使用两块nRF24L01+两块Arduino才能进行测试。

二、应用例子

实验1:

将Sender机A0的AD转换值无线发送到Receiver机

原理图:

Sender机(A0端与电源两端接一个电位器,阻值随意,一般1k~100k均可):
 
 
Receiver机:
 
 
代码:

首先需要安装Mirf库,可以在http://playground.arduino.cc/InterfacingWithHardware/Nrf24L01下载或者本文附件下载。

Sender机:
[pre lang="arduino" line="1" file="Sender.ino"]/*
nRF24L01 Arduino发送端

Ansifa
2015/3/7

引脚接法:
nRF24L01   Arduino UNO
VCC        <->        3.3V
GND        <->        GND
CE        <->        D9
CSN        <->        D10
MOSI<->        D11
MISO<->        D12
SCK        <->        D13
IRQ        <->        不接
*/

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
void setup()
{
    Serial.begin(9600);

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

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

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

//由于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]。

//设置向"serv1"发送数据
    Mirf.setTADDR((byte *)"Rec01");
    Mirf.send(data);
    //while死循环等待发送完毕,才能进行下一步操作。
    while(Mirf.isSending()) {}
    delay(20);
}
[/code]
Receiver机:
[pre lang="arduino" line="1" file="Receiver.ino"]/*
nRF24L01 Arduino Receiver接收端

Ansifa
2015/3/7

引脚接法:
nRF24L01   Arduino UNO
VCC <-> 3.3V
GND <-> GND
CE  <-> D9
CSN <-> D10
MOSI<-> D11
MISO<-> D12
SCK <-> D13
IRQ <-> 不接
*/

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

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

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

//---------初始化部分,不可随时修改---------
    Mirf.cePin = 9;     //设置CE引脚为D9
    Mirf.csnPin = 10;   //设置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]);

//与上一次结果比较,避免相同结果刷屏,降低串口流量
        if(adata != oldadata)
        {
            oldadata = adata; //本次结果作为历史结果。
            //Serial.print输出数据
            Serial.print("A0=");
            Serial.println(adata);
            //也可以输出双字节数据
            //Serial.write(data[1]);
            //Serial.write(data[0]);
        }

}
}
[/code]

实验2:

将上述的数据绘图表。

修改一下输出格式,然后用现成的串口图表软件显示出来。

原理图:
与实验1一样。
代码:
发射端代码与原来一样。
接收端新代码:
[pre lang="arduino" line="1" file="Sender.ino"]
/*
nRF24L01 Arduino Receiver接收端
图表输出版本

Ansifa
2015/3/7

引脚接法:
nRF24L01   Arduino UNO
VCC <-> 3.3V
GND <-> GND
CE  <-> D9
CSN <-> D10
MOSI<-> D11
MISO<-> D12
SCK <-> D13
IRQ <-> 不接
*/

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

//定义一个变量adata存储最终结果。
unsigned int adata = 0;

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

//---------初始化部分,不可随时修改---------
    Mirf.cePin = 9;     //设置CE引脚为D9
    Mirf.csnPin = 10;   //设置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]);

//输出双字节数据
        Serial.write(data[0]);
        Serial.write(data[1]);
    }
}
[/code]

上位机:
直接用现成软件比如这个串口猎人。
配置如图。依照图片顺序配置成截图一样即可。
 
 
 

Arduino连接nRF24L01无线收发模块相关推荐

  1. 单片机基于2.4G无线收发模块NRF24L01的无线通信(基本测试通过)

    在无线通信中,NORDIC公司生产的NRF24L01无线收发模块是许多玩家的选择,它是2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片,具有功能较强而控制较方便并且价格便宜的优点.一块NR ...

  2. 基于Arduino单片机的nRF24L01+无线遥控装置设计(爆肝制作)

    目录 前言 一.总体思路 二.硬件介绍 (一)主机 (二)从机 三.电路设计 (一)主机 (二)从机 四.程序代码 (一)主机 (二)从机 五.总结及改进 六.所用到的文献链接 前言 此文章只涉及单片 ...

  3. ESP8266 Arduino开发之路(2)— 连接到无线WiFi路由器

    ESP8266 Arduino开发之路(2)- 连接到无线WiFi路由器 一.前言 ESP8266可以通过WiFi连接到无线路由器,这种方式和手机通过WiFi连接无线路由器的模式是相同的,我们称该模式 ...

  4. Arduino开发遥控小车(三)基于nRF24L01无线模块实现舵机转向和直流电机调速

    Arduino开发遥控小车(三)基于nRF24L01无线模块实现舵机转向和直流电机调速 前面和大家分享了通过nRF24L01无线模块实现数据发送和接收的基本方法,本次继续和大家分享最终实现遥控小车转向 ...

  5. 如何使用Arduino开发板连接PS2无线控制器

    控制器在我们的生活中有着悠久的历史:从控制遥控车和四轮车到游戏控制器-,他们都使用无线或有线控制器.在本篇文章中,您将学习如何使用Arduino连接和使用PS2游戏机控制器. PS2控制器的功能 每个 ...

  6. 开源 | 嵌入式物联网应用开发 - 无线收发模块

    上一篇文章讲述了ARM-Linux中控扩展模块的开发设计,上一篇文章的具体内容,请参考以下链接: 开源 | 嵌入式物联网项目开发 - ARM中控扩展模块 为了提高硬件模块的可重用性,对于终端设备模块的 ...

  7. 无人机项目跟踪记录六十五----无线收发模块电路

    下图是无线收发模块和蓝牙模块的原理图,首先介绍无线收发模块: 无线收发模块NRF24L01的功能如下: nRF24L01是由NORDIC生产的工作在2.4GHz~2.5GHz的ISM 频段的单片无线收 ...

  8. raspberrypi 与 arduino 使用 nRF24L01+ 通信 -- raspberry pi为发送端

    nRF24L01+ 通过gpio与树梅派链接,按着网上能找到的所有方法基本上都不顺利,从Python方案到c方案都不行,尝试了很长时间,终于成功,基本上,每个人都会碰到各种各样的问题. arduino ...

  9. STM32CubeMX系列08——SPI通信(W25Q64、NRF24L01无线模块)

    文章目录 1. 准备工作 1.1. 所用硬件 1.2. SPI 简介 1.3. 生成工程 1.3.1. 创建工程选择主控 1.3.2. 系统配置 1.3.3. 配置工程目录 2. 读写EEPROM实验 ...

最新文章

  1. PHP--isset()和unset()函数的用法
  2. rust(56)-mp3(1)
  3. Linux一键部署duckchat,宝塔面板部署DuckChat(翻译:鸭信)- 一个简约好用的网络聊天平台...
  4. 20145209 实验三 《敏捷开发与XP实践》 实验报告
  5. 深度学习弯道超车,领先行业不止一点点
  6. Spark NaiveBayes Demo 朴素贝叶斯分类算法
  7. PHP实现限制域名从而保护源代码不被拷贝
  8. 如何批量将 Txt 文本文档转换为 xlsx 格式的 Excel 文档
  9. 超靠谱,一文教会你如何注册申请安徽省实用新型专利
  10. 甲骨文裁员事件的思考
  11. 特征工程之特征选择(5)----包装法
  12. 一个人九月份开始考北邮的经验
  13. Apk脱壳圣战之---脱掉“爱加密”家的壳
  14. b站电脑测试用什么软件,使用BiliBili访问诊断工具检测哔哩哔哩网络的方法
  15. 复变函数-复指数形式
  16. ListView 实现阻尼回弹效果 并去除边缘阴影
  17. 知网根据作者及单位检索文献汇总到Excel(2021.6.9)
  18. WINCC的SQL应用,无需修改任何源码
  19. 利用Python提取ABAQUS的计算结果(ODB)信息
  20. Some Questions about MapReduce

热门文章

  1. 【stm32c8t6多路舵机PWM输出】
  2. Bayes,HMM,MRF Gibbs Distribution在图像降噪中的应用
  3. BGP(3)--路由策略
  4. vue3 动态传值给子组件
  5. Openstack虚拟机镜像深度实践
  6. 台湾大学郭彦甫MATLAB课程PPT课件
  7. java的对象存储在哪里?
  8. 微软业务生产力平台基础架构优化(BPIO)之企业项目管理(EPM)解决方案
  9. Shotgun/Shotgrid入门学习笔记一
  10. Oracle分区表操作