【Arduino】NRF24L01无线模块6通道通信
前言
在我们使用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;
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");
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)
{
signal.pit = 0;
}
}
else
{
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无线模块的时候接收端可以由多个当接收端地址一样是接受到的数据是一样的。
|