【Arduino】NRF24L01无线模块6通道通信
文章目录
- 【Arduino】NRF24L01无线模块6通道通信
- 前言
- 一、NRF24L01接线
- 二、代码
- 1.发射端代码
- 2.接收端代码
- 总结
前言
在我们使用NRF24L01 2.4G无线通讯模块时往往不只是发送一个数据,这里我以我的项目总使用的6通道来分享。
使用到的材料:
两块NRF24L01模块
两块Arduino开发板(型号UNO/NANO)
杜邦线若干
一、NRF24L01接线
这里我用到的是这款2.4G无线模块,通讯距离说是可以达到1000m,实测还是挺远的,满足日常使用需求。
与单片机连接如下图
对于Arduino接线如下:
VCC -> 3.3V
GND -> GND
CSN -> 7
CE -> 8
MOSI -> 11
MISO -> 12
SCK -> 13
注意:无线模块供电用3.3V
二、代码
1.发射端代码
这里我用到了两个按键两个摇杆来作为数据输入
代码如下(示例):
//发射端程序
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
/*摇杆*/
#define PIN_X1 0
#define PIN_Y1 1
#define PIN_Y2 2
#define PIN_X2 3
/*数据包*/
int value;
typedef struct Signal {
byte x11=1;
byte y11=1;
byte x21=1;
byte y21=1;
byte gyr=0;
byte pit=1;
}Signal;
Signal signal;
/*按键*/
int buttonPin1 = 5; // 左按键的管脚定义
int buttonPin2 = 2; // 右按键的管脚定义
bool a1=0;
//bool a2=0;
void setup()
{
Serial.begin(115200);
pinMode(PIN_X1, INPUT);
pinMode(PIN_Y1, INPUT);
pinMode(PIN_X2, INPUT);
pinMode(PIN_Y2, INPUT);
//设置按键管脚上拉输入模式
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.setRADDR((byte *)"FSDDZ"); //发送端地址
Mirf.payload = sizeof(signal);
Mirf.channel = 90; //设置信道
Serial.println("朱先生") ;
Mirf.config();
}
void loop()
{
yaogan();
anjian();
Mirf.setTADDR((byte *)"JSDDZ"); //设置接收端地址
//value = random(255); //0-255的随机数
Mirf.send((byte*)&signal); //发送指令
while(Mirf.isSending())
{
delay(1); //直到发送成功,退出循环
}
/*调试显示数据*/
Serial.print(signal.x11) ;
Serial.print(signal.y11) ;
Serial.print(signal.x21) ;
Serial.print(signal.y21) ;
Serial.print(signal.gyr) ;
Serial.println(signal.pit) ;
}
void yaogan()
{
int x1,y1,x2,y2;
x1=analogRead(PIN_X1);
y1=analogRead(PIN_Y1);
x2=analogRead(PIN_X2);
y2=analogRead(PIN_Y2);
if (x1>=510){signal.x11=2;}
else if (x1>500){signal.x11=1;}
else if (x1<=500){signal.x11=0;}
if (y1>=520){signal.y11=2;}
else if (y1>500){signal.y11=1;}
else if (y1<=500){signal.y11=0;}
if (x2>=510){signal.x21=2;}
else if (x2>490){signal.x21=1;}
else if (x2<=490){signal.x21=0;}
if (y2>=520){signal.y21=2;}
else if (y2>500){signal.y21=1;}
else if (y2<=500){signal.y21=0;}
}
void anjian()
{
//左按键
if (digitalRead(buttonPin1) == LOW) { // 若按键被按下
delay(80); //等待跳过按键抖动的不稳定过程
if (digitalRead(buttonPin1) == LOW) // 若按键被按下
{
a1 = !a1;
signal.gyr = a1;
}
}
//右按键
if (digitalRead(buttonPin2) == LOW) { // 若按键被按下
delay(80); //等待跳过按键抖动的不稳定过程
if (digitalRead(buttonPin2) == LOW) // 若按键被按下
{
//a2 = !a2;
signal.pit = 0;
}
}
else
{
//a2 = 0;
signal.pit = 1;
}
}
2.接收端代码
代码如下(示例):
//接收端程序
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
/*数据包*/
int value;
typedef struct Signal {
byte x11=1;
byte y11=1;
byte x21=1;
byte y21=1;
byte gyr=0;
byte pit=0;
}Signal;
Signal signal;
void setup()
{
Serial.begin(9600);
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.setRADDR((byte *)"JSDDZ"); //接收端地址
Mirf.payload = sizeof(signal);
Mirf.channel = 90; //设置信道
Mirf.config();
Serial.println("朱先生");
}
void loop()
{
if(Mirf.dataReady()) { //接收数据
Mirf.getData((byte *)&signal);
/*调试显示数据*/
Serial.print(signal.x11) ;
Serial.print(signal.y11) ;
Serial.print(signal.x21) ;
Serial.print(signal.y21) ;
Serial.print(signal.gyr) ;
Serial.println(signal.pit) ;
}
}
总结
我们在日常做东西或者项目的过程中可能会常使用到无线通讯模块来收发数据,用NRF24L01无线模块的时候接收端可以由多个当接收端地址一样是接受到的数据是一样的。