Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
d26e0cd
backlash added, deactivate outputs
elral Nov 21, 2022
4e97224
get type/backlash/deact. from config prepared
elral Nov 21, 2022
d40b7f0
remove unnecessary defnines
elral Nov 22, 2022
a293d83
clean up
elral Nov 23, 2022
e646f08
set speed and acceleration for steppers
elral Nov 23, 2022
5b74ca1
new stepper type
elral Nov 23, 2022
07bb4f5
add. stepper inits, add. paramter from config
elral Nov 23, 2022
7e2bf8c
defines for stepper to MFStepper.h
elral Nov 23, 2022
1a0112d
initial set of maxSpeed and Acceleration to class
elral Nov 23, 2022
72769dc
re-formatting
elral Nov 23, 2022
afdff09
deactivate outputs is standard
elral Nov 23, 2022
28e3d5a
improved backlash calculation
elral Nov 23, 2022
02d5464
defines for stepper to MFStepper where it belongs
elral Nov 28, 2022
4df4df4
correct init of accel lib depending on type
elral Nov 28, 2022
237eeb0
new speed settings for stepper types
elral Nov 28, 2022
0c9e05f
test for smoothing
elral Nov 28, 2022
2400151
test for smoothing
elral Nov 28, 2022
6ee57a4
smoothing uncommented
elral Dec 4, 2022
e3f70d5
add a comment
elral Dec 6, 2022
7419d80
delete smoothing
elral Dec 6, 2022
a6542eb
init stepper as driver with correct pins
elral Dec 8, 2022
27f4b37
unused variables deleted, was for smoothing
elral Dec 8, 2022
6fd88ea
Merge branch 'MobiFlight:main' into Stepper_optimization
elral Dec 8, 2022
f9c8237
Merge branch 'main' into Stepper_optimization
elral Dec 8, 2022
f8b8036
testing backlash
elral Dec 9, 2022
850c821
differ only on stepper mode instead stepper type
elral Dec 9, 2022
c4ffbbf
Merge branch 'Stepper_optimization'
elral Dec 9, 2022
e696215
consider backlash for positioning
elral Dec 9, 2022
c574d9f
simplier if clauses
elral Dec 12, 2022
1e9fea6
add comments how to consider backlash
elral Dec 12, 2022
ef5220c
for backw.copmp. do not deactivate outputs
elral Dec 12, 2022
6854ade
keep backw. comp. for deact. outputs
elral Dec 13, 2022
9d3b462
better enumeration
elral Dec 13, 2022
d84cc4c
Merge branch 'Stepper_optimization_more' into Stepper_optimization
elral Dec 13, 2022
bae7ac7
autoreset is avail., delte comment
elral Dec 13, 2022
5763edf
w/o comments and serial print
elral Dec 13, 2022
fa0d58a
test init backlash and speed corrected
elral Dec 13, 2022
62b002e
add power saving for steppers
elral Dec 14, 2022
efcfb85
Merge branch 'MobiFlight:main' into Stepper_optimization
elral Jan 6, 2023
e59bf54
Merge branch 'main' into Stepper_optimization
elral Jan 6, 2023
6698985
Merge branch 'Stepper_optimization' of https://github.com/elral/MobiF…
elral Jan 6, 2023
85206b5
Merge branch 'MobiFlight:main' into Stepper_optimization
elral Jan 6, 2023
0101c53
consider Backlash also on set zero position
elral Jan 6, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions _Boards/Atmel/Board_Mega/MFBoards.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,6 @@
#define MAX_INPUT_SHIFTERS 4
#define MAX_DIGIN_MUX 4

#define STEPS 64
#define STEPPER_SPEED 400 // 300 already worked, 467, too?
#define STEPPER_ACCEL 800

#define MOBIFLIGHT_TYPE "MobiFlight Mega"
#define MOBIFLIGHT_SERIAL "1234567890"
#define MOBIFLIGHT_NAME "MobiFlight Mega"
Expand Down
4 changes: 0 additions & 4 deletions _Boards/Atmel/Board_ProMicro/MFBoards.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,6 @@
#define MAX_INPUT_SHIFTERS 2
#define MAX_DIGIN_MUX 3

#define STEPS 64
#define STEPPER_SPEED 400 // 300 already worked, 467, too?
#define STEPPER_ACCEL 800

#define MOBIFLIGHT_TYPE "MobiFlight Micro"
#define MOBIFLIGHT_SERIAL "0987654321"
#define MOBIFLIGHT_NAME "MobiFlight Micro"
Expand Down
4 changes: 0 additions & 4 deletions _Boards/Atmel/Board_Uno/MFBoards.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,6 @@
#define MAX_INPUT_SHIFTERS 2
#define MAX_DIGIN_MUX 3

#define STEPS 64
#define STEPPER_SPEED 400 // 300 already worked, 467, too?
#define STEPPER_ACCEL 800

