emakefun / rf-nano

emakefun arduino nano V3.0 + nrf24L01+

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

RF - Nnao English

购买链接

arduino_rf-nano_lib

简介

​ RF-Nano是集成NRF24L01+无线模块结合Arduino Nano由我司针对创客研发的一款革命性产品。软件兼容 RF24 开源库,可进行功耗传输速率等设置,支持Mixly、Mblock5、Magicblock图像化编程;优化板载天线设传输更远更稳定,可配置外置天线,使用外置天线可传输距离达100M。

版本升级点

功能 RF-NANO (老版本) RF-NANO (新版本)
USB接口 Micro USB Type - C
尺寸 19 mm x 49 mm 18 mm x 48mm
D11 MOSI ----
USB触点
电源方案 老方案 新方案

天线切换

arduino_rf-nano_lib arduino_rf-nano_lib

​ 板载天线 外置天线

注:当图片中蓝色区域内的电容是横向焊的那就是使用的板载天线,如若是竖向焊的那就是使用的外置天线。如需切换天线,只需修改图片中蓝色区域内的电容焊接方向

原理图

原理图下载

机械结构图

arduino_rf-nano_lib

arduino和无线芯片引脚连接如下

ATmega328P NRF24L01+
D7 CE
D8 CSN
D11 MOSI
D12 MISO
D13 SCK
注 :rf-nano已经被占用的D7,D8,D11,D12,D13引脚不能再被复用

CH340G驱动安装

CH340G驱动下载链接

RF24库安装

arduino_rf-nano_lib

arduino_rf-nano_lib

关键函数说明

基础函数

函数名 说明
RF24 (uint8_t _cepin, uint8_t _cspin) ce引脚 默认是9 cs引脚默认是10
void begin (void) 启动无线收发
void startListening (void) 开始监听指定的通道
void stopListening (void) 停止监听
bool write (const void *buf, uint8_t len) 向指定通道发送数据
bool available (void) 检查是否有接收到数据
bool read (void *buf, uint8_t len) 读取数据到缓存
void openWritingPipe (uint64_t address) 打开address地址发送通道
void openReadingPipe (uint8_t number, uint64_t address) 打开数据接收通道

配置函数

函数名 说明
void setRetries (uint8_t delay, uint8_t count) 设置重试时间,和重试次数
void setChannel (uint8_t channel) 设置通信频道范围0~125,设置115可以避开wifi频道
void setPayloadSize (uint8_t size) 设置静态收发数据负载长度
uint8_t getPayloadSize (void) 获取静态收发数据负载长度
uint8_t getDynamicPayloadSize (void) 设置动态收发数据负载长度
void enableAckPayload (void) 使能自动应答数据包
void enableDynamicPayloads (void) 使能动态负载包
bool isPVariant (void) Determine whether the hardware is an nRF24L01+ or not.
void setAutoAck (bool enable) 使能自动应答包
void setAutoAck (uint8_t pipe, bool enable) Enable or disable auto-acknowlede packets on a per pipeline basis
void setPALevel (rf24_pa_dbm_e level) 设置发射功率等级 0,1,2,3db
rf24_pa_dbm_e getPALevel (void) 获取发射功率
bool setDataRate (rf24_datarate_e speed) 设置数据传输速率
void setCRCLength (rf24_crclength_e length) 设置CRC校验长度
rf24_crclength_e getCRCLength (void) 获取CRC校验长度
void disableCRC (void) 取消CRC校验

高级操作

