智能小车案例:基于Raspberry Pi的自动巡航与避障系统

项目背景

        随着物联网技术的不断发展,智能小车成为了现代生活和工业自动化中的重要工具。为了实现智能小车的自动巡航与避障功能,我们采用了Raspberry Pi作为主控制器,结合传感器和执行器,构建了一个完整的系统。

 

所需材料

  • Raspberry Pi(树莓派)开发板
  • 电机驱动器(L298N)
  • 超声波传感器(HC-SR04)
  • 直流电机
  • 电源和数据线
  • Raspberry Pi的GPIO扩展板
  • Bash命令行环境

安装与配置

  • 首先,确保你的Raspberry Pi已经安装了操作系统并且可以通过SSH或VNC连接到它。

  • 连接所有硬件:将电机驱动器、超声波传感器连接到GPIO扩展板上,然后将直流电机连接到电机驱动器的输出端。

安装必要的软件包:通过SSH连接到Raspberry Pi并运行以下命令安装所需软件包: 
sudo apt-get update  
sudo apt-get install python3-pip wiringpi

代码实现

以下是一个简单的Python脚本,用于控制智能小车的自动巡航与避障功能:
#!/usr/bin/env python3  
import RPi.GPIO as GPIO  
import time  
import threading  
  
# 定义GPIO引脚编号模式  
GPIO.setmode(GPIO.BCM)  
  
# 定义电机引脚和传感器引脚  
MOTOR_LEFT = 23  # 左电机正转/反转引脚  
MOTOR_RIGHT = 24  # 右电机正转/反转引脚  
ECHO = 25  # 超声波传感器发射端引脚  
TRIG = 26  # 超声波传感器接收端引脚  
  
# 设置GPIO引脚为输出模式  
GPIO.setup(MOTOR_LEFT, GPIO.OUT)  
GPIO.setup(MOTOR_RIGHT, GPIO.OUT)  
GPIO.setup(ECHO, GPIO.IN)  
GPIO.setup(TRIG, GPIO.OUT)  
  
# 定义电机驱动函数  
def drive_forward():  
    GPIO.output(MOTOR_LEFT, GPIO.HIGH)  
    GPIO.output(MOTOR_RIGHT, GPIO.LOW)  
    time.sleep(1)  # 前进1秒  
    GPIO.output(MOTOR_LEFT, GPIO.LOW)  
    GPIO.output(MOTOR_RIGHT, GPIO.LOW)  # 停止电机  
  
def drive_backward():  
    GPIO.output(MOTOR_LEFT, GPIO.LOW)  
    GPIO.output(MOTOR_RIGHT, GPIO.HIGH)  
    time.sleep(1)  # 后退1秒  
    GPIO.output(MOTOR_LEFT, GPIO.LOW)  
    GPIO.output(MOTOR_RIGHT, GPIO.LOW)  # 停止电机  
  
def turn_left():  
    GPIO.output(MOTOR_LEFT, GPIO.HIGH)  
    GPIO.output(MOTOR_RIGHT, GPIO.LOW)  
    time.sleep(0.5)  # 左转0.5秒  
    GPIO.output(MOTOR_LEFT, GPIO.LOW)  
    GPIO.output(MOTOR_RIGHT, GPIO.LOW)  # 停止电机  
  
def turn_right():  
    GPIO.output(MOTOR_LEFT, GPIO.LOW)  
    GPIO.output(MOTOR_RIGHT, GPIO.HIGH)  
    time.sleep(0.5)  # 右转0.5秒  
    GPIO.output(MOTOR_LEFT, GPIO.LOW)  
    GPIO.output(MOTOR_RIGHT, GPIO.LOW)  # 停止电机  
  
def stop():  
    GPIO.output(MOTOR_LEFT, GPIO.LOW)  
    GPIO.output(MOTOR_RIGHT, GPIO.LOW)  # 停止电机和所有动作  
    time.sleep(1)  # 保持停止状态1秒,以便检查是否应该继续移动或避障  
    GPIO.cleanup()  # 清理GPIO设置,返回初始状态(低电平)  
    exit()  # 退出程序(可选)或执行其他操作(如循环检测等)以继续控制小车移动或避障。

避障逻辑实现

        为了实现避障功能,我们使用了多线程编程。一个线程用于控制小车的前进,另一个线程用于检测障碍物。当检测到障碍物时,避障线程会发送一个信号给主线程,主线程接收到信号后执行避障操作。

 

避障逻辑如下:
  • 启动避障线程,该线程会持续检测超声波传感器的值。
  • 如果检测到障碍物(超声波传感器值小于某个阈值),则发送一个信号给主线程。
  • 主线程接收到避障信号后,执行避障操作(例如停止、后退、左转或右转)。
  • 避障完成后,继续前进。

