ESP32 MicroPython 小车红外自动寻迹与避障⑭

news2024/10/2 11:18:13

ESP32 MicroPython 小车红外自动寻迹与避障⑭

    • 1、小车超声波避障
    • 2、 小车红外自动寻迹
    • 3、 小车摄像头自动寻迹

1、小车超声波避障

实验目的
使用舵机水平扫描和超声波测距功能,实现小车自动避障行走
实验内容
小车控制舵机转动到中间位置,读取前方距离。如果前方距离达到设置的最小距离30cm,则小车停止前进。再控制舵机分别左右转动(水平扫描)测得左右两边的前方距离情况,判断哪边离障碍物远就往哪边转向。往复循环下去就可以实现前方避障功能
参考代码
参考代码文件可以在资料包文件夹“智能小车mpy例程\综合实验\04-小车超声波避障”文件夹下的main.py ,下面为完整代码内容:

'''
超声波避障小车
'''
from machine import Pin,Timer  #导入Pin引脚和Time定时器模块
from lcd import LCD20          #导入2.0寸LCD模块
import time
import car                     #导入小车控制模块
myCar=car.SERIAL_CAR() #构建小车控制对象
myCar.stop()                #停止下
#######################################################################
#颜色值定义,(R,G,B) 0~255代表颜色值
red = (255,0,0)         #红色
green = (0,255,0)       #绿色
blue = (0,0,255)        #蓝色
white = (255,255,255)   #白色
back = (0,0,0)          #黑色
#######################################################################
'''
舵机角度定义,左边脉宽,中间脉宽,右变脉宽
'''
MID_PWM  = 1500 #舵机中点脉宽

LEFT_PWM = MID_PWM + 700 #舵机左边脉宽

RIGHT    = MID_PWM - 700  #舵机右边脉宽
#######################################################################
#创建LCD对象 dir 显示方向为竖屏,1、3竖屏,2、4横盘
ld=LCD20(dir=1) 

# 整屏填充指定颜色
ld.fill(back)
ld.dText("超声波避障小车",10,10,color=white,size=3) #显示屏提示信息
myCar.servo(MID_PWM)           #舵机控制脉宽1500us,中间转动

dist = 0                       #超声波测距距离变量
car_pwm = 0                    #小车控制速度(pwm:0~100)表示停止到最快
car_dir = 0                    #小车转动方向 0-停止,1-正转,2-反转,3-左转,4-右转

#控制舵机角度并测量距离
def get_dist(servo_pwm):
    dTemp = 0
    myCar.servo(servo_pwm)      #控制舵机转动
    time.sleep_ms(200)          #延时50ms等待稳定
    dTemp = myCar.distance()    #读取测距距离,测距范围25cm~450cm

    if dTemp ==0 :              #测距限制,为0时表示远处盲区
        dTemp = 450             #设置最大距离
    elif dTemp <= 25:           #近距离盲区 表示靠近物体
        dTemp = 25
        pass
    
    return dTemp                #返回距离

##########################################################################

rightDist = 0  #右边距离
leftDist = 0   #左边距离
while True:

    dist = get_dist(MID_PWM)  #舵机控制中间位置测量距离
    if dist <= 30: #表示前面有遮挡,测量左边距离
        myCar.stop() #先停止小车
        time.sleep_ms(100) #等待一会
        
        leftDist = get_dist(LEFT_PWM) #测量左边距离
        time.sleep_ms(10)#等待一会
        
        rightDist = get_dist(RIGHT)  #测量右边距离
        time.sleep_ms(10)#等待一会
        
        dist = get_dist(MID_PWM) #回中
        time.sleep_ms(10)#等待一会
        
        if leftDist > rightDist: #左边距离大于右边距离
            myCar.left(30) #左转
        else :
            myCar.right(30) #右转
            
        time.sleep_ms(200) # 等待转弯时间s
        myCar.stop()
        time.sleep_ms(10)
        pass
    
    car_pwm = int(((0.3*dist) + 10))
    myCar.forward(40) 
    #显示屏显示距离结果
    ld.dText('距离-> '+"{:03d}".format(dist) + ' cm',10,80,white,size=3)
    time.sleep_ms(30)

实验结果
运行代码后,可以看到小车的显示屏显示出距离。发现前方距离太近后小车超声波左右转动,后自动选择左转或者右转。

在这里插入图片描述

2、 小车红外自动寻迹

