|
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
- <title>AccelStepper: AccelStepper.h Source File</title>
- <link href="doxygen.css" rel="stylesheet" type="text/css">
- <link href="tabs.css" rel="stylesheet" type="text/css">
- </head><body>
- <!-- Generated by Doxygen 1.5.6 -->
- <div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main Page</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li class="current"><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <h1>AccelStepper.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// AccelStepper.h</span>
- <a name="l00002"></a>00002 <span class="comment">//</span><span class="comment"></span>
- <a name="l00003"></a>00003 <span class="comment">/// \mainpage AccelStepper library for Arduino</span>
- <a name="l00004"></a>00004 <span class="comment">///</span>
- <a name="l00005"></a>00005 <span class="comment">/// This is the Arduino AccelStepper library.</span>
- <a name="l00006"></a>00006 <span class="comment">/// It provides an object-oriented interface for 2 or 4 pin stepper motors.</span>
- <a name="l00007"></a>00007 <span class="comment">///</span>
- <a name="l00008"></a>00008 <span class="comment">/// The standard Arduino IDE includes the Stepper library</span>
- <a name="l00009"></a>00009 <span class="comment">/// (http://arduino.cc/en/Reference/Stepper) for stepper motors. It is</span>
- <a name="l00010"></a>00010 <span class="comment">/// perfectly adequate for simple, single motor applications.</span>
- <a name="l00011"></a>00011 <span class="comment">///</span>
- <a name="l00012"></a>00012 <span class="comment">/// AccelStepper significantly improves on the standard Arduino Stepper library in several ways:</span>
- <a name="l00013"></a>00013 <span class="comment">/// \li Supports acceleration and deceleration</span>
- <a name="l00014"></a>00014 <span class="comment">/// \li Supports multiple simultaneous steppers, with independent concurrent stepping on each stepper</span>
- <a name="l00015"></a>00015 <span class="comment">/// \li API functions never delay() or block</span>
- <a name="l00016"></a>00016 <span class="comment">/// \li Supports 2 and 4 wire steppers, plus 4 wire half steppers.</span>
- <a name="l00017"></a>00017 <span class="comment">/// \li Supports alternate stepping functions to enable support of AFMotor (https://github.com/adafruit/Adafruit-Motor-Shield-library)</span>
- <a name="l00018"></a>00018 <span class="comment">/// \li Supports stepper drivers such as the Sparkfun EasyDriver (based on 3967 driver chip)</span>
- <a name="l00019"></a>00019 <span class="comment">/// \li Very slow speeds are supported</span>
- <a name="l00020"></a>00020 <span class="comment">/// \li Extensive API</span>
- <a name="l00021"></a>00021 <span class="comment">/// \li Subclass support</span>
- <a name="l00022"></a>00022 <span class="comment">///</span>
- <a name="l00023"></a>00023 <span class="comment">/// The latest version of this documentation can be downloaded from </span>
- <a name="l00024"></a>00024 <span class="comment">/// http://www.open.com.au/mikem/arduino/AccelStepper</span>
- <a name="l00025"></a>00025 <span class="comment">///</span>
- <a name="l00026"></a>00026 <span class="comment">/// Example Arduino programs are included to show the main modes of use.</span>
- <a name="l00027"></a>00027 <span class="comment">///</span>
- <a name="l00028"></a>00028 <span class="comment">/// The version of the package that this documentation refers to can be downloaded </span>
- <a name="l00029"></a>00029 <span class="comment">/// from http://www.open.com.au/mikem/arduino/AccelStepper/AccelStepper-1.11.zip</span>
- <a name="l00030"></a>00030 <span class="comment">/// You can find the latest version at http://www.open.com.au/mikem/arduino/AccelStepper</span>
- <a name="l00031"></a>00031 <span class="comment">///</span>
- <a name="l00032"></a>00032 <span class="comment">/// Tested on Arduino Diecimila and Mega with arduino-0018 & arduino-0021 </span>
- <a name="l00033"></a>00033 <span class="comment">/// on OpenSuSE 11.1 and avr-libc-1.6.1-1.15,</span>
- <a name="l00034"></a>00034 <span class="comment">/// cross-avr-binutils-2.19-9.1, cross-avr-gcc-4.1.3_20080612-26.5.</span>
- <a name="l00035"></a>00035 <span class="comment">///</span>
- <a name="l00036"></a>00036 <span class="comment">/// \par Installation</span>
- <a name="l00037"></a>00037 <span class="comment">/// Install in the usual way: unzip the distribution zip file to the libraries</span>
- <a name="l00038"></a>00038 <span class="comment">/// sub-folder of your sketchbook. </span>
- <a name="l00039"></a>00039 <span class="comment">///</span>
- <a name="l00040"></a>00040 <span class="comment">/// This software is Copyright (C) 2010 Mike McCauley. Use is subject to license</span>
- <a name="l00041"></a>00041 <span class="comment">/// conditions. The main licensing options available are GPL V2 or Commercial:</span>
- <a name="l00042"></a>00042 <span class="comment">/// </span>
- <a name="l00043"></a>00043 <span class="comment">/// \par Open Source Licensing GPL V2</span>
- <a name="l00044"></a>00044 <span class="comment">/// This is the appropriate option if you want to share the source code of your</span>
- <a name="l00045"></a>00045 <span class="comment">/// application with everyone you distribute it to, and you also want to give them</span>
- <a name="l00046"></a>00046 <span class="comment">/// the right to share who uses it. If you wish to use this software under Open</span>
- <a name="l00047"></a>00047 <span class="comment">/// Source Licensing, you must contribute all your source code to the open source</span>
- <a name="l00048"></a>00048 <span class="comment">/// community in accordance with the GPL Version 2 when your application is</span>
- <a name="l00049"></a>00049 <span class="comment">/// distributed. See http://www.gnu.org/copyleft/gpl.html</span>
- <a name="l00050"></a>00050 <span class="comment">/// </span>
- <a name="l00051"></a>00051 <span class="comment">/// \par Commercial Licensing</span>
- <a name="l00052"></a>00052 <span class="comment">/// This is the appropriate option if you are creating proprietary applications</span>
- <a name="l00053"></a>00053 <span class="comment">/// and you are not prepared to distribute and share the source code of your</span>
- <a name="l00054"></a>00054 <span class="comment">/// application. Contact info@open.com.au for details.</span>
- <a name="l00055"></a>00055 <span class="comment">///</span>
- <a name="l00056"></a>00056 <span class="comment">/// \par Revision History</span>
- <a name="l00057"></a>00057 <span class="comment">/// \version 1.0 Initial release</span>
- <a name="l00058"></a>00058 <span class="comment">///</span>
- <a name="l00059"></a>00059 <span class="comment">/// \version 1.1 Added speed() function to get the current speed.</span>
- <a name="l00060"></a>00060 <span class="comment">/// \version 1.2 Added runSpeedToPosition() submitted by Gunnar Arndt.</span>
- <a name="l00061"></a>00061 <span class="comment">/// \version 1.3 Added support for stepper drivers (ie with Step and Direction inputs) with _pins == 1</span>
- <a name="l00062"></a>00062 <span class="comment">/// \version 1.4 Added functional contructor to support AFMotor, contributed by Limor, with example sketches.</span>
- <a name="l00063"></a>00063 <span class="comment">/// \version 1.5 Improvements contributed by Peter Mousley: Use of microsecond steps and other speed improvements</span>
- <a name="l00064"></a>00064 <span class="comment">/// to increase max stepping speed to about 4kHz. New option for user to set the min allowed pulse width.</span>
- <a name="l00065"></a>00065 <span class="comment">/// Added checks for already running at max speed and skip further calcs if so. </span>
- <a name="l00066"></a>00066 <span class="comment">/// \version 1.6 Fixed a problem with wrapping of microsecond stepping that could cause stepping to hang. </span>
- <a name="l00067"></a>00067 <span class="comment">/// Reported by Sandy Noble.</span>
- <a name="l00068"></a>00068 <span class="comment">/// Removed redundant _lastRunTime member.</span>
- <a name="l00069"></a>00069 <span class="comment">/// \version 1.7 Fixed a bug where setCurrentPosition() did always work as expected. Reported by Peter Linhart.</span>
- <a name="l00070"></a>00070 <span class="comment">/// Reported by Sandy Noble.</span>
- <a name="l00071"></a>00071 <span class="comment">/// Removed redundant _lastRunTime member.</span>
- <a name="l00072"></a>00072 <span class="comment">/// \version 1.8 Added support for 4 pin half-steppers, requested by Harvey Moon</span>
- <a name="l00073"></a>00073 <span class="comment">/// \version 1.9 setCurrentPosition() now also sets motor speed to 0.</span>
- <a name="l00074"></a>00074 <span class="comment">/// \version 1.10 Builds on Arduino 1.0</span>
- <a name="l00075"></a>00075 <span class="comment">/// \version 1.11 Improvments from Michael Ellison:</span>
- <a name="l00076"></a>00076 <span class="comment">/// Added optional enable line support for stepper drivers</span>
- <a name="l00077"></a>00077 <span class="comment">/// Added inversion for step/direction/enable lines for stepper drivers</span>
- <a name="l00078"></a>00078 <span class="comment">///</span>
- <a name="l00079"></a>00079 <span class="comment">/// \author Mike McCauley (mikem@open.com.au)</span>
- <a name="l00080"></a>00080 <span class="comment"></span><span class="comment">// Copyright (C) 2009 Mike McCauley</span>
- <a name="l00081"></a>00081 <span class="comment">// $Id: AccelStepper.h,v 1.5 2011/03/21 00:42:15 mikem Exp mikem $</span>
- <a name="l00082"></a>00082
- <a name="l00083"></a>00083 <span class="preprocessor">#ifndef AccelStepper_h</span>
- <a name="l00084"></a>00084 <span class="preprocessor"></span><span class="preprocessor">#define AccelStepper_h</span>
- <a name="l00085"></a>00085 <span class="preprocessor"></span>
- <a name="l00086"></a>00086 <span class="preprocessor">#include <stdlib.h></span>
- <a name="l00087"></a>00087 <span class="preprocessor">#if ARDUINO >= 100</span>
- <a name="l00088"></a>00088 <span class="preprocessor"></span><span class="preprocessor">#include <Arduino.h></span>
- <a name="l00089"></a>00089 <span class="preprocessor">#else</span>
- <a name="l00090"></a>00090 <span class="preprocessor"></span><span class="preprocessor">#include <wiring.h></span>
- <a name="l00091"></a>00091 <span class="preprocessor">#endif</span>
- <a name="l00092"></a>00092 <span class="preprocessor"></span>
- <a name="l00093"></a>00093 <span class="comment">// These defs cause trouble on some versions of Arduino</span>
- <a name="l00094"></a>00094 <span class="preprocessor">#undef round</span>
- <a name="l00095"></a>00095 <span class="preprocessor"></span><span class="comment"></span>
- <a name="l00096"></a>00096 <span class="comment">/////////////////////////////////////////////////////////////////////</span>
- <a name="l00097"></a>00097 <span class="comment">/// \class AccelStepper AccelStepper.h <AccelStepper.h></span>
- <a name="l00098"></a>00098 <span class="comment">/// \brief Support for stepper motors with acceleration etc.</span>
- <a name="l00099"></a>00099 <span class="comment">///</span>
- <a name="l00100"></a>00100 <span class="comment">/// This defines a single 2 or 4 pin stepper motor, or stepper moter with fdriver chip, with optional</span>
- <a name="l00101"></a>00101 <span class="comment">/// acceleration, deceleration, absolute positioning commands etc. Multiple</span>
- <a name="l00102"></a>00102 <span class="comment">/// simultaneous steppers are supported, all moving </span>
- <a name="l00103"></a>00103 <span class="comment">/// at different speeds and accelerations. </span>
- <a name="l00104"></a>00104 <span class="comment">///</span>
- <a name="l00105"></a>00105 <span class="comment">/// \par Operation</span>
- <a name="l00106"></a>00106 <span class="comment">/// This module operates by computing a step time in microseconds. The step</span>
- <a name="l00107"></a>00107 <span class="comment">/// time is recomputed after each step and after speed and acceleration</span>
- <a name="l00108"></a>00108 <span class="comment">/// parameters are changed by the caller. The time of each step is recorded in</span>
- <a name="l00109"></a>00109 <span class="comment">/// microseconds. The run() function steps the motor if a new step is due.</span>
- <a name="l00110"></a>00110 <span class="comment">/// The run() function must be called frequently until the motor is in the</span>
- <a name="l00111"></a>00111 <span class="comment">/// desired position, after which time run() will do nothing.</span>
- <a name="l00112"></a>00112 <span class="comment">///</span>
- <a name="l00113"></a>00113 <span class="comment">/// \par Positioning</span>
- <a name="l00114"></a>00114 <span class="comment">/// Positions are specified by a signed long integer. At</span>
- <a name="l00115"></a>00115 <span class="comment">/// construction time, the current position of the motor is consider to be 0. Positive</span>
- <a name="l00116"></a>00116 <span class="comment">/// positions are clockwise from the initial position; negative positions are</span>
- <a name="l00117"></a>00117 <span class="comment">/// anticlockwise. The curent position can be altered for instance after</span>
- <a name="l00118"></a>00118 <span class="comment">/// initialization positioning.</span>
- <a name="l00119"></a>00119 <span class="comment">///</span>
- <a name="l00120"></a>00120 <span class="comment">/// \par Caveats</span>
- <a name="l00121"></a>00121 <span class="comment">/// This is an open loop controller: If the motor stalls or is oversped,</span>
- <a name="l00122"></a>00122 <span class="comment">/// AccelStepper will not have a correct </span>
- <a name="l00123"></a>00123 <span class="comment">/// idea of where the motor really is (since there is no feedback of the motor's</span>
- <a name="l00124"></a>00124 <span class="comment">/// real position. We only know where we _think_ it is, relative to the</span>
- <a name="l00125"></a>00125 <span class="comment">/// initial starting point).</span>
- <a name="l00126"></a>00126 <span class="comment">///</span>
- <a name="l00127"></a>00127 <span class="comment">/// The fastest motor speed that can be reliably supported is 4000 steps per</span>
- <a name="l00128"></a>00128 <span class="comment">/// second (4 kHz) at a clock frequency of 16 MHz. However, any speed less than that</span>
- <a name="l00129"></a>00129 <span class="comment">/// down to very slow speeds (much less than one per second) are also supported,</span>
- <a name="l00130"></a>00130 <span class="comment">/// provided the run() function is called frequently enough to step the motor</span>
- <a name="l00131"></a>00131 <span class="comment">/// whenever required for the speed set.</span>
- <a name="l00132"></a><a class="code" href="classAccelStepper.html">00132</a> <span class="comment"></span><span class="keyword">class </span><a class="code" href="classAccelStepper.html" title="Support for stepper motors with acceleration etc.">AccelStepper</a>
- <a name="l00133"></a>00133 {
- <a name="l00134"></a>00134 <span class="keyword">public</span>:<span class="comment"></span>
- <a name="l00135"></a>00135 <span class="comment"> /// Constructor. You can have multiple simultaneous steppers, all moving</span>
- <a name="l00136"></a>00136 <span class="comment"> /// at different speeds and accelerations, provided you call their run()</span>
- <a name="l00137"></a>00137 <span class="comment"> /// functions at frequent enough intervals. Current Position is set to 0, target</span>
- <a name="l00138"></a>00138 <span class="comment"> /// position is set to 0. MaxSpeed and Acceleration default to 1.0.</span>
- <a name="l00139"></a>00139 <span class="comment"> /// The motor pins will be initialised to OUTPUT mode during the</span>
- <a name="l00140"></a>00140 <span class="comment"> /// constructor by a call to enableOutputs().</span>
- <a name="l00141"></a>00141 <span class="comment"> /// \param[in] pins Number of pins to interface to. 1, 2 or 4 are</span>
- <a name="l00142"></a>00142 <span class="comment"> /// supported. 1 means a stepper driver (with Step and Direction pins).</span>
- <a name="l00143"></a>00143 <span class="comment"> /// If an enable line is also needed, call setEnablePin() after construction.</span>
- <a name="l00144"></a>00144 <span class="comment"> /// You may also invert the pins using setPinsInverted().</span>
- <a name="l00145"></a>00145 <span class="comment"> /// 2 means a 2 wire stepper. 4 means a 4 wire stepper. 8 means a 4 wire half stepper</span>
- <a name="l00146"></a>00146 <span class="comment"> /// Defaults to 4 pins.</span>
- <a name="l00147"></a>00147 <span class="comment"> /// \param[in] pin1 Arduino digital pin number for motor pin 1. Defaults</span>
- <a name="l00148"></a>00148 <span class="comment"> /// to pin 2. For a driver (pins==1), this is the Step input to the driver. Low to high transition means to step)</span>
- <a name="l00149"></a>00149 <span class="comment"> /// \param[in] pin2 Arduino digital pin number for motor pin 2. Defaults</span>
- <a name="l00150"></a>00150 <span class="comment"> /// to pin 3. For a driver (pins==1), this is the Direction input the driver. High means forward.</span>
- <a name="l00151"></a>00151 <span class="comment"> /// \param[in] pin3 Arduino digital pin number for motor pin 3. Defaults</span>
- <a name="l00152"></a>00152 <span class="comment"> /// to pin 4.</span>
- <a name="l00153"></a>00153 <span class="comment"> /// \param[in] pin4 Arduino digital pin number for motor pin 4. Defaults</span>
- <a name="l00154"></a>00154 <span class="comment"> /// to pin 5.</span>
- <a name="l00155"></a>00155 <span class="comment"></span> <a class="code" href="classAccelStepper.html#a1290897df35915069e5eca9d034038c">AccelStepper</a>(uint8_t pins = 4, uint8_t pin1 = 2, uint8_t pin2 = 3, uint8_t pin3 = 4, uint8_t pin4 = 5);
- <a name="l00156"></a>00156 <span class="comment"></span>
- <a name="l00157"></a>00157 <span class="comment"> /// Alternate Constructor which will call your own functions for forward and backward steps. </span>
- <a name="l00158"></a>00158 <span class="comment"> /// You can have multiple simultaneous steppers, all moving</span>
- <a name="l00159"></a>00159 <span class="comment"> /// at different speeds and accelerations, provided you call their run()</span>
- <a name="l00160"></a>00160 <span class="comment"> /// functions at frequent enough intervals. Current Position is set to 0, target</span>
- <a name="l00161"></a>00161 <span class="comment"> /// position is set to 0. MaxSpeed and Acceleration default to 1.0.</span>
- <a name="l00162"></a>00162 <span class="comment"> /// Any motor initialization should happen before hand, no pins are used or initialized.</span>
- <a name="l00163"></a>00163 <span class="comment"> /// \param[in] forward void-returning procedure that will make a forward step</span>
- <a name="l00164"></a>00164 <span class="comment"> /// \param[in] backward void-returning procedure that will make a backward step</span>
- <a name="l00165"></a>00165 <span class="comment"></span> <a class="code" href="classAccelStepper.html#a1290897df35915069e5eca9d034038c">AccelStepper</a>(<span class="keywordtype">void</span> (*forward)(), <span class="keywordtype">void</span> (*backward)());
- <a name="l00166"></a>00166 <span class="comment"></span>
- <a name="l00167"></a>00167 <span class="comment"> /// Set the target position. The run() function will try to move the motor</span>
- <a name="l00168"></a>00168 <span class="comment"> /// from the current position to the target position set by the most</span>
- <a name="l00169"></a>00169 <span class="comment"> /// recent call to this function.</span>
- <a name="l00170"></a>00170 <span class="comment"> /// \param[in] absolute The desired absolute position. Negative is</span>
- <a name="l00171"></a>00171 <span class="comment"> /// anticlockwise from the 0 position.</span>
- <a name="l00172"></a>00172 <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classAccelStepper.html#ce236ede35f87c63d18da25810ec9736">moveTo</a>(<span class="keywordtype">long</span> absolute);
- <a name="l00173"></a>00173 <span class="comment"></span>
- <a name="l00174"></a>00174 <span class="comment"> /// Set the target position relative to the current position</span>
- <a name="l00175"></a>00175 <span class="comment"> /// \param[in] relative The desired position relative to the current position. Negative is</span>
- <a name="l00176"></a>00176 <span class="comment"> /// anticlockwise from the current position.</span>
- <a name="l00177"></a>00177 <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classAccelStepper.html#68942c66e78fb7f7b5f0cdade6eb7f06">move</a>(<span class="keywordtype">long</span> relative);
- <a name="l00178"></a>00178 <span class="comment"></span>
- <a name="l00179"></a>00179 <span class="comment"> /// Poll the motor and step it if a step is due, implementing</span>
- <a name="l00180"></a>00180 <span class="comment"> /// accelerations and decelerations to achive the ratget position. You must call this as</span>
- <a name="l00181"></a>00181 <span class="comment"> /// fequently as possible, but at least once per minimum step interval,</span>
- <a name="l00182"></a>00182 <span class="comment"> /// preferably in your main loop.</span>
- <a name="l00183"></a>00183 <span class="comment"> /// \return true if the motor is at the target position.</span>
- <a name="l00184"></a>00184 <span class="comment"></span> <span class="keywordtype">boolean</span> <a class="code" href="classAccelStepper.html#608b2395b64ac15451d16d0371fe13ce">run</a>();
- <a name="l00185"></a>00185 <span class="comment"></span>
- <a name="l00186"></a>00186 <span class="comment"> /// Poll the motor and step it if a step is due, implmenting a constant</span>
- <a name="l00187"></a>00187 <span class="comment"> /// speed as set by the most recent call to setSpeed().</span>
- <a name="l00188"></a>00188 <span class="comment"> /// \return true if the motor was stepped.</span>
- <a name="l00189"></a>00189 <span class="comment"></span> <span class="keywordtype">boolean</span> <a class="code" href="classAccelStepper.html#a4a6bdf99f698284faaeb5542b0b7514">runSpeed</a>();
- <a name="l00190"></a>00190 <span class="comment"></span>
- <a name="l00191"></a>00191 <span class="comment"> /// Sets the maximum permitted speed. the run() function will accelerate</span>
- <a name="l00192"></a>00192 <span class="comment"> /// up to the speed set by this function.</span>
- <a name="l00193"></a>00193 <span class="comment"> /// \param[in] speed The desired maximum speed in steps per second. Must</span>
- <a name="l00194"></a>00194 <span class="comment"> /// be > 0. Speeds of more than 1000 steps per second are unreliable. </span>
- <a name="l00195"></a>00195 <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classAccelStepper.html#bee8d466229b87accba33d6ec929c18f">setMaxSpeed</a>(<span class="keywordtype">float</span> <a class="code" href="classAccelStepper.html#4f0989d0ae264e7eadfe1fa720769fb6">speed</a>);
- <a name="l00196"></a>00196 <span class="comment"></span>
- <a name="l00197"></a>00197 <span class="comment"> /// Sets the acceleration and deceleration parameter.</span>
- <a name="l00198"></a>00198 <span class="comment"> /// \param[in] acceleration The desired acceleration in steps per second</span>
- <a name="l00199"></a>00199 <span class="comment"> /// per second. Must be > 0.</span>
- <a name="l00200"></a>00200 <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classAccelStepper.html#dfb19e3cd2a028a1fe78131787604fd1">setAcceleration</a>(<span class="keywordtype">float</span> acceleration);
- <a name="l00201"></a>00201 <span class="comment"></span>
- <a name="l00202"></a>00202 <span class="comment"> /// Sets the desired constant speed for use with runSpeed().</span>
- <a name="l00203"></a>00203 <span class="comment"> /// \param[in] speed The desired constant speed in steps per</span>
- <a name="l00204"></a>00204 <span class="comment"> /// second. Positive is clockwise. Speeds of more than 1000 steps per</span>
- <a name="l00205"></a>00205 <span class="comment"> /// second are unreliable. Very slow speeds may be set (eg 0.00027777 for</span>
- <a name="l00206"></a>00206 <span class="comment"> /// once per hour, approximately. Speed accuracy depends on the Arduino</span>
- <a name="l00207"></a>00207 <span class="comment"> /// crystal. Jitter depends on how frequently you call the runSpeed() function.</span>
- <a name="l00208"></a>00208 <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classAccelStepper.html#e79c49ad69d5ccc9da0ee691fa4ca235">setSpeed</a>(<span class="keywordtype">float</span> speed);
- <a name="l00209"></a>00209 <span class="comment"></span>
- <a name="l00210"></a>00210 <span class="comment"> /// The most recently set speed</span>
- <a name="l00211"></a>00211 <span class="comment"> /// \return the most recent speed in steps per second</span>
- <a name="l00212"></a>00212 <span class="comment"></span> <span class="keywordtype">float</span> <a class="code" href="classAccelStepper.html#4f0989d0ae264e7eadfe1fa720769fb6">speed</a>();
- <a name="l00213"></a>00213 <span class="comment"></span>
- <a name="l00214"></a>00214 <span class="comment"> /// The distance from the current position to the target position.</span>
- <a name="l00215"></a>00215 <span class="comment"> /// \return the distance from the current position to the target position</span>
- <a name="l00216"></a>00216 <span class="comment"> /// in steps. Positive is clockwise from the current position.</span>
- <a name="l00217"></a>00217 <span class="comment"></span> <span class="keywordtype">long</span> <a class="code" href="classAccelStepper.html#748665c3962e66fbc0e9373eb14c69c1">distanceToGo</a>();
- <a name="l00218"></a>00218 <span class="comment"></span>
- <a name="l00219"></a>00219 <span class="comment"> /// The most recently set target position.</span>
- <a name="l00220"></a>00220 <span class="comment"> /// \return the target position</span>
- <a name="l00221"></a>00221 <span class="comment"> /// in steps. Positive is clockwise from the 0 position.</span>
- <a name="l00222"></a>00222 <span class="comment"></span> <span class="keywordtype">long</span> <a class="code" href="classAccelStepper.html#96685e0945b7cf75d5959da679cd911e">targetPosition</a>();
- <a name="l00223"></a>00223
- <a name="l00224"></a>00224 <span class="comment"></span>
- <a name="l00225"></a>00225 <span class="comment"> /// The currently motor position.</span>
- <a name="l00226"></a>00226 <span class="comment"> /// \return the current motor position</span>
- <a name="l00227"></a>00227 <span class="comment"> /// in steps. Positive is clockwise from the 0 position.</span>
- <a name="l00228"></a>00228 <span class="comment"></span> <span class="keywordtype">long</span> <a class="code" href="classAccelStepper.html#5dce13ab2a1b02b8f443318886bf6fc5">currentPosition</a>();
- <a name="l00229"></a>00229 <span class="comment"></span>
- <a name="l00230"></a>00230 <span class="comment"> /// Resets the current position of the motor, so that wherever the motor</span>
- <a name="l00231"></a>00231 <span class="comment"> /// happens to be right now is considered to be the new 0 position. Useful</span>
- <a name="l00232"></a>00232 <span class="comment"> /// for setting a zero position on a stepper after an initial hardware</span>
- <a name="l00233"></a>00233 <span class="comment"> /// positioning move.</span>
- <a name="l00234"></a>00234 <span class="comment"> /// Has the side effect of setting the current motor speed to 0.</span>
- <a name="l00235"></a>00235 <span class="comment"> /// \param[in] position The position in steps of wherever the motor</span>
- <a name="l00236"></a>00236 <span class="comment"> /// happens to be right now.</span>
- <a name="l00237"></a>00237 <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classAccelStepper.html#9d917f014317fb9d3b5dc14e66f6c689">setCurrentPosition</a>(<span class="keywordtype">long</span> position);
- <a name="l00238"></a>00238 <span class="comment"></span>
- <a name="l00239"></a>00239 <span class="comment"> /// Moves the motor to the target position and blocks until it is at</span>
- <a name="l00240"></a>00240 <span class="comment"> /// position. Dont use this in event loops, since it blocks.</span>
- <a name="l00241"></a>00241 <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classAccelStepper.html#344f58fef8cc34ac5aa75ba4b665d21c">runToPosition</a>();
- <a name="l00242"></a>00242 <span class="comment"></span>
- <a name="l00243"></a>00243 <span class="comment"> /// Runs at the currently selected speed until the target position is reached</span>
- <a name="l00244"></a>00244 <span class="comment"> /// Does not implement accelerations.</span>
- <a name="l00245"></a>00245 <span class="comment"></span> <span class="keywordtype">boolean</span> <a class="code" href="classAccelStepper.html#9270d20336e76ac1fd5bcd5b9c34f301">runSpeedToPosition</a>();
- <a name="l00246"></a>00246 <span class="comment"></span>
- <a name="l00247"></a>00247 <span class="comment"> /// Moves the motor to the new target position and blocks until it is at</span>
- <a name="l00248"></a>00248 <span class="comment"> /// position. Dont use this in event loops, since it blocks.</span>
- <a name="l00249"></a>00249 <span class="comment"> /// \param[in] position The new target position.</span>
- <a name="l00250"></a>00250 <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classAccelStepper.html#176c5d2e4c2f21e9e92b12e39a6f0e67">runToNewPosition</a>(<span class="keywordtype">long</span> position);
- <a name="l00251"></a>00251 <span class="comment"></span>
- <a name="l00252"></a>00252 <span class="comment"> /// Disable motor pin outputs by setting them all LOW</span>
- <a name="l00253"></a>00253 <span class="comment"> /// Depending on the design of your electronics this may turn off</span>
- <a name="l00254"></a>00254 <span class="comment"> /// the power to the motor coils, saving power.</span>
- <a name="l00255"></a>00255 <span class="comment"> /// This is useful to support Arduino low power modes: disable the outputs</span>
- <a name="l00256"></a>00256 <span class="comment"> /// during sleep and then reenable with enableOutputs() before stepping</span>
- <a name="l00257"></a>00257 <span class="comment"> /// again.</span>
- <a name="l00258"></a>00258 <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classAccelStepper.html#3591e29a236e2935afd7f64ff6c22006">disableOutputs</a>();
- <a name="l00259"></a>00259 <span class="comment"></span>
- <a name="l00260"></a>00260 <span class="comment"> /// Enable motor pin outputs by setting the motor pins to OUTPUT</span>
- <a name="l00261"></a>00261 <span class="comment"> /// mode. Called automatically by the constructor.</span>
- <a name="l00262"></a>00262 <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classAccelStepper.html#a279a50d30d0413f570c692cff071643">enableOutputs</a>();
- <a name="l00263"></a>00263 <span class="comment"></span>
- <a name="l00264"></a>00264 <span class="comment"> /// Sets the minimum pulse width allowed by the stepper driver.</span>
- <a name="l00265"></a>00265 <span class="comment"> /// \param[in] minWidth The minimum pulse width in microseconds.</span>
- <a name="l00266"></a>00266 <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classAccelStepper.html#f4d3818e691dad5dc518308796ccf154">setMinPulseWidth</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> minWidth);
- <a name="l00267"></a>00267 <span class="comment"></span>
- <a name="l00268"></a>00268 <span class="comment"> /// Sets the enable pin number for stepper drivers.</span>
- <a name="l00269"></a>00269 <span class="comment"> /// 0xFF indicates unused (default).</span>
- <a name="l00270"></a>00270 <span class="comment"> /// Otherwise, if a pin is set, the pin will be turned on when </span>
- <a name="l00271"></a>00271 <span class="comment"> /// enableOutputs() is called and switched off when disableOutputs() </span>
- <a name="l00272"></a>00272 <span class="comment"> /// is called.</span>
- <a name="l00273"></a>00273 <span class="comment"> /// \param[in] enablePin Arduino digital pin number for motor enable</span>
- <a name="l00274"></a>00274 <span class="comment"> /// \sa setPinsInverted</span>
- <a name="l00275"></a>00275 <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classAccelStepper.html#56a81c5f00d02ca19646718e88e974c0">setEnablePin</a>(uint8_t enablePin = 0xff);
- <a name="l00276"></a>00276 <span class="comment"></span>
- <a name="l00277"></a>00277 <span class="comment"> /// Sets the inversion for stepper driver pins</span>
- <a name="l00278"></a>00278 <span class="comment"> /// \param[in] direction True for inverted direction pin, false for non-inverted</span>
- <a name="l00279"></a>00279 <span class="comment"> /// \param[in] step True for inverted step pin, false for non-inverted</span>
- <a name="l00280"></a>00280 <span class="comment"> /// \param[in] enable True for inverted enable pin, false (default) for non-inverted</span>
- <a name="l00281"></a>00281 <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classAccelStepper.html#797b4bdb580d4ca7a1cfeabe3df0de35">setPinsInverted</a>(<span class="keywordtype">bool</span> direction, <span class="keywordtype">bool</span> <a class="code" href="classAccelStepper.html#3c9a220819d2451f79ff8a0c0a395b9f">step</a>, <span class="keywordtype">bool</span> enable = <span class="keyword">false</span>);
- <a name="l00282"></a>00282
- <a name="l00283"></a>00283 <span class="keyword">protected</span>:
- <a name="l00284"></a>00284 <span class="comment"></span>
- <a name="l00285"></a>00285 <span class="comment"> /// Forces the library to compute a new instantaneous speed and set that as</span>
- <a name="l00286"></a>00286 <span class="comment"> /// the current speed. Calls</span>
- <a name="l00287"></a>00287 <span class="comment"> /// desiredSpeed(), which can be overridden by subclasses. It is called by</span>
- <a name="l00288"></a>00288 <span class="comment"> /// the library:</span>
- <a name="l00289"></a>00289 <span class="comment"> /// \li after each step</span>
- <a name="l00290"></a>00290 <span class="comment"> /// \li after change to maxSpeed through setMaxSpeed()</span>
- <a name="l00291"></a>00291 <span class="comment"> /// \li after change to acceleration through setAcceleration()</span>
- <a name="l00292"></a>00292 <span class="comment"> /// \li after change to target position (relative or absolute) through</span>
- <a name="l00293"></a>00293 <span class="comment"> /// move() or moveTo()</span>
- <a name="l00294"></a>00294 <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classAccelStepper.html#ffbee789b5c19165846cf0409860ae79">computeNewSpeed</a>();
- <a name="l00295"></a>00295 <span class="comment"></span>
- <a name="l00296"></a>00296 <span class="comment"> /// Called to execute a step. Only called when a new step is</span>
- <a name="l00297"></a>00297 <span class="comment"> /// required. Subclasses may override to implement new stepping</span>
- <a name="l00298"></a>00298 <span class="comment"> /// interfaces. The default calls step1(), step2(), step4() or step8() depending on the</span>
- <a name="l00299"></a>00299 <span class="comment"> /// number of pins defined for the stepper.</span>
- <a name="l00300"></a>00300 <span class="comment"> /// \param[in] step The current step phase number (0 to 7)</span>
- <a name="l00301"></a>00301 <span class="comment"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classAccelStepper.html#3c9a220819d2451f79ff8a0c0a395b9f">step</a>(uint8_t step);
- <a name="l00302"></a>00302 <span class="comment"></span>
- <a name="l00303"></a>00303 <span class="comment"> /// Called to execute a step using stepper functions (pins = 0) Only called when a new step is</span>
- <a name="l00304"></a>00304 <span class="comment"> /// required. Calls _forward() or _backward() to perform the step</span>
- <a name="l00305"></a>00305 <span class="comment"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classAccelStepper.html#889f109756aa4c0a2feefebd8081a337">step0</a>(<span class="keywordtype">void</span>);
- <a name="l00306"></a>00306 <span class="comment"></span>
- <a name="l00307"></a>00307 <span class="comment"> /// Called to execute a step on a stepper drover (ie where pins == 1). Only called when a new step is</span>
- <a name="l00308"></a>00308 <span class="comment"> /// required. Subclasses may override to implement new stepping</span>
- <a name="l00309"></a>00309 <span class="comment"> /// interfaces. The default sets or clears the outputs of Step pin1 to step, </span>
- <a name="l00310"></a>00310 <span class="comment"> /// and sets the output of _pin2 to the desired direction. The Step pin (_pin1) is pulsed for 1 microsecond</span>
- <a name="l00311"></a>00311 <span class="comment"> /// which is the minimum STEP pulse width for the 3967 driver.</span>
- <a name="l00312"></a>00312 <span class="comment"> /// \param[in] step The current step phase number (0 to 7)</span>
- <a name="l00313"></a>00313 <span class="comment"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classAccelStepper.html#cc64254ea242b53588e948335fd9305f">step1</a>(uint8_t step);
- <a name="l00314"></a>00314 <span class="comment"></span>
- <a name="l00315"></a>00315 <span class="comment"> /// Called to execute a step on a 2 pin motor. Only called when a new step is</span>
- <a name="l00316"></a>00316 <span class="comment"> /// required. Subclasses may override to implement new stepping</span>
- <a name="l00317"></a>00317 <span class="comment"> /// interfaces. The default sets or clears the outputs of pin1 and pin2</span>
- <a name="l00318"></a>00318 <span class="comment"> /// \param[in] step The current step phase number (0 to 7)</span>
- <a name="l00319"></a>00319 <span class="comment"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classAccelStepper.html#88f11bf6361fe002585f731d34fe2e8b">step2</a>(uint8_t step);
- <a name="l00320"></a>00320 <span class="comment"></span>
- <a name="l00321"></a>00321 <span class="comment"> /// Called to execute a step on a 4 pin motor. Only called when a new step is</span>
- <a name="l00322"></a>00322 <span class="comment"> /// required. Subclasses may override to implement new stepping</span>
- <a name="l00323"></a>00323 <span class="comment"> /// interfaces. The default sets or clears the outputs of pin1, pin2,</span>
- <a name="l00324"></a>00324 <span class="comment"> /// pin3, pin4.</span>
- <a name="l00325"></a>00325 <span class="comment"> /// \param[in] step The current step phase number (0 to 7)</span>
- <a name="l00326"></a>00326 <span class="comment"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classAccelStepper.html#49e448d179bbe4e0f8003a3f9993789d">step4</a>(uint8_t step);
- <a name="l00327"></a>00327 <span class="comment"></span>
- <a name="l00328"></a>00328 <span class="comment"> /// Called to execute a step on a 4 pin half-steper motor. Only called when a new step is</span>
- <a name="l00329"></a>00329 <span class="comment"> /// required. Subclasses may override to implement new stepping</span>
- <a name="l00330"></a>00330 <span class="comment"> /// interfaces. The default sets or clears the outputs of pin1, pin2,</span>
- <a name="l00331"></a>00331 <span class="comment"> /// pin3, pin4.</span>
- <a name="l00332"></a>00332 <span class="comment"> /// \param[in] step The current step phase number (0 to 7)</span>
- <a name="l00333"></a>00333 <span class="comment"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classAccelStepper.html#5b33d1088e2beaf2176c42b08fb675ea">step8</a>(uint8_t step);
- <a name="l00334"></a>00334 <span class="comment"></span>
- <a name="l00335"></a>00335 <span class="comment"> /// Compute and return the desired speed. The default algorithm uses</span>
- <a name="l00336"></a>00336 <span class="comment"> /// maxSpeed, acceleration and the current speed to set a new speed to</span>
- <a name="l00337"></a>00337 <span class="comment"> /// move the motor from teh current position to the target</span>
- <a name="l00338"></a>00338 <span class="comment"> /// position. Subclasses may override this to provide an alternate</span>
- <a name="l00339"></a>00339 <span class="comment"> /// algorithm (but do not block). Called by computeNewSpeed whenever a new speed neds to be</span>
- <a name="l00340"></a>00340 <span class="comment"> /// computed. </span>
- <a name="l00341"></a>00341 <span class="comment"></span> <span class="keyword">virtual</span> <span class="keywordtype">float</span> <a class="code" href="classAccelStepper.html#6e4bd79c395e69beee31d76d0d3287e4">desiredSpeed</a>();
- <a name="l00342"></a>00342
- <a name="l00343"></a>00343 <span class="keyword">private</span>:<span class="comment"></span>
- <a name="l00344"></a>00344 <span class="comment"> /// Number of pins on the stepper motor. Permits 2 or 4. 2 pins is a</span>
- <a name="l00345"></a>00345 <span class="comment"> /// bipolar, and 4 pins is a unipolar.</span>
- <a name="l00346"></a>00346 <span class="comment"></span> uint8_t _pins; <span class="comment">// 2 or 4</span>
- <a name="l00347"></a>00347 <span class="comment"></span>
- <a name="l00348"></a>00348 <span class="comment"> /// Arduino pin number for the 2 or 4 pins required to interface to the</span>
- <a name="l00349"></a>00349 <span class="comment"> /// stepper motor.</span>
- <a name="l00350"></a>00350 <span class="comment"></span> uint8_t _pin1, _pin2, _pin3, _pin4;
- <a name="l00351"></a>00351 <span class="comment"></span>
- <a name="l00352"></a>00352 <span class="comment"> /// The current absolution position in steps.</span>
- <a name="l00353"></a>00353 <span class="comment"></span> <span class="keywordtype">long</span> _currentPos; <span class="comment">// Steps</span>
- <a name="l00354"></a>00354 <span class="comment"></span>
- <a name="l00355"></a>00355 <span class="comment"> /// The target position in steps. The AccelStepper library will move the</span>
- <a name="l00356"></a>00356 <span class="comment"> /// motor from the _currentPos to the _targetPos, taking into account the</span>
- <a name="l00357"></a>00357 <span class="comment"> /// max speed, acceleration and deceleration</span>
- <a name="l00358"></a>00358 <span class="comment"></span> <span class="keywordtype">long</span> _targetPos; <span class="comment">// Steps</span>
- <a name="l00359"></a>00359 <span class="comment"></span>
- <a name="l00360"></a>00360 <span class="comment"> /// The current motos speed in steps per second</span>
- <a name="l00361"></a>00361 <span class="comment"> /// Positive is clockwise</span>
- <a name="l00362"></a>00362 <span class="comment"></span> <span class="keywordtype">float</span> _speed; <span class="comment">// Steps per second</span>
- <a name="l00363"></a>00363 <span class="comment"></span>
- <a name="l00364"></a>00364 <span class="comment"> /// The maximum permitted speed in steps per second. Must be > 0.</span>
- <a name="l00365"></a>00365 <span class="comment"></span> <span class="keywordtype">float</span> _maxSpeed;
- <a name="l00366"></a>00366 <span class="comment"></span>
- <a name="l00367"></a>00367 <span class="comment"> /// The acceleration to use to accelerate or decelerate the motor in steps</span>
- <a name="l00368"></a>00368 <span class="comment"> /// per second per second. Must be > 0</span>
- <a name="l00369"></a>00369 <span class="comment"></span> <span class="keywordtype">float</span> _acceleration;
- <a name="l00370"></a>00370 <span class="comment"></span>
- <a name="l00371"></a>00371 <span class="comment"> /// The current interval between steps in microseconds</span>
- <a name="l00372"></a>00372 <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> _stepInterval;
- <a name="l00373"></a>00373 <span class="comment"></span>
- <a name="l00374"></a>00374 <span class="comment"> /// The last step time in microseconds</span>
- <a name="l00375"></a>00375 <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> _lastStepTime;
- <a name="l00376"></a>00376 <span class="comment"></span>
- <a name="l00377"></a>00377 <span class="comment"> /// The minimum allowed pulse width in microseconds</span>
- <a name="l00378"></a>00378 <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> _minPulseWidth;
- <a name="l00379"></a>00379 <span class="comment"></span>
- <a name="l00380"></a>00380 <span class="comment"> /// Is the direction pin inverted?</span>
- <a name="l00381"></a>00381 <span class="comment"></span> <span class="keywordtype">bool</span> _dirInverted;
- <a name="l00382"></a>00382 <span class="comment"></span>
- <a name="l00383"></a>00383 <span class="comment"> /// Is the step pin inverted?</span>
- <a name="l00384"></a>00384 <span class="comment"></span> <span class="keywordtype">bool</span> _stepInverted;
- <a name="l00385"></a>00385 <span class="comment"></span>
- <a name="l00386"></a>00386 <span class="comment"> /// Is the enable pin inverted?</span>
- <a name="l00387"></a>00387 <span class="comment"></span> <span class="keywordtype">bool</span> _enableInverted;
- <a name="l00388"></a>00388 <span class="comment"></span>
- <a name="l00389"></a>00389 <span class="comment"> /// Enable pin for stepper driver, or 0xFF if unused.</span>
- <a name="l00390"></a>00390 <span class="comment"></span> uint8_t _enablePin;
- <a name="l00391"></a>00391
- <a name="l00392"></a>00392 <span class="comment">// The pointer to a forward-step procedure</span>
- <a name="l00393"></a>00393 void (*_forward)();
- <a name="l00394"></a>00394
- <a name="l00395"></a>00395 <span class="comment">// The pointer to a backward-step procedure</span>
- <a name="l00396"></a>00396 void (*_backward)();
- <a name="l00397"></a>00397 };
- <a name="l00398"></a>00398
- <a name="l00399"></a>00399 <span class="preprocessor">#endif </span>
- </pre></div></div>
- <hr size="1"><address style="text-align: right;"><small>Generated on Sun Jan 8 17:27:41 2012 for AccelStepper by
- <a href="http://www.doxygen.org/index.html">
- <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.6 </small></address>
- </body>
- </html>
|