
本项目中所使用的为四线二相的42步进电机,步距角是1.8度,在无细分的情况下转一圈走200步,360/1.8=200。**切记:**42这个数字的含义仅与电机的尺寸有关。而电机步距角细分程度只与电机驱动器的配置有关。

2.2 tb6600驱动器
驱动步进电机往往需要驱动器帮助,常见的步进电机驱动器有:tb6600**、a4988、dm542、dma860h和uln2003**等。其中,大部分步进电机驱动器用法和接线思路大致相同,驱动电机的原理也基本一样。
项目中使用的步进电机驱动器为tb6600,tb6600是一款专业的两相步进电机驱动器,兼容stm32、arduino和其他多种主控器,可实现电机正反转控制,旋转角度控制等功能。步进电机驱动是一种电子设备,通常作为桥梁来连接控制器、电源和步进电机。虽然控制器的处理性能很强大,但是它本身的输出能力(电流)却很弱小。它需要一个中间桥梁去连接电机和主控,并同时为电机提供足够的电源。
tb6600步进电机驱动器采用h桥双极恒相流驱动,可直接用9~42vdc供电,可选择7档细分控制(1、2/a、2/b、4、8、16、32),8档电流控制(0.5a、1a、1.5a、2a、2.5a、2.8a、3.0a、3.5a)。最高支持4a电流输出。信号端都有配有高速光电隔离,防止信号干扰,并且支持共阴、共阳两种信号输入方式。出于安全考虑,驱动器支持脱机保持功能,能够让用户在通电状态下调试。内置温度保护和过流保护,可适应更严苛的工作环境。 驱动器适合驱动57、42型两相、四相混合式步进电机,能达到低振动、低噪声、高速度的驱动效果。可以适用于机械人控制,3d打印等高精度应用领域中。


通过拨动tb6600侧边的拨码开关设置步进电机的细分与电流, 当拨码开关向下拨动则为on,上图为作者设置的步进电机为16细分,电流设置为1.0a。分析:正常情况下,步进电机的步距角为1.8°,转动一圈需要200脉冲,当设置为16细分则需要16×200=3200脉冲(一个脉冲步距角为0.1125°)。而电流拨码开关的设置只要保证输出电流别超过步进电机电流的运载上限就行。
三、5v步进电机与uln2003驱动器
5v五线四相步进电机是一种常见的小扭矩电机,本项目中采用此电机通过机械结构驱动机械臂爪子进行物体抓取。该型号电机往往使用uln2003驱动器配合使用,unl2003器件是高电压大电流达林顿晶体管阵列。

uln2003驱动板上的in1、in2、in3、in4四个引脚和单片机的io口直接使用杜邦线连接,为了方便初次学习uln2003驱动板的朋友理解,这里仅具体给大家讲解1相励磁法,如下图所示:

上图4个定子线圈分别为a、b、c、d,我们依次给a、b、c、d通电,则可实现电机的转动,这个就是上面提到的1相励磁法。使用uln2003驱动板时,我们只需要将in1、in2、in3、in4四个引脚分别去逐个给予高电平即可(使用定时器)。

四、机械臂控制
4.1 jdy-31蓝牙控制
jdy-31蓝牙模块基于蓝牙3.0 spp设计,这样可以支持 windows、linux、android数据透传,工作频段 2.4ghz,调制方式gfsk,最大发射功率8db,最大发射距离30米,支持用户通过at命令修改设备名、波特率等指令,方便快捷使用灵活。
其通常使用时接入串口引脚(uart)即可,成功与蓝牙模块建立通信后会发送connected。简单的说,jdy-31蓝牙模块本质上就是一个蓝牙转串口的设备,使用的时候直接当串口通讯进行使用即可。

