Arduino使用nRF24L01进行通信(二)

在两个Arduino开发板之间的使用nRF24L01双向通信。

电路原理图:

Arduino使用nRF24L01进行通信(二)


以下是示例所需的组件:

●    NRF24L01收发器模块

●    Arduino开发板

●    操纵杆模块

●    伺服电机

●    按钮

●    LED指示灯


源代码

以下是两个代码,以及对它们的描述。


发射机代码

/*
* Arduino Wireless Communication Tutorial
*     Example 2 - Transmitter Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include 《SPI.h》
#include 《nRF24L01.h》
#include 《RF24.h》
#define led 12
RF24 radio(7, 8); // CE, CSN
const byte addresses[][6] = {"00001", "00002"};
boolean buttonState = 0;
void setup() {
  pinMode(12, OUTPUT);
  radio.begin();
  radio.openWritingPipe(addresses[1]); // 00001
  radio.openReadingPipe(1, addresses[0]); // 00002
  radio.setPALevel(RF24_PA_MIN);
}
void loop() {
  delay(5);
  radio.stopListening();
  int potValue = analogRead(A0);
  int angleValue = map(potValue, 0, 1023, 0, 180);
  radio.write(&angleValue, sizeof(angleValue));
  delay(5);
  radio.startListening();
  while (!radio.available());
  radio.read(&buttonState, sizeof(buttonState));
  if (buttonState == HIGH) {
    digitalWrite(led, HIGH);
  }
  else {
    digitalWrite(led, LOW);
  }
}
接收机代码
/*
* Arduino Wireless Communication Tutorial
*     Example 2 - Receiver Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include 《SPI.h》
#include 《nRF24L01.h》
#include 《RF24.h》
#include 《Servo.h》
#define button 4
RF24 radio(7, 8); // CE, CSN
const byte addresses[][6] = {"00001", "00002"};
Servo myServo;
boolean buttonState = 0;
void setup() {
  pinMode(button, INPUT);
  myServo.attach(5);
  radio.begin();
  radio.openWritingPipe(addresses[0]); // 00002
  radio.openReadingPipe(1, addresses[1]); // 00001
  radio.setPALevel(RF24_PA_MIN);
}
void loop() {
  delay(5);
  radio.startListening();
  if ( radio.available()) {
    while (radio.available()) {
      int angleV = 0;
      radio.read(&angleV, sizeof(angleV));
      myServo.write(angleV);
    }
    delay(5);
    radio.stopListening();
    buttonState = digitalRead(button);
    radio.write(&buttonState, sizeof(buttonState));
  }
}
与前一个示例的不同之处在于,我们需要为双向通信创建两个管道或地址。
const byte addresses[][6] = {"00001", "00002"};

在setup函数部分我们需要定义两个管道,并注意第一个Arduino的写地址需要是第二个Arduino的读地址,反之亦然,第一个Arduino的读地址需要是写地址。第二个Arduino。
// at the Transmitter
radio.openWritingPipe(addresses[1]); // 00001
radio.openReadingPipe(1, addresses[0]); // 00002

在loop函数中,使用radio.stopListening()函数,我们将第一个Arduino设置为发送器,读取并将操纵杆的值从0映射到180,并使用radio.write()函数将数据发送到接收器。
radio.stopListening();
int potValue = analogRead(A0);
int angleValue = map(potValue, 0, 1023, 0, 180);
radio.write(&angleValue, sizeof(angleValue));
另一方面,使用radio.startListening()函数,我们将第二个Arduino设置为接收器,并检查是否有可用数据。当有数据可用时,我们将读取它,将其保存到“angleV”变量,然后使用该值旋转伺服电机。
radio.startListening();
  if ( radio.available()) {
    while (radio.available()) {
      int angleV = 0;
      radio.read(&angleV, sizeof(angleV));
      myServo.write(angleV);
    }
接下来,在发送器中,我们将第一个Arduino开发板设置为接收器,并使用空的“while”循环,我们等待第二个Arduino开发板发送数据,数据表示按钮状态是否被按下。如果按下按钮,LED将点亮。这些过程不断重复,并且两个Arduino开发板都不断发送和接收数据。 

原文https://www.yiboard.com/thread-994-1-1.html

- 本文来自网络,如有侵权,请联系本站处理。

2022-06   阅读(875)   评论(0)
 标签: maker Arduino 通信

涨知识
I2C

I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。

评论:
相关文章

ESP32 使用DAC模拟输出完成两路呼吸灯

ESP32的DAC函数可以实现真正的模拟输出。


在 ESP32 上使用 LEDC (PWM)

ESP32 没有Arduino输出 PWM 的 analogWrite(pin, value) 方法,取而代之的 ESP32 有一个 LEDC 来实现PWM功能。


Arduino UNO R4 WiFi 官方介绍文档

本文档作为UNO R4 WiFi的技术概览,您将找到一系列资源和指南链接,帮助您开始下一个项目。


OneButton: 用于使用单个按钮进行多用途输入的Arduino库

Arduino OneButton库是一个用于简化按钮操作的库,它可以轻松地处理按钮的单击、双击和长按等操作。适用于Arduino开发板以及ESP32等其他基于Arduino的开发板。

搜索
小鹏STEM教研服务

专属教研服务系统,助您构建STEM课程体系,打造一站式教学环境。