函数名 说明
void printDetails (void) 打印所有参数配置
void **powerDown **(void) 进入掉电低功耗模式
void [powerUp(void) 推出低功耗模式
uint8_t getPayloadSize (void) 获取静态收发数据负载长度
uint8_t getDynamicPayloadSize (void) 设置动态收发数据负载长度
void enableAckPayload (void) 使能自动应答数据包
void enableDynamicPayloads (void) 使能动态负载包
bool isPVariant (void) Determine whether the hardware is an nRF24L01+ or not.
void setAutoAck (bool enable) 使能自动应答包
void setAutoAck (uint8_t pipe, bool enable) Enable or disable auto-acknowlede packets on a per pipeline basis
void setPALevel (rf24_pa_dbm_e level) 设置发射功率等级 0,1,2,3db
rf24_pa_dbm_e getPALevel (void) 获取发射功率
bool setDataRate (rf24_datarate_e speed) 设置数据传输速率
void setCRCLength (rf24_crclength_e length) 设置CRC校验长度
rf24_crclength_e getCRCLength (void) 获取CRC校验长度
void disableCRC (void) 取消CRC校验

nRF24L01/Si24R1芯片无线通信注意点

通信频道

2.4G无线通讯,是以2400MHz为起始值,每隔1MHz取一个频率点,最大一直到2525MHz(设定频率的时候记得避开WiFi干扰),一共126个取值,nrf2401把这些值叫做 RF Channel。 和波特率一样的问题,收发数据的时候不要修改。由FSK的原理可知,两个模块一收一发,想要正常通信,双方必须使用同样的载波频率,也就是两边RF Channel的值必须相同。

RF Channel的频率间隔是1MHz,如果频带宽度超过了1MHz,那么相邻的两个RF Channel在频带上就会重叠,会相互干扰,这俩Channel就被占用。

当nrf2401的波特率是250Kbps或1Mbps时,可以做到频带宽度小于1MHz,这样就能保证126个RF Channel互不影响,也就是说,我们共有126个Channel可用,很完美。但是当波特率是2Mbps的时候,频带宽度小于1MHz搞不定,只能做到让频带宽度小于2MHz,也就是说我们只有一半的Channel可以用了

地址长度

nrf24L01的地址长度3~5个字节,3/4/5字节3选1

nrf2401作为PRX接收的时候,内部最多可以同时存在6个接收地址,可以通过配置【分别启用】或【分别禁用】一个或多个接收地址。如果启用了多个地址,那么PRX接收数据信号的时候,数据中的目标地址会同时和这些地址依次比较,只要有一个地址匹配上了,那么PRX就认为这份数据是给自己的。哪个地址匹配上了,PRX回复时就把这个地址附带到回应数据上。

nrf2401把这6个接收地址相关的东西叫做数据通道(data pipe),也就是大家在使用库的时候必定要接触的pipe,编号是pipe0~pipe5

pipe地址长度可以随意配置成3/4/5字节,但这6个pipe只能共用一种长度配置,不能分别使用不同的地址长度; pipe0 地址最长可5字节,地址值随意配置,当取3/4字节地址长度时,5字节中使用最低的那3/4字节,高处字节忽略; pipe1 特点同pipe0; pipe2~pipe5 地址最长可5字节,但地址值仅有最低字节可以随意配置,剩余的高位字节只能共用/跟随pipe1中配置的值

接收部分

nrf2401只有一个射频模块,任意时候只能接收一份数据。 如果你在多对一通信时使用【多PTX<-->单PRX的多pipe】方案,需要注意错开各自发送时间。 如果同一时刻两个PTX同时向一个PRX发送数据,即使地址不同,两个信号也会相互干扰,导致PRX谁的信号也解不出来。

发射部分

再来说说PTX端,前面说过,PTX接收回应数据时也要检测地址,PTX使用数据通道pipe0来接收数据(定死的,不能改),所以我们必须【启用】pipe0通道,并为其【配置好地址和地址宽度】,再强调一下,这个地址严格讲不是PTX的地址,而是目标PRX的地址!实际上PTX是没有自己的地址的。

别忘了PTX刚开始发送数据的时候也需要一个地址,按照常理说,pipe0的地址都配置好了,PTX发送数据时就应该知道要发到哪个地址上,但并不是这样:nrf2401发送数据前必须要给它单独配置一个发送地址(TX_ADDR),也就是说,想要让PTX正确的发送和接收数据,必须将目标地址配置给PTX配置两次(即将一个地址分别写到两个不同的地方),一次是给pipe0的,一次是给TX_ADDR的,这两个地方的值必须一样。

模块自检程序

#include <SPI.h>
#include <Wire.h>
#include <RF24.h>
RF24 Radio(7,8);
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  
  Serial.println();
  Serial.println(F("RF_NANO v3.0 Test"));
  //
  // Setup and configure rf radio
  //
  Radio.begin();
  Radio.setAddressWidth(5);
  Radio.openReadingPipe(0, 0x1212121212LL);
  Radio.openReadingPipe(1, 0x3434343431LL);
  Radio.openReadingPipe(2, 0x3434343432LL);
  Radio.openReadingPipe(3, 0x3434343433LL);
  Radio.openReadingPipe(4, 0x3434343434LL);
  Radio.openReadingPipe(5, 0x3434343435LL);
  Radio.setChannel(115);            //115 band above WIFI signals
  Radio.setPALevel(RF24_PA_MAX);    //MIN power low rage
  Radio.setDataRate(RF24_1MBPS) ;   //Minimum speed
  Serial.println("Setup Initialized");
  Radio.printDetails();
}

