feat: add dual BTS7960 motor driver support

- Refactor MotorController to parameterized class with MotorPins struct
- Add motor1 and motor2 instances with shared enable pins (GPIO 14, 27)
- Motor 2 uses GPIO 32/33 for PWM, GPIO 36/39 for current sense
- Update web UI with side-by-side dual motor control panels
- Add per-motor API endpoints (/motor1/*, /motor2/*)
- Add emergency stop button for both motors
- Legacy endpoints map to motor1 for backwards compatibility
- Update readme and AGENTS.md documentation
This commit is contained in:
devdesk
2026-02-06 15:05:13 +02:00
parent 252f0e1ec2
commit f157d3abc5
8 changed files with 608 additions and 230 deletions

View File

@@ -4,10 +4,16 @@
#include "motor.h"
#include "webserver.h"
// Called when motor stall is detected
void onMotorStall() {
Serial.println("Stall callback triggered - stopping motor!");
motor.stop();
// Called when motor 1 stall is detected
void onMotor1Stall() {
Serial.println("Motor1 stall callback triggered - stopping motor!");
motor1.stop();
}
// Called when motor 2 stall is detected
void onMotor2Stall() {
Serial.println("Motor2 stall callback triggered - stopping motor!");
motor2.stop();
}
void setupWiFi() {
@@ -44,13 +50,16 @@ void setup() {
delay(1000);
Serial.println("\n=============================");
Serial.println(" BTS7960 Motor Controller");
Serial.println(" Simple Stall Detection");
Serial.println(" Dual BTS7960 Motor Controller");
Serial.println(" Differential Drive Robot");
Serial.println("=============================\n");
// Initialize motor controller
motor.begin();
motor.setStallCallback(onMotorStall);
// Initialize motor controllers
motor1.begin();
motor1.setStallCallback(onMotor1Stall);
motor2.begin();
motor2.setStallCallback(onMotor2Stall);
// Connect to WiFi
setupWiFi();
@@ -65,6 +74,7 @@ void setup() {
void loop() {
handleWebServer();
motor.update(); // Update current sensing and logging
motor1.update(); // Update current sensing and logging for motor 1
motor2.update(); // Update current sensing and logging for motor 2
delay(1);
}