rf-nano English
rf-nano是emakefun公司基于官方标准Arduino Nano V3.0主板集成nrf24L01+无线芯片而开发一款2.4G无线开发板 。它的尺寸,引脚完全兼容标准nanoV3.0开发板,直接兼容RF24 开源库,可进行功耗,传输速率,频道等设置,支持Mixly、Mblock5、Magicblock图像化编程;优化板载天线设传输距离达30m,板载IPEX贴片天线座,使用外置天线传输距离可达100m。
- 处理器:ATmega328P-AU
- 工作电压:5V建议 VIN输入电压:6V ~ 15V
- 数字IO引脚:22个(其中6个用作PWM输出)
- 模拟输入引脚:8 (A0~A7)
- IO引脚直流电流:40mA
- 5V 引脚电流:VIN输入时1000mA
- 3.3V引脚电流 : 50mA
- Flash内存:32KB(其中0.5KB用于引导加载程序)
- SRAM: 2KB
- EEPROM: 1KB
- USB转串口芯片: CH340G芯片 外置晶振
- 工作时钟:16 MHZ
NanoV3.0,rf-nanoV1.0,RF-NANOV3.0三个产品参数对比
注:rf-nano3.0相对于rf-nano除了功能点进行了升级外,PCB设计版图也进行了全新优化,精心布局,除此以外,电源器件和外围器件也全部优化,采样知名元器件原装芯片,大大提升了整体产品的射频性能和产品稳定性。
rf-nanoV1.0早已停产,但市面上依然有大量销售的V1.0外形的主板均为克隆版本,做工粗糙,器件很多为翻新物料,质量不可靠,请注意分辨。
板载天线 外置天线
注:当图片中蓝色区域内的电容是横向焊的那就是使用的板载天线,如若是竖向焊的那就是使用的外置天线。如需切换天线,只需修改图片中蓝色区域内的电容焊接方向
ATmega328P | nRF24L01+ |
---|---|
D7 | CE |
D8 | CSN |
D11 | MOSI |
D12 | MISO |
D13 | SCK |
注 :rf-nano已经被占用的D7,D8,D11,D12,D13引脚不能再被复用
函数名 | 说明 |
---|---|
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校验 |
通信频道
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>
#include <printf.h>
RF24 Radio(7,8);
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
printf_begin();
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>
#include <printf.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);
printf_begin();
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>
#include <printf.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);
printf_begin();
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();
}
方法一: 频道相同,地址不同
方法二 地址相同,频道不同
开发中......
技术+合作 wechat号: jundi0808([email protected])