STM32F103C8T6第7天:

1. 智能小车:让小车动起来(360.64)

硬件接线

  • B-2A – PB0
  • B-1A – PB1
  • A-1B – PB2
  • A-1A – PB10
  • 其余接线参考上官一号小车项目。

cubemx配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 代码(28.smartCar_project1/MDK-ARM)

2. 智能小车:串口控制小车(361.65)

  • 在 smartCar_project1 的基础上:
    在这里插入图片描述
  • 代码(28.smartCar_project2/MDK-ARM)(拷贝 4g_led_project 中串口接收数据相关的代码)

3. 智能小车:点动控制小车(362.66)

  • 提升滴答定时器的优先级,降低串口的优先级
    在这里插入图片描述
    在这里插入图片描述
  • 代码(28.smartCar_project3/MDK-ARM)(添加延时函数)
    在这里插入图片描述

4. 智能小车:硬件PWM调速(363.67)

硬件接线

  • B-1A – PA0
  • A-1A – PA1
  • B-1A – PB1
  • A-1A – PB10
    在这里插入图片描述

在这里插入图片描述

  • 代码(28.smartCar_project4/MDK-ARM)(修改arr即可调速)
    在这里插入图片描述
  • 将控制车轮的4个 GPIO 口配置修改如下,否则小车动不起来。
  • 原因:L9110每个控制口需要一高一低才可以动起来,如果PWM有效电平为高电平,则另一个GPIO口则需要输出低电平才可以驱动轮子。
    在这里插入图片描述

5. 智能小车:左右轮各自调速(364.68)

  • 代码(28.smartCar_project5/MDK-ARM)
//main.c
while (1){__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,80);__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,150);HAL_Delay(1000);__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,150);__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,80);HAL_Delay(1000);}

6. 智能小车:循迹小车基本实现(365.69)

硬件接线

  • B-2A – PB0
  • B-1A – PB1
  • A-1B – PB2
  • A-1A – PB10
  • 循迹模块(左)DO – PB3
  • 循迹模块(右)DO – PB4

代码实现

  • 基于 smartCar_project1
  • 代码(28.smartCar_project6/MDK-ARM)
//main.c
#define LeftWheel_Value HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3)
#define RightWheel_Value HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4)while (1)
{if (LeftWheel_Value == GPIO_PIN_RESET && RightWheel_Value ==  GPIO_PIN_RESET)goForward();if (LeftWheel_Value == GPIO_PIN_SET && RightWheel_Value ==  GPIO_PIN_RESET)goLeft();if (LeftWheel_Value == GPIO_PIN_RESET && RightWheel_Value ==  GPIO_PIN_SET)goRight();if (LeftWheel_Value == GPIO_PIN_SET && RightWheel_Value ==  GPIO_PIN_SET)stop();
}

7. 智能小车:循迹小车解决转弯不平滑问题(366.70)

硬件接线

  • B-1A – PA0
  • A-1A – PA1
  • B-1A – PB1
  • A-1A – PB10

代码实现

  • 基于smartCar_project5(因为用到pwm)
    在这里插入图片描述
  • 代码(28.smartCar_project7/MDK-ARM)
//main.c
#define LeftWheel_Value HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3)
#define RightWheel_Value HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4)while (1){if(LeftWheel_Value == GPIO_PIN_RESET && RightWheel_Value == GPIO_PIN_RESET){__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,199);__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,199);}if(LeftWheel_Value == GPIO_PIN_SET && RightWheel_Value == GPIO_PIN_RESET){__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,150);__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,80);}if(LeftWheel_Value == GPIO_PIN_RESET && RightWheel_Value == GPIO_PIN_SET){__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,80);__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,150);}if(LeftWheel_Value == GPIO_PIN_SET && RightWheel_Value == GPIO_PIN_SET){__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,0);__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,0);}}
}

8. 智能小车:跟随小车的实现(367.71)

硬件接线

  • B-2A – PB0
  • B-1A – PB1
  • A-1B – PB2
  • A-1A – PB10
  • 红外跟随模块(左)OUT – PB5
  • 红外跟随模块(右)OUT – PB6

代码实现

  • 基于smartCar_project6(基本一致)
    在这里插入图片描述
  • 代码(28.smartCar_project8/MDK-ARM)
