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;则可以进行下载。下载完成…

【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) 许多应用程序的基础…

postgresql-shared_buffers参数详解

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

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

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

Python入职某新员工大量使用Lambda表达式,却被老员工喷是屎山

Python中Lambda表达式是一种简洁而强大的特性,其在开发中的使用优缺点明显,需要根据具体场景权衡取舍。 Lambda表达式的优点之一是它的紧凑语法,适用于一些短小而简单的函数。这种形式使得代码更为精炼,特别在一些函数式编程场景中,Lambda表达式可以提高代码的表达力。此外…

DMX512协议及对接口电路的分析

1、DMX512协议简介 DMX 是Digital MultipleX 的缩写&#xff0c;意为多路数字传输(具有512条信息的数字多路复用”)。DMX512控制协议是美国舞台灯光协会(usITT)于1990年发布的灯光控制器与灯具设备进行数据传输的工业标准&#xff0c;全称是USITTDMX512(1990); DMX512 在其物理…

福州大学《嵌入式系统综合设计》 实验八:FFMPEG视频编码

一、实验目的 掌握使用算能平台进行视频编码的流程&#xff0c;包括开发主机环境与云平台的配置&#xff0c;视频编码程序的编写与理解&#xff0c;代码的编译、运行以及学习使用码流分析工具分析视频压缩码流等。 二、实验内容 搭建实验开发环境&#xff0c;编译并运行编码…

Spring Boot 3.2.0 虚拟线程初体验 (部分装配解析)

写在前面 spring boot 3 已经提供了对虚拟线程的支持。 虚拟线程和平台线程主要区别在于&#xff0c;虚拟线程在运行周期内不依赖操作系统线程&#xff1a;它们与硬件脱钩&#xff0c;因此被称为 “虚拟”。这种解耦是由 JVM 提供的抽象层赋予的。 虚拟线程的运行成本远低于平…

组合设计模式

package com.jmj.pattern.combination;/*** 菜单组件&#xff0c;属于抽象根节点*/ public abstract class MenuComponent {//菜单组件的名称protected String name;//菜单组件的层级protected int level;//添加子菜单public void add(MenuComponent menuComponent) {throw new…

12.Spring源码解析-其它标签解析

容易看出&#xff0c;Spring其实使用了一个Map了保存其映射关系&#xff0c;key就是命名空间的uri&#xff0c;value是NamespaceHandler对象或是Class完整名&#xff0c;如果发现是类名&#xff0c;那么用反射的方法进行初始化&#xff0c;如果是NamespaceHandler对象&#xff…