而上位机作者则选用现成开源的蓝牙调试器app,直接创建一个针对本项目机器人的控制上位机工程。利用该app极大的缩短了上位机开发的时间与工作量,也可以快速检验出机器人的运动控制是否满足要求(需要蓝牙调试app的可以私信作者提供)。
jdy-31蓝牙模块的at指令集:
| 序号 | 目的 | 指令 | 参数 | 响应 | 备注 |
| 1 | 查询版本号 | at+version | none | +version=… | |
| 2 | 复位 | at+reset | none | +ok | |
| 3 | 断开连接 | at+disc | none | +ok | 蓝牙连接后有效 |
| 4 | ble蓝牙mac地址 | at+laddr | none | +laddr=… | |
| 5 | 波特率设置/查询 | at+baud[参数] | 4-9600;5-19200;6-38400;7-57600;8-115200;9-128000 | +ok | 128000也不丢包 |
| 6 | spp蓝牙密码配对/查询 | at+pin[参数] | 4位密码 | +ok | 默认1234 |
| 7 | 广播名设置/查询 | at+name[参数] | 18字节以下 | ok | |
| 8 | 恢复出厂设置 | at+default | none | ok | 默认jdy-31-spp |
| 9 | 串口输出状态使能查询 | at+enlog | 1:打开 0:关闭 | ok | 默认为1 |
4.2 机械臂运动学建模
合格的机械臂产品往往都需要根据其设计的机械结构去解算其运动模型,即仅输入需要的笛卡尔空间坐标系下的位置点
,即可解算出各台电机需要运转的情况。考虑到博客篇幅有限,这里仅给大家提供该机械臂的几何模型算法,后续基于树莓派与stm32的视觉抓取机械臂给大家详细介绍一下。

五、 cubemx配置
1、rcc配置外部高速晶振(精度更高)——hse;

2、sys配置:debug设置成serial wire(否则可能导致芯片自锁);

3、tim2配置:利用tm2定时器配置us级脉冲

4、uart3配置: jdy-31模块与stm32的蓝牙串口通讯(开启串口中断);


5、gpio配置:pa5、pa6、pa7为机械臂方向控制引脚;pd9、pd10、pd11、pd12为5v步进电机的四相输入;pf13、pf14、pf15为机械臂电机驱动脉冲输入引脚;

6、时钟树配置:

7、工程配置:

