#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("舵机已断开连接。"); }