From 1df82d551af176c8760d5d19140b7924527ede64 Mon Sep 17 00:00:00 2001 From: "lxbpxylps@126.com" Date: Thu, 18 Feb 2021 13:18:54 +0800 Subject: [PATCH] =?UTF-8?q?servo=20=E5=BA=93=E6=96=B0=E5=A2=9E=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E5=8D=95=E4=B8=AA=E8=88=B5=E6=9C=BA=E8=BD=AC=E5=8A=A8?= =?UTF-8?q?=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TaiChi/servoTaiChi.cpp | 36 +++++++++++++++++++++++++++++++++++- TaiChi/servoTaiChi.h | 19 +++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/TaiChi/servoTaiChi.cpp b/TaiChi/servoTaiChi.cpp index 940d604..a9332e2 100644 --- a/TaiChi/servoTaiChi.cpp +++ b/TaiChi/servoTaiChi.cpp @@ -11,7 +11,7 @@ Servo::Servo() { - SerialX = &Serial1; //默认使用 Mega 板 18 19 作为串口通信端口 + SerialX = &DEFAULT_SERVO_SERIAL_NUM; //默认使用 Mega 板 18 19 作为串口通信端口 SerialX->begin(SERVO_BAUD_RATE); } @@ -24,6 +24,33 @@ Servo::Servo(HardwareSerial& serial_num) } +//控制单个舵机转动 +//servo_id: 舵机ID, position: 目标位置, time: 转动时间 +void Servo::MoveServo(uint8_t servo_id, uint16_t position, uint16_t time) +{ + uint8_t buf[11]; + buf[0] = FRAME_HEADER; //填充帧头 + buf[1] = FRAME_HEADER; + buf[2] = 8; //数据长度=要控制舵机数*3+5,此处=1*3+5 + buf[3] = CMD_SERVO_MOVE; //填充舵机移动指令 + buf[4] = 1; //要控制的舵机个数 + buf[5] = GET_LOW_BYTE(time); //填充时间的低八位 + buf[6] = GET_HIGH_BYTE(time); //填充时间的高八位 + buf[7] = servo_id; //舵机ID + buf[8] = GET_LOW_BYTE(position); //填充目标位置的低八位 + buf[9] = GET_HIGH_BYTE(position); //填充目标位置的高八位 + + SerialX->write(buf, 10); + + #ifdef SERVO_DEBUG + //调试输出动作组执行信息 + Serial.print("#SERVO: MoveServo: "); Serial.print((int)servo_id); + Serial.print(" position: "); Serial.print((int)position); + Serial.print(" time: "); Serial.println((int)time); + #endif +} + + //运行指定动作组 //action_num: 动作组序号, times: 执行次数 //times = 0 时无限循环 @@ -100,6 +127,13 @@ void Servo::SetAllActionGroupSpeed(float speed) } +//打开爪子 +void Servo::OpenClaw(void) +{ + MoveServo(CLAW_SERVO_ID, CLAW_OPEN_POSITION, CLAW_OPEN_USE_TIME); +} + + //恢复初始状态,指定速度 void Servo::Reset(float speed) { diff --git a/TaiChi/servoTaiChi.h b/TaiChi/servoTaiChi.h index 53c1d79..d20effe 100644 --- a/TaiChi/servoTaiChi.h +++ b/TaiChi/servoTaiChi.h @@ -9,11 +9,26 @@ #define SERVO_DEBUG +//默认与舵机控制板连接串口 +//默认使用 Mega 板 18 19 作为串口通信端口 +#define DEFAULT_SERVO_SERIAL_NUM Serial1 + + +//与舵机控制板串口通信波特率 #define SERVO_BAUD_RATE 9600 +//爪子舵机 id +#define CLAW_SERVO_ID 15 +//爪子打开时舵机位置 +#define CLAW_OPEN_POSITION 500 +//爪子打开用时 +#define CLAW_OPEN_USE_TIME 1000 + + //发送部分的指令 #define FRAME_HEADER 0x55 //帧头 +#define CMD_SERVO_MOVE 0x03 //舵机移动指令 #define CMD_ACTION_GROUP_RUN 0x06 //运行动作组指令 #define CMD_ACTION_GROUP_STOP 0x07 //停止动作组运行指令 #define CMD_ACTION_GROUP_SPEED 0x0B //设置动作组运行速度指令 @@ -35,11 +50,15 @@ public: Servo(); Servo(HardwareSerial &serial_num); //构造函数,指定串口通信端口 + void MoveServo(uint8_t servo_id, uint16_t position, uint16_t time); //控制单个舵机转动 + void RunActionGroup(uint8_t action_num, uint16_t times); //运行指定动作组 void StopActionGroup(void); //停止动作组运行 void SetActionGroupSpeed(uint8_t action_num, float speed); //设定指定动作组的运行速度 void SetAllActionGroupSpeed(float speed); //设置所有动作组的运行速度 + void OpenClaw(void); //打开爪子 + void Reset(float speed = SERVO_NORMAL_SPEED); //恢复初始状态,指定速度 void Catch(float speed = SERVO_NORMAL_SPEED); //抓取,指定速度 void Release(float speed = SERVO_NORMAL_SPEED); //释放,指定速度