你可以根据需要调整避障逻辑,例如增加更多的避障策略或调整传感器阈值。

当然,以下是一个简单的Python代码示例,用于实现避障逻辑: 

import RPi.GPIO as GPIO  
import time  
  
# 设定GPIO引脚  
GPIO.setmode(GPIO.BCM)  
GPIO_TRIGGER = 18  
GPIO_ECHO = 24  
  
# 初始化超声波传感器引脚为输出模式  
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)  
GPIO.setup(GPIO_ECHO, GPIO.IN)  
  
# 定义避障逻辑函数  
def避障():  
    # 发送10微秒的脉冲信号触发超声波传感器  
    GPIO.output(GPIO_TRIGGER, True)  
    time.sleep(0.00001)  
    GPIO.output(GPIO_TRIGGER, False)  
    start_time = time.time()  
    end_time = time.time()  
    # 等待超声波传感器的返回信号  
    while GPIO.input(GPIO_ECHO) == 0:  
        start_time = time.time()  
    while GPIO.input(GPIO_ECHO) == 1:  
        end_time = time.time()  
    # 计算距离(单位:厘米)  
    distance = (end_time - start_time) * 34300 / 2  
    if distance < 20:  # 设定距离阈值为20厘米  
        print("检测到障碍物,执行避障操作")  
        # 这里可以添加避障操作的代码,例如停止、后退、左转或右转等  
        # 清理GPIO资源  
        GPIO.cleanup()

         这只是一个简单的智能小车案例,你可以根据需求进行更多的扩展和改进。例如,增加更多的传感器、实现更复杂的导航算法、加入Wi-Fi控制等。  使用GPIO引脚时需要注意安全问题,特别是对于初学者,建议在熟悉Raspberry Pi和GPIO操作之后再进行更深入的探索和开发。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

山海鲸可视化:引领银行管理进入数据可视化新时代

在金融领域&#xff0c;数据是决策的关键。作为山海鲸可视化的开发者&#xff0c;我们深知数据的价值&#xff0c;并致力于通过可视化技术为银行管理提供更为直观、高效的数据分析工具。 应用场景&#xff1a; 风险管理&#xff1a;银行在运营过程中面临各种风险&#xff0c;如…

第17次修改了可删除可持久保存的前端html备忘录:增加年月日星期,增加倒计时,更改保存区名称可以多个备忘录保存不一样的信息,匹配背景主题:现代深色

第17次修改了可删除可持久保存的前端html备忘录&#xff1a;增加年月日星期&#xff0c;增加倒计时&#xff0c;更改保存区名称可以多个备忘录保存不一样的信息&#xff0c;匹配背景主题&#xff1a;现代深色 备忘录代码&#xff1a; <!DOCTYPE html> <html lang&quo…

Vue学习笔记14 --自定义hook函数/toRef/provide/inject等

9.自定义hook函数 什么是hook&#xff1f;—— 本质是一个函数&#xff0c;把setup函数中使用的Composition API进行了封装。 类似于vue2.x中的mixin。 自定义hook的优势: 复用代码, 让setup中的逻辑更清楚易懂。 10.toRef 作用&#xff1a;创建一个 ref 对象&#xff0c;其…

音视频数字化(音乐CD)

上篇文章【音视频数字化(音频数字化)】我们聊了音频数字化原理,其中谈到了音乐CD,结尾也提到了一个小问题:“CD音质是最高吗?为什么?”不知道大家是怎么理解的。 其实CD质量只是“无损”存储,但是数字化标准只是“44.1kHz,16bit”,因此相对于现在,音质不能说最高。 …

电脑用的视频编辑软件有哪些 视频剪辑软件排行榜 视频剪辑软件推荐 视频剪辑培训学习 视频剪辑制作自学 电脑视频剪辑需要什么配置

电脑视频剪辑软件这么多&#xff0c;到底哪些比较好用&#xff1f;下面就让我们以十大电脑视频剪辑软件排行榜来细数好用的软件。另外&#xff0c;电脑视频剪辑需要什么配置&#xff1f;本文也会给大家从内存、CPU等参数上介绍&#xff0c;并推荐好用的电脑设备。 一、十大电脑…

Orion-14B-Chat-RAG本地部署的解决方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

2024年能源环境、材料科学与人工智能国际会议(ICEEMSAI2024)

2024年能源环境、材料科学与人工智能国际会议(ICEEMSAI2024) 会议简介 2024国际能源环境、材料科学和人工智能大会&#xff08;ICEEMSAI 2024&#xff09;主要围绕能源环境、物质科学和人工智慧等研究领域&#xff0c;旨在吸引能源环境、先进材料和人工智能专家学者、科技人员…

