淘宝二手优必选舵机保姆级驱动教程,看不懂来打我(自行修改ID,有HAL库驱动函数)

1.首先,先检查舵机的好坏。
本身优必选舵机的连接线属于稀缺物品,所以经本人实验,使用PH2.0 3P端子口也可以供电,但要剪掉端口背面的一小段塑料凸起。
另:24齿的舵机也已经测试过可以兼容淘宝有售的24T铝合金舵机盘。
若供电之后,彩灯正常亮起,并有切换效果,则电机有九成概率是良品,可以使用了

2.精华部分,修改舵机ID

这一步是确保舵机可用,并可以集成到自己的机器人项目中的关键一步,只有自行修正了舵机ID,才能使多个舵机并联工作。
另:本人试过级联驱动,但估计是因为线材问题没有成功,目前只有统一连接实验成功了,即多个舵机连接至同一个控制板一条总线

我对这个舵机的研究基本基于两篇文章:一篇是在码云上的“某宝白菜价总线舵机开发记”,一篇是知乎上的相关文章,基本上前一篇的知识就都足够使用了,我的程序也是从博主的arduino代码移植而来。

其实关键就在于一点:根据协议表(刚才提到的码云教程就有),有修改电机ID的命令,使用串口助手即可,在广播模式下(ID位是0x00),仅连接一个电机(这是关键),使用修改命令就可以成功修改电机ID。
很简单,很方便(其实不是很方便校验和还得拿计算器算。。。。。。。。)

在这里也贴出驱动程序,校验和计算程序,基于STM32HAL库的
同理可任意移植到各平台,做ros应用或者机器人的各种学习都可以

uint8_t checksum(uint8_t* buf, uint8_t sz)//计算校验和
{
  uint16_t sum = 0;
  for(uint8_t i=0; i<sz; i++)
    sum += buf[i];
  return (uint8_t)(sum&0xff);
}

void delay_2bit()//延时出来2个回复位的时间,约20us
{
uint16_t a1 =50;
	
while(a1>2)
	a1--;

}

void servo_c(uint8_t ID,uint8_t angle,uint8_t time)//舵机控制
{

servo[2]=ID;   //舵机ID
servo[3]=0x01; //运动控制命令
servo[4]=angle;//目标角度
servo[5]=time; //运动时间
	             //6,7位控制指令中不使用
servo[8]=	checksum(&servo[2],6);//校验和
HAL_UART_Transmit(&huart1,servo,10,1000);//发送10个值
delay_2bit();
	
}

使用这三个函数,可以实现基本的控制,但这款电机据说支持速度校准,位置校准,减速电机模式和回读之类的高级功能,暂时还没有开发。
另:要注意那个延时函数,连续发太快容易丢信号,要根据装机情况微调一下。

典型驱动电压7.4V,兼容2S锂电供电,正常最高是8.4V
应该支持超压提速运行,有待实验,电机和驱动的耐受程度还是很高的。

就是图里这种,在淘宝随处可见
码云文章链接:https://gitee.com/alicedodo/xaobao_cheap_bus_servo_hack_record

文章写得慌促,各位朋友如果有进一步交流的想法请加qq交流:2754578740

我是热爱机器人的通信小白一只,欢迎各位留下宝贵的意见,也期待和各位交朋友。

  • 9
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
你可以使用HAL库驱动舵机。以下是一个示例代码,演示如何使用HAL库来控制舵机: ```c #include "stm32f4xx_hal.h" /* 定义舵机引脚 */ #define SERVO_PIN GPIO_PIN_0 #define SERVO_PORT GPIOA /* 舵机角度范围 */ #define SERVO_MIN_ANGLE 0 #define SERVO_MAX_ANGLE 180 /* 舵机控制周期 */ #define SERVO_PERIOD 20000 // 20ms /* 舵机角度对应的PWM占空比范围 */ #define SERVO_MIN_DUTY_CYCLE 1000 // 1ms #define SERVO_MAX_DUTY_CYCLE 2000 // 2ms /* 定义舵机角度转换函数 */ uint32_t map(uint32_t value, uint32_t in_min, uint32_t in_max, uint32_t out_min, uint32_t out_max) { return (value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } /* 初始化舵机 */ void Servo_Init() { GPIO_InitTypeDef GPIO_InitStruct; TIM_HandleTypeDef htim; /* 打开舵机引脚的时钟 */ __HAL_RCC_GPIOA_CLK_ENABLE(); /* 配置舵机引脚为复用功能 */ GPIO_InitStruct.Pin = SERVO_PIN; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; HAL_GPIO_Init(SERVO_PORT, &GPIO_InitStruct); /* 打开舵机使用的定时器时钟 */ __HAL_RCC_TIM2_CLK_ENABLE(); /* 配置定时器 */ htim.Instance = TIM2; htim.Init.Prescaler = 84 - 1; // 84MHz / 84 = 1MHz htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = SERVO_PERIOD - 1; // PWM周期为20ms htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(&htim); /* 配置PWM输出通道 */ TIM_OC_InitTypeDef sConfigOC; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = SERVO_MIN_DUTY_CYCLE; // 初始占空比为1ms sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_1); /* 启动PWM输出 */ HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1); } /* 控制舵机角度 */ void Servo_SetAngle(uint32_t angle) { /* 将角度转换为对应的PWM占空比 */ uint32_t duty_cycle = map(angle, SERVO_MIN_ANGLE, SERVO_MAX_ANGLE, SERVO_MIN_DUTY_CYCLE, SERVO_MAX_DUTY_CYCLE); /* 设置PWM占空比 */ TIM2->CCR1 = duty_cycle; } ``` 在主函数中,你可以使用`Servo_Init()`函数初始化舵机,并使用`Servo_SetAngle()`函数来控制舵机的角度。例如,要将舵机角度设置为90度,可以调用`Servo_SetAngle(90)`。 请注意,以上代码是基于STM32F4系列微控制器和HAL库的示例。你可能需要根据你使用的具体硬件平台和库进行适当的修改

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值