STM32-智能小车项目

news2025/3/31 6:02:17

项目框图

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.coloradmin.cn/o/2304818.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

星环科技推出DeepSeek全场景解决方案:即开即用、企业级部署、端侧智能三位一体

星环科技(688031.SH)正式发布DeepSeek全场景解决方案,全面覆盖个人用户、企业客户及行业场景需求,为用户提供从个人到企业、从云端到本地的全方位AI应用支持,为不同需求的用户提供了灵活、高效且安全的AI解决方案。 省…

《全星质量管理 QMS 软件系统》:赋能企业高效质量管理

《全星质量管理 QMS 软件系统》:赋能企业高效质量管理 在当今竞争激烈的商业环境中,《全星质量管理 QMS 软件系统》脱颖而出,展现出了显著且无可比拟的应用优势。 首先,《全星质量管理 QMS 软件系统》犹如一张严密的质量管控大网…

【多模态处理篇三】【DeepSeek语音合成:TTS音色克隆技术揭秘】

最近帮某明星工作室做AI语音助手时遇到魔幻需求——要求用5秒的咳嗽声克隆出完整音色!传统TTS系统直接翻车,生成的语音像得了重感冒的电音怪物。直到祭出DeepSeek的TTS音色克隆黑科技,才让AI语音从"机器朗读"进化到"声临其境"。今天我们就来扒开这个声音…

C++Qt学习笔记——实现一个串口通信界面

CQt学习笔记——实现一个串口通信界面 一.界面二、项目结构三、头文件1. 文件头部2. 类定义3. 构造函数和析构函数4. 成员函数5. 成员变量 四、代码解析ReceiveAeraInit 函数解析SerialHelper 构造函数解析1. 为什么有两个 SerialHelper?2. 为什么用 :: 和 :&#x…

Word(2010)排版技巧

设置标题样式 选择需要设置的标题 如下图所示。选择文字后,点击对应的样式即可设置。 设置标题格式 设置字体格式 设置段落格式 显示所有样式 标题样式展示 建议 建议新建一个正文样式,可以命名为正文1,因为所有的样式参考的“样式基准…

一.Vue中的条件渲染

1.在<head>中引用 <script src"https://unpkg.com/vue3/dist/vue.global.js"></script> 2.在<body>中写入 <div id"app"><p><a v-if "user.usernameadmin"href"#">编辑</a><a …

IO进程 day05

IO进程 day05 9. 进程9. 9. 守护进程守护进程的特点守护进程创建步骤 10. 线程10.1. 线程的概念10.2. 进程和线程的区别10.2. 线程资源10.3. 线程的函数接口1. pthread_create-创建线程线程函数和普通函数的区别 2. pthread_exit3.线程资源回收函数join和detach的区别 获取线程…

【HeadFirst系列之HeadFirstJava】第6天之认识Java的API:解锁高效开发的钥匙

认识Java的API&#xff1a;解锁高效开发的钥匙 在《Head First Java》的第六章节中&#xff0c;作者深入探讨了Java的API&#xff08;Application Programming Interface&#xff09;&#xff0c;并强调了它在Java开发中的重要性。Java API 是Java开发工具包&#xff08;JDK&a…

4 - AXI GPIO按键控制LED实验

文章目录 1 实验任务2 系统框图3 软件设计 1 实验任务 本实验任务是通过调用PL端AXI GPIO IP核&#xff0c;使用中断机制&#xff0c;实现PL端按键控制 PS端LED的功能。 2 系统框图 3 软件设计 注意事项&#xff1a; AXI GPIO IP核是双沿触发中断&#xff0c;不可设置&…

题海拾贝:扫雷

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 1、题…

Deepseek本地部署小实践(c盘)

目录 前言 一、安装ollama 二、打开终端执行run 三、可视化 前言 小鲸鱼出来以后看到很多大佬本地部署AI&#xff0c;自己也想试一试&#xff0c;第一次部署AI&#xff0c;选了一个简单的办法&#xff0c;实践一下&#xff0c;写得比较粗糙。 一、安装ollama 先简单的介绍…