Git系列---远程操作

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 引用 1.理解分布式版本控制…

赋能五星养老机构,河北爱晚红枫与清雷科技达成合作

“作为2023年河北省5家五星级养老机构之一&#xff0c;爱晚红枫医养服务有限公司以康复医学为特色&#xff0c;专为失能和半失能人群以及周边患者提供专业的康养治疗服务。此次和清雷科技合作&#xff0c;旨在用高科技的系统和监测产品进一步提升院区的医养结合能力&#xff0c…

如何用 python +ddt+excel 实现接口自动化测试

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 “ 接口自动化测试是指通过编写代码或使用工具&#xff0c;模拟…

Linux中重定向是怎么一回事?

Linux中重定向是怎么一回事&#xff1f; 输出重定向追加重定向输入重定向 输出重定向 Linux下一切皆文件&#xff0c;当我们写下echo命令字符串时&#xff0c;相当于在显示器文件中写入数据 而输入echo 字符串 > filename时&#xff0c;相当于把原本应该写入显示器当中的数…

Linux进程控制:进程创建与等待

目录 一、fork函数 1.1fork函数的调用与功能 1.2fork函数的返回值与写实拷贝 1.3fork的常规用法与失败原因 二、进程终止 2.1进程的退出场景和常见退出方法 2.2_exit函数与exit函数 2.2.1_exit函数 2.2.2exit函数 2.3return退出 三、进程等待 3.1wait及waitpid的方法…

ElementUI Form:InputNumber 计数器

ElementUI安装与使用指南 InputNumber 计数器 点击下载learnelementuispringboot项目源码 效果图 el-radio.vue &#xff08;InputNumber 计数器&#xff09;页面效果图 项目里el-input-number.vue代码 <script> export default {name: el_input_number,data() {re…

Lua脚本

1.准备 1.简介 1.Lua是一种轻量小巧的脚本语言&#xff0c;用标准C语言编写并以源代码形式开放 2.目标 1.其设计目的是为了嵌入应用程序中&#xff0c;从而为应用程序提供灵活的扩展和定制功能 3.特点 1.轻量级&#xff1a;用标准C语言编写并以源代码形式开放&#xff0c;编译后…

嵌入式中屏幕能够显示汉字的原理方法

LCD是嵌入式常见设备&#xff0c;如何在LCD上显示汉字和英文&#xff1f;矢量字体和点阵字体有何不同&#xff1f;同一个字符为何有多种编码&#xff1f; GB2312、GB18030指什么&#xff1f;他们之间有关系吗&#xff1f;嵌入式设备如何支持多国语言&#xff1f;从哪里获取字库…

QGIS 矢量对齐工具-VectorBender

VectorBender 是一个QGIS Python 插件&#xff0c;允许转换矢量图层以匹配另一个几何图形。根据定义的输入点的数量&#xff0c;插件选择三种变换类型&#xff1a;平移、均匀或弯曲。 前两个允许快速对齐非地理参考数据&#xff0c;而第三个允许匹配具有复杂的非均匀和非线性变…

ElementUI 组件:Container 布局容器实例

ElementUI安装与使用指南 Container 布局容器 点击下载learnelementuispringboot项目源码 效果图 el-container-example.vue&#xff08;Container 布局容器实例&#xff09;页面效果图 项目里el-container-example.vue代码 <script> export default {name: el_cont…

【Spring Boot 源码学习】BootstrapRegistry 详解

《Spring Boot 源码学习系列》 BootstrapRegistry 详解 一、引言二、往期内容三、主要内容3.1 源码初识3.2 register 方法3.3 registerIfAbsent 方法3.4 isRegistered 方法3.5 getRegisteredInstanceSupplier 方法3.6 addCloseListener 方法3.7 InstanceSupplier 内部接口类3.7…

Python基础小知识:format函数用法

format优点 format是python2.6新增的一个格式化字符串的方法&#xff0c;相对于老版的%格式方法&#xff0c;它有很多优点。 1.不需要理会数据类型的问题&#xff0c;在%方法中%s只能替代字符串类型 2.单个参数可以多次输出&#xff0c;参数顺序可以不相同 3.填充方式十分灵…

【深入浅出SpringCloud原理及实战】「Netflix系列之Hystrix」针对于限流熔断组件Hystrix的回退降级实现方案和机制

针对于限流熔断组件Hystrix的回退降级实现方案和机制 依赖隔离依赖隔离之线程&线程池高延迟请求的例子 线程池的优势线程池的弊端线程池的开销线程池开销 信号量 依赖隔离 Hystrix通过使用『舱壁模式』&#xff08;注&#xff1a;将船的底部划分成一个个的舱室&#xff0c;…