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