实验目的
使用小车红外功能实现自动寻迹行走
实验内容
本实验需要用到黑线赛道地图,小车使用红外识别黑线功能,进行黑线赛道识别跟随。
参考代码
参考代码文件可以在资料包文件夹“智能小车mpy例程\综合实验\05-小车自动寻迹”文件夹下的main.py ,下面为完整代码内容:

'''
红外寻迹小车实验
'''
from machine import Pin,Timer  #导入Pin引脚和Time定时器模块
from lcd import LCD20          #导入2.0寸LCD模块
import time
import car                     #导入小车控制模块
from machine import Pin        #导入引脚控制模块
#######################红外感应读取变量##########################
myCar=car.SERIAL_CAR() #构建小车控制对象
myCar.stop()                   #停止下
#颜色值定义,(R,G,B) 0~255代表颜色值
red = (255,0,0)                #红色
green = (0,255,0)              #绿色
blue = (0,0,255)               #蓝色
white = (255,255,255)          #白色
back = (0,0,0)                 #黑色

#创建LCD对象 dir 显示方向为竖屏,1、3竖屏,2、4横盘
ld=LCD20(dir=1) 

# 整屏填充指定颜色
ld.fill(back)
ld.dText("寻迹小车",50,10,color=white,size=3) #显示屏提示信息

#######################红外感应读取变量########################
ir1 = 0           #红外1感应状态,左起第一个,检测到黑线为1,否则为0
ir2 = 0           #红外2感应状态,左起第二个,检测到黑线为1,否则为0
ir3 = 0           #红外3感应状态,左起第三个,检测到黑线为1,否则为0
ir4 = 0           #红外4感应状态,左起第四个,检测到黑线为1,否则为0
irData = 0x00     #巡线检测数据转换为16进制,方便逻辑操作
###############################################################
leftPWM = 10            #左轮电机控制PWM 变量
lastLeftPWM = 0
rightPWM = 10           #右轮电机控制PWM 变量
lastRightPWM = 0

normalPWM = 10       #小车直行行驶速度

yawMaxPWM = 30       #正常偏航最大速度
yawMinPWM = 5       #正常偏航最小速度

severeYawMaxPWM = 35 #严重偏航最大速度
severeYawMinPWM = 5 #严重偏航最小速度
#################################################################
#小车循迹处理函数,固右转调整
def car_adj_black4():
    global leftPWM           #全局变量声明
    global rightPWM          #全局变量声明
    global lastLeftPWM
    global lastRightPWM
    global ir1
    global ir2
    global ir3
    global ir4
    #########进入调整参数################
    LoutFlag = 0 #左边严重出界标志
    RoutFlag = 0 #右边边严重出界标志
    while True:
        ir1,ir2,ir3,ir4=myCar.ir()                   #读取红外巡线数据
##################################################################
        if ir1 == 1: # 最左侧检测到 严重出界
            rightPWM = severeYawMaxPWM   #右轮速度控制
            leftPWM =  severeYawMinPWM   #左轮速度控制
            RoutFlag = 1 #右出界标志
        if ir2 == 1:
            rightPWM = yawMaxPWM   #右轮速度控制
            leftPWM =  yawMinPWM   #左轮速度控制
            RoutFlag = 0 #解除严重出界标志
            LoutFlag = 0    #解除严重出界标志
##################################################################
        if ir4 == 1: # 最右侧检测到 严重出界
            rightPWM = severeYawMinPWM   #右轮速度控制
            leftPWM =  severeYawMaxPWM   #左轮速度控制
            LoutFlag = 1    #左出界标志
        if ir3 == 1:
            rightPWM = yawMinPWM   #右轮速度控制
            leftPWM =  yawMaxPWM   #左轮速度控制
            RoutFlag = 0 #解除严重出界标志
            LoutFlag = 0    #解除严重出界标志
##################################################################
        if LoutFlag == 0 and RoutFlag == 0:
            if ir1== 0 and ir2 ==0 and ir3== 0 and ir4 ==0: #正常 定速前进
                rightPWM = normalPWM   #右轮速度控制
                leftPWM =  normalPWM   #左轮速度控制
            pass
##################################################################
        #小车电机执行转速控制
        if lastLeftPWM != leftPWM or lastRightPWM != rightPWM:
            time.sleep_ms(30)        #延时等待串口通信
            myCar.lrForward(leftPWM,rightPWM)   #左轮前进
            lastLeftPWM = leftPWM
            lastRightPWM = rightPWM
            
###################################################################

while True:
    car_adj_black4() #小车巡线控制

实验结果
上传代码文件main.py到小车内部存储后,关闭电源再次打开,把小车放到赛道上,黑线位于小车中间,小车自动根据黑线轨迹行走。

在这里插入图片描述

3、 小车摄像头自动寻迹

实验目的
使用小车AI摄像头识别颜色功能,实现赛道黑线寻迹功。
实验内容
本次实验和上个红外寻迹实验类似,他们不同的是检测黑色线方式不一样,本次实验使用摄像头AI颜色识别黑线功能,实现对赛道黑线寻迹行走功能。
参考代码
参考代码文件可以在资料包文件夹“智能小车mpy例程\综合实验\06-小车摄像头自动寻迹”文件夹下的main.py ,下面为完整代码内容:

'''
AI摄像头巡线小车
'''
from machine import Pin,Timer  #导入Pin引脚和Time定时器模块
from lcd import LCD20          #导入2.0寸LCD模块
import car                     #导入小车控制模块
import cam                     #导入摄像头模块
import time
import ai                      #导入AI模块
from machine import UART       #串口模块

#颜色值定义,(R,G,B) 0~255代表颜色值
red = (255,0,0)  #红色
green = (0,255,0) #绿色
blue = (0,0,255)  #蓝色
white = (255,255,255) #白色
back = (0,0,0)    #黑色

#创建LCD对象 dir 显示方向为竖屏,1、3竖屏,2、4屏横
ld=LCD20()  #默认为竖屏1

# 整屏填充指定颜色
ld.fill(back)

myCam = cam.OV2640(frame=2)        #创建摄像头对象,图层为2层

myCam.framesize(cam.LCD240X240)    #显示屏对应的分辨率 方便显示
myCam.set_hmirror(0) #设置摄像头水平镜像关闭
myCam.set_awb_gain(0)              #设置取消平白平衡
#######################################################
uart1 = UART(1,115200,rx=18,tx=17)
myCar=car.SERIAL_CAR(uart1)      #构建小车控制对象
myCar.stop()                       #停止下

myAi = ai.colorDetection( color = ai.COLOR_BLACK,displayType=1) #启动黑色检测,LCD显示方式

myAi.start() #启动AI检测

