我造轮子,你造车,创客一起造起来!塔克创新资讯【塔克社区 www.xtark.cn 】【塔克博客 www.cnblogs.com/xtark/

    

本文介绍X-CTR100控制器 NRF24L01+ 2.4G无线通信模块的使用,可用于无线遥控、无线数据传输等应用场景。

原理

基本介绍

nRF24L01是由NORDIC生产的工作在2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片。无线收发器包括:频率发生器、增强型"SchockBurst"模式控制器、功率放大器、晶体振荡器、调制器和解调器。输出功率频道选择和协议的设置可以通过SPI 接口进行设置。几乎可以连接到各种单片机芯片,并完成无线数据传送工作。极低的电流消耗:当工作在发射模式下发射功率为0dBm 时电流消耗为11.3mA ,接收模式时为12.3mA,掉电模式和待机模式下电流消耗更低。

NRF24L01模块技术成熟,已经被大量应用,具有如下特点,关于模块详细说明,请参考NRF24L01模块资料。

工作在2.4G频段,全球开放的ISM频段,免许可证使用。

最高工作速率2Mbps,高效的GFSK调制,抗干扰能力强。

125个频道,满足多点通信和跳频通信需要。

内置CRC检错和点对多的通信地址控制。

具有自动应答及重发功能,通信更可靠。

标准模块

标准模块,VCC脚接电压范围为1.9V~3.6V之间,可直接接电压3.3V。

除电源VCC和接地端,其余脚都可以直接5V和3V单片机IO口直接相连,无需电平转换。

增强模块

标准模块一般无专用PA和LNA芯片,传输距离一般为50~100米。

如果要实现更远的传输距离,可选择如下增加PA和LNA的模块,通信距离可达2000米,与标准模块兼容。

    

产品参数:

    

实物图,可以使用高增益天线,增加收发距离。

    

例程

本例程需要两套X-CTR100和两个NRF24L01模块,其中一个用于数据发送,一个用于数据接收,可通过拨码开关SW1进行发送和接收模式选择,串口显示发送或接收的数据内容。

硬件说明

硬件资源:

X-CTR100控制器2套,NRF24L01+模块两套。

  • 串口UART1
  • NRF24L01板载接口

硬件连接:

    

注意不要把模块安装反了。

软件生态

X-SOFT软件生态,X-API文件如下。

ax_nrf24l01.c——X-CTR100 板载 NRF24L01+源文件

ax_ nrf24l01.h——X-CTR100 板载 NRF24L01+头文件

操作函数如下:

uint8_t AX_NRF24L01_Init(void); //NRF24L01初始化

void AX_NRF24L01_SetMode(uint8_t mode, uint8_t *addr_tx, uint8_t *addr_rx); //NRF24L01设置发射接收模式及地址

uint8_t AX_NRF24L01_SendPacket(uint8_t *pbuf); //NRF24L01发送数据包

uint8_t AX_NRF24L01_ReadPacket(uint8_t *pbuf); //NRF24L01读取数据包

宏定义:

//NRF24L01 地址宽度

#define
AX_TX_ADR_WIDTH 5     //发送地址宽度

#define
AX_RX_ADR_WIDTH 5     //接收地址宽度

 

//NRF24L01 数据宽度

#define
AX_TX_PLOAD_WIDTH 32     //发送数据宽度

#define
AX_RX_PLOAD_WIDTH 32     //接收数据宽度    

 

//NRF24L01 操作状态

#define
AX_NRF24L01_TX_ERR 0xff //发送未知错误

#define
AX_NRF24L01_TX_MAX      0x10 //达到最大发送次数

#define
AX_NRF24L01_TX_OK      0x20 //发送数据完成

#define
AX_NRF24L01_RX_ERR 0x55 //接收未知错误

#define
AX_NRF24L01_RX_OK      0x40 //接收数据完成

#define
AX_NRF24L01_MODE_TX 0x01 //发送模式

#define
AX_NRF24L01_MODE_RX      0x02 //接收模式

软件说明

本例程首先对NRF24L01初始化,如果初始化成功返回1,否则返回0。初始化成功后根据获取的拨码开关状态配置发送模式或接收模式。while循环进行数据发送或接收操作,每帧默认发送32字节数据,本例程对前4个字节进行赋值,其中第1个字节进行循环加1操作,用于标识发送帧号,发间隔为200ms,主程序代码如下。

int main(void)

