毕业设计 单片机智能避障超声波跟随小车 - 物联网 嵌入式

news2025/2/5 19:40:04

文章目录

  • 0 前言
  • 1 项目背景
  • 2 实现效果
  • 3 设计原理
    • HC-SR04超声波模块
  • 5 部分代码
  • 6 最后


0 前言

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 基于单片机的智能避障超声波跟随小车

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:4分
  • 工作量:4分
  • 创新点:3分

1 项目背景

一些行业仍在努力掌握工业 4.0 的真正理念,即每台机器都通过互联网相互连接。这个想法意味着要使用传感器、实施控制和智能编程来确保机器或机器人有效地执行任务。

这样的应用一般是在工厂中,材料必须由铁路线控制的机器人在托盘或推车中移动。我们的项目就是受到这个想法的启发,即建立一个机器人系统。这些机器人协同工作以遵循计算好的路径并相互支持。

它还通过引入自主方面来改进概念,只允许对前面的机器人进行编程以改变目标路径并消除对跟随路径的需要。这直接导致了我们的 IR 墙壁感应和障碍物检测机器人以及视觉感应机器人的灵感涌现。

2 实现效果

在这里插入图片描述
墙壁感应和避障机器人:

在这里插入图片描述

视觉传感机器人:

在这里插入图片描述

3 设计原理

它的基本要点是第一辆机器人汽车使用红外传感器(安装在右侧)跟随墙壁和安装在汽车前部的超声波传感器来检测障碍物并转弯。从航位推算获得的坐标信息在第一个 MyRio 的帮助下传输到计算机上的 LabVIEW 软件,在计算机上显示坐标,并且地图绘制了汽车行驶的路径。

此外,我们可以在 LabVIEW 中动态更改多达 10 个参数(速度、增益、转弯速率等),这些参数控制转弯发生的距离、转弯时的速度、墙跟随时的速度、与被跟踪墙壁的距离,以及相关的增益和阈值参数。

在这里插入图片描述
在这里插入图片描述
允许我们在此处控制 C 代码片段中的参数,这些参数用于控制如何使用来自超声波和 IR 传感器的数据。

在这里插入图片描述
第二辆车使用 USB 摄像头,它有自己的 LabVIEW 程序和 MyRio 来回传输信息。在我们的例子中,USB 摄像头跟踪红色并使用其视图中“红色”的质心将转向值从 LabVIEW 程序发送回 myRio,从而发送到使用该信息进行转向的机器人汽车,方向将其与看到的颜色对齐。

第一辆汽车的后部贴有一块红色纸板,这辆车紧随其后。使用第一个 LabVIEW 代码中显示的排序系统来计算转向参考值。然后在电机转向的转向控制中实现。

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

HC-SR04超声波模块

简介

HC-SR04超声波模块常用于机器人避障、物体测距、液位检测、公共安防、停车场检测等场所。HC-SR04超声波模块主要是由两个通用的压电陶瓷超声传感器,并加外围信号处理电路构成的。如图:
在这里插入图片描述
两个压电陶瓷超声传感器,一个用于发出超声波信号,一个用于接收反射回来的超声波信号。由于发出信号和接收信号都比较微弱,所以需要通过外围信号放大器提高发出信号的功率,和将反射回来信号进行放大,以能更稳定地将信号传输给单片机。模块整体电路如图:

在这里插入图片描述

模块参数

(1)模块主要电气参数

  • 使用电压:DC—5V
  • 静态电流:小于2mA
  • 电平输出:高5V
  • 电平输出:底0V
  • 感应角度:不大于15度
  • 探测距离:2cm-450cm
  • 高精度 可达0.2cm

(2)模块引脚
超声波模块有4个引脚,分别为Vcc、 Trig(控制端)、 Echo(接收端)、 GND;其中VCC、GND接上5V电源, Trig(控制端)控制发出的超声波信号,Echo(接收端)接收反射回来的超声波信号。模块如图
在这里插入图片描述

5 部分代码

