From 9be415302d74445f1ed71913a8e011139a8e2216 Mon Sep 17 00:00:00 2001 From: mwood77 <43637076+mwood77@users.noreply.github.com> Date: Tue, 15 Oct 2024 12:30:56 +0200 Subject: [PATCH] basic stepper motor control w/ TMC2209 --- platformio.ini | 4 +- src/platformio/osww-server/src/main.cpp | 20 +++++-- .../osww-server/src/utils/MotorControl.cpp | 53 +++++++++++++++++-- 3 files changed, 68 insertions(+), 9 deletions(-) diff --git a/platformio.ini b/platformio.ini index 9772eeb..d3e4f94 100644 --- a/platformio.ini +++ b/platformio.ini @@ -21,8 +21,9 @@ build_src_filter = +<*> -<./angular/> board_build.filesystem = littlefs check_tool = cppcheck, clangtidy build_flags = - -D OLED_ENABLED=false + -D OLED_ENABLED=true -D PWM_MOTOR_CONTROL=false + -D STEPPER_MOTOR_CONTROL=true -D HOME_ASSISTANT_ENABLED=false check_flags = clangtidy: -fix-errors,--format-style=google @@ -36,3 +37,4 @@ lib_deps = adafruit/Adafruit SSD1306@^2.5.9 electromagus/ESPMX1508@^1.0.5 dawidchyrzynski/home-assistant-integration@^2.1.0 + janelia-arduino/TMC2209@^9.4.2 diff --git a/src/platformio/osww-server/src/main.cpp b/src/platformio/osww-server/src/main.cpp index 528577a..8946eb0 100644 --- a/src/platformio/osww-server/src/main.cpp +++ b/src/platformio/osww-server/src/main.cpp @@ -94,11 +94,19 @@ AsyncWebServer server(80); HTTPClient http; WiFiClient client; ESP32Time rtc; -String winderooVersion = "3.0.0"; +String winderooVersion = "3.1.0"; -#if PWM_MOTOR_CONTROL +#if PWM_MOTOR_CONTROL && STEPPER_MOTOR_CONTROL + #error "You can only have one optional motor control method enabled at a time. You must disable either PWM_MOTOR_CONTROL or STEPPER_MOTOR_CONTROL in the platformio.ini file." +#endif + +// PWM control +#if PWM_MOTOR_CONTROL && !STEPPER_MOTOR_CONTROL MotorControl motor(directionalPinA, directionalPinB, true); -#else +#endif + +// Stepper motor control || Regular DC motor control +#if STEPPER_MOTOR_CONTROL && !PWM_MOTOR_CONTROL || !STEPPER_MOTOR_CONTROL && !WM_MOTOR_CONTROL MotorControl motor(directionalPinA, directionalPinB); #endif @@ -1184,6 +1192,11 @@ void setup() display.invertDisplay(OLED_INVERT_SCREEN); display.setRotation(rotate); drawNotification("Winderoo"); + + + String savedNetworkMessage[2] = {"Winderoo build", "v" + winderooVersion}; + drawMultiLineText(savedNetworkMessage); + delay(1200); } String savedNetworkMessage[2] = {"Connecting to", "saved network..."}; @@ -1302,6 +1315,7 @@ void setup() drawNotification("Starting webserver..."); startWebserver(); + delay(750); // delay to show notification if (strcmp(userDefinedSettings.status.c_str(), "Winding") == 0) { diff --git a/src/platformio/osww-server/src/utils/MotorControl.cpp b/src/platformio/osww-server/src/utils/MotorControl.cpp index 896f503..4765ee7 100644 --- a/src/platformio/osww-server/src/utils/MotorControl.cpp +++ b/src/platformio/osww-server/src/utils/MotorControl.cpp @@ -7,12 +7,44 @@ int motorSpeed = 145; #endif +#if STEPPER_MOTOR_CONTROL + #include + + // Instantiate TMC2209 + TMC2209 stepper_driver; + HardwareSerial & serial_stream = Serial1; + + const int RX_PIN = 5; + const int TX_PIN = 26; + const uint8_t HARDWARE_ENABLE_PIN = 4; + + const long SERIAL_BAUD_RATE = 115200; + const int32_t RUN_VELOCITY = 20000; + const int32_t STOP_VELOCITY = 0; + + + // current values may need to be reduced to prevent overheating depending on + // specific motor and power supply voltage + const uint8_t RUN_CURRENT_PERCENT = 100; + +#endif + MotorControl::MotorControl(int pinA, int pinB, bool pwmMotorControl) { + #if STEPPER_MOTOR_CONTROL + stepper_driver.setup(serial_stream, SERIAL_BAUD_RATE, TMC2209::SERIAL_ADDRESS_0, RX_PIN, TX_PIN); + stepper_driver.setHardwareEnablePin(HARDWARE_ENABLE_PIN); + stepper_driver.setRunCurrent(RUN_CURRENT_PERCENT); + stepper_driver.enableCoolStep(); + stepper_driver.enable(); + + _motorDirection = 0; + #else _pinA = pinA; _pinB = pinB; _motorDirection = 0; _pwmMotorControl = pwmMotorControl; + #endif } void MotorControl::clockwise() @@ -20,6 +52,8 @@ void MotorControl::clockwise() #if PWM_MOTOR_CONTROL MX1508 pwmControl(_pinA, _pinB, CH1, CH2); pwmControl.motorGo(motorSpeed); + #elif STEPPER_MOTOR_CONTROL + stepper_driver.moveAtVelocity(RUN_VELOCITY); #else digitalWrite(_pinA, HIGH); digitalWrite(_pinB, LOW); @@ -32,6 +66,8 @@ void MotorControl::countClockwise() #if PWM_MOTOR_CONTROL MX1508 pwmControl(_pinA, _pinB, CH1, CH2); pwmControl.motorRev(motorSpeed); + #elif STEPPER_MOTOR_CONTROL + stepper_driver.moveAtVelocity(RUN_VELOCITY); #else digitalWrite(_pinA, LOW); digitalWrite(_pinB, HIGH); @@ -44,6 +80,8 @@ void MotorControl::stop() #if PWM_MOTOR_CONTROL MX1508 pwmControl(_pinA, _pinB, CH1, CH2); pwmControl.motorBrake(); + #elif STEPPER_MOTOR_CONTROL + stepper_driver.moveAtVelocity(STOP_VELOCITY); #else digitalWrite(_pinA, LOW); digitalWrite(_pinB, LOW); @@ -53,16 +91,21 @@ void MotorControl::stop() void MotorControl::determineMotorDirectionAndBegin() { - // @todo - investigate if this is still needed - // stop(); - if (_motorDirection) { - clockwise(); + #if STEPPER_MOTOR_CONTROL + stepper_driver.disableInverseMotorDirection(); + #else + clockwise(); + #endif } else { - countClockwise(); + #if STEPPER_MOTOR_CONTROL + stepper_driver.enableInverseMotorDirection(); + #else + countClockwise(); + #endif } }