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上でのみ、動作確認しています

XBusServo.h

Committer:
sawa
Date:
2014-10-08
Revision:
1:bd80d3e8f3a3
Parent:
0:381d475cfd6c
Child:
2:4aca5ffce457

File content as of revision 1:bd80d3e8f3a3:

/* XBusServo.h file
 *
 * for mbed
 *
 * Copyright (c) 2014-2014 JR PROPO
 * Released under the MIT License: http://mbed.org/license/mit
 *
 * by Zak Sawa
 */

#ifndef XBusServo_h
#define XBusServo_h

#include "mbed.h"

// standard interval time for XBus servo
#define kXBusStandardInterval       14              // mSec

// angle data for XBus servo
#define kXbusServoMinimum           0x1249          // 900uSec      -60 or -90 degree
#define kXbusServoNeutral           0x7FFF          // 1500uSec     0 degree
#define kXbusServoMaximum           0xEDB6          // 2100uSec     60 or 90 degree

// maximum number of XBus servo
#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);

public:
    XBusError       start();
    void            stop();

    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

    RawSerial           XBusPort;

    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