STC89C51基础及项目第14天:循迹小车、跟随小车

news2024/9/27 12:16:37

1. 循迹小车基本原理和方案(269.114)

循迹模块使用

  • TCRT5000传感器的红外发射二极管不断发射红外线:
  • 当发射出的红外线 没有 被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为 高电平,指示二极管一直处于 熄灭状态
  • 被检测物体出现 在检测范围内 时,红外线 被反射回来 且强度足够大,红外接收管饱和,此时模块的输出端为 低电平,指示二极管 被点亮
  • 总结:没反射回来,D0输出高电平,灭灯
    在这里插入图片描述

在这里插入图片描述

  • 接线方式
    • VCC:接电源正极(3 - 5V)
    • GND:接电源负极
    • DO: TTL开关信号输出 0、1
    • AO: 模拟信号输出(不同距离输出不同的电压,此脚一般可以不接)

循迹小车原理

  • 由于黑色具有较强的吸收能力,当循迹模块发射的红外线 照射到黑线时,红外线将会 被黑线吸收,导致循迹模块上光敏三极管 处于关闭状态,此时模块上 一个 LED 熄灭
  • 没有检测到 黑线时,模块上 两个 LED 常亮
  • 总结:有感应到黑线,D0输出高电平,灭灯
    在这里插入图片描述
  • 循迹模块安装在小车车头两侧:
    • 下方小车两个模块都能 反射回来红外,输出 低电平,灯亮,直走
    • 上方小车左模块遇到黑线,红外被吸收,左模块输出 高电平且左灯灭,右模块输出 低电平且右灯亮,左转,反之右转

2. 根据循迹原理实现循迹功能代码编写(270.115)

  • 代码(20./07. 循迹小车实现)(不调速方式写代码)
#include "motor.h"
#include "delay.h"
#include "reg52.h"

sbit leftSensor = P2^7;
sbit rightSensor = P2^6;

void main(){
//下方小车两个模块都能反射回来红外,输出低电平,灯亮,直走
//上方小车左模块遇到黑线,红外被吸收,左模块输出高电平且左灯灭,右模块输出低电平且右灯亮,左转,反之右转
	while(1){
		if(leftSensor == 0 && rightSensor == 0){//左右都反射回来,都低电平,直走,灯都亮
			goForward();
		}
		
		if(leftSensor == 1 && rightSensor == 0){//左边没反射回来,左高电平,左转,右灯亮
			goLeft();
		}
		
		if(leftSensor == 0 && rightSensor == 1){//右边没反射回来,右高电平,右转,左灯亮
			goRight();
		}
		
		if(leftSensor == 1 && rightSensor == 1){//左右都没反射回来,都高电平,停,灯都不亮
			stop();
		}
	}
}

3. 循迹实际测试和电位器调节(271.116)

4. 解决转弯干滑问题,加入电机调速

#include "motor.h"
#include "delay.h"
#include "uart.h"
#include "timer.h"
#include "reg52.h"

sbit leftSensor = P2^7;
sbit rightSensor = P2^6;

extern char speedLeft;
extern char speedRight;

void main(){
	Timer0Init();
	Timer1Init();
	//UartInit();
	
	while(1){
		if(leftSensor == 0 && rightSensor == 0){//左右都反射回来,都低电平,直走,灯都亮
			speedLeft = 40;
			speedRight = 40;
		}
		
		if(leftSensor == 1 && rightSensor == 0){//左边没反射回来,左高电平,左转,右灯亮
			speedLeft = 15;   //10份单位时间前进,30份停止,所以慢(20ms是40份的500us)
			speedRight = 40;	//左转
		}
		
		if(leftSensor == 0 && rightSensor == 1){//右边没反射回来,右高电平,右转,左灯亮
			speedLeft = 40;   //40份单位时间前进,0份停止,所以全速(20ms是40份的500us)
			speedRight = 15;	//右转
		}
		
		if(leftSensor == 1 && rightSensor == 1){//左右都没反射回来,都高电平,停,灯都不亮
			speedLeft = 0;
			speedRight = 0;
		}
	}
}
  • 代码(20./08. 循迹小车解决转弯平滑问题)(调速方式写代码)

5. 跟随小车(274.119)

红外壁障模块分析

在这里插入图片描述

  • 原理和循迹是类似的,循迹红外朝下,跟随朝前

