dynamixel protocol engine

Dependents:   RobotArmDemo

Fork of Dynamixel by robot arm demo team

Committer:
jepickett
Date:
Thu Dec 10 21:43:35 2015 +0000
Revision:
0:35c27ebd9e8e
Child:
4:fe2a6b66cb85
initial dynamixel bus protocol implementation for FRDM-K64F. Lots of stuff left to flesh out.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jepickett 0:35c27ebd9e8e 1 /*
jepickett 0:35c27ebd9e8e 2 Copyright (c) 2015 Jonathan Pickett & Microsoft. Some appropriate open source license.
jepickett 0:35c27ebd9e8e 3 */
jepickett 0:35c27ebd9e8e 4
jepickett 0:35c27ebd9e8e 5 #ifndef __DYNAMIXEL_BUS_H__
jepickett 0:35c27ebd9e8e 6 #define __DYNAMIXEL_BUS_H__
jepickett 0:35c27ebd9e8e 7
jepickett 0:35c27ebd9e8e 8 #include "mbed.h"
jepickett 0:35c27ebd9e8e 9
jepickett 0:35c27ebd9e8e 10 #include <vector>
jepickett 0:35c27ebd9e8e 11 using namespace std;
jepickett 0:35c27ebd9e8e 12
jepickett 0:35c27ebd9e8e 13
jepickett 0:35c27ebd9e8e 14 enum InstructionTable
jepickett 0:35c27ebd9e8e 15 {
jepickett 0:35c27ebd9e8e 16 instructionPing = 0x1, // no action. obtain status packet.
jepickett 0:35c27ebd9e8e 17 instructionRead = 0x2, // write values in control table
jepickett 0:35c27ebd9e8e 18 instructionWrite = 0x3, // read values in control table
jepickett 0:35c27ebd9e8e 19 instructionWriteAction = 0x4, // write actions to be performed upon triggering
jepickett 0:35c27ebd9e8e 20 instructionTriggerAction = 0x5, // trigger stored actions
jepickett 0:35c27ebd9e8e 21 instructionReset = 0x6, // changes ALL control table vaalues to factory default
jepickett 0:35c27ebd9e8e 22 instructionSyncWrite = 0x83 // write to many servos at once
jepickett 0:35c27ebd9e8e 23 };
jepickett 0:35c27ebd9e8e 24
jepickett 0:35c27ebd9e8e 25
jepickett 0:35c27ebd9e8e 26 enum StatusCodes
jepickett 0:35c27ebd9e8e 27 {
jepickett 0:35c27ebd9e8e 28 statusValid = 0x80, // REVIEW: Not in spec. I am overloading this for Ping, such that a 0 return value = unit not found
jepickett 0:35c27ebd9e8e 29 instructionError = 0x40,
jepickett 0:35c27ebd9e8e 30 overloadError = 0x20,
jepickett 0:35c27ebd9e8e 31 checksumError = 0x10,
jepickett 0:35c27ebd9e8e 32 rangeError = 0x08,
jepickett 0:35c27ebd9e8e 33 overheatingError = 0x04,
jepickett 0:35c27ebd9e8e 34 angleLimitError = 0x02,
jepickett 0:35c27ebd9e8e 35 inputVoltageError = 0x01
jepickett 0:35c27ebd9e8e 36 };
jepickett 0:35c27ebd9e8e 37
jepickett 0:35c27ebd9e8e 38 typedef unsigned char StatusCode;
jepickett 0:35c27ebd9e8e 39
jepickett 0:35c27ebd9e8e 40 typedef vector<unsigned char> CommBuffer;
jepickett 0:35c27ebd9e8e 41
jepickett 0:35c27ebd9e8e 42 typedef unsigned char ServoId;
jepickett 0:35c27ebd9e8e 43
jepickett 0:35c27ebd9e8e 44 typedef pair< ServoId, CommBuffer > SyncIdDataPair;
jepickett 0:35c27ebd9e8e 45
jepickett 0:35c27ebd9e8e 46 class DynamixelBus
jepickett 0:35c27ebd9e8e 47 {
jepickett 0:35c27ebd9e8e 48 public:
jepickett 0:35c27ebd9e8e 49 DynamixelBus( PinName txUartPin, PinName rxUartPin, PinName txSelectPin, PinName rxSelectPin, int baud );
jepickett 0:35c27ebd9e8e 50
jepickett 0:35c27ebd9e8e 51 StatusCode Ping( ServoId id );
jepickett 0:35c27ebd9e8e 52 StatusCode Read( ServoId id, unsigned char controlTableStart, unsigned char bytesToRead, CommBuffer& data );
jepickett 0:35c27ebd9e8e 53 StatusCode Write( ServoId id, unsigned char controlTableStart, const CommBuffer& dataToWrite );
jepickett 0:35c27ebd9e8e 54 StatusCode WriteAction( ServoId id, unsigned char controlTableStart, const CommBuffer& dataToWrite );
jepickett 0:35c27ebd9e8e 55 void TriggerAction( ServoId id );
jepickett 0:35c27ebd9e8e 56 StatusCode HardReset( ServoId id );
jepickett 0:35c27ebd9e8e 57 StatusCode SyncWrite( unsigned char controlTableStart, unsigned char bytesToWrite, vector<SyncIdDataPair>& data );
jepickett 0:35c27ebd9e8e 58
jepickett 0:35c27ebd9e8e 59 private:
jepickett 0:35c27ebd9e8e 60 unsigned char CalculateTxPacketChecksum( CommBuffer& packet );
jepickett 0:35c27ebd9e8e 61 StatusCode send_ping( ServoId id );
jepickett 0:35c27ebd9e8e 62 StatusCode send_write( ServoId id, unsigned char controlTableStart, const CommBuffer& dataToWrite );
jepickett 0:35c27ebd9e8e 63 StatusCode send_read( ServoId id, unsigned char controlTableStart, unsigned char bytesToRead, CommBuffer& data );
jepickett 0:35c27ebd9e8e 64
jepickett 0:35c27ebd9e8e 65 private:
jepickett 0:35c27ebd9e8e 66 Serial _uart; // The uart the servos live on.
jepickett 0:35c27ebd9e8e 67 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 68 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 69
jepickett 0:35c27ebd9e8e 70 float _replyDelay; // The delay time between command being sent and response being sent by the servo.
jepickett 0:35c27ebd9e8e 71 int _baud; // baud of all connected servos
jepickett 0:35c27ebd9e8e 72 float _responseTimeout;
jepickett 0:35c27ebd9e8e 73 };
jepickett 0:35c27ebd9e8e 74
jepickett 0:35c27ebd9e8e 75 #endif // __DYNAMIXEL_BUS_H__