本文是为参加2021赛季北京理工大学机器人队校内赛所写的简单教程,意在帮助参赛选手快速了解校内赛所需模块的使用方法,以及其与薪火培训知识的联系。
舵机驱动
硬件接线
舵机是由直流电机、减速齿轮组、传感器和控制电路组成的一套自动控制系统。与直流电机不同,舵机只能在一定角度内转动,且发送的信号指定的是输出轴应旋转至的角度。
常见舵机引出线为红棕黄或红黑白3色,其中红色为电源线,接5V;棕色或黑色为地线,接GND;黄色或白色为信号线,接GPIO口。
驱动原理
我们利用信号线给舵机发送一系列周期信号,通过控制周期信号内高电平的持续时间,来达到控制舵机应转动至的角度的目的。参加过薪火培训的同学可能会回忆起,这就是使用PWM方式来控制舵机。
现在,以MG996R的180度舵机为例,我们来解读其相关参数的含义:
参数名称 | 数据 | 含义 |
---|
工作电压 | 4.8~7.2V | 电源线应该接在5V上 |
转动角度 | 180度 | 旋转角度的范围为0°~180° |
工作频率 | 50Hz | 信号周期为20ms,许多舵机都能工作在此频率下 |
脉冲宽度 | 0.5ms~2.5ms | 若1个周期内高电平持续0.5ms,则意味着应旋转至0°位置;若持续2.5ms,则旋转至180°位置;在0.5~2.5ms内,脉冲宽度与输出轴角度成线性关系 |
需要注意的是,不同型号的舵机的参数可能会有所不同,具体参数还请查询手册。
示例代码
同样以“驱动原理”中的参数为例,我们设置PA1为TIM2_CH2模式,使用高速晶振产生72MHz系统时钟信号。设置分频为72-1,则分频信号频率为1MHz;设置自动重载为20000-1,则每1/1000000*20000s=20ms产生自动重载事件,即设置信号周期为20ms。脉冲宽度应在0.5~2.5ms内,则捕获比较寄存器应设置在500 ~ 2500之间。将目标角度缩放为对应的CCR值,传入捕获比较寄存器,即可实现通过PWM控制舵机角度。关于PWM存在疑问的,可以第2周薪火培训的线下课视频和示例工程。
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
uint16_t signal;
uint16_t angle=0;
signal=(uint16_t)((angle-90)*100.0/9+1500);
while (1)
{
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,signal);
}
蓝牙模块
硬件接线
我们使用的蓝牙模块为BT-04或HC-06,如下图所示。
将其根据如下方式与单片机相连接即可。
蓝牙模块 | STM32单片机 |
---|
VCC | 5V |
GND | G |
RXD | TX(你设置为TX的GPIO口) |
TXD | RX(你设置为RX的GPIO口) |
配置蓝牙模块
蓝牙模块在使用前可以对其波特率、名称、密码等参数进行设置,尤其是波特率,必须与之后串口通信的波特率保持一致。蓝牙模块有2种工作模式,即命令响应工作模式和自动连接工作模式。当模块处于自动连接工作模式时,将自动根据事先设定的方式传输数据;当模块处于命令响应工作模式时,能执行AT命令,用户可向模块发送各种AT指令,为模块设定控制参数或发布控制命令。用AT命令设置的参数掉电后依然保存,下次上电使用时无需重新设置。蓝牙模块在上电且未配对情况下自动进入AT模式,默认波特率通常为9600。
将USB转TLL模块与蓝牙模块按照下表连接,USB转TLL模块的USB口接到电脑上。
蓝牙模块 | USB转TLL模块 |
---|
VCC | VCC |
GND | GND |
RXD | TXD |
TXD | RXD |
打开串口调试助手(如薪火培训大礼包中的XCOM),就可以发送AT指令了,常用的指令包括:
- 测试通讯
发送:AT
返回:OK - 设置波特率
发送:AT+BAUD1
返回:OK1200
其中BAUD1可改为BAUD2、BAUD3等,对应不同的波特率,对应关系如下表所示。常用波特率为9600、38400和115200。
指令 | 波特率 |
---|
BAUD1 | 1200 |
BAUD2 | 2400 |
BAUD3 | 4800 |
BAUD4 | 9600 |
BAUD5 | 19200 |
BAUD6 | 38400 |
BAUD7 | 57600 |
BAUD8 | 115200 |
- 设置串口参数
发送:AT+UART=<Param1>,<Param2>, <Param3>
返回:OK
Param1为波特率,Param2为停止位,Param3为校验位。其中,若Param2为0,则设置1位停止位;若Param2为1,则设置2位停止位。若Param3为0,则无校验位;若Param3为1,则为奇校验;若Param3为2,则为偶校验。例如,发送AT+UART=9600,0,0,则设置波特率为9600,1位停止位,无校验位。 - 获得串口参数
发送:AT+UART?
返回:+UART:<Param1>,<Param2>,<Param3> OK
参数含义与设置串口参数时一致。 - 获得蓝牙模块地址
发送:AT+ADDR?
返回:+ADDR:<Param> OK - 设置设备名称
发送:AT+NAME=<Param>
返回:OK - 获得设备名称
发送:AT+NAME?
返回:+NAME:<Param> OK - 设置模块密码
发送:AT+PSWD=<Param>
返回:OK
驱动方式
我们使用的蓝牙模块实质上是个蓝牙转串口的设备,封装了和蓝牙有关的部分,因此我们无需了解蓝牙协议,只要了解串口通信,即可使用蓝牙模块。对于串口通信的收发方式有疑问的同学,可以回看薪火培训串口通信相关的线下课录制和示例视频。
现在我们以BT-04为例,演示通过手机蓝牙控制STM32单片机(当然,也可以通过上位机控制)。
首先下载一个手机蓝牙串口助手,在应用市场里可以找到很多类似的应用,如“蓝牙串口”、“蓝牙调试助手”等,此处使用的是“蓝牙调试器”。完成蓝牙模块和单片机的接线,并给单片机上电后,在app中找到我们的蓝牙模块并连接,密码一般为0000或1234。
编写串口通信收发数据的工程,并烧录到单片机中。打开debug模式,将接收数据添加到watch中,在手机蓝牙串口助手中发送数据,即可在watch中观察到接收数据变化。我们可以利用收到的数据控制单片机的其它外设,或者将单片机运行的结果发送给手机蓝牙串口助手。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)