dynamixel protocol engine
Fork of Dynamixel by
DynamixelBus.h@0:35c27ebd9e8e, 2015-12-10 (annotated)
- 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?
User | Revision | Line number | New 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__ |