Library for XBus servo (under construction)

Dependents:   mbed_XBus_Test mbed_XBus_MotionTest XBusServoTest ControlYokutan2017_2 ... more

It's pre-opened page. it's still a little bit unstable to use command packet but mostly work. Tested only on KL25Z

暫定版ページです。 まだコマンドパケット使用時に時々不安定になりますが、概ね動作しています。 KL25Z上でのみ、動作確認しています

Revision:
0:381d475cfd6c
Child:
1:bd80d3e8f3a3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/XBusServo.h	Thu Oct 02 08:46:53 2014 +0000
@@ -0,0 +1,149 @@
+/* XBusServo.h file
+ *
+ * for mbed
+ *
+ * Copyright (c) 2013-2014 JR PROPO
+ * by Zak Sawa
+ */
+
+#ifndef XBusServo_h
+#define XBusServo_h
+
+#include "mbed.h"
+#include "gpio_api.h"
+
+
+#define kXBusInterval               14              // mSec
+#define kXbusServoNeutral           0x7FFF          // 1500uSec
+#define kXBusMaxServoNum            50
+
+// XBus Get/Set/Status command order
+typedef enum {
+    kXBusOrder_1_Mode =             0x01,
+    kXBusOrder_1_ID =               0x03,
+    kXBusOrder_2_Version =          0x04,           // only for get
+    kXBusOrder_2_Product =          0x05,           // only for get
+    kXBusOrder_1_Unsupported =      0x06,           // only for status
+    kXBusOrder_2_Reset =            0x07,           // only for set
+    kXBusOrder_2_ParamWrite =       0x08,           // only for set
+
+    kXBusOrder_2_Reverse =          0x10,
+    kXBusOrder_2_Neutral =          0x11,
+    kXBusOrder_2_H_Travel =         0x12,
+    kXBusOrder_2_L_Travel =         0x13,
+    kXBusOrder_2_H_Limit =          0x14,
+    kXBusOrder_2_L_Limit =          0x15,
+    kXBusOrder_1_P_Gain =           0x16,
+    kXBusOrder_1_I_Gain =           0x17,
+    kXBusOrder_1_D_Gain =           0x18,
+    kXBusOrder_1_DeadBand =         0x19,
+    kXBusOrder_2_PowerOffset =      0x1A,
+    kXBusOrder_1_AlarmLevel =       0x1B,
+    kXBusOrder_2_AlarmDelay =       0x1C,
+    kXBusOrder_1_Angle_180 =        0x1D,
+    kXBusOrder_1_SlowStart =        0x1E,
+    kXBusOrder_1_StopMode =         0x1F,
+    kXBusOrder_2_CurrentPos =       0x20,           // only for get
+    kXBusOrder_1_CurrentPow =       0x21,           // only for get
+    kXBusOrder_1_SpeedLimit =       0x22,
+    kXBusOrder_2_MaxInteger =       0x23,
+} XBusOrder;
+
+
+// XBus parameter index
+typedef enum {
+    kParamIdx_Unused0 =             0x0000,
+    kParamIdx_AllData_wID =         0x0001,
+    kParamIdx_AllData_woID =        0x0002,
+    kParamIdx_ServoID =             0x0003,
+    kParamIdx_Reversed =            0x0004,
+    kParamIdx_NeutralOffset =       0x0005,
+    kParamIdx_TravelHigh =          0x0006,
+    kParamIdx_TravelLow =           0x0007,
+    kParamIdx_LimitHigh =           0x0008,
+    kParamIdx_LimitLow =            0x0009,
+    kParamIdx_PGainDiff =           0x000A,
+    kParamIdx_IGainDiff =           0x000B,
+    kParamIdx_DGainDiff =           0x000C,
+    kParamIdx_DeadBandDiff =        0x000D,
+    kParamIdx_PWOffsetDiff =        0x000E,
+    kParamIdx_AlarmLevel =          0x000F,
+    kParamIdx_AlarmDelay =          0x0010,
+    kParamIdx_Angle_180 =           0x0011,
+    kParamIdx_SlowStart =           0x0012,
+    kParamIdx_StopMode =            0x0013,
+    kParamIdx_SpeedLimit =          0x0014,
+    kParamIdx_MaxIntegerDiff =      0x0015,
+} XBusParamIdx;
+
+
+// XBus error code
+typedef enum {
+    kXBusError_NoError =            0x0000,
+    kXBusError_CRCError,
+    kXBusError_ServoNumOverflow,
+    kXBusError_ServoNumIsZero,
+    kXBusError_AddWithSameID,
+    kXBusError_IDNotFound,
+    kXBusError_Unsupported,
+    kXBusError_OnlyForTxOnlyMode,
+    kXBusError_OnlyForNormalMode,
+
+    kXBusError_NumOfError,
+} XBusError;
+
+
+
+class XBusServo : private RawSerial             //, private DigitalInOut
+{
+public:
+    XBusServo(PinName tx, PinName rx, uint8_t maxServoNum);
+    virtual ~XBusServo();
+
+public:
+    XBusError       addServo(uint8_t channelID, uint16_t initValue);
+    XBusError       removeServo(uint8_t channelID);
+    XBusError       setServo(uint8_t channelID, uint16_t value);
+
+    void            sendChannelDataPacket(void);
+
+    XBusError       setChannelID(uint8_t oldChannelID, uint8_t newChannelID);
+    XBusError       setCommand(uint8_t channelID, uint8_t order, int16_t* value);
+    XBusError       getCommand(uint8_t channelID, uint8_t order, int16_t* value);
+
+    XBusError       setChannelID(uint8_t newChannelID);
+    XBusError       setCommand(uint8_t order, int16_t* value);
+
+
+private:
+    #define         kRecieveBufferSize          64
+    
+    uint8_t             txOnly;          // 1 for TX only mode
+    PinName             txPin;           //
+    uint8_t             numOfServo;      // number of servos
+    uint8_t             maxServo;        // max number of servos
+    uint8_t*            chPacketBuffer;  // channel data packet buffer
+    uint8_t*            sendBuffer;      // serial send buffer
+    uint8_t*            sendBufferPointer;
+    uint8_t             sendLength;
+    uint8_t             recieveBuffer[kRecieveBufferSize];   // serial recieve buffer
+    uint8_t             recieveBufferPointer;
+    uint8_t             dirty;           //
+    uint8_t             serialWriteBusy; //
+    volatile uint8_t    modifyServosNow; //
+
+    uint8_t             crc_table(uint8_t data, uint8_t crc);
+    uint8_t             crc8(uint8_t* buffer, uint8_t length);
+    uint8_t             getDataSize(uint8_t    order);
+
+    void                write(uint8_t* buffer, uint8_t length);
+    void                flush(void);
+    void                TxIrqHandler(void);
+    void                RxIrqHandler(void);
+
+    XBusError           sendCommandDataPacket(uint8_t command, uint8_t channelID, uint8_t order, int16_t* value, uint8_t valueSize);
+};
+
+
+#endif  // of XBusServo_h
+