//main.c
#define LeftWheel_Value HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5)
#define RightWheel_Value HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6)while (1){if(LeftWheel_Value == GPIO_PIN_RESET && RightWheel_Value == GPIO_PIN_RESET)goForward();if(LeftWheel_Value == GPIO_PIN_SET && RightWheel_Value == GPIO_PIN_RESET)goRight();if(LeftWheel_Value == GPIO_PIN_RESET && RightWheel_Value == GPIO_PIN_SET)goLeft();if(LeftWheel_Value == GPIO_PIN_SET && RightWheel_Value == GPIO_PIN_SET)stop();}
}

9. 智能小车:摇头避障小车舵机封装(368.72)

硬件接线

  • sg90 – PB9

cubeMX配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 代码(28.smartCar_project9_1/MDK-ARM)
//sg90.c
#include "sg90.h"
#include "gpio.h"
#include "tim.h"
void initSG90(void)
{HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4); //启动定时器4__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 15); //将舵机置为90度
}
void sgMiddle(void)
{__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 15); //将舵机置为90度
}
void sgRight(void)
{__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 5); //将舵机置为0度
}
void sgLeft(void)
{__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 25); //将舵机置为180度
}
//main.c
initSG90();
HAL_Delay(1000);
while (1)
{sgLeft();HAL_Delay(1000);sgMiddle();HAL_Delay(1000);sgRight();HAL_Delay(1000);sgMiddle();HAL_Delay(1000);
}

10. 智能小车:摇头避障小车超声波传感器封装(369.73)

硬件接线

  • Trig – PB7
  • Echo – PB8

cubeMX配置

  • 基于 smartCar_project9_1
    在这里插入图片描述

代码实现

  • 代码(28.smartCar_project9_2/MDK-ARM)
//sr04.c
#include "sr04.h"
#include "gpio.h"
#include "tim.h"
//使用TIM2来做us级延时函数
void TIM2_Delay_us(uint16_t n_us)
{/* 使能定时器2计数 */__HAL_TIM_ENABLE(&htim2);__HAL_TIM_SetCounter(&htim2, 0);while(__HAL_TIM_GetCounter(&htim2) < ((1 * n_us)-1) );/* 关闭定时器2计数 */__HAL_TIM_DISABLE(&htim2);
}
double get_distance(void)
{int cnt=0;//1. Trig ,给Trig端口至少10us的高电平HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);//拉高TIM2_Delay_us(20);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);//拉低//2. echo由低电平跳转到高电平,表示开始发送波//波发出去的那一下,开始启动定时器while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_RESET);//等待输入电平拉高HAL_TIM_Base_Start(&htim2);__HAL_TIM_SetCounter(&htim2,0);//3. 由高电平跳转回低电平,表示波回来了while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_SET);//等待输入电平变低//波回来的那一下,我们开始停止定时器HAL_TIM_Base_Stop(&htim2);//4. 计算出中间经过多少时间cnt = __HAL_TIM_GetCounter(&htim2);//5. 距离 = 速度 (340m/s)* 时间/2(计数1次表示1us)return (cnt*340/2*0.000001*100); //单位:cm
}
//main.c
while (1)
{if(dir != MIDDLE){sgMiddle();dir = MIDDLE;HAL_Delay(300);
}disMiddle = get_distance();if(disMiddle > 35){//前进}else{//停止//测左边距离sgLeft();HAL_Delay(300);disLeft = get_distance();sgMiddle();HAL_Delay(300);sgRight();dir = RIGHT;HAL_Delay(300);disRight = get_distance();}
}

11. 智能小车:摇头避障小车封装电机驱动模块(370.74)

硬件接线

  • B-2A – PB0
  • B-1A – PB1
  • A-1B – PB2
  • A-1A – PB10

代码实现

  • 基于 smartCar_project9_2
    在这里插入图片描述
  • 代码(28.smartCar_project9_3/MDK-ARM)
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */if(dir != MIDDLE){sgMiddle();dir = MIDDLE;HAL_Delay(300);
}disMiddle = get_distance();if(disMiddle > 35){//前进goForward();}else if(disMiddle < 10){goBack();}else{//停止stop();//测左边距离sgLeft();HAL_Delay(300);disLeft = get_distance();sgMiddle();HAL_Delay(300);sgRight();dir = RIGHT;HAL_Delay(300);disRight = get_distance();if(disLeft < disRight){goRight();HAL_Delay(150);stop();}if(disRight < disLeft){goLeft();HAL_Delay(150);stop();}}HAL_Delay(50);//防止卡死
}

12. 智能小车:测速数据通过串口发送到上位机(371.75)

硬件接线

  • 测速模块:
  • VCC – 3.3V (不能接 5V,否则遮挡一次会触发 3 次中断)
  • OUT – PB14

代码实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 代码(28.smartCar_project10/MDK-ARM)
//main.c
unsigned int speedCnt = 0;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//外部中断源回调函数
{if(GPIO_Pin == GPIO_PIN_14)if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_14) == GPIO_PIN_RESET)speedCnt++;
}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//定时器中断回调函数
{printf("speed: %d\r\n", speedCnt);speedCnt = 0;
}
//main函数中:
HAL_TIM_Base_Start_IT(&htim2);//开启定时器中断

