项目框图
ST-link接线



实物图:
正面:

反面:

相关内容
使用L9110S电机模块


一、让小车动起来
新建文件夹智能小车项目
在里面复制19-串口打印功能
重命名为01-让小车动起来
新建文件夹motor,如下图所示

打开项目
加载文件
先更改引脚
然后分装函数
前进,后退,左转,右转,停止函数
PB0、PB1引脚控制的是左轮:
当PB0引脚为高电平,PB1引脚为低电平的时候,左轮向前走
当PB0引脚为低电平,PB1引脚为高电平的时候,左轮向后走
当PB0引脚与PB1引脚电平相同的时候,左轮停止
PB2、PB10引脚控制的是右轮
当PB2引脚为高电平,PB10引脚为低电平的时候,右轮向前走
当PB2引脚为低电平,PB10引脚为高电平的时候,右轮向后走
当PB2引脚与PB10引脚电平相同的时候,右轮停止
cpp
#include "motor.h"
//初始化电机函数
void motor_init(void)
{
GPIO_InitTypeDef gpio_initstruct;
//打开时钟
__HAL_RCC_GPIOB_CLK_ENABLE(); // 使能GPIOB时钟
//调用GPIO初始化函数
gpio_initstruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_10; // 两个LED对应的引脚
gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
gpio_initstruct.Pull = GPIO_PULLUP; // 上拉
gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH; // 高速
HAL_GPIO_Init(GPIOB, &gpio_initstruct);
motor_stop();
}
//前进
void motor_go_forward(void)
{
//左轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
//右轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);
}
//后退
void motor_go_backward(void)
{
//左轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
//右轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);
}
//左转
void motor_go_left(void)
{
//左轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);//想要一个轮子不动,就让它两个引脚都等于reset或者set
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
//右轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);
}
//右转
void motor_go_right(void)
{
//左轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
//右轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);
}
//停止
void motor_stop(void)
{
//左轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
//右轮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);
}
二、串口控制小车
注意:串口控制小车与蓝牙控制小车类似
想要实现的效果是:
M1:前进
M2:后退
M3:左转
M4:右转
其他M:停止
复制01-让小车动起来
重命名为02-串口控制小车
将蓝牙模块的文件粘贴到改项目中进行修改

打开项目文件
加载文件
将蓝牙模块的串口2代码粘贴到02项目中

将接收到的串口2的数据打印到串口1中



编译
调试代码
烧录
记得把串口2连接上,用两个串口助手显示结果
串口助手1->连接串口1->用于接收串口2发送过来的数据->波特率是115200
串口助手2->连接串口2->用于发送数据(M1\M2\M3\M4\其他数据)->波特率是9600
注意:在烧录完代码之后,一切准备就绪,发现在串口2中发送输入,串口1接收不到,这时候不要慌,先把两个串口助手断开,然后再次选择串口号,连接串口,这时候在输入数据,就会有反应了。

注意:如果你的电脑中usb接口不足,板子选择使用面包板接电就会出现一个小错误,面包板中只有一个3V3在供电,这个时候,使用杜邦线给32板子接电,就会出现在串口2中输入M1前进之后再输入M2后退,小车会停下来,串口助手1中会显示hello word。如下图所示:
再次输入M2小车会后退,这是因为供电不足,电压不稳,所以想要达到输入M1就是前进,输入M2就是后退,解决办法:需要使用USB外接电源供电。
三、蓝牙控制小车
将上述的串口控制小车中的串口2所接的引脚替换成蓝牙模块
然后手机连接蓝牙
输入数据,小车就会行动
要注意蓝牙所设置的波特率,不然不能正确接收数据
蓝牙当初所设置的波特率是115200,所以要在主函数中调用蓝牙初始化函数时更改波特率
四、点动控制小车
当摁下前进按键的时候,小车就会疯狂的向前走,那么现在要实现,当摁一下前进,小车就前进一下,实现点动控制小车。
复制项目文件02,重命名为,点动控制小车
打开项目


只添加这两行代码即可
剩下的在软件上完成
原理:
在主函数的while函数中,有一个停止的函数,小车最开始的状态就是停止状态,想让小车开始移动,就要打断这个while循环,所以就要用到中断,所以点动的代码要在中断函数中写,所以在中断回调函数中,有让其移动的代码,将这个代码延时一下,比如10ms。那么程序在执行完移动代码之后就会执行这个延时函数,然后再回到while循环中执行停止小车的函数,所以就实现了,10ms的点动,而,需要长时间的移动小车,就要在软件中找补了。
在串口助手中
(把蓝牙摘下去换上串口2,记得串口2的波特率已经改为115200了)

串口助手2可以使用数据流循环发送,设置好发送的间隔,就可以实现长时间的移动。
设置的时间太长,没办法将小车动作连续起来
时间太短,小车跑的太快
其实这个整套下来,像是将片段的小车移动整合起来变成一个连续的小车移动