雄介 太田 / Dynamixel

Dependents:   YOZAKURA_ARM YOZAKURA_ARM_USB YOZAKURA_ARM_USB_Keyboard YOZAKURA_ARM_Keyboard0424 ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers AX12.h Source File

AX12.h

00001 /* mbed AX-12+ Servo Library
00002  *
00003  * Copyright (c) 2010, cstyles (http://mbed.org)
00004  *
00005  * Permission is hereby granted, free of charge, to any person obtaining a copy
00006  * of this software and associated documentation files (the "Software"), to deal
00007  * in the Software without restriction, including without limitation the rights
00008  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00009  * copies of the Software, and to permit persons to whom the Software is
00010  * furnished to do so, subject to the following conditions:
00011  *
00012  * The above copyright notice and this permission notice shall be included in
00013  * all copies or substantial portions of the Software.
00014  *
00015  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00016  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00017  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00018  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00019  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00020  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00021  * THE SOFTWARE.
00022  */
00023 
00024 #ifndef MBED_AX12_H
00025 #define MBED_AX12_H
00026 
00027 #include "mbed.h"
00028 #include "SerialHalfDuplex.h"
00029 
00030 #define AX12_WRITE_DEBUG 0
00031 #define AX12_READ_DEBUG 0
00032 #define AX12_TRIGGER_DEBUG 0
00033 #define AX12_DEBUG 0
00034 #define AX12_ERROR_DEBUG 0
00035 
00036 #define AX12_REG_ID 0x3
00037 #define AX12_REG_CW_LIMIT 0x06
00038 #define AX12_REG_CCW_LIMIT 0x08
00039 #define AX12_REG_TORQUE_ENABLE 0x18
00040 #define AX12_REG_GOAL_POSITION 0x1E
00041 #define AX12_REG_MOVING_SPEED 0x20
00042 #define AX12_REG_VOLTS 0x2A
00043 #define AX12_REG_TEMP 0x2B
00044 #define AX12_REG_MOVING 0x2E
00045 #define AX12_REG_TORQUE_LIMIT 0x22
00046 #define AX12_REG_POSITION 0x24
00047 
00048 #define AX12_MODE_POSITION  0
00049 #define AX12_MODE_ROTATION  1
00050 
00051 #define AX12_CW 1
00052 #define AX12_CCW 0
00053 
00054 /** Servo control class, based on a PwmOut
00055  *
00056  * Example:
00057  * @code
00058  * #include "mbed.h"
00059  * #include "AX12.h"
00060  * 
00061  * int main() {
00062  * 
00063  *   AX12 myax12 (p9, p10, 1);
00064  *
00065  *   while (1) {
00066  *       myax12.SetGoal(0);    // go to 0 degrees
00067  *       wait (2.0);
00068  *       myax12.SetGoal(300);  // go to 300 degrees
00069  *       wait (2.0);
00070  *   }
00071  * }
00072  * @endcode
00073  */
00074 class AX12 {
00075 
00076 public:
00077 
00078     /** Create an AX12 servo object connected to the specified serial port, with the specified ID
00079      *
00080      * @param pin tx pin
00081      * @param pin rx pin 
00082      * @param int ID, the Bus ID of the servo 1-255 
00083      */
00084     AX12(PinName tx, PinName rx, int ID, int baudrate);
00085 
00086     /** Set the mode of the servo
00087      * @param mode
00088      *    0 = Positional, default
00089      *    1 = Continuous rotation
00090      */
00091     int SetMode(int mode);
00092 
00093     /** Set goal angle in integer degrees, in positional mode
00094      *
00095      * @param degrees 0-300
00096      * @param flags, defaults to 0
00097      *    flags[0] = blocking, return when goal position reached 
00098      *    flags[1] = register, activate with a broadcast trigger
00099      *
00100      */
00101     int SetGoal(int degrees, int flags = 0);
00102 
00103 
00104     /** Set the speed of the servo in continuous rotation mode
00105      *
00106      * @param speed, -1.0 to 1.0
00107      *   -1.0 = full speed counter clock wise
00108      *    1.0 = full speed clock wise
00109      */
00110     int SetCRSpeed(float speed);
00111 
00112 
00113     /** Set the clockwise limit of the servo
00114      *
00115      * @param degrees, 0-300
00116      */
00117     int SetCWLimit(int degrees);
00118     
00119     /** Set the counter-clockwise limit of the servo
00120      *
00121      * @param degrees, 0-300
00122      */
00123     int SetCCWLimit(int degrees);
00124 
00125     // Change the ID
00126 
00127     /** Change the ID of a servo
00128      *
00129      * @param CurentID 1-255
00130      * @param NewID 1-255
00131      *
00132      * If a servo ID is not know, the broadcast address of 0 can be used for CurrentID.
00133      * In this situation, only one servo should be connected to the bus
00134      */
00135     int SetID(int CurrentID, int NewID);
00136 
00137 
00138     /** Poll to see if the servo is moving
00139      *
00140      * @returns true is the servo is moving
00141      */
00142     int isMoving(void);
00143 
00144     /** Send the broadcast "trigger" command, to activate any outstanding registered commands
00145      */
00146     void trigger(void);
00147 
00148     /** Read the current angle of the servo
00149      *
00150      * @returns float in the range 0.0-300.0
00151      */
00152     float GetPosition();
00153 
00154     /** Read the temperature of the servo
00155      *
00156      * @returns float temperature 
00157      */
00158     float GetTemp(void);
00159 
00160     /** Read the supply voltage of the servo
00161      *
00162      * @returns float voltage
00163      */
00164     float GetVolts(void);
00165     
00166     int TorqueEnable(int mode);
00167     
00168     int SetTorqueLimit(float torque_limit);
00169 
00170 private :
00171 
00172     SerialHalfDuplex _ax12;
00173 //    Serial _ax12;
00174     int _ID;
00175 
00176     int read(int ID, int start, int length, char* data);
00177     int write(int ID, int start, int length, char* data, int flag=0);
00178 
00179 };
00180 
00181 #endif