{

    uint8_t mode; //工作模式

    uint8_t xrt1_address[AX_TX_ADR_WIDTH] = { 0x01,0x02,0x03,0x04,0x01 };    //发送端地址

    uint8_t xrt2_address[AX_RX_ADR_WIDTH] = { 0x01,0x02,0x03,0x04,0x01 };    //接收端地址

 

    uint8_t nrf24l01_txbuf[32] = { 0 };

    uint8_t nrf24l01_rxbuf[32] = { 0 };

 

    /* X-CTR100初始化 */

    AX_Init(115200);

    printf("***X-CTR100 NRF24L01无线通信测试例程***\r\n\r\n");

 

    //获取拨码开关SW1状态,并设定发射接收模式

    mode = AX_SW_GetSW1Status();

    printf("*通过拨码开关SW1可切换发送或接收模式,复位有效\r\n");

 

    //模块初始化及配置

    if (AX_NRF24L01_Init()) //NRF24L01初始化

    {

        if (mode == 1) //发送模式

        {

            printf("*当前工作模式:发射模式 \r\n");

            AX_NRF24L01_SetMode(AX_NRF24L01_MODE_TX, xrt1_address, xrt2_address); //设置为发送模式,并配置地址

            printf("*发射地址:%2x %2x %2x %2x %2x \r\n",

                xrt1_address[0], xrt1_address[1], xrt1_address[2], xrt1_address[3], xrt1_address[4]);

            printf("*接收地址:%2x %2x %2x %2x %2x \r\n\r\n",

                xrt2_address[0], xrt2_address[1], xrt2_address[2], xrt2_address[3], xrt2_address[4]);

        }

        else
//接收模式

        {

            printf("*当前工作模式:接收模式 \r\n");

            AX_NRF24L01_SetMode(AX_NRF24L01_MODE_RX, xrt2_address, xrt1_address); //设置为接收模式,并配置地址

            printf("*接收地址:%2x %2x %2x %2x %2x \r\n",

                xrt1_address[0], xrt1_address[1], xrt1_address[2], xrt1_address[3], xrt1_address[4]);

            printf("*等待接收数据...... \r\n\r\n");

        }

    }

    else

    {

        //NRF24L01 故障或未连接

        printf("*NRF24L01 初始化失败,请查看模块是否连接。。。 \r\n");

        while (1)

        {

            AX_Delayms(50);

            AX_LEDR_Toggle(); //红灯闪烁

        }

    }

 

    //X-API测试:无线发送接收测试    

    nrf24l01_txbuf[0] = 0;

    nrf24l01_txbuf[1] = 1;

    nrf24l01_txbuf[2] = 2;

    nrf24l01_txbuf[3] = 3;

 

    while (1)

    {

        if (mode == 1) //发送模式

        {

            if (AX_NRF24L01_SendPacket(nrf24l01_txbuf) == AX_NRF24L01_TX_OK)

            {

                printf("*发送的数据:%2x %2x %2x %2x \r\n",

                    nrf24l01_txbuf[0], nrf24l01_txbuf[1], nrf24l01_txbuf[2], nrf24l01_txbuf[3]);

 

                AX_LEDG_On();

                AX_Delayms(100);

                AX_LEDG_Off();

                AX_Delayms(100);

            }

            else
//发送失败红灯闪烁

            {

                AX_LEDR_On();

                AX_Delayms(100);

                AX_LEDR_Off();

                AX_Delayms(100);

            }

            nrf24l01_txbuf[0]++;

        }

        else
//接收模式

        {

            if (AX_NRF24L01_ReadPacket(nrf24l01_rxbuf) == AX_NRF24L01_RX_OK)

            {

                printf("*接收到数据:%2x %2x %2x %2x \r\n",

                    nrf24l01_rxbuf[0], nrf24l01_rxbuf[1], nrf24l01_rxbuf[2], nrf24l01_rxbuf[3]);

 

                AX_LEDG_On();

                AX_Delayms(90);

                AX_LEDG_Off();

                AX_Delayms(90);

            }

            else
//接收失败红灯闪烁

            {

                AX_Delayms(90);

            }

        }

    }

}

实现效果

本例程需要两套X-CTR100和两个NRF24L01模块,通过拨码开关SW1可设置工作模式为发射或接收,其中一个用于数据发送,一个用于数据接收。发送端上电后,如果接收端未上电,由于NRF24L01设置自动应答模式,则发送端每次发送均失败,红灯会伴随闪烁。接收端上电后,则发送和接收端同步发送接收,绿灯伴随闪烁,并通过串口显示接收的数据,运行效果如下图。

    