详细解析d3dx9_27.dll丢失怎么办?如何快速修复d3dx9_27.dll

运行程序时提示“d3dx9_27.dll文件缺失”&#xff0c;通常由DirectX组件损坏或文件丢失引起。此问题可通过系统化修复方法解决&#xff0c;无需重装系统或软件。下文将详细说明具体步骤及注意事项。 一.d3dx9_27.dll缺失问题的本质解析 当系统提示“d3dx9_27.dll丢失”时&…

【LeetCode刷题之路】leetcode155.最小栈

LeetCode刷题记录 &#x1f310; 我的博客主页&#xff1a;iiiiiankor&#x1f3af; 如果你觉得我的内容对你有帮助&#xff0c;不妨点个赞&#x1f44d;、留个评论✍&#xff0c;或者收藏⭐&#xff0c;让我们一起进步&#xff01;&#x1f4dd; 专栏系列&#xff1a;LeetCode…

Vue全局变量的定义和使用,创建 Store变量、读取、修改

在VUE中&#xff0c;当需要各js、各页面都能读写的全局变量时&#xff0c;可以用store变量&#xff0c;从定义到使用的方法如下 一&#xff0e;定义变量&#xff0c;例&#xff1a;我们定一个全局变量gxh 找到 vue的/ src/ store路径, 在 modules文件夹下创建文件gvar.js 在…

基于Docker的前端环境管理:从开发环境到生产部署的实现方案

# 基于Docker的前端环境管理&#xff1a;从开发环境到生产部署的实现方案 简介及前端开发环境挑战 简介 是一种容器化平台&#xff0c;可以将应用程序及其依赖项打包为一个容器&#xff0c;提供一种轻量级、可移植的环境。它能够简化开发、部署和运维的流程&#xff0c;提高…

单片机延时函数怎么写规范?

我们以前在开发产品的时候&#xff0c;肯定会碰到一些延时需求&#xff0c;比如常见的LED闪烁&#xff0c;按键消抖&#xff0c;控制IO口输出时序等等。 别小看延时&#xff0c;这个小问题&#xff0c;想做好&#xff0c;甚至要考虑到程序架构层面。 在开发板上&#xff0c;可能…

数据结构 1-2 线性表的链式存储-链表

1 原理 顺序表的缺点&#xff1a; 插入和删除移动大量元素数组的大小不好控制占用一大段连续的存储空间&#xff0c;造成很多碎片 链表规避了上述顺序表缺点 逻辑上相邻的两个元素在物理位置上不相邻 头结点 L&#xff1a;头指针 头指针&#xff1a;链表中第一个结点的存储…

vue2版本elementUI的table分页实现多选逻辑

1. 需求 我们需要在表格页上实现多选要求&#xff0c;该表格支持分页逻辑。 2. 认识属性 表格属性 参数说明类型可选值默认值data显示的数据array——row-key行数据的 Key&#xff0c;用来优化 Table 的渲染&#xff1b;在使用 reserve-selection 功能与显示树形数据时&…

设计模式-解释器模式、装饰器模式

解释器模式 定义 给分析对象定义一个语言&#xff0c;并定义语言的文法表示&#xff0c;再设计一个解释器来解释语言中的句子。也就是说&#xff0c;用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口&#xff0c;该接口解释一个特定的上下文。 类图 …

linux 命令+相关配置记录(持续更新...)

linux 命令记录相关配置记录 磁盘切换 cd D&#xff1a;#这里表示切换到D盘查看wsl 安装的linux 子系统 wsl --list -vwsl 卸载 linux 子系统 wsl --unregister -xxx # xxx 表示子系统的名字备份Linux 子系统 导出 wsl --export xxx yyy # xxx 表示子系统的名字 yyy 表示压…