跟随小车的原理

  • 左边跟随模块能返回红外,输出低电平,说明物体在左边,右边不能返回,输出高电平,需要左转
  • 右边跟随模块能返回红外,输出低电平,说明物体在右边,左边不能返回,输出高电平,需要右转

代码(20./09. 跟随小车)

#include "motor.h"
#include "delay.h"
#include "reg52.h"

sbit leftSensor = P2^5;
sbit rightSensor = P2^4;

void main(){
//左边跟随模块能返回红外,输出低电平,说明物体在左边,右边不能返回,输出高电平,需要左转
//右边跟随模块能返回红外,输出低电平,说明物体在右边,左边不能返回,输出高电平,需要右转
	while(1){
		if(leftSensor == 0 && rightSensor == 0){//两边都反射回来了,都低电平,直走
			goForward();
		}
		
		if(leftSensor == 1 && rightSensor == 0){//右边反射回来了,右低电平,右转
			goRight();
		}
		
		if(leftSensor == 0 && rightSensor == 1){//左边反射回来了,左低电平,左转
			goLeft();
		}
		
		if(leftSensor == 1 && rightSensor == 1){//两边都没反射回来,都高电平,停
			stop();
		}
	}
}

6. 跟随小车效果(275.120)

7. 摇头测距小车01_舵机和超声波封装(276.121)

  • 代码(20./10. 摇头避障小车/摇头避障小车01_改装垃圾桶代码)

8. 摇头测距小车02_实现疯狂摇头(277.122)

  • 代码(20./10. 摇头避障小车/摇头避障小车02_摇头)
#include "reg52.h"
#include "hc04.h"
#include "delay.h"
#include "sg90.h"

void main()
{
	Timer0Init();
	Timer1Init();
	//舵机的初始位置
	sgMiddle();
	Delay2000ms();
	
	while(1){
		sgLeft();
		Delay300ms();
		sgMiddle();
		Delay300ms();
		
		sgRight();
		Delay300ms();
		sgMiddle();
		Delay300ms();
	}
}

9. 摇头测距小车03_测距摇头(278.123)

  • 代码(20./10. 摇头避障小车/摇头避障小车03_测距摇头实现)
#include "reg52.h"
#include "hc04.h"
#include "delay.h"
#include "sg90.h"

void main(){
	
	double disMiddle;
	double disLeft;
	double disRight;
	
	Timer0Init();
	Timer1Init();
	//舵机的初始位置
	sgMiddle();
	Delay2000ms();
	
	while(1){
		disMiddle = getDistance();
		
		if(disMiddle > 35){
			//前进
		}else{
			//停止
			//sg左转 测左边距离
			sgLeft();
			Delay300ms();
			disLeft = getDistance();
			
			sgMiddle();
			Delay300ms();
			
			//sg右转 测右边距离
			sgRight();
			Delay300ms();
			disRight = getDistance();
			
			sgMiddle();
			Delay300ms();
		}
	}
}

10. 摇头测距小车04_摇头训距和行驶(279.124)

  • 代码(20./10. 摇头避障小车/摇头避障小车04_摇头测距加电机联动)
#include "reg52.h"
#include "hc04.h"
#include "delay.h"
#include "sg90.h"
#include "motor.h"

#define MIDDLE 0
#define LEFT 1
#define RIGHT 2

void main(){
	char dir;

	double disMiddle;
	double disLeft;
	double disRight;
	
	Timer0Init();
	Timer1Init();
	//舵机的初始位置
	sgMiddle();
	Delay2000ms();
	
	while(1){
		if(dir != MIDDLE){
			sgMiddle();
			dir = MIDDLE;
			Delay300ms();
		}
		disMiddle = getDistance();
		
		if(disMiddle > 35){
			//前进
			goForward();
		}else{
			//停止
			stop();
			//sg左转 测左边距离
			sgLeft();
			Delay300ms();
			disLeft = getDistance();
			
			sgMiddle();
			Delay300ms();
			
			//sg右转 测右边距离
			sgRight();
			Delay300ms();
			disRight = getDistance();
			
			if(disLeft < disRight){
				goRight();
				Delay150ms();
				stop();
			}
			if(disLeft > disRight){
				goLeft();
				Delay150ms();
				stop();
			}
		}
	}
}

