单片机互通调试初步完成

This commit is contained in:
2025-05-27 16:44:45 +08:00
parent 22e1109d81
commit 6aaae06bac
22 changed files with 1678 additions and 129 deletions

View File

@@ -0,0 +1,142 @@
#include "motor_control.h"
#if defined(ESP32)
Servo esp_servo; // 使用 ESP32Servo 库的 Servo 对象
#else
Servo standard_servo; // 使用标准 Servo 库的 Servo 对象
#endif
void motor_setup() {
// --- 电机引脚设置 ---
pinMode(MOTOR_LEFT_IN1_PIN, OUTPUT);
pinMode(MOTOR_LEFT_IN2_PIN, OUTPUT);
pinMode(MOTOR_RIGHT_IN3_PIN, OUTPUT);
pinMode(MOTOR_RIGHT_IN4_PIN, OUTPUT);
#if defined(ESP32)
// 配置 ESP32 LEDC PWM 通道
ledcSetup(PWM_CHANNEL_LEFT, PWM_FREQUENCY, PWM_RESOLUTION);
ledcSetup(PWM_CHANNEL_RIGHT, PWM_FREQUENCY, PWM_RESOLUTION);
// 将 LEDC 通道附加到电机 ENA/ENB 引脚
ledcAttachPin(MOTOR_LEFT_ENA_PIN, PWM_CHANNEL_LEFT);
ledcAttachPin(MOTOR_RIGHT_ENB_PIN, PWM_CHANNEL_RIGHT);
#else
// 对于非ESP32板ENA/ENB引脚通常直接用 analogWrite 控制
pinMode(MOTOR_LEFT_ENA_PIN, OUTPUT);
pinMode(MOTOR_RIGHT_ENB_PIN, OUTPUT);
#endif
motor_stop(); // 初始状态停止电机
Serial.println("电机驱动已初始化。");
// --- 舵机初始化 ---
servo_attach();
servo_center(); // 舵机初始居中
Serial.println("舵机已初始化并居中。");
}
// --- 内部辅助函数设置单个电机速度和方向 ---
void set_motor_speed(char motor_char, int speed, bool forward) {
// speed: 0-255
int actual_speed = constrain(speed, 0, 255);
if (motor_char == 'L') { // 左电机
digitalWrite(MOTOR_LEFT_IN1_PIN, forward ? HIGH : LOW);
digitalWrite(MOTOR_LEFT_IN2_PIN, forward ? LOW : HIGH);
#if defined(ESP32)
ledcWrite(PWM_CHANNEL_LEFT, actual_speed);
#else
analogWrite(MOTOR_LEFT_ENA_PIN, actual_speed);
#endif
} else if (motor_char == 'R') { // 右电机
digitalWrite(MOTOR_RIGHT_IN3_PIN, forward ? HIGH : LOW);
digitalWrite(MOTOR_RIGHT_IN4_PIN, forward ? LOW : HIGH);
#if defined(ESP32)
ledcWrite(PWM_CHANNEL_RIGHT, actual_speed);
#else
analogWrite(MOTOR_RIGHT_ENB_PIN, actual_speed);
#endif
}
}
// --- 公开的电机控制函数 ---
void motor_move_forward(int speed) {
set_motor_speed('L', speed, true);
set_motor_speed('R', speed, true);
Serial.print("电机前进,速度: "); Serial.println(speed);
}
void motor_move_backward(int speed) {
set_motor_speed('L', speed, false);
set_motor_speed('R', speed, false);
Serial.print("电机后退,速度: "); Serial.println(speed);
}
void motor_stop() {
set_motor_speed('L', 0, true); // 速度为0方向无所谓
set_motor_speed('R', 0, true);
Serial.println("电机停止。");
}
void motor_set_raw_speeds(int left_speed, int right_speed) {
bool left_forward = left_speed >= 0;
bool right_forward = right_speed >= 0;
set_motor_speed('L', abs(left_speed), left_forward);
set_motor_speed('R', abs(right_speed), right_forward);
Serial.print("设置原始速度 左:"); Serial.print(left_speed);
Serial.print(" 右:"); Serial.println(right_speed);
}
void motor_turn_left(int speed, float turn_intensity, int steer_angle) {
servo_set_angle(steer_angle);
int outer_speed = speed;
int inner_speed = speed * (1.0 - constrain(turn_intensity, 0.0, 1.0));
motor_set_raw_speeds(inner_speed, outer_speed);
Serial.print("左转: 基础速度="); Serial.print(speed);
Serial.print(", 强度="); Serial.print(turn_intensity);
Serial.print(", 舵机角度="); Serial.println(steer_angle);
}
void motor_turn_right(int speed, float turn_intensity, int steer_angle) {
servo_set_angle(steer_angle);
int outer_speed = speed;
int inner_speed = speed * (1.0 - constrain(turn_intensity, 0.0, 1.0));
motor_set_raw_speeds(outer_speed, inner_speed);
Serial.print("右转: 基础速度="); Serial.print(speed);
Serial.print(", 强度="); Serial.print(turn_intensity);
Serial.print(", 舵机角度="); Serial.println(steer_angle);
}
// --- 舵机控制函数 ---
void servo_attach() {
#if defined(ESP32)
esp_servo.attach(SERVO_PIN);
#else
standard_servo.attach(SERVO_PIN);
#endif
Serial.println("舵机已连接。");
}
void servo_set_angle(int angle) {
int constrained_angle = constrain(angle, 0, 180); // 标准舵机角度范围
#if defined(ESP32)
esp_servo.write(constrained_angle);
#else
standard_servo.write(constrained_angle);
#endif
// Serial.print("舵机角度设置为: "); Serial.println(constrained_angle);
}
void servo_center() {
servo_set_angle(90); // 假设90度是舵机中心位置
Serial.println("舵机已居中 (90度)。");
}
void servo_detach() {
#if defined(ESP32)
esp_servo.detach();
#else
standard_servo.detach();
#endif
Serial.println("舵机已断开连接。");
}