#define MOBIFLIGHT_TYPE "MobiFlight Uno"
#define MOBIFLIGHT_SERIAL "0987654321"
#define MOBIFLIGHT_NAME "MobiFlight Uno"
Expand Down
2 changes: 1 addition & 1 deletion platformio.ini
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ lib_deps_Atmel =
arduino-libraries/Servo @ 1.1.8
build_flags =
-DMF_REDUCE_FUNCT_LEDCONTROL
-DMAXCALLBACKS=30
-DMAXCALLBACKS=35
-DSERIAL_RX_BUFFER_SIZE=96
-DMESSENGERBUFFERSIZE=96
-DMAXSTREAMBUFFERSIZE=96
Expand Down
1 change: 1 addition & 0 deletions src/CommandMessenger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ void attachCommandCallbacks()
cmdMessenger.attach(kSetStepper, Stepper::OnSet);
cmdMessenger.attach(kResetStepper, Stepper::OnReset);
cmdMessenger.attach(kSetZeroStepper, Stepper::OnSetZero);
cmdMessenger.attach(kSetStepperSpeedAccel, Stepper::OnSetSpeedAccel);
#endif

#if MF_SERVO_SUPPORT == 1
Expand Down
29 changes: 21 additions & 8 deletions src/Config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -232,10 +232,10 @@ void readConfig()
{
if (configLength == 0) // do nothing if no config is available
return;
uint16_t addreeprom = MEM_OFFSET_CONFIG; // define first memory location where config is saved in EEPROM
uint16_t addrbuffer = 0; // and start with first memory location from nameBuffer
char params[6] = "";
uint8_t command = readUintFromEEPROM(&addreeprom); // read the first value from EEPROM, it's a device definition
uint16_t addreeprom = MEM_OFFSET_CONFIG; // define first memory location where config is saved in EEPROM
uint16_t addrbuffer = 0; // and start with first memory location from nameBuffer
char params[8] = ""; // buffer for reading parameters from EEPROM and sending to ::Add() function of device
char command = readUintFromEEPROM(&addreeprom); // read the first value from EEPROM, it's a device definition
bool copy_success = true; // will be set to false if copying input names to nameBuffer exceeds array dimensions
// not required anymore when pins instead of names are transferred to the UI

Expand Down Expand Up @@ -270,7 +270,7 @@ void readConfig()
#endif

#if MF_STEPPER_SUPPORT == 1
case kTypeStepperDeprecated:
case kTypeStepperDeprecated1:
// this is for backwards compatibility
params[0] = readUintFromEEPROM(&addreeprom); // Pin1 number
params[1] = readUintFromEEPROM(&addreeprom); // Pin2 number
Expand All @@ -280,10 +280,8 @@ void readConfig()
Stepper::Add(params[0], params[1], params[2], params[3], 0);
copy_success = readEndCommandFromEEPROM(&addreeprom); // check EEPROM until end of name
break;
#endif

#if MF_STEPPER_SUPPORT == 1
case kTypeStepper:
case kTypeStepperDeprecated2:
params[0] = readUintFromEEPROM(&addreeprom); // Pin1 number
params[1] = readUintFromEEPROM(&addreeprom); // Pin2 number
params[2] = readUintFromEEPROM(&addreeprom); // Pin3 number
Expand All @@ -292,6 +290,21 @@ void readConfig()
Stepper::Add(params[0], params[1], params[2], params[3], params[4]);
copy_success = readEndCommandFromEEPROM(&addreeprom); // check EEPROM until end of name
break;

case kTypeStepper:
params[0] = readUintFromEEPROM(&addreeprom); // Pin1 number
params[1] = readUintFromEEPROM(&addreeprom); // Pin2 number
params[2] = readUintFromEEPROM(&addreeprom); // Pin3 number
params[3] = readUintFromEEPROM(&addreeprom); // Pin4 number
params[4] = readUintFromEEPROM(&addreeprom); // Button number
params[5] = readUintFromEEPROM(&addreeprom); // Stepper Mode
params[6] = readUintFromEEPROM(&addreeprom); // backlash
params[7] = readUintFromEEPROM(&addreeprom); // deactivate output
// there is an additional 9th parameter stored in the config (profileID) which is not needed in the firmware
// and therefor not read in, it is just skipped like the name with reading until end of command
Stepper::Add(params[0], params[1], params[2], params[3], params[4], params[5], params[6], params[7]);
copy_success = readEndCommandFromEEPROM(&addreeprom); // check EEPROM until end of name
break;
#endif

#if MF_SERVO_SUPPORT == 1
Expand Down
96 changes: 81 additions & 15 deletions src/MF_Stepper/MFStepper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,45 +7,96 @@
#include "mobiflight.h"
#include "MFStepper.h"

enum { // enumeration for stepper mode
FULL4WIRE,
HALF4WIRE,
DRIVER
};

enum {
MOVE_CCW,
MOVE_CW
};

MFStepper::MFStepper()
{
_initialized = false;
}

void MFStepper::attach(uint8_t pin1, uint8_t pin2, uint8_t pin3, uint8_t pin4, uint8_t btnPin5)
void MFStepper::attach(uint8_t pin1, uint8_t pin2, uint8_t pin3, uint8_t pin4, uint8_t btnPin5, uint8_t mode, int8_t backlash, bool deactivateOutput)
{
if (!FitInMemory(sizeof(AccelStepper))) {
// Error Message to Connector
cmdMessenger.sendCmd(kStatus, F("MFStepper does not fit in Memory"));
return;
}
if (pin2 == pin4 && pin1 == pin3) // if pin1/2 are identical to pin3/4
{ // init new stepper with external driver (step and direction)
uint16_t maxSpeed = 0;
uint16_t Accel = 0;

switch (mode) {
case FULL4WIRE:
maxSpeed = STEPPER_SPEED;
Accel = STEPPER_ACCEL;
if (pin1 == pin3 && pin2 == pin4) // for backwards compatibility
_stepper = new (allocateMemory(sizeof(AccelStepper))) AccelStepper(AccelStepper::DRIVER, pin1, pin2);
else
_stepper = new (allocateMemory(sizeof(AccelStepper))) AccelStepper(AccelStepper::FULL4WIRE, pin4, pin2, pin1, pin3);
break;
case HALF4WIRE:
_stepper = new (allocateMemory(sizeof(AccelStepper))) AccelStepper(AccelStepper::HALF4WIRE, pin4, pin2, pin1, pin3);
maxSpeed = STEPPER_SPEED;
Accel = STEPPER_ACCEL;
break;
case DRIVER:
_stepper = new (allocateMemory(sizeof(AccelStepper))) AccelStepper(AccelStepper::DRIVER, pin1, pin2);
} else { // otherwise init new stepper in full 4 wire mode
_stepper = new (allocateMemory(sizeof(AccelStepper))) AccelStepper(AccelStepper::FULL4WIRE, pin4, pin2, pin1, pin3);
maxSpeed = STEPPER_SPEED;
Accel = STEPPER_ACCEL;
break;
default:
_initialized = false;
return;
break;
}

_stepper->setMaxSpeed(maxSpeed);
_stepper->setAcceleration(Accel);
_zeroPin = btnPin5;
_zeroPinState = HIGH;

if (_zeroPin) {
pinMode(_zeroPin, INPUT_PULLUP); // set pin to input
pinMode(_zeroPin, INPUT_PULLUP);
}
_initialized = true;
_resetting = false;

_backlash = backlash;
_deactivateOutput = deactivateOutput;
_initialized = true;
_resetting = false;
_isStopped = true;
_inMove = MOVE_CW;
}

void MFStepper::detach()
{
_initialized = false;
}

void MFStepper::moveTo(long absolute)
void MFStepper::moveTo(long newPosition)
{
_resetting = false;
if (_targetPos != absolute) {
_targetPos = absolute;
_stepper->moveTo(absolute);
_resetting = false;
long currentPosition = _stepper->currentPosition();

if (_targetPos != newPosition) {
if (_deactivateOutput && _isStopped) {
_stepper->enableOutputs();
_isStopped = false;
}
if (_inMove == MOVE_CW && newPosition < currentPosition && newPosition < _targetPos)
_inMove = MOVE_CCW;
if (_inMove == MOVE_CCW && newPosition > currentPosition && newPosition > _targetPos)
_inMove = MOVE_CW;

_stepper->moveTo(newPosition + _backlash * _inMove);
_targetPos = newPosition;
}
}

Expand All @@ -57,6 +108,9 @@ uint8_t MFStepper::getZeroPin()
void MFStepper::setZero()
{
_stepper->setCurrentPosition(0);
if (_inMove == MOVE_CW) {
_stepper->moveTo(-_backlash);
}
}

void MFStepper::setZeroInReset()
Expand All @@ -80,6 +134,10 @@ void MFStepper::update()
{
_stepper->run();
checkZeroPin();
if (_stepper->currentPosition() == (_targetPos + _backlash * _inMove) && _deactivateOutput) {
_stepper->disableOutputs();
_isStopped = true;
}
}

void MFStepper::reset()
Expand All @@ -99,14 +157,22 @@ void MFStepper::reset()
_stepper->moveTo(-100000);
}

void MFStepper::setMaxSpeed(float speed)
void MFStepper::setMaxSpeed(uint16_t speed)
{
_stepper->setMaxSpeed(speed);
}

void MFStepper::setAcceleration(float acceleration)
void MFStepper::setAcceleration(uint16_t acceleration)
{
_stepper->setAcceleration(acceleration);
}

void MFStepper::powerSavingMode(bool state)
{
if (state)
_stepper->disableOutputs();
else
_stepper->enableOutputs();
}

// MFStepper.cpp
18 changes: 13 additions & 5 deletions src/MF_Stepper/MFStepper.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,21 @@

class MFStepper
{
#define STEPPER_SPEED 400
#define STEPPER_ACCEL 800

public:
MFStepper();
void attach(uint8_t pin1 = 1, uint8_t pin2 = 2, uint8_t pin3 = 3, uint8_t pin4 = 4, uint8_t btnPin1 = 0);
void attach(uint8_t pin1 = 1, uint8_t pin2 = 2, uint8_t pin3 = 3, uint8_t pin4 = 4, uint8_t btnPin1 = 0, uint8_t mode = 0, int8_t backlash = 0, bool deactivateOutput = false);
void detach();
void update();
void reset();
void moveTo(long absolute);
void setMaxSpeed(float speed);
void setAcceleration(float acceleration);
void setMaxSpeed(uint16_t speed);
void setAcceleration(uint16_t acceleration);
void setZero();
uint8_t getZeroPin();
void powerSavingMode(bool state);

private:
bool _initialized;
Expand All @@ -30,9 +34,13 @@ class MFStepper
uint8_t _zeroPin;
uint8_t _zeroPinState;
long _targetPos;
uint8_t _backlash;
bool _deactivateOutput;
bool _inMove;
bool _isStopped;

void checkZeroPin(void);
void setZeroInReset(void);
void checkZeroPin(void);
void setZeroInReset(void);
};

// MFStepper.h
37 changes: 28 additions & 9 deletions src/MF_Stepper/Stepper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ namespace Stepper
MFStepper *steppers[MAX_STEPPERS];
uint8_t steppersRegistered = 0;

void Add(int pin1, int pin2, int pin3, int pin4, int btnPin1)
void Add(uint8_t pin1, uint8_t pin2, uint8_t pin3, uint8_t pin4, uint8_t btnPin1, uint8_t mode, int8_t backlash, bool deactivateOutput)
{
if (steppersRegistered == MAX_STEPPERS)
return;
Expand All @@ -23,11 +23,10 @@ namespace Stepper
cmdMessenger.sendCmd(kStatus, F("Stepper does not fit in Memory!"));
return;
}

steppers[steppersRegistered] = new (allocateMemory(sizeof(MFStepper))) MFStepper;
steppers[steppersRegistered]->attach(pin1, pin2, pin3, pin4, btnPin1);
steppers[steppersRegistered]->setMaxSpeed(STEPPER_SPEED);
steppers[steppersRegistered]->setAcceleration(STEPPER_ACCEL);
// autoreset is not released yet
steppers[steppersRegistered]->attach(pin1, pin2, pin3, pin4, btnPin1, mode, backlash, deactivateOutput);

if (btnPin1 > 0) {
// this triggers the auto reset if we need to reset
steppers[steppersRegistered]->reset();
Expand All @@ -54,8 +53,8 @@ namespace Stepper

void OnSet()
{
int stepper = cmdMessenger.readInt16Arg();
long newPos = cmdMessenger.readInt32Arg();
uint8_t stepper = (uint8_t)cmdMessenger.readInt16Arg();
long newPos = cmdMessenger.readInt32Arg();

if (stepper >= steppersRegistered)
return;
Expand All @@ -65,7 +64,7 @@ namespace Stepper

void OnReset()
{
int stepper = cmdMessenger.readInt16Arg();
uint8_t stepper = (uint8_t)cmdMessenger.readInt16Arg();

if (stepper >= steppersRegistered)
return;
Expand All @@ -75,20 +74,40 @@ namespace Stepper

void OnSetZero()
{
int stepper = cmdMessenger.readInt16Arg();
uint8_t stepper = (uint8_t)cmdMessenger.readInt16Arg();

if (stepper >= steppersRegistered)
return;
steppers[stepper]->setZero();
setLastCommandMillis();
}

void OnSetSpeedAccel()
{
uint8_t stepper = (uint8_t)cmdMessenger.readInt16Arg();
uint16_t maxSpeed = cmdMessenger.readInt16Arg();
uint16_t maxAccel = cmdMessenger.readInt16Arg();

if (stepper >= steppersRegistered)
return;
steppers[stepper]->setMaxSpeed(maxSpeed);
steppers[stepper]->setAcceleration(maxAccel);
}

void update()
{
for (uint8_t i = 0; i < steppersRegistered; i++) {
steppers[i]->update();
}
}

void PowerSave(bool state)
{
for (uint8_t i = 0; i < steppersRegistered; ++i) {
steppers[i]->powerSavingMode(state);
}
}

} // namespace

// Stepper.cpp
Loading