dynamixel protocol engine
Fork of Dynamixel by
DynamixelBus.h@4:fe2a6b66cb85, 2016-01-23 (annotated)
- Committer:
- henryrawas
- Date:
- Sat Jan 23 00:08:13 2016 +0000
- Revision:
- 4:fe2a6b66cb85
- Parent:
- 0:35c27ebd9e8e
- Child:
- 5:8b70bee8059b
refactor
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
henryrawas | 4:fe2a6b66cb85 | 1 | /* Copyright (C) 2016 Schakra 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__ |