dynamixel protocol engine

Dependents:   RobotArmDemo

Fork of Dynamixel by robot arm demo team

Committer:
henryrawas
Date:
Thu Feb 04 20:10:09 2016 +0000
Revision:
5:8b70bee8059b
Parent:
4:fe2a6b66cb85
update copyright

Who changed what in which revision?

UserRevisionLine numberNew contents of line
henryrawas 5:8b70bee8059b 1 /* Copyright (C) 2016 Telesensorics Inc, MIT License
henryrawas 4:fe2a6b66cb85 2 *
henryrawas 4:fe2a6b66cb85 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
henryrawas 4:fe2a6b66cb85 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
henryrawas 4:fe2a6b66cb85 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
henryrawas 4:fe2a6b66cb85 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
henryrawas 4:fe2a6b66cb85 7 * furnished to do so, subject to the following conditions:
henryrawas 4:fe2a6b66cb85 8 *
henryrawas 4:fe2a6b66cb85 9 * The above copyright notice and this permission notice shall be included in all copies or
henryrawas 4:fe2a6b66cb85 10 * substantial portions of the Software.
henryrawas 4:fe2a6b66cb85 11 *
henryrawas 4:fe2a6b66cb85 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
henryrawas 4:fe2a6b66cb85 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
henryrawas 4:fe2a6b66cb85 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
henryrawas 4:fe2a6b66cb85 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
henryrawas 4:fe2a6b66cb85 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
henryrawas 4:fe2a6b66cb85 17 */
henryrawas 4:fe2a6b66cb85 18
jepickett 0:35c27ebd9e8e 19
jepickett 0:35c27ebd9e8e 20 #ifndef __DYNAMIXEL_BUS_H__
jepickett 0:35c27ebd9e8e 21 #define __DYNAMIXEL_BUS_H__
jepickett 0:35c27ebd9e8e 22
jepickett 0:35c27ebd9e8e 23 #include "mbed.h"
jepickett 0:35c27ebd9e8e 24
jepickett 0:35c27ebd9e8e 25 #include <vector>
jepickett 0:35c27ebd9e8e 26 using namespace std;
jepickett 0:35c27ebd9e8e 27
jepickett 0:35c27ebd9e8e 28
jepickett 0:35c27ebd9e8e 29 enum InstructionTable
jepickett 0:35c27ebd9e8e 30 {
jepickett 0:35c27ebd9e8e 31 instructionPing = 0x1, // no action. obtain status packet.
jepickett 0:35c27ebd9e8e 32 instructionRead = 0x2, // write values in control table
jepickett 0:35c27ebd9e8e 33 instructionWrite = 0x3, // read values in control table
jepickett 0:35c27ebd9e8e 34 instructionWriteAction = 0x4, // write actions to be performed upon triggering
jepickett 0:35c27ebd9e8e 35 instructionTriggerAction = 0x5, // trigger stored actions
jepickett 0:35c27ebd9e8e 36 instructionReset = 0x6, // changes ALL control table vaalues to factory default
jepickett 0:35c27ebd9e8e 37 instructionSyncWrite = 0x83 // write to many servos at once
jepickett 0:35c27ebd9e8e 38 };
jepickett 0:35c27ebd9e8e 39
jepickett 0:35c27ebd9e8e 40
jepickett 0:35c27ebd9e8e 41 enum StatusCodes
jepickett 0:35c27ebd9e8e 42 {
jepickett 0:35c27ebd9e8e 43 statusValid = 0x80, // REVIEW: Not in spec. I am overloading this for Ping, such that a 0 return value = unit not found
jepickett 0:35c27ebd9e8e 44 instructionError = 0x40,
jepickett 0:35c27ebd9e8e 45 overloadError = 0x20,
jepickett 0:35c27ebd9e8e 46 checksumError = 0x10,
jepickett 0:35c27ebd9e8e 47 rangeError = 0x08,
jepickett 0:35c27ebd9e8e 48 overheatingError = 0x04,
jepickett 0:35c27ebd9e8e 49 angleLimitError = 0x02,
jepickett 0:35c27ebd9e8e 50 inputVoltageError = 0x01
jepickett 0:35c27ebd9e8e 51 };
jepickett 0:35c27ebd9e8e 52
jepickett 0:35c27ebd9e8e 53 typedef unsigned char StatusCode;
jepickett 0:35c27ebd9e8e 54
jepickett 0:35c27ebd9e8e 55 typedef vector<unsigned char> CommBuffer;
jepickett 0:35c27ebd9e8e 56
jepickett 0:35c27ebd9e8e 57 typedef unsigned char ServoId;
jepickett 0:35c27ebd9e8e 58
jepickett 0:35c27ebd9e8e 59 typedef pair< ServoId, CommBuffer > SyncIdDataPair;
jepickett 0:35c27ebd9e8e 60
jepickett 0:35c27ebd9e8e 61 class DynamixelBus
jepickett 0:35c27ebd9e8e 62 {
jepickett 0:35c27ebd9e8e 63 public:
jepickett 0:35c27ebd9e8e 64 DynamixelBus( PinName txUartPin, PinName rxUartPin, PinName txSelectPin, PinName rxSelectPin, int baud );
jepickett 0:35c27ebd9e8e 65
jepickett 0:35c27ebd9e8e 66 StatusCode Ping( ServoId id );
jepickett 0:35c27ebd9e8e 67 StatusCode Read( ServoId id, unsigned char controlTableStart, unsigned char bytesToRead, CommBuffer& data );
jepickett 0:35c27ebd9e8e 68 StatusCode Write( ServoId id, unsigned char controlTableStart, const CommBuffer& dataToWrite );
jepickett 0:35c27ebd9e8e 69 StatusCode WriteAction( ServoId id, unsigned char controlTableStart, const CommBuffer& dataToWrite );
jepickett 0:35c27ebd9e8e 70 void TriggerAction( ServoId id );
jepickett 0:35c27ebd9e8e 71 StatusCode HardReset( ServoId id );
jepickett 0:35c27ebd9e8e 72 StatusCode SyncWrite( unsigned char controlTableStart, unsigned char bytesToWrite, vector<SyncIdDataPair>& data );
jepickett 0:35c27ebd9e8e 73
jepickett 0:35c27ebd9e8e 74 private:
jepickett 0:35c27ebd9e8e 75 unsigned char CalculateTxPacketChecksum( CommBuffer& packet );
jepickett 0:35c27ebd9e8e 76 StatusCode send_ping( ServoId id );
jepickett 0:35c27ebd9e8e 77 StatusCode send_write( ServoId id, unsigned char controlTableStart, const CommBuffer& dataToWrite );
jepickett 0:35c27ebd9e8e 78 StatusCode send_read( ServoId id, unsigned char controlTableStart, unsigned char bytesToRead, CommBuffer& data );
jepickett 0:35c27ebd9e8e 79
jepickett 0:35c27ebd9e8e 80 private:
jepickett 0:35c27ebd9e8e 81 Serial _uart; // The uart the servos live on.
jepickett 0:35c27ebd9e8e 82 DigitalOut _txSelect; // Turn on to enable the tri-state buffer before sending data over the bus. Turn off when data has been sent.
jepickett 0:35c27ebd9e8e 83 DigitalOut _rxSelect; // Turn on to enable the tri-state buffer before receiving data over the bus. Turn off when data has been received.
jepickett 0:35c27ebd9e8e 84
jepickett 0:35c27ebd9e8e 85 float _replyDelay; // The delay time between command being sent and response being sent by the servo.
jepickett 0:35c27ebd9e8e 86 int _baud; // baud of all connected servos
jepickett 0:35c27ebd9e8e 87 float _responseTimeout;
jepickett 0:35c27ebd9e8e 88 };
jepickett 0:35c27ebd9e8e 89
jepickett 0:35c27ebd9e8e 90 #endif // __DYNAMIXEL_BUS_H__