笔记--总线舵机YB-SD15M--stm32

文章目录

  • 前言
  • 一、官方文档的理解
    • 1.发送格式
    • 2.命令地址
  • 二、控制文件
    • 1.c
    • 2.h
  • 文件


前言

使用stm32控制这个总线舵机。
舵机为总线舵机。一定要配合控制板一起用,不然只使用stm32无法控制。

在这里插入图片描述
在这里插入图片描述


一、官方文档的理解

1.发送格式

发送格式如下,其中的指令类型就说发下去以后是写入到舵机里面的,还是让舵机反馈一个东西上来。

在这里插入图片描述

2.命令地址

写入参数第第一个字节就是下面的地址,可以从你的目标地址一直往下写,只要你说明了数据长度就行。

在这里插入图片描述
比如说
这里地址写的是2a,且数据长度为7也就说说在2a这个地址上还会继续往后写4个数据

在这里插入图片描述
2a是目标位置,那就从这个往后写,写四个,所以这个就是写入目标位置和转到目标位置时间的一个指令

在这里插入图片描述

二、控制文件

1.c

要注意的是当舵机数据回传的时候要有中断,我这个适合hal库的usart空闲中断,一次把数据全部接收进来。
可以把这个反馈的函数放在空闲中断回调里面。
目前反馈函数只写了当前位置。

