/******************************************************
* FileName: LobotServoController.cpp
** Company: 乐幻索尔
* Date: 2016/07/02 16:53
* Description: Lobot舵机控制板二次开发库,本文件包含
了此库的具体实现
*****************************************************/
#include "LobotServoController.h"
#define GET_LOW_BYTE(A) (uint8_t)((A))
//宏函数 获得A的低八位
#define GET_HIGH_BYTE(A) (uint8_t)((A) >> 8)
//宏函数 获得A的高八位
#define BYTE_TO_HW(A, B) ((((uint16_t)(A)) << 8) | (uint8_t)(B))
//宏函数 以A为高八位 B为低八位 合并为16位整形
LobotServoController::LobotServoController()
{
//初始化运行中动作组号为0xFF,运行次数为0,运行中标识为假,电池电压为0
numOfActinGroupRunning = 0xFF;
actionGroupRunTimes = 0;
isRunning = false;
batteryVoltage = 0;
#if defined(__AVR_ATmega32U4__) //for Arduino Leonardo,Micro....
SerialX = &Serial1;
#else
SerialX = &Serial;
#endif
}
LobotServoController::LobotServoController(HardwareSerial &A)
{
LobotServoController();
SerialX = &A;
}
LobotServoController::~LobotServoController()
{
}
/*********************************************************************************
* Function: moveServo
* Description: 控制单个舵机转动
* Parameters: sevoID:舵机ID,Position:目标位置,Time:转动时间
舵机ID取值:0<=舵机ID<=31,Time取值: Time > 0
* Return: 无返回
* Others:
**********************************************************************************/
void LobotServoController::moveServo(uint8_t servoID, uint16_t Position, uint16_t Time)
{
uint8_t buf[11];
if (servoID > 31 || !(Time > 0)) { //舵机ID不能打于31,可根据对应控制板修改
return;
}
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] = servoID; //舵机ID
buf[8] = GET_LOW_BYTE(Position); //填充目标位置的低八位
buf[9] = GET_HIGH_BYTE(Position); //填充目标位置的高八位
SerialX->write(buf, 10);
}
/*********************************************************************************
* Function: moveServos
* Description: 控制多个舵机转动
* Parameters: servos[]:舵机结体数组,Num:舵机个数,Time:转动时间
0 < Num <= 32,Time > 0
* Return: 无返回
* Others:
**********************************************************************************/
void LobotServoController::moveServos(LobotServo servos[], uint8_t Num, uint16_t Time)
{
uint8_t buf[103]; //建立缓存
if (Num < 1 || Num > 32 || !(Time > 0)) {
return; //舵机数不能为零和大与32,时间不能为零
}
buf[0] = FRAME_HEADER; //填充帧头
buf[1] = FRAME_HEADER;
buf[2] = Num * 3 + 5; //数据长度 = 要控制舵机数*3+5
buf[3] = CMD_SERVO_MOVE; //填充舵机移动指令
buf[4] = Num; //要控制的舵机个数
buf[5] = GET_LOW_BYTE(Time); //取得时间的低八位
buf[6] = GET_HIGH_BYTE(Time); //取得时间的高八位
uint8_t index = 7;
for (uint8_t i = 0; i < Num; i++) { //循环填充舵机ID和对应目标位置
buf[index++] = servos[i].ID; //填充舵机ID
buf[index++] = GET_LOW_BYTE(servos[i].Position); //填充目标位置低八位
buf[index++] = GET_HIGH_BYTE(servos[i].Position);//填充目标位置高八位
}
SerialX->write(buf, buf[2] + 2); //发送帧,长度为数据长度+两个字节的帧头
}
/*********************************************************************************
* Function: moveServos
* Description: 控制多个舵机转动
* Parameters: Num:舵机个数,Time:转动时间,...:舵机ID,转动角,舵机ID,转动角度 如此类推
* Return: 无返回
* Others:
**********************************************************************************/
void LobotServoController::moveServos(uint8_t Num, uint16_t Time, ...)
{
uint8_t buf[128];
va_list arg_ptr = NULL;
va_start(arg_ptr, Time); //取得可变参数首地址
if (Num < 1 || Num > 32 || (!(Time > 0)) || arg_ptr == NULL) {
return; //舵机数不能为零和大与32,时间不能为零,可变参数不能为空
}
buf[0] = FRAME_HEADER; //填充帧头
buf[1] = FRAME_HEADER;
buf[2] = Num * 3 + 5; //数据长度 = 要控制舵机数 * 3 + 5
buf[3] = CMD_SERVO_MOVE; //舵机移动指令
buf[4] = Num; //要控制舵机数
buf[5] = GET_LOW_BYTE(Time); //取得时间的低八位
buf[6] = GET_HIGH_BYTE(Time); //取得时间的高八位
uint8_t index = 7;
for (uint8_t i = 0; i < Num; i++) { //从可变参数中取得并循环填充舵机ID和对应目标位置
uint16_t tmp = va_arg(arg_ptr, uint16_t); //可参数中取得舵机ID
buf[index++] = GET_LOW_BYTE(tmp); //貌似avrgcc中可变参数整形都是十六位
//再取其低八位
uint16_t pos = va_arg(arg_ptr, uint16_t); //可变参数中取得对应目标位置
buf[index++] = GET_LOW_BYTE(pos); //填充目标位置低八位
buf[index++] = GET_HIGH_BYTE(pos); //填充目标位置高八位
}
va_end(arg_ptr); //置空arg_ptr
SerialX->write(buf, buf[2] + 2); //发送帧
}
/*********************************************************************************
* Function: runActionGroup
* Description: 运行指定动作组
* Parameters: NumOfAction:动作组序号, Times:执行次数
* Return: 无返回
* Others: Times = 0 时无限循环
**********************************************************************************/
void LobotServoController::runActionGroup(uint8_t numOfAction, uint16_t Times)
{
uint8_t buf[7];
buf[0] = FRAME_HEADER; //填充帧头
buf[1] = FRAME_HEADER;
buf[2] = 5; //数据长度,数据帧除帧头部分数据字节数,此命令固定为5
buf[3] = CMD_ACTION_GROUP_RUN; //填充运行动作组命令
buf[4] = numOfAction; //填充要运行的动作组号
buf[5] = GET_LOW_BYTE(Times); //取得要运行次数的低八位
buf[6] = GET_HIGH_BYTE(Times); //取得要运行次数的高八位
SerialX->write(buf, 7); //发送数据帧
}
/*********************************************************************************
* Function: stopActiongGroup
* Description: 停止动作组运行
* Parameters: Speed: 目标速度
* Return: 无返回
* Others:
**********************************************************************************/
void LobotServoController::stopActionGroup(void)
{
uint8_t buf[4];
buf[0] = FRAME_HEADER; //填充帧头
buf[1] = FRAME_HEADER;
buf[2] = 2; //数据长度,数据帧除帧头部分数据字节数,此命令固定为2
buf[3] = CMD_ACTION_GROUP_STOP; //填充停止运行动作组命令
SerialX->write(buf, 4); //发送数据帧
}
/*********************************************************************************
* Function: setActionGroupSpeed
* Description: 设定指定动作组的运行速度
* Parameters: NumOfAction: 动作组序号 , Speed:目标速度
* Return: 无返回
* Others:
**********************************************************************************/
void LobotServoController::setActionGroupSpeed(uint8_t numOfAction, uint16_t Speed)
{
uint8_t buf[7];
buf[0] = FRAME_HEADER; //填充帧头
buf[1] = FRAME_HEADER;
buf[2] = 5; //数据�
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
garbage_classification_achen (2).zip (65个子文件)
garbage_classification_achen
garbage_classification_achen.ino 8KB
LobotServoController.h 2KB
Step.h 532B
UartStep.h 708B
UartStep.cpp 4KB
def.h 851B
.git
index 1KB
HEAD 23B
refs
heads
master 41B
tags
COMMIT_EDITMSG 21B
objects
0f
c6ed4aac7465021f33a1ae13a31f28bd453bee 2KB
1f
30a6a34f5819094896e386487b751178368a5e 292B
7d
9bd0ff8214399d12086ae85dc6cb7f4af2aeab 543B
e6
7bbaee9ac67ecfb5324cba6a4aa53717a44ca9 407B
2a
6f0220e5f49950fe4683ca7b23e74ed4ba4cf9 217B
10
b9d8f00628700cb569d6b5188df13e3b5f4f89 167B
74
45a3e10354345edc40dfcf4842842cc56b41a9 817B
f2
1a1f798f1f93ac8a4102b8649d39092a514898 287B
26
0212bf1f238d3df3ecbab3857b659ebd888425 408B
b5
04d9587c7c1b59024fda933bd929e86342f482 169B
pack
d7
90a27c43941ac46689e557ffdbf4c0ccfa377b 514B
c7
cf2d2cd570cb2d7410f7cb5cd28bf11c5ed50f 744B
87
81873f16055e3ba119a3ad2ab1cd109f51ec6d 1KB
6e
834f83a795d8b2632c65f6c558f8d178747d4f 5KB
info
51
9cc5fa1fbedcba12e07e743cb3fbf07f9f04fd 428B
ba
4eb4926b2862a261c3981858abd99373084943 293B
3a
e964466aa0b0dc69ef57d6d7183625efbeae6f 2KB
2b
919940de54e2e3175ff63027ffd2b5f2993e93 938B
5b
167384797020aade8cc5a7299e69d6f263a77a 744B
c5
49ec9dd643caf07d6d9b26996e44907555cf6b 5KB
fb
405a0aade90c748f6c8e04e78eebcfd35eba38 455B
8e
58adaad17b045258f191ba464d0b5d76734fff 600B
ddfe09bfc271f840accb2a82f6440d534f3eb7 3KB
a0
0e71fc44ac6a33449c20ad0e1d2480d0156ddf 411B
7c
a2e836ac82ac11049c5e2f5921e3158fd5d98b 2KB
9c9d3e66cdc5978b5ac3827a253fc9d69cd078 428B
2e
0bc4537bf7f0ef3979f16eb9ab90b3612ab1b7 172B
e9
39432cc9a5f926e7935fda086f1a8a042d74cc 137B
b3
baebba6179754aa506af3d415fee91d4e67f6b 1KB
5fbc5de8cd8526f4c1d6eaf2c4ea05d06c21f2 630B
description 73B
info
exclude 240B
logs
HEAD 594B
refs
heads
master 594B
hooks
post-update.sample 189B
sendemail-validate.sample 2KB
prepare-commit-msg.sample 1KB
commit-msg.sample 896B
pre-receive.sample 544B
update.sample 4KB
pre-commit.sample 2KB
pre-rebase.sample 5KB
applypatch-msg.sample 478B
fsmonitor-watchman.sample 5KB
push-to-checkout.sample 3KB
pre-applypatch.sample 424B
pre-push.sample 1KB
pre-merge-commit.sample 416B
config 130B
Step.cpp 2KB
PositionXY.ino 376B
action_control.ino 4KB
Uart_POS_XY.ino 1KB
Arduino_UART_CMDw.ino 20KB
LobotServoController.cpp 11KB
共 65 条
- 1
资源评论
t3096424184
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于ArcEngine的GIS数据处理系统.zip
- (源码)基于JavaFX和MySQL的医院挂号管理系统.zip
- (源码)基于IdentityServer4和Finbuckle.MultiTenant的多租户身份认证系统.zip
- (源码)基于Spring Boot和Vue3+ElementPlus的后台管理系统.zip
- (源码)基于C++和Qt框架的dearoot配置管理系统.zip
- (源码)基于 .NET 和 EasyHook 的虚拟文件系统.zip
- (源码)基于Python的金融文档智能分析系统.zip
- (源码)基于Java的医药管理系统.zip
- (源码)基于Java和MySQL的学生信息管理系统.zip
- (源码)基于ASP.NET Core的零售供应链管理系统.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功