From e5162629046f7471bb46e8ea0b704623f99efebb Mon Sep 17 00:00:00 2001 From: Tim Leuschner Date: Sat, 7 Sep 2019 21:37:01 +0200 Subject: [PATCH] ..to be tested --- lib/A4988_Stepper/src/A4988_Stepper.cpp | 3 +- platformio.ini | 2 +- sonoff/i18n.h | 5 +- sonoff/my_user_config.h | 2 +- sonoff/support_features.ino | 2 +- sonoff/xdrv_25_A4988_Stepper.ino | 185 ++---------------------- 6 files changed, 21 insertions(+), 178 deletions(-) diff --git a/lib/A4988_Stepper/src/A4988_Stepper.cpp b/lib/A4988_Stepper/src/A4988_Stepper.cpp index 52e8e8860..d44375396 100644 --- a/lib/A4988_Stepper/src/A4988_Stepper.cpp +++ b/lib/A4988_Stepper/src/A4988_Stepper.cpp @@ -17,7 +17,6 @@ #include "Arduino.h" #include "A4988_Stepper.h" -#include A4988_Stepper::A4988_Stepper( int m_spr , int m_rpm , short m_mis @@ -27,7 +26,7 @@ A4988_Stepper::A4988_Stepper( int m_spr , short m_ms1_pin , short m_ms2_pin , short m_ms3_pin ) { - last_time = 0; // time stamp in us of the last step taken + last_time = 0; // time stamp in us of the last step taken motor_SPR = m_spr; // StepsPerRevolution motor_RPM = m_rpm; // RoundsPerMinute motor_MIS = m_mis; // Microsteps w/o effect if MS1-MS3 not connected - then full steps anyway diff --git a/platformio.ini b/platformio.ini index d19018416..f4d99c7ef 100755 --- a/platformio.ini +++ b/platformio.ini @@ -25,7 +25,7 @@ build_dir = .pioenvs ;default_envs = sonoff-BR ;default_envs = sonoff-CN ;default_envs = sonoff-CZ -;default_envs = sonoff-DE +default_envs = sonoff-DE ;default_envs = sonoff-ES ;default_envs = sonoff-FR ;default_envs = sonoff-GR diff --git a/sonoff/i18n.h b/sonoff/i18n.h index 6b6f219f9..70132f06a 100644 --- a/sonoff/i18n.h +++ b/sonoff/i18n.h @@ -457,7 +457,7 @@ #define D_JSON_ZIGBEEZCLRECEIVED "ZigbeeZCLReceived" #define D_JSON_ZIGBEEZCLSENT "ZigbeeZCLSent" - // Commands xdrv_98_A4988.ino + // Commands xdrv_25_A4988_Stepper.ino #ifdef USE_A4988_Stepper #define D_CMND_MOTOR "MOTOR" #define D_JSON_MOTOR_COMMAND "Command" @@ -465,6 +465,9 @@ #define D_JSON_MOTOR_MOVE "doMove" #define D_JSON_MOTOR_ROTATE "doRotate" #define D_JSON_MOTOR_TURN "doTurn" + #define D_JSON_MOTOR_SPR "setSPR" + #define D_JSON_MOTOR_RPM "setRPM" + #define D_JSON_MOTOR_MIS "setMIS" #endif /********************************************************************************************/ diff --git a/sonoff/my_user_config.h b/sonoff/my_user_config.h index cad9c64bb..1d63e842c 100644 --- a/sonoff/my_user_config.h +++ b/sonoff/my_user_config.h @@ -527,7 +527,7 @@ #define USE_SM16716 // Add support for SM16716 RGB LED controller (+0k7 code) //#define USE_HRE // Add support for Badger HR-E Water Meter (+1k4 code) -#define USE_A4988_Stepper // Add support for A4988 Stepper-Motors-Driver-circuit +#define USE_A4988_Stepper // Add support for A4988 Stepper-Motors-Driver-circuit (+12k7 code) /*********************************************************************************************\ * Debug features diff --git a/sonoff/support_features.ino b/sonoff/support_features.ino index d788473ef..94019ce3d 100644 --- a/sonoff/support_features.ino +++ b/sonoff/support_features.ino @@ -439,7 +439,7 @@ void GetFeatures(void) feature5 |= 0x00000004; // xsns_52_ibeacon.ino #endif #ifdef USE_A4988_Stepper - feature5 |= 0x00000008; // xdrv_98_A4988.ino + feature5 |= 0x00000008; // xdrv_25_A4988.ino #endif // feature5 |= 0x00000010; diff --git a/sonoff/xdrv_25_A4988_Stepper.ino b/sonoff/xdrv_25_A4988_Stepper.ino index 0a2782d1a..e1d6903bf 100644 --- a/sonoff/xdrv_25_A4988_Stepper.ino +++ b/sonoff/xdrv_25_A4988_Stepper.ino @@ -20,13 +20,7 @@ #ifdef USE_A4988_Stepper #include -/*********************************************************************************************\ - * Stepper mötör on driver A4988 - * - * - https://www.dfrobot.com/wiki/index.php/Weather-proof_Ultrasonic_Sensor_SKU_:_SEN0207 -\*********************************************************************************************/ - -#define XDRV_98 98 +#define XDRV_25 25 enum A4988Errors { A4988_NO_ERROR, A4988_NO_JSON_COMMAND, A4988_INVALID_JSON}; @@ -63,25 +57,12 @@ void A4988Init(void) , A4988_ms1_pin , A4988_ms2_pin , A4988_ms3_pin ); - A4988_spr = myA4988->getSPR(); - A4988_rpm = myA4988->getRPM(); - A4988_mis = myA4988->getMIS(); - if ((A4988_ms1_pin < 99)&&(A4988_ms2_pin < 99)&&(A4988_ms3_pin < 99)&&(A4988_ena_pin<99)) { - AddLog_P2(LOG_LEVEL_INFO, PSTR("STP: A4988-Driver initialized (%dSPR, %dRPM,%dMIS). Pins: Dir[%d] Stp[%d] Ena[%d] MS1[%d] MS2[%d] MS3[%d]"),A4988_spr, A4988_rpm, A4988_mis, A4988_dir_pin,A4988_stp_pin,A4988_ena_pin,A4988_ms1_pin,A4988_ms2_pin,A4988_ms3_pin); - } else { - if ((A4988_ena_pin<99)) { - AddLog_P2(LOG_LEVEL_INFO, PSTR("STP: A4988-Driver initialized (%dSPR, %dRPM,%dMIS). Pins: Dir[%d] Stp[%d] Ena[%d] MicroStepping hardwired"),A4988_spr, A4988_rpm, A4988_mis, A4988_dir_pin,A4988_stp_pin,A4988_ena_pin); - } else { - AddLog_P2(LOG_LEVEL_INFO, PSTR("STP: A4988-Driver initialized (%dSPR, %dRPM,%dMIS). Pins: Dir[%d] Stp[%d] motor permanently on, MicroStepping hardwired"),A4988_spr, A4988_rpm, A4988_mis, A4988_dir_pin,A4988_stp_pin,A4988_ena_pin); - } - } } const char kA4988Commands[] PROGMEM = "MOTOR|" - "doMove|doRotate|doTurn|setSPR|setRPM|setMIC|getSPR|getRPM|getMIC|doVader"; - -void (* const A4988Command[])(void) PROGMEM = { &CmndMOTOR, &CmndDoMove, &CmndDoRotate, &CmndDoTurn, &CmndSetSPR, &CmndSetRPM, &CmndSetMIS , &CmndGetSPR, &CmndGetRPM, &CmndGetMIS, &CmndDoVader }; + "doMove|doRotate|doTurn|setSPR|setRPM|setMIS"; +void (* const A4988Command[])(void) PROGMEM = { &CmndMOTOR}; uint32_t MOTORCmndJson(void) { @@ -96,22 +77,27 @@ uint32_t MOTORCmndJson(void) DynamicJsonBuffer jsonBuf; JsonObject &json = jsonBuf.parseObject(dataBufUc); if (!json.success()) { return A4988_INVALID_JSON; } - if (json.containsKey(D_JSON_MOTOR_MOVE )){ long stepsPlease = 50; stepsPlease = strtoul(json[D_JSON_MOTOR_MOVE],nullptr,10); - AddLog_P2(LOG_LEVEL_INFO, PSTR("A4988: Moving %d steps"), stepsPlease); myA4988->doMove(stepsPlease); } else if (json.containsKey(D_JSON_MOTOR_ROTATE )){ long degrsPlease = 45; degrsPlease = strtoul(json[D_JSON_MOTOR_ROTATE],nullptr,10); - AddLog_P2(LOG_LEVEL_INFO, PSTR("A4988: Rotating %d degrs"), degrsPlease); myA4988->doRotate(degrsPlease); } else if (json.containsKey(D_JSON_MOTOR_TURN )){ float turnsPlease = 0.25; turnsPlease = strtod(json[D_JSON_MOTOR_TURN],nullptr); - AddLog_P2(LOG_LEVEL_DEBUG, PSTR("A4988: Turning %d times"), turnsPlease); myA4988->doTurn(turnsPlease); + } else if (json.containsKey(D_JSON_MOTOR_SPR )){ + int howManySteps =strtoul(json[D_JSON_MOTOR_SPR],nullptr,10); + myA4988->setSPR(howManySteps); + } else if (json.containsKey(D_JSON_MOTOR_RPM )){ + int howManyRounds =strtoul(json[D_JSON_MOTOR_RPM],nullptr,10); + myA4988->setRPM(howManyRounds); + } else if (json.containsKey(D_JSON_MOTOR_MIS )){ + short oneToSixteen =strtoul(json[D_JSON_MOTOR_MIS],nullptr,10); + myA4988->setMIS(oneToSixteen); } else return A4988_NO_JSON_COMMAND; return A4988_NO_ERROR; } @@ -139,157 +125,12 @@ void A4988CmndResponse(uint32_t error){ } -void CmndGetSPR(void) { - AddLog_P2(LOG_LEVEL_INFO, PSTR("A4988: SPR = %d steps"), myA4988->getSPR()); -} - -void CmndGetRPM(void) { - AddLog_P2(LOG_LEVEL_INFO, PSTR("A4988: RPM = %d rounds"), myA4988->getRPM()); -} - -void CmndGetMIS(void) { - AddLog_P2(LOG_LEVEL_INFO, PSTR("A4988: MIS = %d steps"), myA4988->getMIS()); -} - -void CmndDoMove(void) -{ - if (XdrvMailbox.data_len > 0) { - long stepsPlease = 1; - stepsPlease = strtoul(XdrvMailbox.data,nullptr,10); - AddLog_P2(LOG_LEVEL_INFO, PSTR("A4988: Moving %d steps"), stepsPlease); - myA4988->doMove(stepsPlease); - } else { - AddLog_P2(LOG_LEVEL_INFO, PSTR("A4988: Moving 25 steps")); - myA4988->doMove(25); - } - ResponseCmndDone(); -} - -void CmndDoRotate(void) -{ - if (XdrvMailbox.data_len > 0) { - long degrsPlease = 1; - degrsPlease = strtoul(XdrvMailbox.data,nullptr,10); - AddLog_P2(LOG_LEVEL_INFO, PSTR("A4988: Rotating %d degrs"), degrsPlease); - myA4988->doRotate(degrsPlease); - } else { - AddLog_P2(LOG_LEVEL_INFO, PSTR("A4988: Moving 45 degrs")); - myA4988->doRotate(45); - } - ResponseCmndDone(); -} - -void CmndDoTurn(void) -{ - if (XdrvMailbox.data_len > 0) { - float turnsPlease = 0; - turnsPlease = strtod(XdrvMailbox.data,nullptr); - AddLog_P2(LOG_LEVEL_DEBUG, PSTR("A4988: Turning %d times"), turnsPlease); - myA4988->doTurn(turnsPlease); - } else { - AddLog_P2(LOG_LEVEL_DEBUG, PSTR("A4988: Turning 0.25 times")); - myA4988->doRotate(0.25); - } - ResponseCmndDone(); -} - -void CmndSetRPM(void) -{ - short rpmPlease = 60; - if (XdrvMailbox.data_len > 0) { - rpmPlease = strtoul(XdrvMailbox.data,nullptr,10); - } - AddLog_P2(LOG_LEVEL_DEBUG, PSTR("A4988: RPM set to %d"), rpmPlease); - myA4988->setRPM(rpmPlease); - ResponseCmndDone(); -} - -void CmndSetSPR(void) -{ - int sprPlease = 200; - if (XdrvMailbox.data_len > 0) { - sprPlease = strtoul(XdrvMailbox.data,nullptr,10); - } - AddLog_P2(LOG_LEVEL_DEBUG, PSTR("A4988: SPR set to %d"), sprPlease); - myA4988->setSPR(sprPlease); - ResponseCmndDone(); -} - -void CmndSetMIS(void) -{ - if ((pin[GPIO_A4988_MS1] < 99) && (pin[GPIO_A4988_MS2] < 99) && (pin[GPIO_A4988_MS3] < 99)) { - short misPlease = 1; - if (XdrvMailbox.data_len > 0) { - misPlease = strtoul(XdrvMailbox.data,nullptr,10); - AddLog_P2(LOG_LEVEL_DEBUG, PSTR("A4988: Microsteps set to %d"), misPlease); - myA4988->setMIS(misPlease); - } - } else { - AddLog_P2(LOG_LEVEL_DEBUG, PSTR("A4988: Microsteps constant = 1. You'll have to define GPIO's for MS1-MS3 and connect them to A4988 or hardwire A4988 itself")); - } - ResponseCmndDone(); -} - -void CmndDoVader(void){ - myA4988->enable(); - myA4988->setRPM(25); myA4988->doMove( 30); delay(5); - myA4988->setRPM(25); myA4988->doMove(-30); delay(5); - myA4988->setRPM(25); myA4988->doMove( 30); delay(5); - myA4988->setRPM(20); myA4988->doMove(-25); delay(5); - myA4988->setRPM(30); myA4988->doMove( 20); delay(5); - myA4988->setRPM(25); myA4988->doMove( 50); delay(5); - myA4988->setRPM(20); myA4988->doMove(-25); delay(5); - myA4988->setRPM(30); myA4988->doMove( 20); delay(5); - myA4988->setRPM(25); myA4988->doMove(-50); delay(5);// - myA4988->setRPM(38); myA4988->doMove( 31); delay(5); - myA4988->setRPM(38); myA4988->doMove(-31); delay(5); - myA4988->setRPM(38); myA4988->doMove( 31); delay(5); - myA4988->setRPM(38); myA4988->doMove(-31); delay(5); - myA4988->setRPM(41); myA4988->doMove( 21); delay(5); - myA4988->setRPM(30); myA4988->doMove(-21); delay(5); - myA4988->setRPM(25); myA4988->doMove( 30); delay(5); - myA4988->setRPM(20); myA4988->doMove(-25); delay(5); - myA4988->setRPM(30); myA4988->doMove( 20); delay(5); - myA4988->setRPM(25); myA4988->doMove(-50); delay(5);// - myA4988->setRPM(50); myA4988->doMove( 40); delay(5); - myA4988->setRPM(25); myA4988->doMove(-20); delay(5); - myA4988->setRPM(25); myA4988->doMove( 15); delay(5); - myA4988->setRPM(50); myA4988->doMove(-40); delay(5); - myA4988->setRPM(48); myA4988->doMove( 35); delay(5); - myA4988->setRPM(45); myA4988->doMove(-25); delay(5); - myA4988->setRPM(41); myA4988->doMove( 25); delay(5); - myA4988->setRPM(38); myA4988->doMove(-26); delay(5); - myA4988->setRPM(41); myA4988->doMove( 25); delay(5); - myA4988->setRPM(25); myA4988->doMove( 25); delay(5); - myA4988->setRPM(41); myA4988->doMove(-35); delay(5); - myA4988->setRPM(38); myA4988->doMove( 25); delay(5); - myA4988->setRPM(36); myA4988->doMove(-25); delay(5); - myA4988->setRPM(33); myA4988->doMove( 25); delay(5); - myA4988->setRPM(30); myA4988->doMove(-27); delay(5); - myA4988->setRPM(33); myA4988->doMove( 25); delay(5); - myA4988->setRPM(33); myA4988->doMove( 25); delay(5); - myA4988->setRPM(38); myA4988->doMove(-30); delay(5); - myA4988->setRPM(18); myA4988->doMove( 10); delay(5); - myA4988->setRPM(18); myA4988->doMove(-10); delay(5); - myA4988->setRPM(25); myA4988->doMove( 20); delay(5); - myA4988->setRPM(20); myA4988->doMove(-25); delay(5); - myA4988->setRPM(30); myA4988->doMove( 20); delay(5); - myA4988->setRPM(25); myA4988->doMove(-50); delay(5); - myA4988->setRPM(20); myA4988->doMove( 25); delay(5); - myA4988->setRPM(30); myA4988->doMove(-20); delay(5); - myA4988->setRPM(25); myA4988->doMove( 50); delay(5); - myA4988->disable(); - AddLog_P2(LOG_LEVEL_INFO, PSTR("Stepper: may the force be with you!")); - ResponseCmndDone(); -} - /*********************************************************************************************\ * Interface \*********************************************************************************************/ -bool Xdrv98(uint8_t function) +bool Xdrv25(uint8_t function) { bool result = false; - if ((pin[GPIO_A4988_DIR] < 99) && (pin[GPIO_A4988_STP] < 99)) { switch (function) { case FUNC_INIT: