STM32-智能小车项目

news/2025/2/25 5:51:43

项目框图

ST-link接线

实物图:

正面:

 反面:

相关内容

使用L9110S电机模块

电机驱动模块L9110S详解 | 良许嵌入式

一、让小车动起来

新建文件夹智能小车项目

在里面复制19-串口打印功能

重命名为01-让小车动起来

新建文件夹motor,如下图所示

打开项目

加载文件

先更改引脚

然后分装函数

前进,后退,左转,右转,停止函数

PB0、PB1引脚控制的是左轮:

当PB0引脚为高电平,PB1引脚为低电平的时候,左轮向前走

当PB0引脚为低电平,PB1引脚为高电平的时候,左轮向后走

当PB0引脚与PB1引脚电平相同的时候,左轮停止

PB2、PB10引脚控制的是右轮

当PB2引脚为高电平,PB10引脚为低电平的时候,右轮向前走

当PB2引脚为低电平,PB10引脚为高电平的时候,右轮向后走

当PB2引脚与PB10引脚电平相同的时候,右轮停止

#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可以使用数据流循环发送,设置好发送的间隔,就可以实现长时间的移动。

设置的时间太长,没办法将小车动作连续起来

时间太短,小车跑的太快

其实这个整套下来,像是将片段的小车移动整合起来变成一个连续的小车移动

 


http://www.niftyadmin.cn/n/5865053.html

相关文章

Spring Cloud Gateway 网关的使用

在之前的学习中,所有的微服务接口都是对外开放的,这就意味着用户可以直接访问,为了保证对外服务的安全性,服务端实现的微服务接口都带有一定的权限校验机制,但是由于使用了微服务,就需要每一个服务都进行一…

云电脑接入DeepSeek?探讨ToDesk云电脑、海马云、顺网云的AI潜能

目录 前言一、云电脑相比实体电脑部署DeepSeek的优势二、DeepSeek云电脑实操1、ToDesk云电脑2、海马云3、顺网云 三、DeepSeek R1模型与云电脑适配性分析1、基本配置分析2、文本推理测试 四、云电脑选型看点1、跨平台兼容性2、文件存储3、关键技术4、安全与隐私5、用户体验 五、…

put data item into sotfhsm as data objects in different block size

#!/bin/bash # 该脚本用于向智能卡写入4096个数据对象,每个token最多容纳256个数据对象 # 当前token满载时,自动初始化新tokenSTART_TIME$(date %s%3N) # 模块路径,根据实际情况调整 MODULE_PATH"/home/ubuntu/Documents/HSM/20250106/S…

Fisher信息矩阵(Fisher Information Matrix, FIM)与自然梯度下降:机器学习中的优化利器

Fisher信息矩阵与自然梯度下降:机器学习中的优化利器 在机器学习尤其是深度学习中,优化模型参数是一个核心任务。我们通常依赖梯度下降(Gradient Descent)来调整参数,但普通的梯度下降有时会显得“笨拙”,…

轻量级SDK,大能量:EasyRTC重塑嵌入式设备音视频体验

在智能硬件与物联网迅猛发展的今天,嵌入式设备的音视频通讯能力正变得愈加关键。然而,受限于硬件资源,尤其是Flash存储空间的不足,传统的音视频通讯方案往往难以在嵌入式设备上实现高效集成。EasyRTC凭借其轻量级SDK和先进的技术架…

Spring Boot 多模块怎么统一管理

在 Spring Boot 中,多模块项目是一种常见的架构模式,尤其适用于构建大型、复杂的应用程序。将应用程序拆分成多个模块可以提高代码的可维护性、可重用性和团队协作效率。然而,多模块项目也带来了一些管理上的挑战,例如依赖版本管理…

uni-app 系统学习,从入门到实战(二)—— 项目结构解析

全篇大概 2000 字(含代码),建议阅读时间 10min 一、UniApp 目录结构详解 UniApp 基于 Vue.js 开发,其目录结构遵循约定大于配置的原则,以下是一个标准项目的核心目录结构: pages # 页面目录(核…

springboot集成jackson-dataformat-xml实现发送XML请求和XML响应参数处理

背景 最近在做发票相关的业务,需要对接第三方进行开发票等一系列操作,对方的系统是较老系统,需要采用XML的请求方式。 思路 一般来说,基于springboot的项目采用的都是JSON格式的请求参数和响应参数,因此需要做一个转…