11. 实地测试及BUG微调(280.125)

  • 代码(20./10. 摇头避障小车/摇头避障小车05_bug修改)
#include "reg52.h"
#include "hc04.h"
#include "delay.h"
#include "sg90.h"
#include "motor.h"

#define MIDDLE 0
#define LEFT 1
#define RIGHT 2

void main(){
	char dir;

	double disMiddle;
	double disLeft;
	double disRight;
	
	Timer0Init();
	Timer1Init();
	//舵机的初始位置
	sgMiddle();
	Delay2000ms();
	
	while(1){
		if(dir != MIDDLE){
			sgMiddle();
			dir = MIDDLE;
			Delay300ms();
		}
		disMiddle = getDistance();
		
		if(disMiddle > 35){
			//前进
			goForward();
		}else if(disMiddle < 10){
			goBack();
		}else{
			//停止
			stop();
			//sg左转 测左边距离
			sgLeft();
			Delay300ms();
			disLeft = getDistance();
			
			sgMiddle();
			Delay300ms();
			
			//sg右转 测右边距离
			sgRight();
			Delay300ms();
			disRight = getDistance();
			
			if(disLeft < disRight){
				goRight();
				Delay150ms();
				stop();
			}
			if(disLeft > disRight){
				goLeft();
				Delay150ms();
				stop();
			}
		}
	}
}

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

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

相关文章

积分球测量作用

积分球在测量光通量上的使用可以追溯到1890年&#xff0c;并且现在已经成为一个多方面广泛使用的仪器。积分球是专门用于LED光色参数测量和光谱分析的仪器。LED光源以其体积小、能耗低、响应快、寿命长等诸多优点&#xff0c;在各个领域都得到广泛使用&#xff0e;积分球作为一…

腾讯云学生用户专享活动汇总

腾讯云一直致力于为广大用户提供更加优惠的云计算服务&#xff0c;其中也包括学生用户。为了让学生用户更好地享受腾讯云的优惠政策&#xff0c;腾讯云推出了多种学生用户专享的优惠活动。本文将为大家介绍腾讯云学生用户专享的优惠活动&#xff0c;帮助学生用户更好地了解腾讯…

修炼k8s+flink+hdfs+dlink(四:k8s(二)组件)

一&#xff1a;控制平面组件。 控制平面组件会为集群做出全局决策&#xff0c;比如资源的调度。 以及检测和响应集群事件&#xff0c;例如当不满足部署的 replicas 字段时&#xff0c; 要启动新的 pod&#xff09;。 1. kube-apiserver。 该组件负责公开了 Kubernetes API&a…

QECon大会亮相产品,全栈测试平台推荐:RunnerGo

最近在gitee上看见一款获得GVP&#xff08;最有价值开源项目&#xff09;的测试平台RunnerGo&#xff0c;看他们官网介绍包含了接口测试、性能测试、自动化测试。知道他们有saas版可以试用&#xff0c;果断使用了一下&#xff0c;对其中场景管理和性能测试印象深刻&#xff0c;…

智慧公厕技术解析 | 提高公厕管理效率的关键

智慧公厕&#xff0c;作为现代城市管理的重要一环&#xff0c;已经越来越受到各地、各行业、各单位的重视。通过引入先进的技术手段&#xff0c;智慧公厕不仅能够提升管理效率&#xff0c;还能够改善用户体验&#xff0c;成为城市发展、旅游景区、商业大厦等场所的亮丽名片。本…

【项目】在线oj

1. 创建项目 创建maven项目。 引入依赖&#xff08;mysql connector和servlet&#xff09;&#xff1a; <dependencies><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><ar…

antd Form shouldUpdate 关联展示 form 数组赋值

form 数组中嵌套数值更新 注意&#xff1a;数组是引用类型 项目需求&#xff0c;表单中包含多个产品信息&#xff0c;使用form.list 数组嵌套&#xff0c;提货方式如果是邮寄展示地址&#xff0c;如果是自提&#xff0c;需要在该条目中增加两项 代码如下&#xff1a;// An hi…

提升企业管理效率!金蝶软件配置自定义域名,快速实现公网远程访问