在这里插入图片描述

13. 智能小车:OLED代码二次开发(372.76)

硬件接线

  • SCL – PB6
  • SDA – PB7

封装Oled模块

  • 代码(28.smartCar_project11_1/MDK-ARM)

14. 智能小车:实现测速并使用Oled显示速度(373.77)

  • 代码(28.smartCar_project11_2/MDK-ARM)
    在这里插入图片描述
    在这里插入图片描述

15. 智能小车:Wifi测速小车并本地Oled显示(374.78)

硬件接线

  • 把 esp8266 插进串口1

代码实现

在这里插入图片描述
在这里插入图片描述

  • 代码(28.smartCar_project12/MDK-ARM)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/178914.shtml

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

相关文章

简要介绍Spring原生框架与Spring是轻量级框架的原因

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

别再让假的fiddler教程毒害你了,来看这套最全最新的fiddler全工具讲解

fiddler界面工具栏介绍 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; &#xff08;1&#xff09;WinConfig&#xff1a;windows 使用了一种叫做“AppContainer”的隔离技术&#xff0c;使得一些流量无法正常捕获&#xff0c;在 fiddler中点击 WinConfig…

Vue指令之v-html

在Vue中有很多特殊的标签属性&#xff0c;这些属性一般以’v’开头&#xff0c;用于在标签中实现特殊的功能。 例如&#xff0c;当Vue实例的data是一个inner html&#xff0c;我们想在网页上渲染这部分html&#xff0c;如果依然使用之前的{{ variable }}&#xff0c;则只会将i…

单片机复位电路

有时候我们的代码会跑飞,这个时候基本上是一切推到重来.”推倒重来”在计算机术语上称为复位.复位需要硬件的支持,复位电路就是在单片机的复位管脚上产生一个信号&#xff0c;俗称复位信号.这个信号需要持续一定的时间,单片机收到该信号之后就会复位,从头执行。 复位原理: 那么…

【视觉SLAM十四讲学习笔记】第三讲——四元数

专栏系列文章如下&#xff1a; 【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍 【视觉SLAM十四讲学习笔记】第二讲——初识SLAM 【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵 【视觉SLAM十四讲学习笔记】第三讲——Eigen库 【视觉SLAM十四讲学习笔记】第三讲——旋转向量和欧…

anaconda换源安装pytorch(附带bug解决办法)

1.安装anaconda 如何安装anaconda可以看这篇文章:如何安装anaconda 2.换源安装pytorch: 首先进入到pytorch官网&#xff0c;选对好参数之后复制命令进入到anaconda prompt即可: 然后进入自己的环境之后输入该命令(即conda install …)&#xff0c;则可以进行下载。下载完成…

C 标准库 - <stdlib.h>和<string.h>详解

目录 C 标准库 - 简介 库变量 库宏 库函数 实例 C 标准库 - 简介 库变量 库宏 库函数 实例 C 标准库 - <stdlib.h> 简介 C 标准库中的 <stdlib.h> 是 C 标准库的头文件之一&#xff0c;包含了一些常用的函数和类型&#xff0c;主要用于内存管理、字…

【DevOps】SonarQube 指标解读

