Provides an interface to an AX-12A servo. Requires the Dynamixel bus protocol library

Dependents:   RobotArmDemo

Fork of AX-12A by robot arm demo team

Committer:
henryrawas
Date:
Sat Jan 23 00:08:04 2016 +0000
Revision:
12:f66c779ca018
Parent:
11:8de493bd8922
Child:
14:9afd50c38c80
refactor

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jepickett 0:1a48094c99d1 1 /* Copyright (c) 2012 Martin Smith, MIT License
henryrawas 12:f66c779ca018 2 * Copyright (C) 2016 Schakra Inc, MIT License
jepickett 0:1a48094c99d1 3 *
jepickett 0:1a48094c99d1 4 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
jepickett 0:1a48094c99d1 5 * and associated documentation files (the "Software"), to deal in the Software without restriction,
jepickett 0:1a48094c99d1 6 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
jepickett 0:1a48094c99d1 7 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
jepickett 0:1a48094c99d1 8 * furnished to do so, subject to the following conditions:
jepickett 0:1a48094c99d1 9 *
jepickett 0:1a48094c99d1 10 * The above copyright notice and this permission notice shall be included in all copies or
jepickett 0:1a48094c99d1 11 * substantial portions of the Software.
jepickett 0:1a48094c99d1 12 *
jepickett 0:1a48094c99d1 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
jepickett 0:1a48094c99d1 14 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
jepickett 0:1a48094c99d1 15 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
jepickett 0:1a48094c99d1 16 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
jepickett 0:1a48094c99d1 17 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
jepickett 0:1a48094c99d1 18 */
jepickett 0:1a48094c99d1 19
jepickett 0:1a48094c99d1 20 #ifndef MBED_AX12_H
jepickett 0:1a48094c99d1 21 #define MBED_AX12_H
jepickett 0:1a48094c99d1 22
jepickett 0:1a48094c99d1 23 #include "mbed.h"
jepickett 0:1a48094c99d1 24 #include "DynamixelBus.h"
henryrawas 12:f66c779ca018 25
jepickett 0:1a48094c99d1 26
jepickett 0:1a48094c99d1 27 enum ControlTable
jepickett 0:1a48094c99d1 28 {
jepickett 1:d7642b2e155d 29 ctModelNumberLow = 0, // RD
jepickett 1:d7642b2e155d 30 ctModelNumberHigh = 1, // RD
jepickett 1:d7642b2e155d 31 ctFirmwareVersion = 2, // RD
jepickett 1:d7642b2e155d 32 ctID = 3, // RD/WR
jepickett 1:d7642b2e155d 33 ctBaudRate = 4, // RD/WR
jepickett 1:d7642b2e155d 34 ctReturnDelayTime = 5, // RD/WR
jepickett 1:d7642b2e155d 35 ctCWAngleLimitL = 6, // RD/WR
jepickett 1:d7642b2e155d 36 ctCWAngleLimitH = 7, // RD/WR
jepickett 1:d7642b2e155d 37 ctCCWAngleLimitL = 8, // RD/WR
jepickett 1:d7642b2e155d 38 ctCCWAngleLimitH = 9, // RD/WR
jepickett 1:d7642b2e155d 39 ctReserved1 = 10,
jepickett 1:d7642b2e155d 40 ctTemperatureLimit = 11, // RD/WR
jepickett 1:d7642b2e155d 41 ctVoltageLow = 12, // RD/WR
jepickett 1:d7642b2e155d 42 ctVoltageHigh = 13, // RD/WR
jepickett 1:d7642b2e155d 43 ctMaxTorqueL = 14, // RD/WR
jepickett 1:d7642b2e155d 44 ctMaxTorqueH = 15, // RD/WR
jepickett 1:d7642b2e155d 45 ctStatusReturnLevel = 16, // RD/WR
jepickett 1:d7642b2e155d 46 ctAlarmLED = 17, // RD/WR
jepickett 1:d7642b2e155d 47 ctAlarmShutdown = 18, // RD/WR
jepickett 1:d7642b2e155d 48 ctReserved2 = 19,
jepickett 1:d7642b2e155d 49 ctDownCalibrationL = 20, // RR
jepickett 1:d7642b2e155d 50 ctDownCalibrationH = 21, // RD
jepickett 1:d7642b2e155d 51 ctUpCalibrationL = 22, // RD
jepickett 1:d7642b2e155d 52 ctUpCalibrationH = 23, // RD
jepickett 1:d7642b2e155d 53 ctTorqueEnable = 24, // RD/WR
jepickett 1:d7642b2e155d 54 ctLED = 25, // RD/WR
jepickett 1:d7642b2e155d 55 ctCWComplianceMargin = 26, // RD/WR
jepickett 1:d7642b2e155d 56 ctCCWComplianceMargin = 27, // RD/WR
jepickett 1:d7642b2e155d 57 ctCWComplianceSlope = 28, // RD/WR
jepickett 1:d7642b2e155d 58 ctCCWComplianceSlope = 29, // RD/WR
jepickett 1:d7642b2e155d 59 ctGoalPositionL = 30, // RD/WR
jepickett 1:d7642b2e155d 60 ctGoalPositionH = 31, // RD/WR
jepickett 1:d7642b2e155d 61 ctMovingSpeedL = 32, // RD/WR
jepickett 1:d7642b2e155d 62 ctMovingSpeedH = 33, // RD/WR
jepickett 1:d7642b2e155d 63 ctTorqueLimitL = 34, // RD/WR
jepickett 1:d7642b2e155d 64 ctTorqueLimitH = 35, // RD/WR
jepickett 1:d7642b2e155d 65 ctPresentPositionL = 36, // RD
jepickett 1:d7642b2e155d 66 ctPresentPositionH = 37, // RD
jepickett 1:d7642b2e155d 67 ctPresentSpeedL = 38, // RD
jepickett 1:d7642b2e155d 68 ctPresentSpeedH = 39, // RD
jepickett 1:d7642b2e155d 69 ctPresentLoadL = 40, // RD
jepickett 1:d7642b2e155d 70 ctPresentLoadH = 41, // RD
jepickett 1:d7642b2e155d 71 ctPresentVoltage = 42, // RD
jepickett 1:d7642b2e155d 72 ctPresentTemperature = 43, // RD
jepickett 1:d7642b2e155d 73 ctRegisteredInst = 44, // RD/WR
jepickett 1:d7642b2e155d 74 ctReserved3 = 45,
jepickett 1:d7642b2e155d 75 ctMoving = 46, // RD
jepickett 1:d7642b2e155d 76 ctLock = 47, // RD/WR
jepickett 1:d7642b2e155d 77 ctPunchL = 48, // RD/WR
jepickett 1:d7642b2e155d 78 ctPunchH = 49 // RD/WR
jepickett 0:1a48094c99d1 79 };
jepickett 0:1a48094c99d1 80
henryrawas 11:8de493bd8922 81 // to reduce time reading values from servo,
henryrawas 11:8de493bd8922 82 // we read values as a block from PresentPosition through Moving
henryrawas 11:8de493bd8922 83 // these are cached until ClearCache call
henryrawas 11:8de493bd8922 84 enum CachedControlTable
henryrawas 11:8de493bd8922 85 {
henryrawas 11:8de493bd8922 86 cctPresentPositionL = 36 - 36,
henryrawas 11:8de493bd8922 87 cctPresentPositionH = 37 - 36,
henryrawas 11:8de493bd8922 88 cctPresentSpeedL = 38 - 36,
henryrawas 11:8de493bd8922 89 cctPresentSpeedH = 39 - 36,
henryrawas 11:8de493bd8922 90 cctPresentLoadL = 40 - 36,
henryrawas 11:8de493bd8922 91 cctPresentLoadH = 41 - 36,
henryrawas 11:8de493bd8922 92 cctPresentVoltage = 42 - 36,
henryrawas 11:8de493bd8922 93 cctPresentTemperature = 43 - 36,
henryrawas 11:8de493bd8922 94 cctRegisteredInst = 44 - 36,
henryrawas 11:8de493bd8922 95 cctReserved3 = 45 - 36,
henryrawas 11:8de493bd8922 96 cctMoving = 46 - 36
henryrawas 11:8de493bd8922 97 };
henryrawas 11:8de493bd8922 98
henryrawas 11:8de493bd8922 99 const unsigned char AX12ReadBlockStart = ctPresentPositionL;
henryrawas 11:8de493bd8922 100 const unsigned char AX12ReadBlockLength = ctLock - ctPresentPositionL;
henryrawas 11:8de493bd8922 101
henryrawas 10:e4c9b94b5879 102 class AX12
jepickett 0:1a48094c99d1 103 {
jepickett 0:1a48094c99d1 104
jepickett 0:1a48094c99d1 105 public:
jepickett 0:1a48094c99d1 106 AX12(DynamixelBus* pbus, ServoId = 1);
jepickett 0:1a48094c99d1 107
henryrawas 11:8de493bd8922 108 // clear cache to force actual read from servo
henryrawas 11:8de493bd8922 109 void ClearCache();
henryrawas 11:8de493bd8922 110
jepickett 4:f2da3b1d9988 111 // sets the servo ID
jepickett 4:f2da3b1d9988 112 StatusCode SetServoId(char newId);
jepickett 4:f2da3b1d9988 113
jepickett 0:1a48094c99d1 114 // returns the status of the servo (connected/not connected + errors)
henryrawas 11:8de493bd8922 115 StatusCode Ping(void);
jepickett 0:1a48094c99d1 116
henryrawas 2:7b970151bf19 117 // Sets the goal position of the servo in degrees
jepickett 0:1a48094c99d1 118 StatusCode SetGoal(float degrees);
jepickett 0:1a48094c99d1 119
jepickett 0:1a48094c99d1 120 // determines if the servo is moving
jepickett 0:1a48094c99d1 121 bool IsMoving(void);
jepickett 0:1a48094c99d1 122
jepickett 0:1a48094c99d1 123 // gets the position of the servo in degrees
henryrawas 11:8de493bd8922 124 float GetPosition(void);
jepickett 0:1a48094c99d1 125
jepickett 0:1a48094c99d1 126 // gets the internal temperature of the servo
jepickett 1:d7642b2e155d 127 int GetTemperature(void);
jepickett 0:1a48094c99d1 128
jepickett 0:1a48094c99d1 129 // gets the servo power supply voltage
jepickett 0:1a48094c99d1 130 float GetSupplyVoltage(void);
jepickett 1:d7642b2e155d 131
henryrawas 11:8de493bd8922 132 // Sets the replay delay for dynamixel protocol
henryrawas 11:8de493bd8922 133 StatusCode SetReplyDelay(int us);
henryrawas 11:8de493bd8922 134
henryrawas 7:155ecc801119 135 // gets the servo load
henryrawas 7:155ecc801119 136 float GetLoad(void);
henryrawas 7:155ecc801119 137
jepickett 1:d7642b2e155d 138 // enables/disables holding torque
jepickett 1:d7642b2e155d 139 StatusCode TorqueEnable( bool );
jepickett 0:1a48094c99d1 140
henryrawas 2:7b970151bf19 141 // get last error
henryrawas 6:a702043b1420 142 virtual int GetLastError();
henryrawas 8:b6979be5a0a7 143
henryrawas 8:b6979be5a0a7 144 // check if has error
henryrawas 8:b6979be5a0a7 145 virtual bool HasError();
henryrawas 10:e4c9b94b5879 146
henryrawas 2:7b970151bf19 147
jepickett 0:1a48094c99d1 148 private :
jepickett 0:1a48094c99d1 149 ServoId _ID;
jepickett 0:1a48094c99d1 150 DynamixelBus* _pbus;
henryrawas 2:7b970151bf19 151
henryrawas 2:7b970151bf19 152 unsigned char _LastError;
henryrawas 2:7b970151bf19 153
henryrawas 11:8de493bd8922 154 unsigned char _ReadCache[AX12ReadBlockLength];
henryrawas 11:8de493bd8922 155 bool _HasReadCache;
henryrawas 11:8de493bd8922 156
henryrawas 11:8de493bd8922 157 StatusCode LoadReadCache();
jepickett 0:1a48094c99d1 158 };
jepickett 0:1a48094c99d1 159 #endif