Arduino 遥控机器人项目 - 使用手柄控制和断电功能
#include <Servo.h> #include <SPI.h> #include <Adafruit_GFX.h> #include <Max72xxPanel.h>
Max72xxPanel myMatrix = Max72xxPanel(9,1,1);
Servo myservo1; Servo myservo2; Servo myservo3; Servo myservo4; int pos1 = 0; int i = 0; #define digital_IO 8 int val; int analog_IO = 0;
bool powerOn = true; // 添加开关
void setup() { pinMode(8, OUTPUT); pinMode(13, OUTPUT); pinMode(0, OUTPUT); DDRC |= 0X01; myservo1.attach(3); myservo2.attach(6); myservo3.attach(9); myservo4.attach(10); Serial.begin(9600); }
void loop() { if (powerOn) { // 开关打开时才运行程序 // 读取手柄发送的值 int verticalAxisValue = analogRead(A1); int horizontalAxisValue = analogRead(A2); // 将读取到的值映射到机器人的运动参数上 int verticalSpeed = map(verticalAxisValue, 0, 1023, -255, 255); int horizontalSpeed = map(horizontalAxisValue, 0, 1023, -255, 255); // 防止摇杆被误触,将摇杆在中间值附近的数值设置为0 if (abs(verticalSpeed) < 20) { verticalSpeed = 0; } if (abs(horizontalSpeed) < 20) { horizontalSpeed = 0; } // 控制机器人的运动,使用 PWM 控制电机的速度 analogWrite(3, abs(verticalSpeed)); analogWrite(11, abs(horizontalSpeed)); // 根据摇杆的方向控制机器人的运动方向 if (verticalSpeed > 0) { digitalWrite(6, LOW); digitalWrite(9, HIGH); } else if (verticalSpeed < 0) { digitalWrite(6, HIGH); digitalWrite(9, LOW); } else { digitalWrite(6, LOW); digitalWrite(9, LOW); } if (horizontalSpeed > 0) { digitalWrite(10, LOW); } else if (horizontalSpeed < 0) { digitalWrite(10, HIGH); } else { digitalWrite(10, LOW); }
if (Serial.available()) {
// 读取 8 个字节
byte data[8];
for (int i = 0; i < 8; i++) {
data[i] = Serial.read();
}
int R1int = data[2];
int R2int = data[3];
int L1int = data[4];
int L2int = data[5];
int keyint = data[6];
int SUM = data[7];
Serial.print('R1int: ');
Serial.println(R1int);
Serial.print('R2int: ');
Serial.println(R2int);
Serial.print('L1int: ');
Serial.println(L1int);
Serial.print('L2int: ');
Serial.println(L2int);
Serial.print('keyint: ');
Serial.println(keyint);
Serial.print('SUM: ');
myservo3.write(R1int);
myservo4.write(R2int);
myMatrix.setCursor(0, 0);
myMatrix.print('6');
myMatrix.write();
}
// 等待一段时间,以避免过于频繁地发送数据
delay(50);
// 清空串口缓冲区
while (Serial.available()) {
Serial.read();
}
} else { // 开关关闭时停止机器人运动并关闭所有舵机 analogWrite(3, 0); analogWrite(11, 0); digitalWrite(6, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); myservo1.write(90); myservo2.write(90); myservo3.write(90); myservo4.write(90); }
// 读取开关状态 val = digitalRead(digital_IO); if (val == HIGH) { powerOn = true; } else { powerOn = false; } }
原文地址: https://www.cveoy.top/t/topic/n7MD 著作权归作者所有。请勿转载和采集!