Dynamixel servo controller. This program consists of 2 parts: "dynamixel_servo_controller.cpp/.h" and "main.cpp"( demo program ).

Dependencies:   mbed

Fork of dynamixel_servo_controller by Yusuke Okino

dynamixel_servo_controller.h

Committer:
PicYusuke
Date:
2018-06-13
Revision:
4:ce4fef97e7e5
Parent:
3:51f72ee2d5c2
Child:
5:4474c07c6274

File content as of revision 4:ce4fef97e7e5:

/*
 * Copyright (c) 2018 Yusuke Okino

 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:

 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.

 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

#ifndef DYNAMIXEL_SERVO_CONTROLLER_H
#define DYNAMIXEL_SERVO_CONTROLLER_H

#define MBED_ENVIRONMENT

#ifdef MBED_ENVIRONMENT
    #include "mbed.h"
#else

#include <cstdint>
    typedef uint16_t PinName;
    const PinName PA_9 = 9;
    const PinName PA_10 = 10;

#endif

/**
 * @brief Dynamixel サーボコントローラ protocol v2
 * 
 */
namespace dynamixel_servo_v2
{

namespace 
{
    // チェックサム計算クラス( 今後実装 )
    #if 0
    class CRC16 
    {
        private:

        public:
            /**
             * @brief Construct a new CRC16 object
             * 
             * @param polynomial 
             */
            CRC16(const uint16_t polynomial);

    };
    #endif
};

/**
 * @brief Dynamixel XM430サーボ制御用クラス
 * 
 */
class XM430
{
    private:

        // Checksum polynomial
        const static uint16_t CRC16_POLY = 0x8005;

        /********************* レジスタマップ ***********************/
        /***************** instruction *******************/
        const static uint8_t WRITE = 0x03;
        /*************************************************/

        /**************** Control table ******************/
        const static uint16_t TORQUE_ENABLE = 64;   
        const static uint16_t GOAL_POSITION = 116;
        /*************************************************/
        /***********************************************************/

        uint16_t crc_tbl[256];  // CRC16 計算用テーブル
        uint8_t tx_buf[128];    // シリアル送信バッファ
        uint8_t rx_buf[128];    // シリアル受信バッファ
        
        #ifdef MBED_ENVIRONMENT
        Serial uart;            // シリアル通信用クラス

        /**
         * @brief UART 受信割り込み関数
         * 
         */
        void UART_Rx_Callback();
        #endif

    public:
        /**
         * @brief Construct a new XM430 object
         * 
         */
        XM430(PinName tx_pin, PinName rx_pin);

    private:

        /**
         * @brief チェックサム計算( crc16 )
         * 
         * @param crc_init_val crc 初期値
         * @param data 検査対象のデータ列
         * @param data_length 
         * @return uint16_t チェックサム計算結果
         */
        uint16_t CRC16(const uint16_t crc_init_val, uint8_t *data, const uint32_t data_length);

        /**
         * @brief パケット生成
         * 
         * @param servo_id 
         * @param length 
         * @param instruction 
         * @param ctrl_reg control レジスタ
         * @param data 送信データ
         */
        void Create_Packet(uint8_t servo_id, uint16_t length, const uint8_t instruction,
                            const uint16_t ctrl_reg, uint8_t *data);

        /**
         * @brief シリアルバルク送信
         * 
         * @param buf 送信バッファ
         * @param buf_length バッファ長
         * @return true 正常に通信が終了
         * @return false 通信が不正に終了
         */
        bool Send_Bulk_Char(uint8_t *buf, const uint32_t buf_length);

    public:
        /**
         * @brief サーボのトルクをONにする
         * 
         * @param id サーボID
         * @return true 通信が正常に終了
         * @return false 通信が不正に終了
         */
        bool Torque_ON(uint8_t id);

        /**
         * @brief サーボのトルクをOFFにする
         * 
         * @param id サーボID
         * @return true 通信が正常に終了
         * @return false 通信が不正に終了
         */
        bool Torque_OFF(uint8_t id);

        /**
         * @brief サーボホーン位置を設定
         * 
         * @param id サーボID
         * @param pos 目標回転位置
         * @return true 通信が正常に終了
         * @return false 通信が不正に終了
         */
        bool Set_Pos(uint8_t id, uint32_t pos);
};
};

#endif