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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

想成为网络安全工程师该如何学习?

一、网络安全应该怎么学&#xff1f; 1.计算机基础需要过关 这一步跟网安关系暂时不大&#xff0c;是进入it行业每个人都必须掌握的基础能力。 计算机网络计算机操作系统算法与数据架构数据库 Tips:不用非要钻研至非常精通&#xff0c;可以与学习其他课程同步进行。 2.渗透技…

计算虚拟化之CPU——qemu解析

解析 qemu 的命令行&#xff0c;qemu 的命令行解析&#xff0c;就是下面这样一长串。 qemu_add_opts(&qemu_drive_opts);qemu_add_opts(&qemu_chardev_opts);qemu_add_opts(&qemu_device_opts);qemu_add_opts(&qemu_netdev_opts);qemu_add_opts(&qemu_nic_…

Java代码的编译与执行过程

一、编译过程 1、javac 编译 Java源代码通过编译器&#xff08;javac&#xff09;编译为字节码文件(.class)。 idea中的 build 和 maven package等指令都可以编译为 .class 2、类加载器(Class Loader) 类加载器负责将类的字节码文件加载到内存中&#xff0c;以便在运行时创…

Helm3部署kubeview资源可视化工具

一、KubeView 介绍 KubeView 是一个 Kubernetes 集群可视化工具和可视化资源管理器。它提供了跨命名空间的 Kubernetes 对象的完整概述&#xff0c;以及它们如何通过直观的 UI 和资源对象相互连接。它允许用户在集群内部运行命令&#xff0c;并查看集群内部的资源使用情况、容器…

带着GPT-4V(ision)上路,自动驾驶新探索

On the Road with GPT-4V(ision): Early Explorations of Visual-Language Model on Autonomous Driving GitHub | https://github.com/PJLab-ADG/GPT4V-AD-Exploration arXiv | https://arxiv.org/abs/2311.05332 自动驾驶技术的追求取决于对感知、决策和控制系统的复杂集成。…

【计算机毕业设计】nodejs+vue音乐播放器系统 微信小程序83g3s

本系统的设计与实现共包含12个表:分别是配置文件信息表&#xff0c;音乐列表评论表信息表&#xff0c;音乐论坛信息表&#xff0c;歌手介绍信息表&#xff0c;音乐资讯信息表&#xff0c;收藏表信息表&#xff0c;token表信息表&#xff0c;用户表信息表&#xff0c;音乐类型信…

某东大厂面试js手写题【手写代码附带注释,放心食用,博主亲测】

文章目录 前言js实现push方法js实现订阅发布手写防抖节流手写reduce方法后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;前端面试 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技…

Apache POI(处理Miscrosoft Office各种文件格式)

文章目录 一、Apache POI介绍二、应用场景三、使用步骤1.导入maven坐标2.写入代码讲解3.读取代码讲解 总结 一、Apache POI介绍 Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用 POI 在 Java 程序中对Miscrosoft Office…

SpringBoot——模板引擎及原理

优质博文&#xff1a;IT-BLOG-CN 一、模板引擎的思想 模板是为了将显示与数据分离&#xff0c;模板技术多种多样&#xff0c;但其本质都是将模板文件和数据通过模板引擎生成最终的HTML代码。 二、SpringBoot模板引擎 SpringBoot推荐的模板引擎是Thymeleaf语法简单&#xff0…

LCM-LoRA模型推理简明教程

潜在一致性模型 (LCM) 通常可以通过 2-4 个步骤生成高质量图像&#xff0c;从而可以在几乎实时的设置中使用扩散模型。 来自官方网站&#xff1a; LCM 只需 4,000 个训练步骤&#xff08;约 32 个 A100 GPU 小时&#xff09;即可从任何预训练的稳定扩散 (SD) 中提取出来&#…

距离向量路由协议——IGRP和EIGRP

IGRP-内部网关路由协议 IGRP&#xff08;Interior Gateway Routing Protocol&#xff0c;内部网关路由协议&#xff09;是一种动态距离向量路由协议&#xff0c;它是Cisco公司在20世纪80年代中期设计的&#xff0c;是Cisco专用路由协议。目前在Cisco高版本的IOS已经对IGRP不提…

python加速方法:GPU加速(numba库)Demo及编写注意事项

上周使用GPU加速了一个算法&#xff0c;效果特别惊艳&#xff0c;由于算法代码本身没有太大参考价值&#xff0c;所以这里只记录了一些心得体会&#xff0c;以便后续遇到问题进行参考排查 numba加速代码编写注意事项 numba加速代码编写一定要注意&#xff1a; 1、开辟空间&am…

用通俗的方式讲解Transformer:从Word2Vec、Seq2Seq逐步理解到GPT、BERT

直到今天早上&#xff0c;刷到CSDN一篇讲BERT的文章&#xff0c;号称一文读懂&#xff0c;我读下来之后&#xff0c;假定我是初学者&#xff0c;读不懂。 关于BERT的笔记&#xff0c;其实一两年前就想写了&#xff0c;迟迟没动笔的原因是国内外已经有很多不错的资料&#xff0…

nodejs之express学习(1)

安装 npm i express使用 // 导入 const express require(express) // 创建应用 const app express() // 创建路由 app.get(/home,(req,res)>{res.end("hello express") }) app.listen(3000,()>{console.log("服务已启动~") })路由的介绍 什么是…

leetCode 226.翻转二叉树

给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 226. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09; 示例 1: 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;root…

【栈和队列(1)(逆波兰表达式)】

文章目录 前言什么是栈(Stack)栈方法栈的模拟实现链表也可以实现栈逆波兰表达式逆波兰表达式在栈中怎么使用 前言 什么是栈(Stack) 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0…

智慧化工~工厂设备检修和保全信息化智能化机制流程

化工厂每年需要现场检修很多机器&#xff0c;比如泵、压缩机、管道、塔等等&#xff0c;现场检查人员都是使用照相机&#xff0c;现场拍完很多机器后&#xff0c;回办公室整理乱糟糟的照片&#xff0c;但是经常照了之后无法分辨是哪台设备&#xff0c;而且现场经常漏拍&#xf…

毫米波雷达DOA角度计算-----MUSIC算法

MUSIC算法如下&#xff1a; txNum &#xff1a;发射天线 2个 &#xff0c;rxNum&#xff1a;接收天线 4 个 。 ant &#xff1a; 为目标点的 天线 接收数据 &#xff0c; 为 8*1矩阵。 A ant;d 0.5;M 1; % # 快拍数ang_ax -90:90; % 角度坐标% 接收信号方向向量for k1:…

vr中小学智慧教育仿真平台大大减轻教师备课负担

在教育领域&#xff0c;将VR虚拟现实、AR增强现实和元宇宙技术融合到在线教育的VR云课堂智慧学习平台&#xff0c;通过为学生和教师提供了一个全新的、沉浸式的学习环境&#xff0c;极大地改善了传统的教学方式和学习体验&#xff0c;正成为改革的重要力量。 课程资源云平台拥有…

类指针压缩空间

一、类指针压缩介绍 压缩指针&#xff0c;指的是在 64 位的机器上&#xff0c;使用 32 位的指针来访问数据&#xff08;堆中的对象或 Metaspace 中的元数据&#xff09;的一种方式。 对象头中的 Class Pointer 默认占 8 个字节&#xff0c;开启 -XX:UseCompressedOops 后&…