```c

/************************** .h文件******************************/


#ifndef _pid_H
#define _pid_H

#define     MODEL_P       1
#define     MODEL_PI      2
#define     MODEL_PID     3

typedef struct
{
    u8 choose_model;    		//使用哪个模式调节,以方便分布调试
    
    float curr;                   //当前值
    float set;                    //设定值
    
    float En;                     //当前时刻误差值
    float En_1;                   //前一时刻误差值
    float En_2;                   //前二时刻误差值
        
    float Kp;                     //比例系数
    float T;                      //每隔T控制器输出一次PID运算结果

    u16   Tdata;                  //判断PID周期到没到
    float Ti;                     //积分时间常数
    float Td;                     //微分时间常数
    
    float Dout;                   //增量PID计算本次应该输出的增量值-本次计算的结果

    float OUT0;                   //一个维持的输出,防止失控
    
    short currpwm;                //当前的pwm宽度
    u16 pwmcycle;                 //pwm周期

}PID;

extern u8 STATUS;
extern PID pid;
void PID_Init(void);      //增量式PID初始化
void pid_calc(void);              //pid计算 并输出


/************************** .c文件******************************/


#endif
#include "pid.h"
#include "PWM_Config.h"
#include "USART_Config.h"   		//USART设置

PID pid;

void PID_Init()  		//
{
    pid.choose_model = MODEL_PID;
    pid.T=330;                		//采样周期,定时器使用1ms,则最小执行PID的周期为330ms
    
    pid.set =280;            		//用户设定值
    pid.Kp=0.5;                	//比例系数
    pid.Ti=40;               		//微分系数常数
    pid.Td=10;                		//积分时间常数
    pid.OUT0=0;                	//一个维持的输出

    pid.pwmcycle = 330;    		//PWM的周期
}
    
void pid_calc()  			
{
 	float dk1;float dk2;
  	float t1,t2,t3;
    
    if(pid.Tdata < (pid.T))  		//最小计算周期未到
     {
            return ;
     }
    pid.Tdata = 0;
    
    pid.En=pid.set-pid.curr;  		//本次误差
    dk1=pid.En-pid.En_1;   		//本次偏差与上次偏差之差
    dk2=pid.En-2*pid.En_1+pid.En_2;
    
  	t1=pid.Kp*dk1;                   	//比例
    
    t2=(pid.Kp*pid.T)/pid.Ti;      	//积分
    t2=t2*pid.En;
    
    t3=(pid.Kp*pid.Td)/pid.T;        	//微分
    t3=t3*dk2;
    
    switch(pid.choose_model)
     {
         case MODEL_P:    		//仅用P
				pid.Dout= t1;                    
				printf("使用P运算\r\n") ;
             	break;
         
         case MODEL_PI:  		//仅用PI
				pid.Dout= t1+t2;                
				printf("使用PI运算\r\n") ;
            	break;
                 
         case MODEL_PID: 		//用PID
				pid.Dout= t1+t2+t3;        
				printf("使用PID运算\r\n") ;
				break;
	 } 
          
    pid.currpwm+=pid.Dout;  		//本次应该输出的PWM
    printf("PID算得的OUT:\t%d\r\n",(int)pid.currpwm) ;
     
    if(pid.currpwm>pid.pwmcycle)       //确保值在0-pid.pwmcycle之间
    {
      pid.currpwm=pid.pwmcycle;
    }
    if(pid.currpwm<0)
    {
     pid.currpwm=0;
    }
    
    printf("实际输出使用的OUT:\t%d\r\n",(int)pid.currpwm) ;
    pid.En_2=pid.En_1;
    pid.En_1=pid.En;    
}


void tim4_pwm_init(u16 arr,u16 psc)
{  
	
	RCC->APB1ENR |= 1<<2;    //时钟复位TIM4
	TIM4->CR1=0x0080;     //ARPE 使能,Timx_ARR寄存器被装入缓冲器
	TIM4->CR1|=0x01;      //使能定时器 4
  
	  RCC->APB2ENR |= 1<<3;       //时钟使能GPIOB  由电路图知GPIO6和TIM4的通道一复用 
	  GPIOB->CRL&=0X00F00000;
	  GPIOB->CRL|=0XBB033333;    //pb6  7复用功能输出   PB6输出ch1,pb7输出ch2
	  TIM4->ARR = arr;            //设置计数器自动重装载值
	  TIM4->PSC = psc;              //预分频器设计
	
	  TIM4->CCMR1 =0X6060;  //配置Tim4输入捕获模式
	
	  TIM4->CCMR1|=1<<3;            //CH1 预装载使能   
	  TIM4->CCMR1|=1<<11;           //CH 2 预装载使能
	
	  TIM4->CCER |=1<<0;            //OC1 输出使能 
	  TIM4->CCER |=1<<4;            //OC2 输出使能
	
	  
}
这里用到的寄存器全部可以在stm32中文手册里查到。



6 最后

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

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

相关文章

玩转云端 | 数据管理深似海,运维如何变“路人”?

数字技术正在改变人们生产、生活的方方面面。作为数字经济时代的重要生产要素&#xff0c;数据正以指数级别爆发式增长&#xff0c;企业对于数据存储及处理的方式和要求已是“今时不同往日”。最早古人存储数据的方法是“以物记物”或“借物记物”&#xff0c;即用更易于携带的…

如何视频裁剪?建议收藏这几种裁剪视频的方法

现在的网络很是方便&#xff0c;我们可以轻轻松松的在网上找到各种网课视频来进行学习。不过有些网课里面的重点内容不仅比较少&#xff0c;还很分散&#xff0c;让我们很难做到高效的学习。但其实我们可以通过视频裁剪&#xff0c;将有重点内容的视频裁剪下来&#xff0c;这样…

SpringBoot SSMP案例整合二 运维篇

目录 一、程序打包 二、项目打包后 若启动失败 三、虚拟机启动SpringBoot项目&#xff08;Linux&#xff09; 四、临时属性 五、配置文件4级分类 六、自定义配置文件 七、多环境开发&#xff08;yml版本&#xff09; 八、多环境开发多文件版&#xff08;yml版&#xf…

C++ Primer 第四章 表达式

C Primer 第四章 表达式4.1. Fundamentals4.1.1. Lvalues and Rvalues4.1.2. Precedence and Associativity4.2. Arithmetic Operators4.4. Assignment Operators4.5. Increment and Decrement Operators4.9. The sizeof Operator4.10. Comma Operator4.11. Type Conversions4.…

中国风?古典系?AI中文绘图创作尝鲜!⛵

&#x1f4a1; 作者&#xff1a;韩信子ShowMeAI &#x1f4d8; 深度学习实战系列&#xff1a;https://www.showmeai.tech/tutorials/42 &#x1f4d8; 本文地址&#xff1a;https://www.showmeai.tech/article-detail/413 &#x1f4e2; 声明&#xff1a;版权所有&#xff0c;转…

Java——B-树

概念 当我们使用avl树或者红黑树进行数据检索时&#xff0c;虽然树是平衡的&#xff0c;可以保证搜索的效率大概是logN。但是当我们的数据量比较大时&#xff0c;只能在内存中存储数据在硬盘中的指针&#xff0c;这时如果我们要检索数据&#xff0c;最少也需要比较树的高度次。…

【算法】单词接龙,合并区间, 二叉搜索树的最近公共祖先,旋转排序数组中的最小值看看有你会的吗?

算法学习有些时候是枯燥的&#xff0c;每天学习一点点 算法题目一. 单词接龙 II 题目描述java 解答参考二. 合并区间 题目描述java 解答参考三. 二叉搜索树的最近公共祖先 题目要求java实现方案四 寻找旋转排序数组中的最小值一. 单词接龙 II 题目描述 按字典 wordList 完成从…

Azure RTOS 嵌入式无线网络框架简化物联网应用开发

一、Azure RTOS概述 Azure RTOS 是一个实时操作系统 (RTOS)&#xff0c;适用于由微控制器 (MCU) 提供支持的物联网 (IoT) 和边缘设备&#xff0c; Azure RTOS 旨在支持高度受限设备&#xff08;电池供电&#xff0c;并且闪存容量不到 64 KB&#xff09;。简而言之&#xff0c;…

某HR分享:2n和n+3的基数不一样,n+3比2n拿得多!仲裁期间不能入职新公司,千万别轻易仲裁,得不偿失!...

被裁员时&#xff0c;要2n还是要n3&#xff1f;是否选择仲裁&#xff1f;一位hr说&#xff0c;跟走过仲裁的同学和律师朋友打听了下&#xff0c;原来2n和n3完全不一样。n3的n取的是“非私营单位从业人员平均工资”的三倍&#xff0c;杭州市是3.2万。2n的n取的是“全社会就业人员…

Android设计模式详解之单例模式

前言 定义&#xff1a;确保某一个类只有一个实例&#xff0c;而且自行实例化并向整个系统提供这个实例。 使用场景&#xff1a;确保某个类有且仅有一个对象的场景&#xff0c;避免产生多个对象消耗过多的资源。比如要访问IO和数据库资源&#xff0c;应该考虑使用单例模式。 …

JAVA开发(数据库表设计)

对于大型系统数据库设计&#xff0c;需要进行一定的规划和规范&#xff0c;才能方便系统扩展和维护。一般系统的数据库设计要求&#xff0c;有数据库表系统规划&#xff0c;数据库表系统命名规范和设计规范。 一、数据库表系统规划 1、按系统规划或者按微服务规划 2、按业务…

Matlab论文插图绘制模板第71期—三维饼图(Pie3)

在之前的文章中&#xff0c;分享了Matlab饼图的绘制模板&#xff1a; 进一步&#xff0c;再来分享一下三维饼图的绘制模板。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;Matlab论文插图绘制模板系列&#xff0c;旨在降低大家使用Matlab进行科研绘图的门槛&#xff0…

最大子段和(动态规划详细解析)

最大子段和 题目描述 给出一个长度为 nnn 的序列 aaa&#xff0c;选出其中连续且非空的一段使得这段和最大。 输入格式 第一行是一个整数&#xff0c;表示序列的长度 nnn。 第二行有 nnn 个整数&#xff0c;第 iii 个整数表示序列的第 iii 个数字 aia_iai​。 输出格式 …

读取excel文件read_excel()--Pandas

1. 函数功能 读取excel文件&#xff0c;支持读取xls,xlsx,xlsm等类型的EXCEL文件。能够读取一个sheet表或多个sheet表 2. 函数语法 pandas.read_excel(io, sheet_name0, *, header0, namesNone, index_colNone, usecolsNone, squeezeNone, dtypeNone, engineNone, converte…

MCMC算法

一. MCMC算法定义 MCMC是Markov chain Monte Carlo的缩写&#xff0c;即马尔可夫链蒙特卡罗方法。MCMC是一组利用马尔可夫链从随机分布中取样的算法。生成的马氏链即是对于目标分布的近似估计。常见算法&#xff1a; Metropolis-Hastings算法Gibbs取样算法Hamiltonian Monte C…

单片机AT89C51数码管数字时钟和闹钟二

详细代码讨论加我QQ&#xff1a;1271370903 一、课题的方案设计与论证 1.1摘要 近年来随着计算机在社会领域的渗透和大规模集成电路的发展&#xff0c;单片机的应用正在不断地走向深入&#xff0c;由于它具有功能强&#xff0c;体积小&#xff0c;功耗低&#xff0c;价格便宜…

【我的渲染技术进阶之旅】你可能永远猜不到为什么Filament项目命名为TNT?

文章目录一、疑惑为啥叫TNT&#xff1f;二、寻找真相2.1 百度TNT关键字2.2 GitHub issue2.3 GitHub Discussion三、总结一、疑惑为啥叫TNT&#xff1f; 在我之前的博客【我的渲染技术进阶之旅】如何编译Filament的windows版本程序&#xff1f; 有介绍如何编译Windows版本的Fil…

React 18:Ref(获取DOM对象)

ref介绍 React中所有的操作默认都是在React元素上进行&#xff0c;然后再通过虚拟DOM应用到真实页面上的。这样做的好处我们不在赘述。 虽然如此&#xff0c;在React中依然为我们提供了可以直接访问原生DOM对象的方式。ref就是干这个事的。 ref是reference的简写&#xff0c…

【排序】详细聊聊归并排序(含非递归)

目录 归并排序的基本思想&#xff1a; 递归算法&#xff1a; 递归算法的思路分析&#xff1a; 开辟数组的函数&#xff1a; 递归的函数&#xff1a; 非递归算法&#xff1a; 非递归的思路分析&#xff1a; 边界问题&#xff1a; 时间复杂度和空间复杂度分析&#xff1a…

重建农场2.0:实景三维数据中心一站式解决方案

面向实景三维中国建设&#xff0c;如何扩大产能&#xff0c;不断提升实景三维数据中心的重建算力水平&#xff1f;如何满足快速迭代的需求&#xff0c;不断提升数据中心的应变能力&#xff1f;如何做到“一机多能”&#xff0c;不断外延数据中心的硬件价值&#xff1f;在前不久…