#include "bus_servo.h"#include "usart.h"#include "bsp_hal_uartdma.h"#include <stdio.h>
#include <string.h>#define RX_MAX_BUF 8//接收数据相关变量
uint8_t Rx_Data[8] = {0};
uint8_t Rx_index = 0;
uint8_t Rx_Flag = 0;
uint8_t RecvFlag = 0;/* 控制总线舵机,* id:要控制的id号,0xfe为全体控制* value:位置值(96~4000) * time:运行的时间,时间越小,运行越快,最小为0 * */
void bus_servo_control(uint8_t id, uint16_t value, uint16_t time)
{if (value >= 96 && value <= 4000){const uint8_t s_id = id & 0xff;const uint8_t len = 0x07;const uint8_t cmd = 0x03;const uint8_t addr = 0x2a;const uint8_t pos_H = (value >> 8) & 0xff;const uint8_t pos_L = value & 0xff;const uint8_t time_H = (time >> 8) & 0xff;const uint8_t time_L = time & 0xff;const uint8_t checknum = (~(s_id + len + cmd + addr + pos_H + pos_L + time_H + time_L)) & 0xff;// unsigned char data[] = {0xff, 0xff, s_id, len, cmd, addr, pos_H, pos_L, time_H, time_L, checknum};unsigned char data[11] = {0};data[0] = 0xff;data[1] = 0xff;data[2] = s_id;data[3] = len;data[4] = cmd;data[5] = addr;data[6] = pos_H;data[7] = pos_L;data[8] = time_H;data[9] = time_L;data[10] = checknum;HAL_UART_Transmit(&huart1,data,11,1000);}
}/* 控制舵机卸下* id:要控制的id号,0xfe为全体控制
* value:这个值为1的时候有力0的时候卸力* */void bus_servo_Unloading(uint8_t id,uint8_t value)
{const uint8_t s_id = id & 0xff;const uint8_t len = 0x04;//四个const uint8_t cmd = 0x03;//写入const uint8_t addr = 0x28;//数据地址const uint8_t val = value ;const uint8_t checknum = (~(s_id + len + cmd + addr + value)) & 0xff;unsigned char data[11] = {0};data[0] = 0xff;data[1] = 0xff;data[2] = s_id;data[3] = len;data[4] = cmd;data[5] = addr;data[6] = val;data[7] = checknum;HAL_UART_Transmit(&huart1,data,8,1000);}/* 写入目标ID(1~250) */
void bus_servo_set_id(uint8_t id)
{if ((id >= 1) && (id <= 250)){const uint8_t s_id = 0xfe; /* 发送广播的ID */const uint8_t len = 0x04;const uint8_t cmd = 0x03;const uint8_t addr = 0x05;const uint8_t set_id = id; /* 实际写入的ID */const uint8_t checknum = (~(s_id + len + cmd + addr + set_id)) & 0xff;// const uint8_t data[] = {0xff, 0xff, s_id, len, cmd, addr, set_id, checknum};unsigned char data[8] = {0};data[0] = 0xff;data[1] = 0xff;data[2] = s_id;data[3] = len;data[4] = cmd;data[5] = addr;data[6] = set_id;data[7] = checknum;HAL_UART_Transmit(&huart1,data,8,1000);}
}/* 发送读取舵机位置命令 */
void bus_servo_read(uint8_t id)//读取舵机位置
{if (id > 0 && id <= 250){const uint8_t s_id = id & 0xff;const uint8_t len = 0x04;const uint8_t cmd = 0x02;const uint8_t param_H = 0x38;const uint8_t param_L = 0x02;const uint8_t checknum = (~(s_id + len + cmd + param_H + param_L)) & 0xff;// const uint8_t data[] = {0xff, 0xff, s_id, len, cmd, param_H, param_L, checknum};unsigned char data[8] = {0};data[0] = 0xff;data[1] = 0xff;data[2] = s_id;data[3] = len;data[4] = cmd;data[5] = param_H;data[6] = param_L;data[7] = checknum;HAL_UART_Transmit(&huart1,data,8,1000);}
}//转化接收到的值为位置数
uint16_t bus_servo_get_value(void)
{uint8_t checknum = (~(Rx_Data[2] + Rx_Data[3] + Rx_Data[4] + Rx_Data[5] + Rx_Data[6])) & 0xff;if(checknum == Rx_Data[7]){// uint8_t s_id = Rx_Data[2];uint16_t value_H = 0;uint16_t value_L = 0;uint16_t value = 0;value_H = Rx_Data[5];value_L = Rx_Data[6];value = (value_H << 8) + value_L;return value;}return 0;
}uint8_t get_Rx_state(void)
{return RecvFlag;
}int now_servo_value[6];//当前值uint8_t  callback_data[8];
int calue_ = 0;void Uart1Rx_Handler(char *pdata, uint16_t len)//回调函数
{if(len == 8){	memcpy(callback_data,pdata,8);uint8_t checknum = (~(callback_data[2] + callback_data[3] + callback_data[4] + callback_data[5] + callback_data[6])) & 0xff;if(checknum == callback_data[7])//校验是否正确{//解析出值calue_ = (callback_data[5] << 8) + callback_data[6];//放到当前的数组里now_servo_value[callback_data[2]-1] = calue_;}}}

2.h

#ifndef _BUS_SERVO_H_
#define _BUS_SERVO_H_
#include "main.h"void bus_servo_control(uint8_t id, uint16_t value, uint16_t time);
void bus_servo_set_id(uint8_t id);
void bus_servo_read(uint8_t id);
uint16_t bus_servo_get_value(void);
void bus_servo_uart_recv(uint8_t Rx_Temp);
uint8_t get_Rx_state(void);void bus_servo_Unloading(uint8_t id,uint8_t value);void Uart1Rx_Handler(char *pdata, uint16_t len);//回调函数#endif /* _BUS_SERVO_H_ */

文件

资料文件和程序文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/149098.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux入门---信号的理解

目录标题 如何理解计算机中的信号如何查看计算机中的信号初步了解信号的保存和发送如何向目标进程发送信号情景一&#xff1a;使用键盘发送信号情景二&#xff1a;系统调用发送信号情景三&#xff1a;硬件异常产生信号情景四&#xff1a;软件条件产生信号 核心转储信号的两个问…

React项目部署 - Nginx配置

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

纯css实现3D鼠标跟随倾斜

老规矩先上图 为什么今天会想起来整这个呢?这是因为和我朋友吵架, 就是关于这个效果的,就是这个 卡片懸停毛玻璃效果, 我朋友认为纯css也能写, 我则坦言他就是在放狗屁,这种跟随鼠标的3D效果要怎么可能能用纯css写, 然后吵着吵着发现,欸,好像真能用css写哦,我以前还写过这种…

深度学习-卷积神经网络-AlexNET

文章目录 前言1.不同卷积神经网络模型的精度2.不同神经网络概述3.卷积神经网络-单通道4.卷积神经网络-多通道5.池化层6.全连接层7.网络架构8.Relu激活函数9.双GPU10.单GPU模型 1.LeNet-52.AlexNet1.架构2.局部响应归一化&#xff08;VGG中取消了&#xff09;3.重叠/不重叠池化4…

Nginx与Spring Boot的错误模拟实践:探索502和504错误的原因

文章目录 前言502和504区别---都是Nginx返回的access.log和error.log介绍SpringBoot结合Nginx实战502 and 504准备工作Nginx配置host配置SpringBoot 502模拟access.logerror.log 504模拟access.logerror.log 500模拟access.logerror.log 总结 前言 刚工作那会&#xff0c;最常…

beego-简单项目写法--后续放到git上

Beego案例-新闻发布系统 1.注册 后台代码和昨天案例代码一致。,所以这里面只写一个注册的业务流程图。 **业务流程图 ** 2.登陆 业务流程图 登陆和注册业务和我们昨天登陆和注册基本一样&#xff0c;所以就不再重复写这个代码 但是我们遇到的问题是如何做代码的迁移&…

Folium 笔记:MarkerCluster

在一张地图上以聚簇的形式显示大量的标记&#xff08;markers&#xff09; 举例&#xff1a; import folium from folium.plugins import MarkerCluster import randomm folium.Map(location[45.5236, -122.6750], zoom_start13) # 创建一个基本的地图marker_cluster Marker…

基于蝴蝶优化的BP神经网络(分类应用) - 附代码

基于蝴蝶优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于蝴蝶优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.蝴蝶优化BP神经网络3.1 BP神经网络参数设置3.2 蝴蝶算法应用 4.测试结果&#xff1a;5.M…

Python 列表推导式深入解析

Python 列表推导式深入解析 列表推导式是 Python 中的一种简洁、易读的方式&#xff0c;用于创建列表。它基于一个现有的迭代器&#xff08;如列表、元组、集合等&#xff09;来生成新的列表。 基本语法&#xff1a; 列表推导式的基本形式如下&#xff1a; [expression for…

SRT服务器SLS

目前互联网上的视频直播有两种&#xff0c;一种是基于RTMP协议的直播&#xff0c;这种直播方式上行推流使用RTMP协议&#xff0c;下行播放使用RTMP&#xff0c;HTTPFLV或者HLS&#xff0c;直播延时一般大于3秒&#xff0c;广泛应用秀场、游戏、赛事和事件直播&#xff0c;满足了…

nodejs+vue游戏测评交流系统elementui

可以实现首页、发布招募、公司资讯、我的等&#xff0c;另一方面来说也可以提高在游戏测评交流方面的效率给相关管理人员的工作带来一定的便利。在我的页面可以对游戏攻略、我的收藏管理、实际上如今信息化成为一个未来的趋势或者可以说在当前现代化的城市典范中,发布招募等功能…

中秋时节赏明月,五子棋戏月饼趣 — Flutter中秋限定版五子棋

前言 当中秋时节来临&#xff0c;我们都期待着与亲人朋友共度这个美好的节日。这个时候&#xff0c;除了传统的赏月和品尝美味的月饼&#xff0c;我还有一个特别的建议——尝试一款有趣的Flutter五子棋游戏&#xff01;这款五子棋游戏以中秋为主题&#xff0c;游戏的棋子也可爱…

微服务的初步使用

环境说明 jdk1.8 maven3.6.3 mysql8 idea2022 spring cloud2022.0.8 微服务案例的搭建 新建父工程 打开IDEA&#xff0c;File->New ->Project&#xff0c;填写Name&#xff08;工程名称&#xff09;和Location&#xff08;工程存储位置&#xff09;&#xff0c;选…

人工智能:创新之路

随着时光的推移&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;已然成为现代科技领域的焦点。AI不再是科幻小说或电影的幻想&#xff0c;而是如今社会生活和商业领域的重要一部分。本文将回顾人工智能的发展历程&#xff0c;探讨其现状…

Qt 综合练习小项目--反金币(2/2)

目录 4 选择关卡场景 4.2 背景设置 4.3 创建返回按钮 4.3 返回按钮 4.4 创建选择关卡按钮 4.5 创建翻金币场景 5 翻金币场景 5.1 场景基本设置 5.2 背景设置 5.3 返回按钮 5.4 显示当前关卡 5.5 创建金币背景图片 5.6 创建金币类 5.6.1 创建金币类 MyCoin 5.6.…

基于SpringBoot的图书进销存管理系统

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 图书类型管理 商品退货管理 客户信息管理 图书添加 客户添加 应收金额 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实…

对象存储,从单机到分布式的演进

关于数据存储的相关知识,请大家关注“数据存储张”,各大平台同名。 通过《什么是云存储?从对象存储说起》我们对对象存储的历史、概念和基本使用有了一个大概的认识。而且我们以Minio为例,通过单机部署的模式实际操作了一下对象存储的GUI,感受了一下对象存储的用法。 在上…

Linux Vi编辑器基础操作指南

Linux Vi编辑器基础操作指南 Linux中的Vi是一个强大的文本编辑器&#xff0c;虽然它有一些陡峭的学习曲线&#xff0c;但一旦掌握了基本操作&#xff0c;它就变得非常高效。以下是Vi编辑器的一些基本用法&#xff1a; 打开Vi编辑器&#xff1a; vi 文件名退出Vi编辑器&#xff…

安装matplotlib__pygame,以pycharm调入模块

安装pip 安装matplotlib 安装完毕&#xff0c;终端输入pip list检查 导入模块出现bug&#xff0c;发现不是matplotlib包的问题&#xff0c;pycharm版本貌似不兼容&#xff0c;用python编辑器可正常绘图&#xff0c;pygame也可正常导入。 ​​​​​​​ pycharm版本问题解决 终…

nodejs+vue中医体质的社区居民健康管理系统elementui

可以实现首页、中医体质量表、健康文章、健康视频、我的等&#xff0c;在我的页面可以对医生、小区单元、医疗药品等功能进行操作。目前主要的健康管理系统是以西医为主&#xff0c;而为了传扬中医文化&#xff0c;提高全民健康意识&#xff0c;解决人民日益增长的美好生活需要…