Aruna
aruna::driver::Stepper Class Referenceabstract

#include <Stepper.h>

Inheritance diagram for aruna::driver::Stepper:
Collaboration diagram for aruna::driver::Stepper:

Public Member Functions

 Stepper (uint8_t *pins, size_t pins_count, movement::axis_mask_t axis, bool active_high)
 Stepper motor. More...
 
void set_speed (int16_t speed)
 Set speed of the stepper motor. More...
 
void do_steps (int32_t steps)
 Do an x number of steps. More...
 
 ~Stepper ()
 destructor. More...
 
- Public Member Functions inherited from aruna::movement::Actuator
 Actuator (axis_mask_t axis=axis_mask_t::NONE)
 Actuator object, used by the movement module for vehicle movement. More...
 
virtual ~Actuator ()
 
err_t set_axis (axis_mask_t new_axis)
 Set the axis that this Actuator is capable in moving in. More...
 
axis_mask_t get_axis ()
 get the movement modes that this driver supports. More...
 
err_t set (axis_mask_t axisMask, int16_t speed)
 Set the speed of the motors directly. More...
 
uint16_t get_speed ()
 Get the current speed of Actuator. More...
 

Private Member Functions

err_t init_pins ()
 initialize the pins for output More...
 
err_t clear_pins ()
 reset the pins back to initial state (run when program is finished) More...
 
virtual err_t init_pin (uint8_t pin_nr)=0
 init single pin as output More...
 
virtual err_t set_pin (uint8_t pin_nr, bool value)=0
 set pin level high or low More...
 
virtual err_t clear_pin (uint8_t pin_nr)
 clear single pin after program is finished More...
 
err_t do_step (movement::axis_mask_t direction)
 Do a single step in a direction. More...
 
uint8_t get_pin (movement::axis_mask_t direction, uint8_t n=0)
 pop pin from circular array buffer. More...
 
void timer_task ()
 task to set the next phase on time. More...
 
err_t _set (movement::axis_mask_t axisMask, int16_t speed) override
 Implementation of axis movement, this function is called from set(...). More...
 

Static Private Member Functions

static void _timer_task_wrapper (void *_this)
 wrapper for timer_task(), as FreeRTOS only wants to create tasks from static functions More...
 

Private Attributes

SemaphoreHandle_t asked_set_mutex = NULL
 
uint16_t asked_speed
 
movement::axis_mask_t asked_direction
 
size_t active_pin_index = 0
 
TaskHandle_t timer_task_handle
 
const uint8_t * pins
 
const size_t pins_count = 0
 
const bool active_high
 
log::channel_tlog
 

Additional Inherited Members

- Public Attributes inherited from aruna::movement::Actuator
err_t startup_error = err_t::NOT_STARTED
 error when constructing gets put here, read before usage. More...
 
- Static Protected Member Functions inherited from aruna::movement::Actuator
static double convert_range (uint16_t input, float range_max=100.f, float range_min=0.f)
 Convert uint16 to a new range. More...
 

Detailed Description

Definition at line 18 of file Stepper.h.

Constructor & Destructor Documentation

◆ Stepper()

Stepper::Stepper ( uint8_t *  pins,
size_t  pins_count,
movement::axis_mask_t  axis,
bool  active_high 
)

Stepper motor.

Parameters
pins,pointerGPIO number array, used in order for phase shifting
pins_count,numberof entries in pins
axis,axismask to work on
active_high,shouldthe current phase be high and other low or current phase low and other pins high

Definition at line 28 of file Stepper.cpp.

32 // TODO creating two stepper object causes error on registering log
33 // TODO break_on_idle bool parameter. If true: lock motor when speed is zero; false: release motor is speed is zero.
34  log = new log::channel_t("stepper");
35 
36  asked_set_mutex = xSemaphoreCreateMutex();
37  if (asked_set_mutex == NULL) {
38  log->error("failed to create mutex");
39  }
40  if (xTaskCreate(_timer_task_wrapper, "stepper timer", 2048, this, 10, &timer_task_handle) != pdTRUE)
41  log->error("failed to create stepper timer task");
43 
44 }
static void _timer_task_wrapper(void *_this)
wrapper for timer_task(), as FreeRTOS only wants to create tasks from static functions ...
Definition: Stepper.cpp:101
const uint8_t * pins
Definition: Stepper.h:25
TaskHandle_t timer_task_handle
Definition: Stepper.h:24
Actuator(axis_mask_t axis=axis_mask_t::NONE)
Actuator object, used by the movement module for vehicle movement.
Definition: Actuator.cpp:12
err_t init_pins()
initialize the pins for output
Definition: Stepper.cpp:106
const size_t pins_count
Definition: Stepper.h:26
err_t startup_error
error when constructing gets put here, read before usage.
Definition: Actuator.h:45
const bool active_high
Definition: Stepper.h:27
int error(const char *format,...)
log error message
Definition: log.cpp:90
SemaphoreHandle_t asked_set_mutex
Definition: Stepper.h:20
log::channel_t * log
Definition: Stepper.h:28
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ~Stepper()

Stepper::~Stepper ( )

destructor.

Definition at line 46 of file Stepper.cpp.

46  {
47  clear_pins();
48  vTaskDelete(timer_task_handle);
49 }
TaskHandle_t timer_task_handle
Definition: Stepper.h:24
err_t clear_pins()
reset the pins back to initial state (run when program is finished)
Definition: Stepper.cpp:117
Here is the call graph for this function:
Here is the caller graph for this function:

Member Function Documentation

◆ _set()

aruna::err_t Stepper::_set ( movement::axis_mask_t  axisMask,
int16_t  speed 
)
overrideprivatevirtual

Implementation of axis movement, this function is called from set(...).

Only gets called when axisMask match axis of Actuator.

Parameters
axisMaskaxis (can be multiple) to set speed to.
speeddesired speed.
Returns
err_t::OK if successful, others when not...

Implements aruna::movement::Actuator.

Definition at line 9 of file Stepper.cpp.

9  {
10 
12  return err_t::OK;
13 }
void set_speed(int16_t speed)
Set speed of the stepper motor.
Definition: Stepper.cpp:128
Here is the call graph for this function:
Here is the caller graph for this function:

◆ _timer_task_wrapper()

void Stepper::_timer_task_wrapper ( void *  _this)
staticprivate

wrapper for timer_task(), as FreeRTOS only wants to create tasks from static functions

Parameters
_thiscurrent object to timer_task() can be called

Definition at line 101 of file Stepper.cpp.

101  {
102  (static_cast<Stepper *>(_this))->timer_task();
103 }
Here is the caller graph for this function:

◆ clear_pin()

virtual err_t aruna::driver::Stepper::clear_pin ( uint8_t  pin_nr)
inlineprivatevirtual

clear single pin after program is finished

Parameters
pin_nrpin to clear
Returns
err_t

Reimplemented in aruna::driver::ESP32_Stepper.

Definition at line 62 of file Stepper.h.

62  {
63  return err_t::OK;
64  }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ clear_pins()

aruna::err_t Stepper::clear_pins ( )
private

reset the pins back to initial state (run when program is finished)

Returns
err_t

Definition at line 117 of file Stepper.cpp.

117  {
118  err_t msg = err_t::OK;
119  for (int i = 0; i < pins_count; ++i) {
120  msg = clear_pin(pins[i]);
121  if (msg != err_t::OK) {
122  log->error("failed to close pin %i: %s", pins[i], err_to_char.at(msg));
123  }
124  }
125  return msg;
126 }
const uint8_t * pins
Definition: Stepper.h:25
const std::map< err_t, char * > err_to_char
Definition: arunaTypes.h:54
const size_t pins_count
Definition: Stepper.h:26
virtual err_t clear_pin(uint8_t pin_nr)
clear single pin after program is finished
Definition: Stepper.h:62
int error(const char *format,...)
log error message
Definition: log.cpp:90
log::channel_t * log
Definition: Stepper.h:28
Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_step()

aruna::err_t Stepper::do_step ( movement::axis_mask_t  direction)
private

Do a single step in a direction.

Parameters
directionPLUS or MINUS
Returns
err_t

Definition at line 15 of file Stepper.cpp.

15  {
16 // TODO half stepping
17  err_t last_err_msg;
18  for (int i = 0; i < pins_count; ++i) {
19  if (i == active_pin_index)
20  continue;
21  last_err_msg = set_pin(pins[i], !active_high);
22  }
23  last_err_msg = set_pin(get_pin(direction), active_high);
24 
25  return last_err_msg;
26 }
const uint8_t * pins
Definition: Stepper.h:25
size_t active_pin_index
Definition: Stepper.h:23
const size_t pins_count
Definition: Stepper.h:26
const bool active_high
Definition: Stepper.h:27
virtual err_t set_pin(uint8_t pin_nr, bool value)=0
set pin level high or low
uint8_t get_pin(movement::axis_mask_t direction, uint8_t n=0)
pop pin from circular array buffer.
Definition: Stepper.cpp:51
Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_steps()

void Stepper::do_steps ( int32_t  steps)

Do an x number of steps.

Parameters
stepsamount of steps to take

Definition at line 138 of file Stepper.cpp.

138  {
139 // TODO
140 }
Here is the caller graph for this function:

◆ get_pin()

uint8_t Stepper::get_pin ( movement::axis_mask_t  direction,
uint8_t  n = 0 
)
private

pop pin from circular array buffer.

Parameters
direction,directionto pop
n,offsetof current active pin, default 0
Returns
pin_nr

Definition at line 51 of file Stepper.cpp.

51  {
52  uint8_t ret_val = pins[active_pin_index + n];
53 // circular buffer
54  if (n == 0 and direction == movement::axis_mask_t::DIRECTION_PLUS) {
55 // move to next pin
57  } else if (n == 0 and direction == movement::axis_mask_t::DIRECTION_MIN) {
58 // move to prev pin
59  active_pin_index = ((int32_t) (active_pin_index - 1)) < 0 ? pins_count - 1 : active_pin_index - 1;
60  }
61  return ret_val;
62 }
const uint8_t * pins
Definition: Stepper.h:25
size_t active_pin_index
Definition: Stepper.h:23
const size_t pins_count
Definition: Stepper.h:26
Here is the caller graph for this function:

◆ init_pin()

virtual err_t aruna::driver::Stepper::init_pin ( uint8_t  pin_nr)
privatepure virtual

init single pin as output

Parameters
pin_nr,pinto initialize
Returns
err_t

Implemented in aruna::driver::ESP32_Stepper.

Here is the caller graph for this function:

◆ init_pins()

aruna::err_t Stepper::init_pins ( )
private

initialize the pins for output

Returns
err_t

Definition at line 106 of file Stepper.cpp.

106  {
107  err_t msg = err_t::OK;
108  for (int i = 0; i < pins_count; ++i) {
109  msg = init_pin(pins[i]);
110  if (msg != err_t::OK) {
111  log->error("failed to init pin %i: %s", pins[i], err_to_char.at(msg));
112  }
113  }
114  return msg;
115 }
const uint8_t * pins
Definition: Stepper.h:25
const std::map< err_t, char * > err_to_char
Definition: arunaTypes.h:54
virtual err_t init_pin(uint8_t pin_nr)=0
init single pin as output
const size_t pins_count
Definition: Stepper.h:26
int error(const char *format,...)
log error message
Definition: log.cpp:90
log::channel_t * log
Definition: Stepper.h:28
Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_pin()

virtual err_t aruna::driver::Stepper::set_pin ( uint8_t  pin_nr,
bool  value 
)
privatepure virtual

set pin level high or low

Parameters
pin_nr,pinto set
value,bool.true for high, false for low
Returns
err_t

Implemented in aruna::driver::ESP32_Stepper.

Here is the caller graph for this function:

◆ set_speed()

void Stepper::set_speed ( int16_t  speed)

Set speed of the stepper motor.

Parameters
speeduse minus to go the other way.

Definition at line 128 of file Stepper.cpp.

128  {
129  if (xSemaphoreTake(asked_set_mutex, portMAX_DELAY) != pdTRUE)
130  log->error("failed to take mutex");
131  asked_speed = speed;
133  if (xSemaphoreGive(asked_set_mutex) != pdTRUE)
134  log->error("failed to give mutex");
135  xTaskNotifyGive(timer_task_handle);
136 }
TaskHandle_t timer_task_handle
Definition: Stepper.h:24
movement::axis_mask_t asked_direction
Definition: Stepper.h:22
int error(const char *format,...)
log error message
Definition: log.cpp:90
SemaphoreHandle_t asked_set_mutex
Definition: Stepper.h:20
uint16_t asked_speed
Definition: Stepper.h:21
log::channel_t * log
Definition: Stepper.h:28
Here is the call graph for this function:
Here is the caller graph for this function:

◆ timer_task()

void Stepper::timer_task ( )
private

task to set the next phase on time.

Definition at line 64 of file Stepper.cpp.

64  {
65  uint16_t speed = 0;
67  uint16_t delay_ms = 0;
68  bool first_time = true;
69  err_t err_msg;
70  while (true) {
71 
72  if (speed == 0)
73 // wait indefenitly if speed is zero
74  ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
75 
76  if (ulTaskNotifyTake(pdTRUE, 0) or first_time) {
77  first_time = false;
78 // update our variables
79  if (xSemaphoreTake(asked_set_mutex, portMAX_DELAY) != pdTRUE) {
80  log->error("failed to take mutex");
81  }
82  speed = asked_speed;
83  direction = asked_direction;
84  if (xSemaphoreGive(asked_set_mutex) != pdTRUE) {
85  log->error("failed to give mutex");
86  }
87 // TODO refine delay to more reasonable speeds
88  delay_ms = 65536 - speed;
89 
90  }
91 // loop the pins!
92  err_msg = do_step(direction);
93  if (err_msg != err_t::OK)
94  log->error("failed to step: %s", err_to_char.at(err_msg));
95  vTaskDelay(delay_ms / portTICK_PERIOD_MS);
96 
97  }
98 
99 }
const std::map< err_t, char * > err_to_char
Definition: arunaTypes.h:54
movement::axis_mask_t asked_direction
Definition: Stepper.h:22
err_t do_step(movement::axis_mask_t direction)
Do a single step in a direction.
Definition: Stepper.cpp:15
int error(const char *format,...)
log error message
Definition: log.cpp:90
SemaphoreHandle_t asked_set_mutex
Definition: Stepper.h:20
uint16_t asked_speed
Definition: Stepper.h:21
log::channel_t * log
Definition: Stepper.h:28
Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ active_high

const bool aruna::driver::Stepper::active_high
private

Definition at line 27 of file Stepper.h.

◆ active_pin_index

size_t aruna::driver::Stepper::active_pin_index = 0
private

Definition at line 23 of file Stepper.h.

◆ asked_direction

movement::axis_mask_t aruna::driver::Stepper::asked_direction
private

Definition at line 22 of file Stepper.h.

◆ asked_set_mutex

SemaphoreHandle_t aruna::driver::Stepper::asked_set_mutex = NULL
private

Definition at line 20 of file Stepper.h.

◆ asked_speed

uint16_t aruna::driver::Stepper::asked_speed
private

Definition at line 21 of file Stepper.h.

◆ log

log::channel_t* aruna::driver::Stepper::log
private

Definition at line 28 of file Stepper.h.

◆ pins

const uint8_t* aruna::driver::Stepper::pins
private

Definition at line 25 of file Stepper.h.

◆ pins_count

const size_t aruna::driver::Stepper::pins_count = 0
private

Definition at line 26 of file Stepper.h.

◆ timer_task_handle

TaskHandle_t aruna::driver::Stepper::timer_task_handle
private

Definition at line 24 of file Stepper.h.


The documentation for this class was generated from the following files: