stm32使用HAL库快速编写智能寻迹避障小车(附代码)

2023-05-16

最近学校安排了一节用stm32编写寻迹避障小车的课,但无奈学校老师教的方法让作者觉得无法理解,但课程答辩时间快到了,组内小组成员又做的磕磕绊绊,于是身为组长的我就决定尝试一下用刚学的cubemx工具,完整的写完一个小车寻迹避障代码。经过长达三天的编写搭车过程,作者终于做出了一个可以稳定寻迹的小车,过程虽然非常艰辛,但是也非常有趣。好了废话不多说,下面是具体思路。

本设计主要有三个模块,包括信号检测模块、主控模块、电机驱动模块。信号检测模块采用灰度传感器和超声波,用以对有无障碍与黑线进行检测。主控电路采用STM32单片机为控制芯片。用编码器cubemx等软件进行编程控制,电机驱动模块采用意法半导体的298N专用电机驱动芯片,单片控制与传统分立元件电路相比,使整个系统有很好的稳定性。信号检测模块将采集到的路况信号传入STM32单片机,经单片机处理过后对298N发出指令进行相应的调整。通过有无光线接收来控制电动小车的转向,从而实现自动循迹避障的功能。

需要的材料:

  • 电机2个和万向轮2个(也可以用4个电机)
  • 小车底板
  • 298n一个
  • stm32
  • 电池
  • 灰度传感器3个
  • 超声波传感器1个
  • 杜邦线若干

小车整体连接思路如下,

小车连线图

主要元件介绍:

1. 超声波

超声波测距器可应用于汽车倒车。建筑施工工地以及一些工业现场的位置监控,也可用于如液位、井深、管道长度、物体厚度等的测量。其测量范围为0.10~4.00m,测量精度为1cm。测量时与被测物体无直接接触,能够清晰、稳定地显示测量结果。
由于超声波指向性强,能量消耗慢,在介质中传播的距离较远,因而超声波经常用于距离的测量。利用超声波检测距离设计比较方便,计算处理也比较简单,并且在测量精度方面也能达到使用的要求。

在这里插入图片描述

VCC 供 3.3V-5 V电源,
GND 为地线,
TRIG 触发控制信号输入,
ECHO 回响信号输出

基本工作原理:
(1)采用 IO 口 TRIG 触发测距,给最少 10us 的高电平信号。
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;

超声波

2. 灰度传感器

灰度传感器是模拟传感器,与stm32结合使用,可以感知地面或桌面不同的颜色而产生相应的信号,可实现与颜色有相关的互动作品,也可以作为巡线小车的巡线传感器或者足球机器人的场地灰度识别。电源需要和控制器一致,通常为3.3V或5V。
在这里插入图片描述

接口定义:
out:信号输出
+:电源(VCC)
-:地(GND)

基本工作原理:
灰度传感器共引出三个引脚,分别是电源正Vcc、电源地GND、信号端out,实际使用时可以直接将传感器连接到stm32的模拟接口,传感器白色高亮 LED 亮起,将传感器扣放在灰度不同的纸张上,通过stm32自带的 AD 转换进行数据的读取,然后通过串口打印出测量的模拟量即可。

3. 电机

电机采用直流减速电机,直流减速电机转动力矩大,体积小,重量轻,装配简单,使用方便。由于其内部由高速电动机提供原始动力,带动变速(减速)齿轮组,可以产生较大扭力。
电机

4. 298n驱动模块

驱动模块采用专用芯片L298N 作为电机驱动芯片,L298N 是一个具有高电压大电流的全桥驱动芯片,其响应频率高,一片L298N可以分别控制两个直流电机。以下为L298N的引脚图和输入输出关系表。

298n
关系表

总体控制思路

在这里插入图片描述

主要代码:

1. 距离测算代码

uint16_t soner_gettime(void)
{
	uint32_t a;
	a=TIM2->CNT;
	return a;
}

float soner_getdistance(void)
{   
	uint16_t time_node1;
  uint16_t time_node2;
  uint16_t measure;
  soner_startrange();
  while(HAL_GPIO_ReadPin(SONER_PORT,SONER_ECHO_PIN)==RESET);
	time_node1=soner_gettime();
	while(HAL_GPIO_ReadPin(SONER_PORT,SONER_ECHO_PIN)==SET);
	time_node2=soner_gettime();
	measure=time_node2-time_node1;
	distance_temp = measure * 17.0/100;
	if(distance_last==0)
		distance_last = distance_temp;
	if(distance_last-distance_temp>100 || distance_temp-distance_last>100)
	{
		distance_result =distance_last;
		distance_last=distance_temp;
	}
	else
	{
		distance_result=distance_temp;
		distance_last=distance_temp;
	}
  return distance_result;
}


2. 距离判断

		
		if(distance<15){
			
	  HAL_GPIO_WritePin(ele_l1_GPIO_Port, ele_l1_Pin, GPIO_PIN_SET);
	  HAL_GPIO_WritePin(ele_l2_GPIO_Port, ele_l2_Pin, GPIO_PIN_SET);
      HAL_GPIO_WritePin(ele_r1_GPIO_Port, ele_r1_Pin, GPIO_PIN_SET);
      HAL_GPIO_WritePin(ele_r2_GPIO_Port, ele_r2_Pin, GPIO_PIN_SET);
			
		}

3. ADC读取灰度传感器值:



		
		if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC))
		{
			ADC1_Value = HAL_ADC_GetValue(&hadc1);
       
      lemon1=(ADC1_Value-3000);	
			if(lemon1<100){
				a1=1;
			}else{
				a1=0;
			}
		}
			
			//adc1
			
		
		HAL_ADC_PollForConversion(&hadc2,50);
		
		if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc2),HAL_ADC_STATE_REG_EOC))
		{
			ADC2_Value = HAL_ADC_GetValue(&hadc2);
       
      lemon2=(ADC2_Value-3300);
			
			if(lemon2<40){
				a2=1;
			}else{
				a2=0;
			}
		}
		
		//adc2
		

		HAL_ADC_PollForConversion(&hadc3,50);
		
		if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc3),HAL_ADC_STATE_REG_EOC))
		{
			ADC3_Value = HAL_ADC_GetValue(&hadc3);
       
      lemon3=(ADC3_Value-2180);
			
			if(lemon3<120){
				a3=1;
			}else{
				a3=0;
			}
			
		//adc3
			
		}

4. 灰度传感器驱动电机:

if(a2==1&&distance>15){
			
			HAL_GPIO_WritePin(ele_l1_GPIO_Port, ele_l1_Pin, GPIO_PIN_RESET);
			HAL_GPIO_WritePin(ele_l2_GPIO_Port, ele_l2_Pin, GPIO_PIN_SET);
      HAL_GPIO_WritePin(ele_r1_GPIO_Port, ele_r1_Pin, GPIO_PIN_RESET);
      HAL_GPIO_WritePin(ele_r2_GPIO_Port, ele_r2_Pin, GPIO_PIN_SET);
			
			__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_3,25);
			__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,25);
			
		}
		
		if(a1==1&&distance>15){
			
			HAL_GPIO_WritePin(ele_l1_GPIO_Port, ele_l1_Pin, GPIO_PIN_RESET);
			HAL_GPIO_WritePin(ele_l2_GPIO_Port, ele_l2_Pin, GPIO_PIN_SET);
      HAL_GPIO_WritePin(ele_r1_GPIO_Port, ele_r1_Pin, GPIO_PIN_RESET);
      HAL_GPIO_WritePin(ele_r2_GPIO_Port, ele_r2_Pin, GPIO_PIN_SET);
			
			__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_3,25);
			__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,0);
			
		}
			
		
		
		
		if(a3==1&&distance>15){
			
			HAL_GPIO_WritePin(ele_l1_GPIO_Port, ele_l1_Pin, GPIO_PIN_RESET);
			HAL_GPIO_WritePin(ele_l2_GPIO_Port, ele_l2_Pin, GPIO_PIN_SET);
      HAL_GPIO_WritePin(ele_r1_GPIO_Port, ele_r1_Pin, GPIO_PIN_RESET);
      HAL_GPIO_WritePin(ele_r2_GPIO_Port, ele_r2_Pin, GPIO_PIN_SET);
			
			__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_3,0);
			__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,25);
			
		}





    

制作过程

小车的组装还比较简单,组装小车并没有花太长时间。我们用3D打印做了一个放灰度传感器的小架子。
在这里插入图片描述

因为采用了cubemx编写程序,使得代码简洁易懂。
在这里插入图片描述
经过多次测试与改进,作者的智能小车能很好的完成循迹和避障功能,小车能够用灰度传感器在测试场地上沿黑线前进并在转弯处转向。通过本次编程,作者理解了智能小车避障、寻迹与自动控制的基本原理,并且学习了使用cubemx编写stm32的keil代码,十分有趣,让我明白了电控的知识与过程,慢慢领悟了其重要性,在我们的生活中也可以用到,比如可自己制作自动扫地机器人,无人机等,激发了我学习的动力,也让我接触到了电机控制、灰度传感器、298n模块、超声波模块的使用,并学习了如何烧录芯片、编写代码以及串口调试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32使用HAL库快速编写智能寻迹避障小车(附代码) 的相关文章

  • Spring IOC原理解析

    首先恭喜守宏同学找到了自己心仪的工作 xff0c 入职的事情终于尘埃落定 xff0c 也算是一个新的开始吧 和守宏聊天的时候也说了很多有关工作的事情 xff0c 畅想了以后美好的未来 xff0c 也想到了今后的种种困难 不说别的就是单单在北
  • Ardupilot四元数姿态控制函数attitude_controller_run_quat解析

    Ardupilot四元数姿态控制函数attitude controller run quat解析 源码解析细节讲解thrust heading rotation angles update ang vel target from att e
  • Ardupilot速率控制器rate_controller_run解析

    Ardupilot速率控制器rate controller run解析 PID速率控制器源码解析rate controller run PID运算积分限制update i get ff set xxx 内容补充 xff1a 函数中陀螺仪数据
  • muduo网络库学习总结:基本架构及流程分析

    muduo网络库学习 xff1a 基本架构及流程分析 基本架构Basic ReactorMutiple Reactor 43 ThreadPool muduo库的基本使用基本结构介绍EventLoop类Poller类Channel类TcpC
  • push_back和emplace_back比较以及vector扩容

    push back和emplace back比较以及vector扩容 push back和emplace back的比较使用测试类测试过程将实体类对象传入将右值数字传入将实体类对象move 转右值之后传入 vector扩容过程 关于这部分内
  • 在ubuntu 11.04下编写驱动程序

    在ubuntu11 04下直接就可以编写驱动程序 xff0c 并进行编译 hello c include 34 linux init h 34 include 34 linux module h 34 static int hello in
  • ROS的优势与不足(除了ROS 机器人自主定位导航还能怎么做?)

    导读 xff1a 随着这两年国内机器人的升温 xff0c 自主定位导航技术作为机器人智能化的第一步正不断引起行业内的重视 为了实现这一功能 xff0c 不少厂家选择采用机器人操作系统ROS xff08 Robot Operation Sys
  • C++版本发展史

    1 C 43 43 98 2 C 43 43 03 3 C 43 43 11 3 1 nullptr 3 2 auto 3 3 decltype 3 4 初始化列表 3 5 范围for循环 3 6 右值引用 3 7 字符串字面量 3 8 n
  • 分布式数据库难题(三):数据一致性

    1 什么是数据一致性 一直以来 xff0c 在 分布式系统 和 数据库 这两个学科中 xff0c 一致性 xff08 Consistency xff09 都是重要概念 xff0c 但它表达的内容却并不相同 对于分布式系统而言 xff0c 一
  • 分布式数据库难题(四):单机事务

    1 ACID的含义 在数据库中 xff0c 事务 是由多个操作构成的序列 1970 年詹姆斯 格雷 xff08 Jim Gray xff09 提出了事务的 ACID 四大特性 xff0c 将广义上的事务一致性具化到了原子性 一致性 隔离性和
  • 对一个整数进行因式分解,求出所有质因数

    1 题目描述 给定一个正整数N xff0c 对N进行质因数分解 xff0c 求解N的所有质因数 2 解题思路 xff08 1 xff09 2 是很特殊的 xff0c 必须单独列出 xff08 2 xff09 必须先判断是否质数 因为如果是质
  • Windows10下安装Ubuntu18.04LTS详细教程

    这篇文章分享自己在Windows10系统下安装VMware虚拟机 xff0c 然后在VMware中安装Ubuntu 18 04 LTS的详细过程 之所以选择在虚拟机中安装Ubuntu xff0c 主要是可以不影响自己电脑的正常使用 xff0
  • 我的2011 写给小白

    许久前就想写这篇日志了 xff0c 但是一直以各种理由搪塞着 xff0c 没空闲 xff0c 再加上该死的期末考试 xff0c 唉 xff0c 真是愁煞人也 xff0c 现在好了 xff0c 什么都完事了 xff0c 也淡定了 xff0c
  • Pixhawk的历史

    发展历程 xff1a APM gt PX4FMU IO gt Pixhawk xff1a 1 Arduino简介 Arduino就是主要以以AVR单片机为核心控制器的单片机应用开发板 xff08 当然也有其他核心的例如STM32版本的但是不
  • 姿态解算基础:欧拉角、方向余弦、四元数

    什么是姿态解算 xff1a 飞行器的姿态解算过程涉及到两个坐标系 xff0c 一个是运载体的机体坐标系 xff0c 该坐标系与运载体固连 xff0c 当运载体转动的时候 xff0c 这个坐标系也跟着转动 xff0c 我们假设运载体的坐标系为
  • 姿态解算进阶:互补滤波(陀螺仪、加速度计、地磁计数据融合)

    互补滤波原理 xff1a 在四轴入门理论知识那节我们说 xff0c 加速度计和磁传感器都是极易受外部干扰的传感器 xff0c 都只能得到2维的角度关系 xff0c 但是测量值随时间的变化相对较小 xff0c 结合加速度计和磁传感器可以得到3
  • C++实现线程池

    本文转载自 xff1a https blog csdn net caoshangpa article details 80374651 1 为什么需要线程池技术 目前的大多数网络服务器 xff0c 包括Web服务器 Email服务器以及数据
  • 详解coredump

    1 什么是coredump xff1a 2 开启或关闭core文件的生成 xff1a 3 core文件的存储位置和文件名 xff1a 4 造成程序core的原因 xff08 参考 xff09 xff1a 5 用GDB调试coredump x
  • C++中二进制、字符串、十六进制、十进制之间的转换

    1 十进制和二进制相互转换 2 字符串和二进制相互转换 3 字符串和十进制相互转换 4 十进制和十六进制相互转换 5 二进制和十六进制 1 十进制和二进制相互转换 xff08 1 xff09 十进制转二进制 int a 61 10 bits
  • 解决 docker: Invalid containerPort: 5000 .

    复制粘贴的命令报这个错误 xff0c 结果手敲了一下就好了 可能就是 v 那里字符有点问题 xff0c 或者多个空格之类的 看了下其他人说的解决办法 xff0c 说也有可能是大写字母的问题 学习不要图省事 xff0c 真的 xff01

随机推荐

  • linux输入yum后提示: -bash: /usr/bin/yum: No such file or directory的解决方法

    一 首先了解Linux系统下这两个命令的区别 yum xff1a 属于 xff1a RedHat系列 常见系统有 xff1a Redhat Centos Fedora等 apt get xff1a 属于 xff1a Debian系列 常见系
  • OpenCV矩形检测

    点击我爱计算机视觉标星 xff0c 更快获取CVML新技术 今天在52CV交流群里有朋友问到矩形检测的问题 xff0c 恰好前几天做了一个与此相关的项目 xff0c 调研了一下相关的算法 xff08 期间被某带bug的开源代码坑了很久 xf
  • 修改树莓派系统的虚拟内存大小(SWAP)

    树莓派默认的虚拟内存大小才100M xff0c 有时候我们需要扩大它 xff0c 树莓派的虚拟内存配置文件和debian默认的位置不一样 xff0c 所以这里我们修改的是 etc dphys swapfile sudo nano etc d
  • Python爬虫—request模块与验证码识别

    相关文章链接 xff1a Python爬虫 爬虫基础简介 Python爬虫 数据解析及案例 xff08 4K图片爬取 xff09 一 request模块 1 1 概念 python中原生的一种基于网络请求的模块 xff0c 功能非常强大 x
  • 学习 ROS 机器人没有前途?!

    点击蓝字 关注我们 本文转载自蓝桥云课合作作者 xff1a 机器马 xff0c 文末有小惊喜哦 01 ROS 是什么 机器人操作系统 xff08 ROS xff09 是一种用于编写机器人软件的灵活框架 它是工具 xff0c 库和协议的集合
  • 运维必学的监控系统——Prometheus,大牛免费直播带你入门~

    关注 实验楼 xff0c 每天分享一个项目教程 实验1小时 明晚开启 xff0c 腾讯大牛天火老师带你入门Promentheus xff08 普罗米修斯 xff09 这一当下超火的监控系统 提到监控系统 xff0c 人们往往会想到Zabbi
  • VINS-Mono代码阅读笔记(十一):进入pose_graph节点代码分析

    本篇笔记紧接着上一篇VINS Mono代码阅读笔记 xff08 十 xff09 xff1a vins estimator中的非线性优化 xff0c 来接着学习VINS Mono系统中重定位和全局优化部部分的代码 这部分代码在pose gra
  • ROS中插件plugin的简单使用方法

    插件 xff0c 如同其名字一样 xff0c 第一次接触的时候让我想到了U盘或者USB线这类东西 xff0c 它们和电脑没有关系 xff0c 但是插入 xff08 挂载 xff09 电脑USB口后却可以正常使用 xff0c 仿佛扩展了电脑的
  • ROS中的roslaunch命令和launch文件(ROS入门学习笔记四)

    ROS中的基本对象和概念学习笔记 ROS入门学习笔记一 ROS中创建工作区和包 ROS入门学习笔记二 ROS功能包中CMakeLists txt的说明 ROS入门学习笔记三 1 roslaunch命令 我们知道 xff0c rosrun命令
  • 嵌入式软件面试题整理

    基础试题 1 用预处理指令 define 声明一个常数 xff0c 用以表明1年中有多少秒 xff08 忽略闰年问 define SECONDS PER YEAR 60 60 24 365 UL 说明 xff1a define 语法的基本知
  • 硬件在环仿真(HiL)测试介绍

    一 HiL是什么 xff1f 硬件在环仿真 xff08 Hardware in the Loop xff0c 简称HIL xff09 是真 的控制器连接假 的被控对象 xff0c 以一种高效低成本的方式对控制器进行全面测试 它是一种用于复杂
  • Docker Dockerfile详解

    dockerfike快速创建自定义的Docker镜像 一 目录 1 docker典型结构 2 指令介绍 3 创建docker镜像 二 结构 DockerFile分为四部分组成 xff1a 基础镜像信 维护者信息 镜像操作指令和容器启动时执行
  • 树莓派3B+(Raspberry Pi 3 Model B+)安装Ubuntu MATE 18.04及简单配置

    树莓派3B 43 安装Ubuntu MATE 18 04及简单配置 安装Ubuntu18 04 MATE下载Ubuntu 18 04 MATE准备Raspberry Pi Imager镜像烧录工具开机启动 简单配置设置root密码更新列表配
  • OpenCV之getOptimalNewCameraMatrix

    去畸变后的图像四周会出现黑色区域 xff0c 如果畸变较大 xff0c 如鱼眼镜头 xff0c 四周黑色区域将会更大 opencv中给我们提供了一个函数getOptimalNewCameraMatrix xff0c 用于去除畸变矫正后图像四
  • 【深度学习小常识】什么是mAP?

    目录 一 mAP相关概念 1 正例与负例 2 P xff08 精确率 xff09 3 R xff08 召回率 xff09 4 ACC xff08 准确率 xff09 5 AP xff08 平均精确度 xff09 6 示例 二 mAP 1 m
  • STM32CubeMX 下载和安装 详细教程

    HAL库 STM32CubeMX开发 STM32F407 目录 STM32CubeMX安装包 Win 6 6 1 下载链接 STM32CubeMX 下载 步骤1 xff1a 点击官网链接下载 官网下载地址 xff1a https www s
  • Keil5----跳转定义和查找功能

    一 Keil5 跳转定义 跳转定义 鼠标左键点击要查找的变量 方法1 xff1a 点击鼠标右键 xff0c 功能栏中有跳转定义的选项 方法2 xff1a 按快捷键 F12 具体操作如下图所示 xff1a 跳转结果 二 Keil5 查找功能
  • 使用WIFI模块AT指令进行MQTT协议通信

    劢领系列模组 xff0c 经过1年多的演化后 xff0c 已存在多套标准的固件程序 如果用户需要使用MQTT方式进行通信 xff0c 则需要选择标准AT指令 43 MQTT的版本 此版本不仅可以支持标准AT指令的SOCKET通信 xff0c
  • ActiveMQ配置wss

    最近把前端页面由原来的http升级为了https xff0c 发现之前ActiveMQ提供的ws不能强求了 xff0c https服务下要求升级到wss 全网搜索了下 xff0c 没有找到一个靠谱的文档 一 证书准备 使用wss连接服务必须
  • stm32使用HAL库快速编写智能寻迹避障小车(附代码)

    最近学校安排了一节用stm32编写寻迹避障小车的课 xff0c 但无奈学校老师教的方法让作者觉得无法理解 xff0c 但课程答辩时间快到了 xff0c 组内小组成员又做的磕磕绊绊 xff0c 于是身为组长的我就决定尝试一下用刚学的cubem