From b03cbf4f364e1290ecd23bc129537af092894caa Mon Sep 17 00:00:00 2001 From: Kiveisha Yevgeniy Date: Tue, 17 Jun 2014 14:58:59 +0000 Subject: [PATCH] step_motor: Added new module Signed-off-by: Kiveisha Yevgeniy --- examples/CMakeLists.txt | 3 + examples/step_motor_example.cxx | 73 ++++++++++++++++++++++ src/step_motor/CMakeLists.txt | 5 ++ src/step_motor/jsupm_step_motor.i | 7 +++ src/step_motor/pyupm_step_motor.i | 10 +++ src/step_motor/step_motor.cxx | 127 ++++++++++++++++++++++++++++++++++++++ src/step_motor/step_motor.h | 101 ++++++++++++++++++++++++++++++ 7 files changed, 326 insertions(+) create mode 100644 examples/step_motor_example.cxx create mode 100644 src/step_motor/CMakeLists.txt create mode 100644 src/step_motor/jsupm_step_motor.i create mode 100644 src/step_motor/pyupm_step_motor.i create mode 100644 src/step_motor/step_motor.cxx create mode 100644 src/step_motor/step_motor.h diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 8372666..6666071 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -17,6 +17,7 @@ add_executable (accelerometer mma7455.cxx) add_executable (lcd st7735.cxx) add_executable (max31855-example max31855.cxx) add_executable (gy65-example gy65.cxx) +add_executable (stepmotor-example step_motor_example.cxx) include_directories (${PROJECT_SOURCE_DIR}/src/hmc5883l) include_directories (${PROJECT_SOURCE_DIR}/src/grove) @@ -32,6 +33,7 @@ include_directories (${PROJECT_SOURCE_DIR}/src/mma7455) include_directories (${PROJECT_SOURCE_DIR}/src/st7735) include_directories (${PROJECT_SOURCE_DIR}/src/max31855) include_directories (${PROJECT_SOURCE_DIR}/src/gy65) +include_directories (${PROJECT_SOURCE_DIR}/src/step_motor) target_link_libraries (compass hmc5883l ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (groveled grove ${CMAKE_THREAD_LIBS_INIT}) @@ -52,3 +54,4 @@ target_link_libraries (accelerometer mma7455 ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (lcd st7735 ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (max31855-example max31855 ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (gy65-example gy65 ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries (stepmotor-example step_motor ${CMAKE_THREAD_LIBS_INIT}) diff --git a/examples/step_motor_example.cxx b/examples/step_motor_example.cxx new file mode 100644 index 0000000..dc06941 --- /dev/null +++ b/examples/step_motor_example.cxx @@ -0,0 +1,73 @@ +/* + * Author: Yevgeniy Kiveisha + * Copyright (c) 2014 Intel Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include "step_motor.h" +#include + +int doWork = 0; +upm::StepMotor *sensor = NULL; + +void +sig_handler(int signo) +{ + printf("got signal\n"); + if (signo == SIGINT) { + printf("exiting application\n"); + doWork = 1; + } +} + +int +main(int argc, char **argv) +{ +//! [Interesting] + sensor = new upm::StepMotor(4, 6); + + while (!doWork) { + sensor->setSpeed (500); + sensor->stepForward (500); + usleep (10000); + sensor->stepBackwards (500); + usleep (10000); + + sensor->setSpeed (750); + sensor->stepForward (500); + usleep (10000); + sensor->stepBackwards (500); + usleep (10000); + + sensor->setSpeed (1000); + sensor->stepForward (500); + usleep (10000); + sensor->stepBackwards (500); + usleep (10000); + } + + delete sensor; +//! [Interesting] + return 0; +} diff --git a/src/step_motor/CMakeLists.txt b/src/step_motor/CMakeLists.txt new file mode 100644 index 0000000..62fe6cf --- /dev/null +++ b/src/step_motor/CMakeLists.txt @@ -0,0 +1,5 @@ +set (libname "step_motor") +set (libdescription "upm STEP_MOTOR") +set (module_src ${libname}.cxx) +set (module_h ${libname}.h) +upm_module_init() diff --git a/src/step_motor/jsupm_step_motor.i b/src/step_motor/jsupm_step_motor.i new file mode 100644 index 0000000..3c45a7a --- /dev/null +++ b/src/step_motor/jsupm_step_motor.i @@ -0,0 +1,7 @@ +%module jsupm_step_motor + +%{ + #include "step_motor.h" +%} + +%include "step_motor.h" diff --git a/src/step_motor/pyupm_step_motor.i b/src/step_motor/pyupm_step_motor.i new file mode 100644 index 0000000..abd80c2 --- /dev/null +++ b/src/step_motor/pyupm_step_motor.i @@ -0,0 +1,10 @@ +%module pyupm_step_motor + +%include "stdint.i" + +%feature("autodoc", "3"); + +%include "step_motor.h" +%{ + #include "step_motor.h" +%} diff --git a/src/step_motor/step_motor.cxx b/src/step_motor/step_motor.cxx new file mode 100644 index 0000000..9f04e4c --- /dev/null +++ b/src/step_motor/step_motor.cxx @@ -0,0 +1,127 @@ +/* + * Author: Yevgeniy Kiveisha + * Copyright (c) 2014 Intel Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include + +#include "step_motor.h" + +using namespace upm; + +StepMotor::StepMotor (int dirPin, int stePin) { + maa_result_t error = MAA_SUCCESS; + m_name = "StepMotor"; + + maa_init(); + + m_stePin = stePin; + m_dirPin = dirPin; + + m_pwmStepContext = maa_pwm_init (m_stePin); + m_dirPinCtx = maa_gpio_init (m_dirPin); + if (m_dirPinCtx == NULL) { + fprintf (stderr, "Are you sure that pin%d you requested is valid on your platform?", m_dirPin); + exit (1); + } + + error = maa_gpio_dir (m_dirPinCtx, MAA_GPIO_OUT); + if (error != MAA_SUCCESS) { + maa_result_print (error); + } +} + +StepMotor::~StepMotor() { + maa_result_t error = MAA_SUCCESS; + + maa_pwm_close (m_pwmStepContext); + + error = maa_gpio_close (m_dirPinCtx); + if (error != MAA_SUCCESS) { + maa_result_print(error); + } +} + +void +StepMotor::setSpeed (int speed) { + if (speed > MAX_PERIOD) { + m_speed = MAX_PERIOD; + } + + if (speed < MIN_PERIOD) { + m_speed = MIN_PERIOD; + } + + m_speed = speed; +} + +maa_result_t +StepMotor::stepForward (int ticks) { + dirForward (); + move (ticks); +} + +maa_result_t +StepMotor::stepBackwards (int ticks) { + dirBackwards (); + move (ticks); +} + +maa_result_t +StepMotor::move (int ticks) { + maa_result_t error = MAA_SUCCESS; + + maa_pwm_enable (m_pwmStepContext, 1); + for (int tick = 0; tick < ticks; tick++) { + maa_pwm_period_us (m_pwmStepContext, m_speed); + maa_pwm_pulsewidth_us (m_pwmStepContext, PULSEWIDTH); + } + maa_pwm_enable (m_pwmStepContext, 0); + + return error; +} + +maa_result_t +StepMotor::dirForward () { + maa_result_t error = MAA_SUCCESS; + + error = maa_gpio_write (m_dirPinCtx, HIGH); + if (error != MAA_SUCCESS) { + maa_result_print (error); + } + + return error; +} + +maa_result_t +StepMotor::dirBackwards () { + maa_result_t error = MAA_SUCCESS; + + error = maa_gpio_write (m_dirPinCtx, LOW); + if (error != MAA_SUCCESS) { + maa_result_print (error); + } + + return error; +} diff --git a/src/step_motor/step_motor.h b/src/step_motor/step_motor.h new file mode 100644 index 0000000..f80ff65 --- /dev/null +++ b/src/step_motor/step_motor.h @@ -0,0 +1,101 @@ +/* + * Author: Yevgeniy Kiveisha + * Copyright (c) 2014 Intel Corporation. + * + * Credits to Adafruit. + * Based on Adafruit BMP085 library. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#pragma once + +#include +#include +#include +#include +#include + +#define MIN_PERIOD 500 +#define MAX_PERIOD 1000 +#define PULSEWIDTH 480 + +#define HIGH 1 +#define LOW 0 + +namespace upm { + +/** + * @brief C++ API for StepMotor Drivers + * + * This file defines the step_motor C++ interface for libstep_motor + * + * @snippet step_motor_example.cxx Interesting + */ +class StepMotor { + public: + /** + * Instanciates a StepMotor object + * + * @param dirPin direction pin + * @param stePin steper pulse pin + */ + StepMotor (int dirPin, int stePin); + + /** + * StepMotor object destructor. + */ + ~StepMotor (); + + /** + * Set the speed of rotation + * + * @param speed rotation speed + */ + void setSpeed (int speed); + + /** + * Rotate motor forward + * + * @param ticks number of tickes the motor will move + */ + maa_result_t stepForward (int ticks); + + /** + * Rotate motor backward + * + * @param ticks number of tickes the motor will move + */ + maa_result_t stepBackwards (int ticks); + + private: + std::string m_name; + + int m_dirPin; + int m_stePin; + int m_speed; + + maa_gpio_context m_dirPinCtx; + maa_pwm_context m_pwmStepContext; + + maa_result_t move (int ticks); + maa_result_t dirForward (); + maa_result_t dirBackwards (); + }; +} -- 2.7.4