Files
mqtt_power/esp32_robot_firmware/motor_control.cpp

142 lines
4.6 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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