文章目录 前言1. 保留自定义域名2. 域名解析3. 配置自定义域名4. 关于服务器选择以及域名备案的说明4.1 关于服务器地区的选择&#xff1a;4.2 关于自定义域名备案&#xff1a;4.3 关于域名过白名单&#xff1a; 前言 上篇文章我们讲过如何安装金蝶云星空&#xff0c;实现异地…

深度学习DAY3:高斯噪声

噪声 1 噪声定义 噪声是电路或系统中不含信息量的电压或电流。在工业与自然界中&#xff0c;存在着各种干扰源&#xff08;噪声源&#xff09;&#xff0c;如大功率电力电子器件的接入、大功率用电设备的开启与断开、雷击闪电等都会使空间电场和磁场产生有序或无序的变化&…

01 初识FPGA

01 初识FPGA 一.FPGA是什么 FPGA&#xff08;Filed Programmable Gate Array&#xff09;&#xff0c;现场可编程门阵列&#xff0c;一种以数字电路为主的集成芯片&#xff0c;属于可编程逻辑器件PLD的一种。 1.1 两大巨头 Xilinx(赛灵思)Altera&#xff08;阿尔特拉&#…

普通物理 A2 期末复习

普通物理 A2 期末复习 本文首发于 2023-06-20 在 https://chenhaotian.top/study/general-physics-a2-final-review/ 总结 第十章 机械振动和电磁振荡 10-1 谐振动 弹簧振子的谐振动 位移 速度 加速度 特征量 旋转矢量法 单摆 能量 题&#xff1a;振动方程 题&#xff1a;振…

XLSX.utils.sheet_to_json() 数字格式转为字符串格式

raw 默认为true&#xff0c;设置为false就可以了 XLSX.utils.sheet_to_json(workbook.Sheets[sheet], {raw:false})

B端产品需求分析的思路和方法 4大方面

需求分析对产品成功和客户满意度至关重要&#xff0c;它帮助团队深入了解用户需求&#xff0c;优化用户体验&#xff0c;减少开发中的需求变更&#xff0c;降低开发风险。如果缺乏产品分析&#xff0c;容易造成产品定位不准确&#xff0c;用户体验不佳&#xff0c;不能满足用户…

canvas基础1

直线 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> <b…

(十五)VBA常用基础知识:正则表达式的使用

vba正则表达式的说明 项目说明Pattern在这里写正则表达式&#xff0c;例&#xff1a;[\d]{2,4}IgnoreCase大小写区分&#xff0c;默认false&#xff1a;区分&#xff1b;true&#xff1a;不区分Globaltrue&#xff1a;全体检索&#xff1b;false&#xff1a;最小匹配Test类似p…

docker应用记录总结

一、前言 docker这类部署工具&#xff0c;久而久之不使用非常容易忘记&#xff0c;甚至连操作命令都容易忘记。网上也有比较全的docker使用教程。这里做一个记录总结&#xff0c;纯属是温故知新。 二、docker部署应用 1、docker印象 docker首先让我想到的是是虚拟化技术&…

Uniapp中父子页面传值

效果 实现 A页面 点击图一按钮进入图二页面 <view class"cu-form-group margin-top"><button class"cu-btn sm bg-gradual-green" style"margin-left: 70%; " click"selectMaterial">选择物料</button></view…

联邦学习中的攻击手段和防御机制

联邦学习产生的背景&#xff1a; 海量数据的生成和这些数据的后续处理往往需要一个数据仓库并在仓库内汇总数据。然而&#xff0c;随着数据泄漏事件层出不穷&#xff0c;数据安全性得不到保障&#xff0c;人们开始怀疑集中收集数据是否可靠&#xff0c;数据的隐私性的也得到了更…

Web应用防火墙的重要性及基本原理

企业网络安全是保障业务稳定运行的基础&#xff0c;而Web应用防火墙&#xff08;WAF&#xff09;是这个基础上的重要一环。本文将为你详细介绍WAF的基本原理&#xff0c;并探讨其在维护网络安全中的重要作用。 一、Web应用防火墙是什么&#xff1f; Web应用防火墙&#xff08;…

VSCode插件开发概述

目录 VSCode插件开发概述vscode插件vscode插件的用途脚手架安装重要文件package.jsonactivationEvents extension.js一个简单的例子本地打包 VSCode插件开发概述 vscode插件 vscode 是微软推出的一款轻量级代码编辑器&#xff0c;在使用的时候总会需要安装一些插件去协助我们…