六、代码与解析
6.1 机械臂电机控制代码
机械臂的驱动器件为3台42步进电机,通过tb6600驱动器进行驱动。单片机mcu主要控制的是tb6600上的dir与pul端口,其控制过程也很简单——gpio控制即可(作者选择共阴接法,dir-与pul-都需接地,只需要控制dir+与pul+即可)。
其中,dir+端口的控制为gpio的高低电平控制,该dir+端口的高低电平输入决定了步进电机的转动方向。pul+端口则需要输入脉冲信号进行控制,脉冲频率的高低决定了步进电机的转速。当然,这里的pul+端口的脉冲输入有2种主流方式:(1)us级延迟函数gpio电平翻转(2)设置定时器翻转gpio(这里作者使用us级延迟函数翻转实现脉冲)。
motordrive.h代码:
#ifndef __motordriver_h
#define __motordriver_h
#include "main.h"
//电机方向控制引脚
//正转
#define motor1forward hal_gpio_writepin(gpioa,gpio_pin_5,gpio_pin_set);
#define motor2forward hal_gpio_writepin(gpioa,gpio_pin_6,gpio_pin_set);
#define motor3forward hal_gpio_writepin(gpioa,gpio_pin_7,gpio_pin_set);
//反转
#define motor1backward hal_gpio_writepin(gpioa,gpio_pin_5,gpio_pin_reset)
#define motor2backward hal_gpio_writepin(gpioa,gpio_pin_6,gpio_pin_reset)
#define motor3backward hal_gpio_writepin(gpioa,gpio_pin_7,gpio_pin_reset)
//步进电机控制
void motor1(short dir,int speed);//步进电机1号机
void motor2(short dir,int speed);//步进电机2号机
void motor3(short dir,int speed);//步进电机3号机
#endif
motordrive.c代码:
#include "motordrive.h"
#include "tim.h"
//1号步进电机,1正转,其他反转
void motor1(short dir,int speed)
{
if(dir == 1)
{
motor1forward;
}
else
{
motor1backward;
}
//电机脉冲控制
hal_gpio_writepin(gpiof,gpio_pin_13,gpio_pin_set);
tims_delay_us(speed);
hal_gpio_writepin(gpiof,gpio_pin_13,gpio_pin_reset);
tims_delay_us(speed);
}
//2号步进电机,1正转,其他反转
void motor2(short dir,int speed)
{
if(dir == 1)
{
motor2forward;
}
else
{
motor2backward;
}
//电机脉冲控制
hal_gpio_writepin(gpiof,gpio_pin_14,gpio_pin_set);
tims_delay_us(speed);
hal_gpio_writepin(gpiof,gpio_pin_14,gpio_pin_reset);
tims_delay_us(speed);
}
//3号步进电机,1正转,其他反转
void motor3(short dir,int speed)
{
if(dir == 1)
{
motor3forward;
}
else
{
motor3backward;
}
//电机脉冲控制
hal_gpio_writepin(gpiof,gpio_pin_15,gpio_pin_set);
tims_delay_us(speed);
hal_gpio_writepin(gpiof,gpio_pin_15,gpio_pin_reset);
tims_delay_us(speed);
}
us级延迟函数:
void tims_delay_us(uint16_t nus)
{
__hal_tim_set_counter(dly_tim_handle, 0);
__hal_tim_enable(dly_tim_handle);
while (__hal_tim_get_counter(dly_tim_handle) < nus)
{
}
__hal_tim_disable(dly_tim_handle);
}
6.2 机械爪控制代码
机械爪部分使用5v步进电机与uln2003驱动板驱动,将uln2003驱动器上的in1、in2、in3、in4四个引脚循环拉高电平,即可实现对5v步进电机的控制(in引脚循环周期的快慢决定电机转动的快慢,循环引脚顺序决定了电机转动方向)。
crawl.h代码:
#ifndef __crawl_h
#define __crawl_h
#include "main.h"
//引脚定义
#define in1_high hal_gpio_writepin(gpiod,gpio_pin_9,gpio_pin_set)
#define in2_high hal_gpio_writepin(gpiod,gpio_pin_10,gpio_pin_set)
#define in3_high hal_gpio_writepin(gpiod,gpio_pin_11,gpio_pin_set)
#define in4_high hal_gpio_writepin(gpiod,gpio_pin_12,gpio_pin_set)
#define in1_low hal_gpio_writepin(gpiod,gpio_pin_9,gpio_pin_reset)
#define in2_low hal_gpio_writepin(gpiod,gpio_pin_10,gpio_pin_reset)
#define in3_low hal_gpio_writepin(gpiod,gpio_pin_11,gpio_pin_reset)
#define in4_low hal_gpio_writepin(gpiod,gpio_pin_12,gpio_pin_reset)
//5v步进电机控制
void stepper(short dir,int speed);
#endif
crawl.c代码:
#include "crawl.h"
//1是正转,其余是反转
void stepper(short dir,int speed)
{
if(dir == 1)
{
in1_high;
hal_delay(speed);
in1_low;
in2_high;
hal_delay(speed);
in2_low;
in3_high;
hal_delay(speed);
in3_low;
in4_high;
hal_delay(speed);
in4_low;
}
else
{
in1_high;
hal_delay(speed);
in1_low;
in4_high;
hal_delay(speed);
in4_low;
in3_high;
hal_delay(speed);
in3_low;
in2_high;
hal_delay(speed);
in2_low;
}
}
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、oppo等大厂,18年进入阿里一直到现在。**
**深知大多数嵌入式工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**



**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**


**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以+v:vip1104z获取!!! (备注:嵌入式)**
<img src="https://img-community.csdnimg.cn/images/73bb5de17851459088c6af944156ee24.jpg" alt="img" style="zoom: 67%;" />
# 最后
**资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~**
**你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!**
95%以上嵌入式&物联网开发知识点,真正体系化!**
[外链图片转存中...(img-qrtxcgln-1712383660991)]
[外链图片转存中...(img-mkt5uyfv-1712383660992)]
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以+v:vip1104z获取!!! (备注:嵌入式)**
<img src="https://img-community.csdnimg.cn/images/73bb5de17851459088c6af944156ee24.jpg" alt="img" style="zoom: 67%;" />
# 最后
**资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~**
**你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!**
**[更多资料点击此处获qu!!](https://bbs.csdn.net/topics/618376385)**
发表评论