玩转X-CTR100 l STM32F4 l NRF24L01+ 2.4G无线通信的更多相关文章

  1. 玩转X-CTR100 l STM32F4 l ADC 模拟数字转换

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 AD转换接 ...

  2. 玩转X-CTR100 l STM32F4 l MPU6050加速度陀螺仪传感器

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 板载加速度 ...

  3. 玩转X-CTR100 l STM32F4 l X-CTR100与树莓派搭建机器人平台

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器与树莓派Linux系统 ...

  4. 玩转X-CTR100 l STM32F4 l 舵机控制

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器的舵机控制,X-CTR ...

  5. 玩转X-CTR100 l STM32F4 l DRV8825 A4988 步进电机控制

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器控制步进电机 ...

  6. 玩转X-CTR100 l STM32F4 l 基础例程printf、LED、蜂鸣器、拨码开关、位带操作

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器基础板载资源 ...

  7. 玩转X-CTR100 l STM32F4 l PS2无线手柄

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] SONY的PS2无线手柄是索尼游戏机的遥控手柄,控制 ...

  8. 玩转X-CTR100 l STM32F4 l DSP指令集性能测试

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 DSP库的 ...

  9. 玩转X-CTR100 l STM32F4 l FPU单精度浮点性能测试

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器如何开启ST ...

随机推荐

  1. Maven报错Please ensure you are using JDK 1.4 or above and not a JRE解决方法!

    https://www.cnblogs.com/shihua513/p/6163682.html 在eclipse下用maven编译时,很有可能出现以下错误: Please ensure you ar ...

  2. 20165327 2017-2018-2 《Java程序设计》第9周学习总结

    20165327 2017-2018-2 <Java程序设计>第9周学习总结 教材内容总结 第十三章 (一)教材学习内容总结 理解 URL类是对统一资源定位符的抽象,使用URL创建对象的应 ...

  3. [LintCode] Linked List Cycle(带环链表)

    描述 给定一个链表,判断它是否有环. 样例 给出 -21->10->4->5, tail connects to node index 1,返回 true. 这里解释下,题目的意思, ...

  4. P2469 [SDOI2010]星际竞速

    在何Au的讲解下终于搞明白了这个以前的坑. 首先考虑最小路径覆盖. 这个题意又要求我们求出的最大流为n-1(这样才能保证路径为1条) 考虑高速航行模式的图怎么建,只需要保证最大流的同时费用最小即可,显 ...

  5. Card Game Again CodeForces - 818E (双指针)

    大意: 给定序列, 求多少个区间积被k整除. 整除信息满足单调性, 显然双指针. 具体实现只需要考虑k的素数向量, 对每一维维护个指针即可. 这题看了下cf其他人的做法, 发现可以直接暴力, 若当前的 ...

  6. 多线程总结2之volatile和synchronized(转)

    本文转自 http://www.jasongj.com/java/thread_safe/ 一.多线程编程中的三个核心概念 本篇文章将从这三个问题出发,结合实例详解volatile如何保证可见性及一定 ...

  7. 2.两数相加(Add Two Numbers) C++

    第一想法是顺着题目的原因,将两链表分别转化为一个数字,再将数字相加,然后把结果转化为字符串,存到答案链表中.但是数据太大会溢出! 所以,要在计算一对数字的过程当中直接存储一个结果,注意结果大于9时进位 ...

  8. Oracle 11.2.0.4.0 Dataguard部署和日常维护(2)-Datauard部署篇

    1. primary库设置dataguard相关参数   1.1. 强制primay库在任何状态下必须记录日志 SYS@userdata>select FORCE_LOGGING from v$ ...

  9. VCG(VisualCodeGrepper)安装使用教程

    一.说明 代码审计工具看来还是比较难做,一是开源的代码审计工具少,二是原本的一些开源审计工具很多都不更新甚至不能使用了. VCG支持审计C++.Java.C#.PHP和VB,但其“审计”基本相当于函数 ...

  10. Android studio 一个项目引入另一个项目作为Libary

    1.在我们开发Android项目时,有时需要一个项目作为另一个项目的工具类的引用,这样就需要配置下,使得MyLibrary到MyApplication作为一个module. 我们直接截图上步骤: 1. ...