arduino+通信模块

lgmyxbjfu
发布于 2020-11-6 15:05
浏览
0收藏

arduino+通信模块-鸿蒙开发者社区

CSN是一个“片选择引脚”,即Chip Select N(N代表低电平有效),假如你想通过1个NRF24L01同多个NRF24L01进行通信的话,就需这个引脚了。一旦将想要通信的那个NRF24L01模块的CSN引脚置0,就代表你之后所有的信息传输对象针对的是这个NRF24L01模块。这就好比你是一个管理员,然后你要管理一群聋子,咋办呢?你喊他们名字肯定是不行的,于是你想出一个好办法,给每一个聋子身上挂一个双色牌,一面红色一面绿色,假如某个聋子身上的牌子翻成红色代表他处于被通信状态,假如是绿色就是不通信状态,那么好,这一群聋子中你只需要把任意一个人的牌子翻成红色,其他人翻成绿色,然后这群聋子就可以知道你到底想指挥的是哪一个人了,CSN就相当于NRF24L01的双色牌。


CE是“模式选择引脚”,NRF24L01作为无线传输模块,必然有“接收”和“发送”两种状态,那么在决定这块NRF24L01模块是“接收”还是“发送”时,就是通过CE引脚来定义的。


MOSI和MISO这两个引脚在前一篇讲过了,MOSI和MISO是串口通信中信息传输的通道,前者用于发送端传送信息给接收端的线,后者用于接收端反馈信息给接收端的线;通常在控制过程中MOSI用的多,但是有时候我们需要接收端反馈是否接收到信息的话也会需要MISO来传送反馈信息。


SCK是“时钟引脚”,这个东西存在的意思是什么呢?我们知道NRF24L01传送数据的时候是一帧一帧的是传输的,那么好,在传输的时候我们总得有个节奏吧,发送端不能一会儿快一会儿慢的,否则接收端怎么接收呢?所以我们需要设定一个打节奏的装置,就是这个SCK时钟。SCK会打一个固定的节奏,然后传送端和接收端就可以按照这个固定的节奏有条不紊地收发信息了,否则接收端和发送端的节奏没有一个统一步调的话很容易出现信息丢失或者干脆接收不到。

发送模块
 
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
void setup()
{
    Serial.begin(9600);
 
    Mirf.cePin = 9;                //设置CE引脚为D9
    Mirf.csnPin = 10;        //设置CE引脚为D10
    Mirf.spi = &MirfHardwareSpi;
    Mirf.init();  //初始化nRF24L01               
 
        //设置接收标识符"Sen01"
    Mirf.setRADDR((byte *)"Sen01");
    //设置一次收发的字节数,这里发一个整数,写sizeof(unsigned int),实际等于2字节
    Mirf.payload = sizeof(unsigned int);
    //发送通道,可以填0~128,收发必须一致。
    Mirf.channel = 3;
    Mirf.config();
 
        //注意一个Arduino写Sender.ino,另一个写Receiver.ino。
        //这里标识写入了Sender.ino
    Serial.println("I'm Sender...");
}
unsigned int adata = 0;
void loop()
{
        //读取A0值到adata
    adata = analogRead(A0);
 
    //由于nRF24L01只能以byte单字节数组形式发送Mirf.payload个数据,
    //所以必须将所有需要传输的数据拆成byte。
    //下面定义byte数组,存放待发数据,因为Mirf.payload = sizeof(unsigned int);
    //实际下面等于byte data[2];
    byte data[Mirf.payload];
 
    //adata是unsigned int双字节数据,必须拆开。
    //将adata高低八位拆分:
    data[0] = adata & 0xFF;                //低八位给data[0],
    data[1] = adata >> 8;                //高八位给data[1]。
 Serial.println(adata);
    //设置向"serv1"发送数据
    Mirf.setTADDR((byte *)"Rec01");
    Mirf.send(data);
    //while死循环等待发送完毕,才能进行下一步操作。
    while(Mirf.isSending()) {}
    delay(20);
}
接受模块
 
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
 int left1 = 7;
int left2 = 6;
int right1 = 5;
int right2 = 4;



void qian()
{
digitalWrite(left1,HIGH);
digitalWrite(left2,LOW);
digitalWrite(right1,HIGH);
digitalWrite(right2,LOW);
}
    //定义一个变量adata存储最终结果,oldadata存储旧结果,防止相同结果刷屏。
    unsigned int adata = 0, oldadata = 0;
 
void setup()
{
    Serial.begin(9600);
 
    //---------初始化部分,不可随时修改---------
    Mirf.cePin = 9;     //设置CE引脚为D9
    Mirf.csnPin = 10;   //设置CE引脚为D10
    Mirf.spi = &MirfHardwareSpi;
    Mirf.init();  //初始化nRF24L01
 
    //---------配置部分,可以随时修改---------
    //设置接收标识符"Rev01"
    Mirf.setRADDR((byte *)"Rec01");
    //设置一次收发的字节数,这里发一个整数,
    //写sizeof(unsigned int),实际等于2字节
    Mirf.payload = sizeof(unsigned int);
    //发送通道,可以填0~128,收发必须一致。
    Mirf.channel = 3;
    Mirf.config();
 
    //注意一个Arduino写Sender.ino,另一个写Receiver.ino。
    //这里用来辨别写入了Receiver.ino程序
    Serial.println("I'm Receiver...");
}
 
void loop()
{
    //定义一个暂存数组,大小为Mirf.payload。
    byte data[Mirf.payload];
    if(Mirf.dataReady())    //等待接收数据准备好
    {
        Mirf.getData(data);    //接收数据到data数组
        //data[1]<左移8位与data[0]并,重组数据。
        adata = (unsigned int)((data[1] << 8) | data[0]);
 if (data <30)
 {
  qian();
 }
        //与上一次结果比较,避免相同结果刷屏,降低串口流量
        if(adata != oldadata)
        {
            oldadata = adata; //本次结果作为历史结果。
            //Serial.print输出数据
            Serial.print("A0=");
            Serial.println(adata);
            //也可以输出双字节数据
            //Serial.write(data[1]);
            //Serial.write(data[0]);
        }
 
    }
}

arduino+通信模块-鸿蒙开发者社区

原文作者:jun_军

分类
已于2020-11-6 15:05:49修改
收藏
回复
举报
回复
    相关推荐