求助各位大佬帮我解释一下代码,有偿
2024-03-234261
AI 快速预览详细
本项目教程介绍了如何使用 nRF24L01 无线通信模块与 Arduino 控制电机和舵机。硬件清单包括 nRF24L01 模块、Arduino 控制板、电机和舵机。最终效果是通过无线信号控制电机速度和舵机角度。难度等级适中,适合初学者和教育场景,如 STEM 教育和机器人社团。
|
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Servo.h> Servo myServo; int In1 = 2; int In2 = 3; int ENA = 5; int In3 = 4; int In4 = 7; int ENB = 6; RF24 radio(8,9); const byte address[6] = "00001"; char receivedData[32] = ""; int LXJ, LYJ, RYJ; int motorSpeedA, motorSpeedB = 0, diff = 0; void setup() { myServo.attach(10); pinMode(In1, OUTPUT); pinMode(In2, OUTPUT); pinMode(ENA, OUTPUT); pinMode(In3, OUTPUT); pinMode(In4, OUTPUT); pinMode(ENB, OUTPUT); Serial.begin(9600); radio.begin(); radio.openReadingPipe(0, address); radio.setPALevel(RF24_PA_MIN); radio.startListening(); } void loop() { if (radio.available()){ radio.read(&receivedData, sizeof(receivedData)); LXJ = atoi(&receivedData[0]); delay(10); radio.read(&receivedData, sizeof(receivedData)); LYJ = atoi(&receivedData[0]); delay(10); radio.read(&receivedData, sizeof(receivedData)); RYJ = atoi(&receivedData[0]); delay(10); } int angelV = map(RYJ, 0, 1023, 5, 170); myServo.write(angelV); if (LXJ < 470) { digitalWrite(In1, HIGH); digitalWrite(In2, LOW); digitalWrite(In3, LOW); digitalWrite(In4, HIGH); motorSpeedA = motorSpeedB = map(LXJ, 470, 0, 0, 255); } else if (LXJ > 550) { digitalWrite(In1, LOW); digitalWrite(In2, HIGH); digitalWrite(In3, HIGH); digitalWrite(In4, LOW); motorSpeedA = motorSpeedB = map(LXJ, 550, 1023, 0, 255); } else { motorSpeedA = motorSpeedB = diff = 0; } if (LYJ < 470) { diff = map(LYJ, 470, 0, 0, 255); motorSpeedA = motorSpeedA + diff; motorSpeedB = motorSpeedB - diff; if (motorSpeedA > 255) { motorSpeedA = 180; } if (motorSpeedB < 0) { motorSpeedB = 0; } } //Make Tank turn Left by differential if (LYJ > 550) { diff = map(LYJ, 550, 1023, 0, 255); motorSpeedB = motorSpeedB + diff; motorSpeedA = motorSpeedA - diff; if (motorSpeedB > 255) { motorSpeedB = 180; } if (motorSpeedA < 0) { motorSpeedA = 0; } } //Make Tank turn Right on its own center if (LYJ < 470 && 470 < LXJ && LXJ < 550) { digitalWrite(In1, HIGH); digitalWrite(In2, LOW); digitalWrite(In3, HIGH); digitalWrite(In4, LOW); motorSpeedA = motorSpeedB = map(LYJ, 470, 0, 0, 255); } //Make Tank turn Left on its own center if (LYJ > 550 && 470 < LXJ && LXJ < 550) { digitalWrite(In1, LOW); digitalWrite(In2, HIGH); digitalWrite(In3, LOW); digitalWrite(In4, HIGH); motorSpeedA = motorSpeedB = map(LYJ, 550, 1023, 0, 255); } if (motorSpeedA < 140) { motorSpeedA = 0; } if (motorSpeedB < 140) { motorSpeedB = 0; } analogWrite(ENA, motorSpeedA); analogWrite(ENB, motorSpeedB); Serial.print("LXJ: "); Serial.print(LXJ); Serial.print(" | LYJ: "); Serial.print(LYJ); Serial.print(" | RYJ: "); Serial.print(RYJ); Serial.print(" || motorSpeedA: "); Serial.print(motorSpeedA); Serial.print(" | motorSpeedB: "); Serial.print(motorSpeedB); Serial.print(" | diff: "); Serial.println(diff); } |
-
-
20.88 KB, 下载次数: 5272




#include
#include
#include
// 定义舵机对象和引脚
Servo myServo;
int In1 = 2;
int In2 = 3;
int ENA = 5;
int In3 = 4;
int In4 = 7;
int ENB = 6;
// 定义无线模块对象和地址
RF24 radio(8,9);
const byte address[6] = "00001";
// 定义接收数据的缓冲区和变量
char receivedData[32] = "";
int LXJ, LYJ, RYJ;
int motorSpeedA, motorSpeedB = 0, diff = 0;
void setup() {
// 初始化舵机、引脚和无线模块
myServo.attach(10);
pinMode(In1, OUTPUT);
pinMode(In2, OUTPUT);
pinMode(ENA, OUTPUT);
pinMode(In3, OUTPUT);
pinMode(In4, OUTPUT);
pinMode(ENB, OUTPUT);
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, address);
radio.setPALevel(RF24_PA_MIN);
radio.startListening();
}
void loop() {
// 检查是否有无线信号接收到
if (radio.available()){
// 读取接收到的数据并解析
radio.read(&receivedData, sizeof(receivedData));
LXJ = atoi(&receivedData[0]);
delay(10);
radio.read(&receivedData, sizeof(receivedData));
LYJ = atoi(&receivedData[0]);
delay(10);
radio.read(&receivedData, sizeof(receivedData));
RYJ = atoi(&receivedData[0]);
delay(10);
}
// 根据接收到的数据控制舵机的角度
int angelV = map(RYJ, 0, 1023, 5, 170);
myServo.write(angelV);
// 根据接收到的数据控制电机的速度和方向
if (LXJ < 470) {
digitalWrite(In1, HIGH);
digitalWrite(In2, LOW);
digitalWrite(In3, LOW);
digitalWrite(In4, HIGH);
motorSpeedA = motorSpeedB = map(LXJ, 470, 0, 0, 255);
} else if (LXJ > 550) {
digitalWrite(In1, LOW);
digitalWrite(In2, HIGH);
digitalWrite(In3, HIGH);
digitalWrite(In4, LOW);
motorSpeedA = motorSpeedB = map(LXJ, 550, 1023, 0, 255);
} else {
motorSpeedA = motorSpeedB = diff = 0;
}
// 根据接收到的数据调整电机速度的差异
if (LYJ < 470) {
diff = map(LYJ, 470, 0, 0, 255);
motorSpeedA = motorSpeedA + diff;
motorSpeedB = motorSpeedB - diff;
if (motorSpeedA > 255) {
motorSpeedA = 180;
}
if (motorSpeedB < 0) {
motorSpeedB = 0;
}
} else if (LYJ > 550) {
diff = map(LYJ, 550, 1023, 0, 255);
motorSpeedB = motorSpeedB + diff;
motorSpeedA = motorSpeedA - diff;
if (motorSpeedB > 255) {
motorSpeedB = 180;
}
if (motorSpeedA < 0) {
motorSpeedA = 0;
}
}
// 根据接收到的数据控制坦克的转向
if (LYJ < 470 && 470 < LXJ && LXJ < 550) {
digitalWrite(In1, HIGH);
digitalWrite(In2, LOW);
digitalWrite(In3, HIGH);
digitalWrite(In4, LOW);
motorSpeedA = motorSpeedB = map(LYJ, 470, 0, 0, 255);
} else if (LYJ > 550 && 470 < LXJ && LXJ < 550) {
digitalWrite(In1, LOW);
digitalWrite(In2, HIGH);
digitalWrite(In3, LOW);
digitalWrite(In4, HIGH);
motorSpeedA = motorSpeedB = map(LYJ, 550, 1023, 0, 255);
}
if (motorSpeedA < 140) {
motorSpeedA = 0;
}
if (motorSpeedB < 140) {
motorSpeedB = 0;
}
// 控制电机的速度和方向
analogWrite(ENA, motorSpeedA);
analogWrite(ENB, motorSpeedB);
// 通过串口输出接收到的数据和电机速度等信息
Serial.print("LXJ: ");
Serial.print(LXJ);
Serial.print(" | LYJ: ");
Serial.print(LYJ);
Serial.print(" | RYJ: ");
Serial.print(RYJ);
Serial.print(" || motorSpeedA: ");
Serial.print(motorSpeedA);
Serial.print(" | motorSpeedB: ");
Serial.print(motorSpeedB);
Serial.print(" | diff: ");
Serial.println(diff);
}
[/code]