demo project
Dependencies: AX-12A Dynamixel mbed iothub_client EthernetInterface NTPClient ConfigFile SDFileSystem iothub_amqp_transport mbed-rtos proton-c-mbed wolfSSL
RobotArm.h@4:36a4eceb1b7f, 2015-12-23 (annotated)
- Committer:
- henryrawas
- Date:
- Wed Dec 23 18:34:06 2015 +0000
- Revision:
- 4:36a4eceb1b7f
- Child:
- 5:36916b1c5a06
RobotArm plus publish IoTHub status
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
henryrawas | 4:36a4eceb1b7f | 1 | /* |
henryrawas | 4:36a4eceb1b7f | 2 | Copyright (c) 2015 Jonathan Pickett & Microsoft. Some appropriate open source license. |
henryrawas | 4:36a4eceb1b7f | 3 | */ |
henryrawas | 4:36a4eceb1b7f | 4 | |
henryrawas | 4:36a4eceb1b7f | 5 | #ifndef __ROBOT_ARM_H__ |
henryrawas | 4:36a4eceb1b7f | 6 | #define __ROBOT_ARM_H__ |
henryrawas | 4:36a4eceb1b7f | 7 | |
henryrawas | 4:36a4eceb1b7f | 8 | #include "mbed.h" |
henryrawas | 4:36a4eceb1b7f | 9 | #include "rtos.h" |
henryrawas | 4:36a4eceb1b7f | 10 | |
henryrawas | 4:36a4eceb1b7f | 11 | #include "DynamixelBus.h" |
henryrawas | 4:36a4eceb1b7f | 12 | #include "RobotNode.h" |
henryrawas | 4:36a4eceb1b7f | 13 | |
henryrawas | 4:36a4eceb1b7f | 14 | #define MAX_PARTS 8 |
henryrawas | 4:36a4eceb1b7f | 15 | |
henryrawas | 4:36a4eceb1b7f | 16 | |
henryrawas | 4:36a4eceb1b7f | 17 | enum ArmAction |
henryrawas | 4:36a4eceb1b7f | 18 | { |
henryrawas | 4:36a4eceb1b7f | 19 | AA_RunSeq = 0x1, |
henryrawas | 4:36a4eceb1b7f | 20 | AA_Status = 0x2, |
henryrawas | 4:36a4eceb1b7f | 21 | AA_Alert = 0x3 |
henryrawas | 4:36a4eceb1b7f | 22 | }; |
henryrawas | 4:36a4eceb1b7f | 23 | |
henryrawas | 4:36a4eceb1b7f | 24 | enum ArmThreadSignals |
henryrawas | 4:36a4eceb1b7f | 25 | { |
henryrawas | 4:36a4eceb1b7f | 26 | AS_Action = 0x1, |
henryrawas | 4:36a4eceb1b7f | 27 | AS_LocalAlert = 0x2, |
henryrawas | 4:36a4eceb1b7f | 28 | AS_Cancel = 0x4, |
henryrawas | 4:36a4eceb1b7f | 29 | AS_NextStep = 0x8, |
henryrawas | 4:36a4eceb1b7f | 30 | AS_NextSeq = 0x10 |
henryrawas | 4:36a4eceb1b7f | 31 | }; |
henryrawas | 4:36a4eceb1b7f | 32 | |
henryrawas | 4:36a4eceb1b7f | 33 | enum IothubThreadSignals |
henryrawas | 4:36a4eceb1b7f | 34 | { |
henryrawas | 4:36a4eceb1b7f | 35 | IS_Close = 0x1, |
henryrawas | 4:36a4eceb1b7f | 36 | IS_SendStatus = 0x2 |
henryrawas | 4:36a4eceb1b7f | 37 | }; |
henryrawas | 4:36a4eceb1b7f | 38 | |
henryrawas | 4:36a4eceb1b7f | 39 | class RobotArm |
henryrawas | 4:36a4eceb1b7f | 40 | { |
henryrawas | 4:36a4eceb1b7f | 41 | public: |
henryrawas | 4:36a4eceb1b7f | 42 | |
henryrawas | 4:36a4eceb1b7f | 43 | RobotArm(); |
henryrawas | 4:36a4eceb1b7f | 44 | |
henryrawas | 4:36a4eceb1b7f | 45 | // move all parts to specified postions in ms time |
henryrawas | 4:36a4eceb1b7f | 46 | bool MoveArmPositions(vector<float> positions, int ms, int steps); |
henryrawas | 4:36a4eceb1b7f | 47 | |
henryrawas | 4:36a4eceb1b7f | 48 | // start - move all parts to specified postions in ms time |
henryrawas | 4:36a4eceb1b7f | 49 | bool MoveArmPositionsStart(vector<float> positions, int ms); |
henryrawas | 4:36a4eceb1b7f | 50 | |
henryrawas | 4:36a4eceb1b7f | 51 | // start - move all parts to specified postions - test if done |
henryrawas | 4:36a4eceb1b7f | 52 | bool MoveArmPositionsHasNext(); |
henryrawas | 4:36a4eceb1b7f | 53 | |
henryrawas | 4:36a4eceb1b7f | 54 | // start - move all parts to specified postions - next step |
henryrawas | 4:36a4eceb1b7f | 55 | bool MoveArmPositionsNext(int& nextdelay); |
henryrawas | 4:36a4eceb1b7f | 56 | |
henryrawas | 4:36a4eceb1b7f | 57 | // start - move all parts to specified postions - finish |
henryrawas | 4:36a4eceb1b7f | 58 | bool MoveArmPositionsEnd(); |
henryrawas | 4:36a4eceb1b7f | 59 | |
henryrawas | 4:36a4eceb1b7f | 60 | // move one part to specified postion in ms time |
henryrawas | 4:36a4eceb1b7f | 61 | bool MovePartPosition(int partIx, float position, int ms, int steps); |
henryrawas | 4:36a4eceb1b7f | 62 | |
henryrawas | 4:36a4eceb1b7f | 63 | // get all parts positions |
henryrawas | 4:36a4eceb1b7f | 64 | bool GetArmPositions(vector<float>& outPos); |
henryrawas | 4:36a4eceb1b7f | 65 | |
henryrawas | 4:36a4eceb1b7f | 66 | // get all parts last positions |
henryrawas | 4:36a4eceb1b7f | 67 | bool GetArmLastPositions(vector<float>& outPos); |
henryrawas | 4:36a4eceb1b7f | 68 | |
henryrawas | 4:36a4eceb1b7f | 69 | // get one part position |
henryrawas | 4:36a4eceb1b7f | 70 | float GetPartPosition(int partIx); |
henryrawas | 4:36a4eceb1b7f | 71 | |
henryrawas | 4:36a4eceb1b7f | 72 | // get all parts for a measurement |
henryrawas | 4:36a4eceb1b7f | 73 | bool GetArmMeasure(int measureId, vector<float>& outPos); |
henryrawas | 4:36a4eceb1b7f | 74 | |
henryrawas | 4:36a4eceb1b7f | 75 | // get all parts last measurement |
henryrawas | 4:36a4eceb1b7f | 76 | bool GetArmLastMeasure(int measureId, vector<float>& outPos); |
henryrawas | 4:36a4eceb1b7f | 77 | |
henryrawas | 4:36a4eceb1b7f | 78 | // get one part measurement |
henryrawas | 4:36a4eceb1b7f | 79 | float GetPartMeasure(int measureId, int partIx); |
henryrawas | 4:36a4eceb1b7f | 80 | |
henryrawas | 4:36a4eceb1b7f | 81 | int GetNumParts(); |
henryrawas | 4:36a4eceb1b7f | 82 | |
henryrawas | 4:36a4eceb1b7f | 83 | // set arm speed as ms between steps |
henryrawas | 4:36a4eceb1b7f | 84 | void SetStepMs(int stepms); |
henryrawas | 4:36a4eceb1b7f | 85 | |
henryrawas | 4:36a4eceb1b7f | 86 | // set ThreadId for signals |
henryrawas | 4:36a4eceb1b7f | 87 | void SetThreadId(osThreadId tid); |
henryrawas | 4:36a4eceb1b7f | 88 | |
henryrawas | 4:36a4eceb1b7f | 89 | // get the part object |
henryrawas | 4:36a4eceb1b7f | 90 | RobotNode* GetArmPart(int partIx); |
henryrawas | 4:36a4eceb1b7f | 91 | |
henryrawas | 4:36a4eceb1b7f | 92 | // get last error code from action |
henryrawas | 4:36a4eceb1b7f | 93 | unsigned char GetLastError(); |
henryrawas | 4:36a4eceb1b7f | 94 | |
henryrawas | 4:36a4eceb1b7f | 95 | // get index of part with error |
henryrawas | 4:36a4eceb1b7f | 96 | int GetLastErrorPart(); |
henryrawas | 4:36a4eceb1b7f | 97 | |
henryrawas | 4:36a4eceb1b7f | 98 | private: |
henryrawas | 4:36a4eceb1b7f | 99 | // sensors and actuators |
henryrawas | 4:36a4eceb1b7f | 100 | RobotNode* _armParts[MAX_PARTS]; |
henryrawas | 4:36a4eceb1b7f | 101 | |
henryrawas | 4:36a4eceb1b7f | 102 | int _numParts; |
henryrawas | 4:36a4eceb1b7f | 103 | |
henryrawas | 4:36a4eceb1b7f | 104 | // #ms between steps |
henryrawas | 4:36a4eceb1b7f | 105 | int _stepms; |
henryrawas | 4:36a4eceb1b7f | 106 | |
henryrawas | 4:36a4eceb1b7f | 107 | // thread id |
henryrawas | 4:36a4eceb1b7f | 108 | osThreadId _tid; |
henryrawas | 4:36a4eceb1b7f | 109 | |
henryrawas | 4:36a4eceb1b7f | 110 | // part ix for last error |
henryrawas | 4:36a4eceb1b7f | 111 | int _lastErrorPart; |
henryrawas | 4:36a4eceb1b7f | 112 | |
henryrawas | 4:36a4eceb1b7f | 113 | // for thread friendly moves |
henryrawas | 4:36a4eceb1b7f | 114 | vector<float> lastpos; |
henryrawas | 4:36a4eceb1b7f | 115 | vector<float> differentials; |
henryrawas | 4:36a4eceb1b7f | 116 | int numsteps; |
henryrawas | 4:36a4eceb1b7f | 117 | int curstep; |
henryrawas | 4:36a4eceb1b7f | 118 | int delayms; |
henryrawas | 4:36a4eceb1b7f | 119 | int expDelay; |
henryrawas | 4:36a4eceb1b7f | 120 | Timer elapseTimer; |
henryrawas | 4:36a4eceb1b7f | 121 | }; |
henryrawas | 4:36a4eceb1b7f | 122 | |
henryrawas | 4:36a4eceb1b7f | 123 | #endif |