tarNum = 0  #检测到目标数量
#检测到第一个目标的位置,用于计算中点位置
x0=0
x1=0
y0=0
y1=0 
midPointX = 0 #计算出X轴的中心点,90~150控制区域
#######################################################################
#读取检测结果,并计算中点位置返回坐标
def read_ai_data():
    v=myAi.read() #读取检测到数据
    n = v[0] #读取检测目标数量
    yMax = 0 #读取最大值
    iMax = 0 #最大值对应的索引
    if n > 0: #检测到目标
        yMax = v[2] #读取第一个Y轴左上角坐标的值 作为最大值
        for i in range(n): #遍历查找过滤检测目标为最靠近小车的目标坐标
            if yMax < v[(4*i)+2]: #查找最大值
                yMax = v[(4*i)+2]
                iMax = i #记录最大值对应的索引
            pass
        
        x0 = v[4*iMax+1] #读取底部检测对象的X轴坐标用于计算中点
        x1 = v[4*iMax+3]

        return ((x1 - x0)//2) + x0 #计算出X轴中心位置 ,用于控制调整位置 设置调整位置90~150,120为中心点
    else:
        return 0
    return 0
###########################小车速度控制变量#######################################
leftPWM = 10            #左轮电机控制PWM 变量
lastLeftPWM = 0
rightPWM = 10           #右轮电机控制PWM 变量
lastRightPWM = 0

normalPWM = 10       #小车直行行驶速度

yawMaxPWM = 30       #正常偏航最大速度
yawMinPWM = 5       #正常偏航最小速度

severeYawMaxPWM = 35 #严重偏航最大速度
severeYawMinPWM = 5 #严重偏航最小速度

#######################################################################
#AI摄像头巡线小车处理函数
def ai_car_adj_fun():
    global leftPWM           #全局变量声明
    global rightPWM          #全局变量声明
    global lastLeftPWM
    global lastRightPWM
    #########进入调整参数################
    LoutFlag = 0 #左边严重出界标志
    RoutFlag = 0 #右边边严重出界标志
    while True:
        midPointX = read_ai_data()  #读取中点位置
        if midPointX <= 47: #0~47 小车严重往左转向
            rightPWM = severeYawMaxPWM   #右轮速度控制
            leftPWM =  severeYawMinPWM   #左轮速度控制
            pass
        elif midPointX >= 48 and midPointX <= 95 : #48~95 小车往左转向
            rightPWM = yawMaxPWM   #右轮速度控制
            leftPWM =  yawMinPWM   #左轮速度控制
            pass
        elif midPointX >= 96 and midPointX <= 143 : #直行
            rightPWM = normalPWM   #右轮速度控制
            leftPWM =  normalPWM   #左轮速度控制
            pass
        elif midPointX >= 144 and midPointX <= 190 :
            rightPWM = yawMinPWM   #右轮速度控制
            leftPWM =  yawMaxPWM   #左轮速度控制
            pass
        elif midPointX >= 191:
            rightPWM = severeYawMinPWM   #右轮速度控制
            leftPWM =  severeYawMaxPWM   #左轮速度控制
            pass

        #小车电机执行转速控制
        if lastLeftPWM != leftPWM or lastRightPWM != rightPWM:
            time.sleep_ms(50)        #延时等待串口通信
            myCar.lrForward(leftPWM,rightPWM)   #左轮前进
            lastLeftPWM = leftPWM
            lastRightPWM = rightPWM
        time.sleep_ms(100)
##############################################################################################
while True:
    ai_car_adj_fun()

实验结果
上传好代码到小车内部存储后,重启电源放到赛道上,黑线位于小车中间即可实现黑线跟随

在这里插入图片描述
相关代码及固件:
https://download.csdn.net/download/lu330274924/88549191

智能小车购买链接
技术支持抖音:易驱达Easy Drive Coming
淘宝官方商城:https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-18887194911.15.135014bdaKI6mV&id=715385110550

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

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

相关文章

26、江科大stm32视频学习笔记——W25Q64简介

一、电路图 1、软件模拟的SPI&#xff1a;线可以任意接 2、硬件模拟的SPI&#xff1a;要按以下方式连接 3、本次软件模拟和硬件模拟使用同一个电路图&#xff0c;方便切换 CS&#xff08;片选&#xff09;&#xff1a;PA4 DO&#xff08;从…

适合初学者的 机器学习 资料合集(可快速下载)

AI时代已经来临&#xff0c;机器学习成为了当今的热潮。但是&#xff0c;很多人在面对机器学习时却不知道如何开始学习。 今天&#xff0c;我为大家推荐几个适合初学者的机器学习开源项目&#xff0c;帮助大家更好地了解和掌握机器学习的知识。这些项目都是开源的&#xff0c;…

分享flask_socketio配置时遇到的一些问题

flask_socketio 1.前言 flask_socketio应用启动后&#xff0c;在控制台中&#xff0c;存在着flask_socketio这些烦人的log 一堆的get和post几秒一个让我什么都看不清&#xff0c;因此想要关掉log 结果没想到&#xff0c;找了很多办法半天去不掉flask_socketio的log 试过了…

Docker(十一)Swarm mode

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; Swarm mode Docker 1.12 Swarm mode 已经内嵌入 Docker 引擎&#xff0c;成为了 docker 子命令 docker swarm。请注意与旧的 Docker Swarm …

天天酷跑-C语言搭建童年游戏(easyx)

游戏索引 游戏名称&#xff1a;天天酷跑 游戏介绍&#xff1a; 本游戏是在B站博主<程序员Rock>的视频指导下完成 想学的更详细的小伙伴可以移步到<程序员Rock>视频 【程序员Rock】C语言项目&#xff1a;手写天天酷跑丨大一课程设计首选项目&#xff0c;手把手带你用…

高效减少组织自发荧光,提高信噪比

在免疫组化检测过程中&#xff0c;许多样本组织会产生可通过各种波长滤光片的组织内源性自发荧光&#xff0c;干扰抗体标记的目的蛋白荧光的观察&#xff0c;甚至导致实验失败。为了解决免疫组化实验中的自发荧光&#xff0c;VectorLabs公司&#xff08;国内代理商欣博盛生物&a…

C#,入门教程(24)——类索引器(this)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(23)——数据类型转换的一点基础知识https://blog.csdn.net/beijinghorn/article/details/124187182 工业软件首先要求高可靠性、高可维护性。 作为工业软件的开发者&#xff0c;我们对语言重载的需求是&#xff1a;“不可或缺”。 …

为什么说CRM行业化是大势所趋?有哪些判断因素

很多企业、很多销售对CRM的负面评价集中在不够贴合行业、不人性化&#xff0c;也就是功能不够细分和实用。因为CRM几乎是所有企业管理系统中最贴近业务实际的&#xff0c;但各行各业的业务千差万别&#xff0c;所以功能完备、使用满意度高的CRM一定是深度行业化、与不同行业业务…

canvas绘制六芒星

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

C++ Primer 6.5 特殊用途语言特性 6.6 函数匹配 知识点+练习题

C Primer6.5 特殊用途语言特性 6.6 函数匹配 默认实参内联函数constexpr函数调试帮助assert预处理宏NDBUG预处理变量 函数匹配练习题 默认实参 string screen(int hz24,int wid80,char c) windowscreen( , ,?)&#xff1b;//错误&#xff01;&#xff0c;只有尾部的实参可以省…

固态硬盘优化设置

目录 前言&#xff1a; 关闭Windows Search 禁用系统保护&#xff08;不建议&#xff09; 不建议禁用系统保护原因 关闭碎片整理 提升固态硬盘速度 开启TRIM 合理使用固态硬盘的容量 正确关机 关闭开机自启 前言&#xff1a; 电脑配备固态硬盘就能一劳永逸吗&#…

Oracle1 数据库管理

Oracle的安装 一、基础表的创建 1.1 切换到scott用户 用sys 账户 登录 解锁scott账户 alter user scott account unlock;conn scott/tiger;发现并不存在scott账户&#xff0c;自己创建一个&#xff1f; 查找资料后发现&#xff0c;scott用户的脚本需要自己执行一下 C:\ap…

一个golang小白使用vscode搭建Ununtu20.04下的go开发环境

文章目录 前言搭建go环境下载go安装包解压go压缩包完成安装配置环境变量编写一个helloword程序 安装VSCode插件安装智能提示插件安装go依赖包修改代理并重新安装依赖包 go.mod 和 go.workgo.modgo.work小试一下go.work 总结 前言 先交代一下背景&#xff0c;距离正式接触golan…

[IPv6]常用的几种IPv4和IPv6地址格式

记录一下常用的IPv4和IPv6地址格式 IPv4 IPv4地址是32位的&#xff0c;通常表示为“192.168.1.12”这样点分成4段的形式。 一个IP地址可以分为两部分&#xff0c;网络ID和主机ID。如何区分哪些位是网络ID&#xff0c;哪些位是主机ID&#xff0c;就需要子网掩码。 子网掩码 …

利用STM32CubeMX和keil模拟器,3天入门FreeRTOS(1.1) —— 创建多个静态任务实操和简单讲解

前言 &#xff08;1&#xff09;FreeRTOS是我一天过完的&#xff0c;由此回忆并且记录一下。个人认为&#xff0c;如果只是入门&#xff0c;利用STM32CubeMX是一个非常好的选择。学习完本系列课程之后&#xff0c;再去学习网上的一些其他课程也许会简单很多。 &#xff08;2&am…

基于LSTM的负荷预测,基于BILSTM的负荷预测,基于GRU的负荷预测,基于BIGRU的负荷预测,基于BP神经网络的负荷预测

目录 背影 摘要 代码和数据下载&#xff1a;基于LSTM的负荷预测&#xff0c;基于BILSTM的负荷预测&#xff0c;基于GRU的负荷预测&#xff0c;基于BIGRU的负荷预测&#xff0c;基于BP神经网络的负荷预测资源-CSDN文库 https://download.csdn.net/download/abc991835105/8876806…

HCIA——22DNS:DNS层次域名空间、域名服务器、域名解析的原理

学习目标&#xff1a; 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

YOLOv8改进 | 主干篇 | 低照度图像增强网络SCINet改进黑暗目标检测(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是低照度图像增强网络SCINet,SCINet(自校正照明网络)是一种专为低光照图像增强设计的框架。它通过级联照明学习过程和权重共享机制来处理图像,优化了照明部分以提升图像质量。我将该网络集成在YOLOv8的主干上针对于图像的输入进行增…

以太坊账户地址与比特B地址生成方法对比

作者 张群&#xff08;赛联区块链教育首席讲师&#xff0c;工信部赛迪特聘资深专家&#xff0c;CSDN认证业界专家&#xff0c;微软认证专家&#xff0c;多家企业区块链产品顾问&#xff09;关注张群&#xff0c;为您提供一站式区块链技术和方案咨询。 以太坊和比特B地址在生成方…

关于js的BigInt的使用与注意事项

说明 BigInt是一种内置对象&#xff0c;提供了一种方法来表示大于2^53 - 1 的整数&#xff0c;2^53 - 1 为Number可以表示的最大数字&#xff0c;BigInt可以突破限制&#xff0c;可以用任意精度表示整数&#xff0c;超出Number的安全整数限制&#xff0c;也可以安全地存储和操…