Lydia - Printhead
StepperController.h
Go to the documentation of this file.
1 #ifndef STEPPERCONTROLLER_H
2 #define STEPPERCONTROLLER_H
3 
4 #include <Arduino.h>
5 #include <ArduinoLog.h>
6 #include <osr-base.h>
7 #include <App.h>
8 #include <Addon.h>
9 #include <Component.h>
10 #include <ModbusValue.h>
11 #include <types.h>
12 #include <AccelStepper.h>
13 #include <xmath.h>
14 #include "../features.h"
15 #include "../enums.h"
16 #include "../config.h"
17 
18 
19 class StepperController : public Component, public ModbusValue<int[]>
20 {
21 
22 public:
24  {
30  };
31 
33  {
34  Component *owner;
35  short dirPin;
36  short pulsePin;
37  short feedbackPin;
38  short overloadPin;
39  short enabled;
40  short speed;
41  short pulseWidth;
42  short dir;
43  short id;
44  short addressStart;
45  };
46 
48  Component *owner,
49  short dirPin,
50  short pulsePin,
51  short feedbackPin,
52  short overloadPin,
53  short enabled,
54  short speed,
55  short pulseWidth,
56  short dir,
57  short id,
58  short addressStart) : ModbusValue<int[]>(addressStart),
59  Component("Stepper", id, Component::COMPONENT_DEFAULT, owner),
60  stepper(AccelStepper::DRIVER, pulsePin, dirPin),
61  _speed(speed),
63  _feedback(feedbackPin),
64  _overload(overloadPin),
65  _enabled(enabled),
66  _dir(dir),
67  _dirPin(dirPin),
68  _pulsePin(pulsePin),
69  _addressStart(addressStart),
71  {
72  //setFlag(OBJECT_RUN_FLAGS::E_OF_DEBUG);
73  SBI(nFlags, OBJECT_NET_CAPS::E_NCAPS_MODBUS);
74  Log.verboseln("stepper controller created");
75  }
76 
77  short speed(short val0, short val1 = 0)
78  {
79  _speed = val0;
80  int range[STEPPER_MODUBUS_RANGE] = {_speed, _dir, _status, 0};
81  onSet(range, STEPPER_MODUBUS_RANGE);
82  return E_OK;
83  }
84  short getSpeed(){
85  return _speed;
86  }
87  short dir(short val0, short val1)
88  {
89  _dir = val0;
90  return E_OK;
91  }
92  short setup()
93  {
94  setRegisterMode(MB_REGISTER_MODE::E_MB_REGISTER_MODE_READ_WRITE);
95  setNumberAddresses(STEPPER_MODUBUS_RANGE);
96  setFunctionCode(MB_FC::MB_FC_READ_REGISTERS);
97  setAddress(_addressStart);
98  stepper.setMaxSpeed(STEPPER_MAX_SPEED_0);
99  stepper.setMinPulseWidth(_pulseWidth);
100  stepper.setPinsInverted(_dir, false, false);
101 
102  int range[STEPPER_MODUBUS_RANGE] = {_speed, _dir, _status, analogRead(_overload)};
103  onSet(range, STEPPER_MODUBUS_RANGE);
104  //Log.verboseln("stepper controller setup:%d", _addressStart);
105  //Log.verboseln("stepper controller dir:%d | pulse:%d | speed:%d", _dirPin,_pulsePin, _speed);
106  stepper.setSpeed(_speed);
107  return E_OK;
108  }
109  short pulseWidth(short val0, short val1)
110  {
111  _pulseWidth = val0;
112  return E_OK;
113  }
114  short debug(){
115  Log.verboseln("StepperController::debug Speed=%d | Dir=%d | Address=%d | Status=%d | Load=%d", _speed, _dir, addr, _status, analogRead(_overload));
116  return E_OK;
117  }
118  short info()
119  {
120  // Log.verboseln(F("StepperController::debug Speed=%d | Dir=%d | Address=%d | Status=%d" CR), _speed, _dir, addr, _status);
121  return E_OK;
122  }
123  short loop()
124  {
125  short netSpeed = clamp<short>(netVal(addr), 0, STEPPER_MAX_SPEED_0);
126  short netDir = clamp<short>(netVal(addr + MB_RW_STEPPER_DIR_OFFSET), 0, 1);
127  short netStatus = netVal(addr + MB_RW_STEPPER_STATUS_OFFSET);
128  short netUser = netVal(addr + MB_RW_STEPPER_USER_OFFSET);
129  if (netSpeed != _speed)
130  {
131  _speed = netSpeed;
132  }
133  if (netDir != _dir)
134  {
135  _dir = netDir;
136  }
137  int range[STEPPER_MODUBUS_RANGE] = {_speed, netDir, netSpeed, 0};
138  onSet(range, STEPPER_MODUBUS_RANGE);
139  stepper.setPinsInverted(_dir, false, false);
140  stepper.setSpeed(_speed * 10);
141  stepper.runSpeed();
142  return E_OK;
143  }
144 
145  short onRegisterMethods(Bridge *bridge)
146  {
147  // bridge->registerMemberFunction(id, this, C_STR("setFlag"), (ComponentFnPtr)&StepperController::setFlag);
148  // bridge->registerMemberFunction(id, this, C_STR("clearFlag"), (ComponentFnPtr)&StepperController::clearFlag);
149  // bridge->registerMemberFunction(id, this, C_STR("info"), (ComponentFnPtr)&StepperController::info);
150  /*
151  bridge->registerMemberFunction(id, this, C_STR("speed"), (ComponentFnPtr)&StepperController::speed);
152  bridge->registerMemberFunction(id, this, C_STR("pulseWidth"), (ComponentFnPtr)&StepperController::pulseWidth);
153  bridge->registerMemberFunction(id, this, C_STR("dir"), (ComponentFnPtr)&StepperController::dir);
154  */
155  return E_OK;
156  }
157 
159  {
160  return analogRead(_overload) > STEPPER_OVERLOAD_THRESHOLD_0;
161  }
162 
163 private:
164  AccelStepper stepper;
165  short _speed;
166  short _dir;
167  short _dirPin;
168  short _pulsePin;
169  short _pulseWidth;
171  short _status;
172  short _feedback;
173  short _overload;
174  short _enabled;
175 };
176 
177 #endif
StepperController::_feedback
short _feedback
Definition: StepperController.h:172
StepperController::MOTOR_STATUS
MOTOR_STATUS
Definition: StepperController.h:23
StepperController::onRegisterMethods
short onRegisterMethods(Bridge *bridge)
Definition: StepperController.h:145
StepperController::MOTOR_OVERLOAD
@ MOTOR_OVERLOAD
Definition: StepperController.h:27
StepperController::StepperControllerParams
Definition: StepperController.h:32
StepperController::StepperController
StepperController(Component *owner, short dirPin, short pulsePin, short feedbackPin, short overloadPin, short enabled, short speed, short pulseWidth, short dir, short id, short addressStart)
Definition: StepperController.h:47
StepperController::_status
short _status
Definition: StepperController.h:171
StepperController::getSpeed
short getSpeed()
Definition: StepperController.h:84
StepperController::setup
short setup()
Definition: StepperController.h:92
StepperController::_pulseWidth
short _pulseWidth
Definition: StepperController.h:169
STEPPER_OVERLOAD_THRESHOLD_0
#define STEPPER_OVERLOAD_THRESHOLD_0
Definition: config_adv.h:132
StepperController::MOTOR_ERROR
@ MOTOR_ERROR
Definition: StepperController.h:28
StepperController::debug
short debug()
Definition: StepperController.h:114
StepperController::StepperControllerParams::pulseWidth
short pulseWidth
Definition: StepperController.h:41
StepperController::StepperControllerParams::owner
Component * owner
Definition: StepperController.h:34
StepperController::_enabled
short _enabled
Definition: StepperController.h:174
MB_RW_STEPPER_DIR_OFFSET
#define MB_RW_STEPPER_DIR_OFFSET
Definition: enums.h:251
StepperController::StepperControllerParams::overloadPin
short overloadPin
Definition: StepperController.h:38
StepperController::dir
short dir(short val0, short val1)
Definition: StepperController.h:87
MB_RW_STEPPER_STATUS_OFFSET
#define MB_RW_STEPPER_STATUS_OFFSET
Definition: enums.h:252
StepperController::_dirPin
short _dirPin
Definition: StepperController.h:167
StepperController::StepperControllerParams::feedbackPin
short feedbackPin
Definition: StepperController.h:37
StepperController::_addressStart
short _addressStart
Definition: StepperController.h:170
StepperController::loop
short loop()
Definition: StepperController.h:123
StepperController::MOTOR_UNKNOWN
@ MOTOR_UNKNOWN
Definition: StepperController.h:29
StepperController::MOTOR_IDLE
@ MOTOR_IDLE
Definition: StepperController.h:26
StepperController::_speed
short _speed
Definition: StepperController.h:165
StepperController::info
short info()
Definition: StepperController.h:118
StepperController::MOTOR_RUNNING
@ MOTOR_RUNNING
Definition: StepperController.h:25
StepperController::_pulsePin
short _pulsePin
Definition: StepperController.h:168
STEPPER_MODUBUS_RANGE
#define STEPPER_MODUBUS_RANGE
Definition: config_adv.h:128
StepperController::_overload
short _overload
Definition: StepperController.h:173
MB_RW_STEPPER_USER_OFFSET
#define MB_RW_STEPPER_USER_OFFSET
Definition: enums.h:253
StepperController::stepper
AccelStepper stepper
Definition: StepperController.h:164
E_OK
#define E_OK
Definition: enums.h:11
StepperController::isOverloaded
bool isOverloaded()
Definition: StepperController.h:158
StepperController::StepperControllerParams::id
short id
Definition: StepperController.h:43
StepperController::StepperControllerParams::addressStart
short addressStart
Definition: StepperController.h:44
StepperController::StepperControllerParams::pulsePin
short pulsePin
Definition: StepperController.h:36
StepperController::StepperControllerParams::enabled
short enabled
Definition: StepperController.h:39
StepperController::speed
short speed(short val0, short val1=0)
Definition: StepperController.h:77
StepperController::_dir
short _dir
Definition: StepperController.h:166
StepperController
Definition: StepperController.h:19
STEPPER_MAX_SPEED_0
#define STEPPER_MAX_SPEED_0
Definition: config_adv.h:127
StepperController::StepperControllerParams::dir
short dir
Definition: StepperController.h:42
StepperController::StepperControllerParams::speed
short speed
Definition: StepperController.h:40
StepperController::StepperControllerParams::dirPin
short dirPin
Definition: StepperController.h:35
StepperController::pulseWidth
short pulseWidth(short val0, short val1)
Definition: StepperController.h:109