千家信息网

树莓派怎样进行超声波测距自动避障

发表于:2024-10-25 作者:千家信息网编辑
千家信息网最后更新 2024年10月25日,树莓派怎样进行超声波测距自动避障,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。超声波测距的原理很简单,发射一个声波,反弹
千家信息网最后更新 2024年10月25日树莓派怎样进行超声波测距自动避障

树莓派怎样进行超声波测距自动避障,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

超声波测距的原理很简单,发射一个声波,反弹回来,然后接受反弹回来的这个声波。 利用这个时间差,就可以算出距离了。 首先,连接超声波模块,我的连接在GPIO20和GPIO21上,所以相应的代码如下

# 超声波引脚TRIG = 20ECHO = 21

TRIG这个名称也可以换,但是模块上用的这个名字,用这个更好记忆。 TRIG负责发射超声波,ECHO负责接收超声波。

1、初始化超声波模块,也就是把它不让他发射,置于低电平

  GPIO.output(TRIG, 0)

很多在后面追加了如下代码:

time.sleep(0.000002)

应该是为了防止错误,因为紧接着,就需要把发射端置为高电平。

2、发射超声波

GPIO.output(TRIG, 1)time.sleep(0.00001)GPIO.output(TRIG, 0)

一定要 用GPIO.output(TRIG, 0)来把超声波发射关闭,否则将会一直发射,也就没有办法测距了。 现在发射结束。

3、接收超声波

while GPIO.input(ECHO) == 0:    passemitTime = time.time()while GPIO.input(ECHO) == 1:    pass    acceptTime = time.time()

通过该代码,获取ECHO的状态,一开始发射的时候,ECHO输入为低电平,此时获取一个时间emitTime,发射结束以后,接收启动,接收到信号,获得一个时间 acceptTime。

4、计算距离

 totalTime = acceptTime - emitTimedistanceForReturn = totalTime * 340 / 2 * 100

这里之所以乘以100,是因为获得的距离是微米,乘以100就是厘米了。

5、整合代码

现在把上面的代码整合起来,放在一个distance函数里面,并且返回距离的值。 完整代码如下:

# 超声波测距函数def distance():    GPIO.output(TRIG, 0)    time.sleep(0.000002)    GPIO.output(TRIG, 1)    time.sleep(0.00001)    GPIO.output(TRIG, 0)    while GPIO.input(ECHO) == 0:        pass    emitTime = time.time()    while GPIO.input(ECHO) == 1:        pass    acceptTime = time.time()    totalTime = acceptTime - emitTime    distanceForReturn = totalTime * 340 / 2 * 100    return  distanceForReturn

6、循环发射超声波并检测距离

拿到了距离,需要让超声波按照要求不断发射和接收,小车也需要做出相应的反应,因此还需要一个循环的函数。 代码很难用文字解释,但是很好理解。如下:

def loop():    while True:        dis= distance()        if dis<40:            while dis<40:                backword(50, 0.2)                dis=distance()        else:            forward(50, 0)

7、运行函数

if __name__ == '__main__':    try:        forward(50, 0)        loop()    except KeyboardInterrupt:        GPIO.cleanup()

8、写在文章外

forward()和backword()等函数均是之前定义的小车运动的函数。 以下是整个文件的所有代码:

import time# 绑定对应的引脚,来自于图纸PWMA = 18AIN1 = 22AIN2 = 27PWMB = 23BIN1 = 25BIN2 = 24# 超声波引脚TRIG = 20ECHO = 21GPIO.setmode(GPIO.BCM)GPIO.setwarnings(False)# 设置引脚为输出GPIO.setup(PWMA, GPIO.OUT)GPIO.setup(AIN1, GPIO.OUT)GPIO.setup(AIN2, GPIO.OUT)GPIO.setup(PWMB, GPIO.OUT)GPIO.setup(BIN1, GPIO.OUT)GPIO.setup(BIN2, GPIO.OUT)GPIO.setup(TRIG, GPIO.OUT)GPIO.setup(ECHO, GPIO.IN)# 电机leftMotor = GPIO.PWM(PWMA, 100)rightMotor = GPIO.PWM(PWMB, 100)leftMotor.start(0)rightMotor.start(0)##小车的前进函数def forward(speed, runtime):    leftMotor.ChangeDutyCycle(speed)    GPIO.output(AIN1, True)  # AIN1高电平则正转    GPIO.output(AIN2, False)  # 如果为True则翻转    rightMotor.ChangeDutyCycle(speed)    GPIO.output(BIN1, True)    GPIO.output(BIN2, False)    time.sleep(runtime)  # 维持状态的时间,如果不给命令执行其他,将会继续执行# 后退函数def backword(speed, backtime):    leftMotor.ChangeDutyCycle(speed)    GPIO.output(AIN2, True)    GPIO.output(AIN1, False)    rightMotor.ChangeDutyCycle(speed)    GPIO.output(BIN2, True)    GPIO.output(BIN1, False)    time.sleep(backtime)# 左转弯函数def turnLeft(speed, lefttime):    leftMotor.ChangeDutyCycle(speed)    GPIO.output(AIN1, False)    GPIO.output(AIN2, True)    rightMotor.ChangeDutyCycle(speed)    GPIO.output(BIN1, True)    GPIO.output(BIN2, False)    time.sleep(lefttime)# 右转弯函数def turnRight(speed, righttime):    leftMotor.ChangeDutyCycle(speed)    GPIO.output(AIN1, True)    GPIO.output(AIN2, False)    rightMotor.ChangeDutyCycle(speed)    GPIO.output(BIN1, False)    GPIO.output(BIN2, True)    time.sleep(righttime)# 超声波测距函数def distance():    GPIO.output(TRIG, 0)    time.sleep(0.000002)    GPIO.output(TRIG, 1)    time.sleep(0.00001)    GPIO.output(TRIG, 0)    while GPIO.input(ECHO) == 0:        pass    emitTime = time.time()    while GPIO.input(ECHO) == 1:        pass    acceptTime = time.time()    totalTime = acceptTime - emitTime    distanceForReturn = totalTime * 340 / 2 * 100    return  distanceForReturndef loop():    while True:        dis= distance()        if dis<40:            while dis<40:                backword(50, 0.2)                dis=distance()        else:            forward(50, 0)if __name__ == '__main__':    try:        forward(50, 0)        loop()    except KeyboardInterrupt:        GPIO.cleanup()```这样,遇到障碍物,就会后退。通过转弯可以躲避障碍物,这里没有写躲避的代码。其实就是转向就可以了。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

超声 超声波 发射 函数 代码 时间 电平 小车 模块 声波 就是 文章 状态 障碍 障碍物 帮助 循环 整合 树莓 清楚 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 黑色沙漠未找到登录服务器 access数据库窗体 专升本数据库真题及答案 服务器sfp口能配置地址吗 郴州软件开发工程师招生 数据库的物理设计通常分为 vs向数据库添加数据库 华为机架式服务器供应商 人人商城数据库修改帐号密码 肇庆软件开发专家 重庆联想服务器维修维保云主机 华为软件开发年薪多少 关于数据库系统对比文件系统 数据库事件是指什么 云服务器管理系统教程 每个路由器都有链路状态数据库 吉林网络技术服务活动简介 重庆市教育系统网络安全宣传周 南通通微软件开发公司 时间互联网络科技有限公司 查看sql数据库密码 数据库的数据的共享 服务器与交换机如何连接图 本服务器属于美国 股票上海蛙扑网络技术有限公司 湖北数据库日志审计价格 南通职工网络安全打牌 虚拟技术数据库 软件开发的具体工作内容 每日专业解读软件开发
0