SonarQube 指标解读 1.BUG 评级计算方法&#xff08;可靠性&#xff09;2.漏洞评级计算方法&#xff08;安全性&#xff09;3.债务和坏味道4.覆盖率4.1 代码覆盖率4.2 分支覆盖率4.3 单元测试覆盖率 5.重复 1.BUG 评级计算方法&#xff08;可靠性&#xff09; ✅ A&#xff1a…

1128. 等价多米诺骨牌对的数量

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/number-of-equivalent-domino-pa…

Day12 qt QMianWindow,资源文件,对话框,布局方式,常用ui控件

QMianWindow 概述 QMainWindow 是一个为用户提供主窗口程序的类&#xff0c;包含一个菜单栏&#xff08; menu bar &#xff09;、多 个工具栏 (tool bars) 、多个铆接部件 (dock widgets) 、一个状态栏 (status bar) 及 一个中心部件 (central widget) 许多应用程序的基础…

Python实现Windows服务自启动、禁用、启动、停止、删除

如果一个程序被服务监管&#xff0c;那么仅仅kill程序是无用的&#xff0c;还要把服务关掉 import win32service import win32serviceutildef EnableService(service_name):try:# 获取服务管理器scm win32service.OpenSCManager(None, None, win32service.SC_MANAGER_ALL_ACC…

JS长按保存canvas绘图

实现长按页面保存的功能&#xff0c;可以通过JavaScript结合浏览器的事件监听和Canvas的截图方法来实现。 <!DOCTYPE html> <html> <head><title></title> </head> <body oncontextmenu"return false"><h1>长按页面…

postgresql-shared_buffers参数详解

shared_buffers 是 PostgreSQL 中一个非常关键的参数&#xff0c;用于配置服务器使用的共享内存缓冲区的大小。这些缓冲区用于存储数据页&#xff0c;以便数据库可以更快地访问磁盘上的数据。 这个参数在 PostgreSQL 的性能方面有着重要的影响。增加 shared_buffers 可以提高数…

北京交通大学 计算机网络体系与协议(研) 考试试卷

计算机网络体系与协议2023年期末考试 时长&#xff1a;120分钟 学院&#xff1a; 学号&#xff1a; 姓名&#xff1a; 一、简答题&#xff08;每题5分&#xff09; 1.简述公开密钥密码体制的工作原理…

Java HashSet

HashSet 是一个基于 HashMap 实现的无序列表。 它不保证数据存储的顺序, 但是可以保证存储的数据是唯一不重复的, 同时支持存储 null。 如果再了解 HashMap 后, HashSet 是几个 Collection 实现中最容易理解的集合, 因为 HashSet 的所有操作都是借助于 HashMap 实现的。 Hash…

【并发编程】ConcurrentHashMap底层结构和原理

&#x1f4eb;作者简介&#xff1a;小明Java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

【Python百宝箱】密码学之美:Python安全性实战手册

前言 在当今数字化时代&#xff0c;数据安全和隐私保护是至关重要的。密码学作为信息安全的基石&#xff0c;为我们提供了许多关键的工具和算法&#xff0c;用于加密、解密、数据完整性验证和密码管理。Python生态系统中有多个强大的密码学库&#xff0c;本文将深入探讨其中一…

wmvcore.dll丢失怎么办?解决电脑出现wmvcore.dll丢失问题5个方法

wmvcore.dll缺失5个解决方法与wmvcore.dll丢失原因及文件介绍 引言&#xff1a; 在日常使用电脑的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是wmvcore.dll缺失。wmvcore.dll是Windows Media Video编码解码相关动态链接库文件之一&#xff0c;它对…

Linux 项目自动化构建工具:make/makefile

什么是 make make 是一个命令&#xff0c;他会在源文件的当前目录下寻找 makefile 或者 Makefile 文件执行这个文件中的代码。 makefile 文件的编写 我们先来见见猪跑&#xff0c;看看 make 怎么用的&#xff1a; 下面是 makefile 文件的内容&#xff1a; 这是 test.c 中的…

WPF创建进度条

使用wpf做一个原生的进度条&#xff0c;进度条上面有值&#xff0c;先看效果。 功能就是点击按钮&#xff0c;后台处理数据&#xff0c;前台显示处理数据的变化&#xff0c;当然还可以对进度条进行美化和关闭的操作&#xff0c;等待后台处理完毕数据&#xff0c;然后自动关闭。…