点对点收发测试

发送

#include <SPI.h>
#include <Wire.h>
#include <RF24.h>
RF24 SendRadio(7,8);

int value;

void WriteData()
{
  value = random(255); //随机一个0-255的值,并赋给value
  SendRadio.openWritingPipe(0xF0F0F0F066);//Sends data on this 40-bit address
  SendRadio.write(&value, sizeof(value));//发送value的值
  Serial.print("WriteData");
  Serial.print(".........");
  Serial.println(value);
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println(F("RF-NANO v4.0 Send Test"));

  //
  // Setup and configure rf radio
  //
  // Get into standby mode

  SendRadio.begin();
  SendRadio.setAddressWidth(5);
  SendRadio.openWritingPipe(0xF0F0F0F066LL);
  SendRadio.setChannel(115);           //115 band above WIFI signals
  SendRadio.setPALevel(RF24_PA_MAX);   //MIN power low rage
  SendRadio.setDataRate(RF24_1MBPS) ;  //Minimum speed
  SendRadio.stopListening(); //Stop Receiving and start transminitng
  Serial.print("Send Setup Initialized");
  SendRadio.printDetails();
  delay(500);
}

void loop() {
  WriteData();
  delay(1000);
}

接收

#include <SPI.h>
#include<Wire.h>
#include <RF24.h>
RF24 ReceiveRadio (7, 8);

byte value[32];

void ReadData()
{
  uint8_t bytes;
  if (ReceiveRadio.available())
  {
    while (ReceiveRadio.available())
    { 
      bytes = ReceiveRadio.getPayloadSize();
      ReceiveRadio.read(value, bytes);//接收数据,并将数据赋值给value
    }
    Serial.print("ReadData");
    Serial.print(".........");
    Serial.println(value[0]);//打印所接收的值
  }
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println(F("RF-NANO v4.0 Receive Test"));

  //
  // Setup and configure rf radio
  //
  ReceiveRadio.begin();
  ReceiveRadio.setAddressWidth(5);
  ReceiveRadio.openReadingPipe(1, 0xF0F0F0F066LL);
  ReceiveRadio.setChannel(115);  //115 band above WIFI signals
  ReceiveRadio.setPALevel(RF24_PA_MAX); //MIN power low rage
  ReceiveRadio.setDataRate(RF24_1MBPS) ;  //Minimum speed
  ReceiveRadio.startListening();
  Serial.println("Receive Setup Initialized");
  ReceiveRadio.printDetails();
  delay(500);
}

void loop() {
  ReadData();
}

一对多测试

muilt_demo

方法一: 频道相同,地址不同

方法二 地址相同,频道不同

联系我们

技术 + 合作:WX号: null-lab

About

emakefun arduino nano V3.0 + nrf24L01+


Languages

Language:C++ 100.0%