智能小车案例:基于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操作之后再进行更深入的探索和开发。

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

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

相关文章

幻兽帕鲁:10秒开服,一键配置游戏参数教程!

随着游戏行业的不断发展&#xff0c;玩家们对于游戏体验的要求也越来越高。为了满足玩家们的需求&#xff0c;腾讯云提供了游戏联机服务器一键部署方案&#xff0c;本文将为大家详细介绍如何基于腾讯云服务器10秒钟完成开服和配置游戏参数&#xff0c;让大家的游戏体验更加顺畅…

Codeforces Round 921 (Div. 2)(A~B)

A. We Got Everything Covered! 找出一个字符串S&#xff0c;满足条件&#xff1a;所有可能的长度为n&#xff0c;使用前k个小写字母的字符串P都是S的子串。 其中字符串S的长度尽可能短。 这种构造题&#xff0c;构造S的时候尽可能在原有的基础上去扩展&#xff0c;如果能扩…

Linux 分卷压缩命令

1.分卷压缩 使用tar归档命令就可以进行分卷压缩了&#xff0c;比如说我要分卷压缩一个当前目录下面的大小为10G的test文件&#xff0c;然后我想压缩完每一卷大小不超过1000M&#xff0c;每一个分卷的名字叫compressedFile.tar.gz00-compressedFile.tar.gz0n&#xff0c;这个文…

服装产业转型升级,iPayLinks帮助企业拓展市场盈更多

从十万件的大订单转变为几百件的小订单&#xff0c;小单快反模式为中国服装出口带来了机遇&#xff0c;也带来了挑战。 “十三行-中大-鹭江”是广州曾经最具代表性的外贸服装产业带。在过去很长的一段时间里&#xff0c;服装外贸老板在这里创造“神话”&#xff1a;24小时内完…

centos 安装docker CE

centos 安装docker CE 0. 参考 1. 安装需要的包 sudo yum install -y yum-utils \device-mapper-persistent-data \lvm22. 添加仓库 sudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo3. 安装docker sudo yum install docke…

spdk技术原理简介和实践经验

一、导读 与机械硬盘相比&#xff0c;NVMe-ssd在性能、功耗和密度上都有巨大的优势&#xff0c;并且随着固态存储介质的高速发展&#xff0c;其价格也在大幅下降&#xff0c;这些优势使得NVMe-ssd在分布式存储中使用越来越广泛。由于NVMe-ssd的性能比传统磁盘介质高出很多&…

jvm基础篇之垃圾回收[1](方法区、堆回收)

文章目录 垃圾回收类型手动垃圾回收&#xff1a;C/C的内存管理自动垃圾回收&#xff1a;Java的内存管理自动垃圾回收应用场景不同垃圾回收对比 线程不共享部分的回收方法区的回收手动触发回收 堆回收两种判断方法引用计数法查看垃圾回收日志可达性分析法GC Root对象类型可达性算…

函数式接口当参数使用

如果函数式接口作为一个方法的参数&#xff0c;就以为着要方法调用方自己实现业务逻辑&#xff0c;常见的使用场景是一个业务整体逻辑是不相上下的&#xff0c;但是在某一个步骤有不同的逻辑&#xff0c;例如数据处理有不同的策略&#xff0c;如果有大量的if-els&#xff0c;或…

机器学习4-多元线性回归

多元线性回归(Multiple Linear Regression)是线性回归的一种扩展形式&#xff0c;用于建立因变量与多个自变量之间的关系。在简单线性回归中&#xff0c;我们考虑一个因变量和一个自变量之间的线性关系&#xff0c;而多元线性回归允许我们考虑多个自变量对因变量的影响。 一般…

轻松录制视频,WPS录屏功能全攻略

“有人知道wps怎么录屏吗&#xff1f;老师要求我们录制一段视频&#xff0c;是关于课堂教学的&#xff0c;可是我不会录制文档&#xff0c;眼看就快到提交的时间了&#xff0c;现在真的很着急&#xff0c;希望大家帮帮我&#xff01;” 随着信息技术的发展&#xff0c;录制屏幕…

视频号怎么开店铺?保证金多少?

一、视频号怎么开店铺&#xff1f; 首先&#xff0c;你需要确保你已经拥有一个视频号账号。如果还没有账号&#xff0c;你可以在抖音上注册一个&#xff0c;并按照提示完成个人信息的填写和验证。 接下来&#xff0c;在视频号主页的右上角点击“设置”按钮。然后&#xff0c;…

进阶SQL —— 取指定字段的分位数

如果有分区需求&#xff0c;先对数据分区排序&#xff1b;没有分区需求&#xff0c;则直接对数据排序。 如果有分区需求&#xff0c;求每个分区的总数&#xff1b;没有分区需求&#xff0c;则直接求总行数。 如果有分区需求&#xff0c;筛选排序值 分区总数 * 分位数&#x…

数字图像处理(实践篇)三十二 OpenCV-Python比较两张图片的差异

目录 一 方案 二 实践 ​通过计算两张图像像素值的均方误差(MSE)来比较两张图像。差异大的两张图片具有较大的均方差值,相反,相似的图片间则具有较小的均方差值。需要注意的是。待比较的两张图像要具有相同的高度、宽度和通道数。 一 方案 ①导入依赖库 import cv2 import…

ROR之.nil? .empty? .blank?的用法

1、出处 Ruby的方法&#xff1a;.nil?、.empty? Rails的方法&#xff1a;.blank? 2、意义&#xff1a; .nil? 判断对象是否存在&#xff1b; .empty? 对象已经存在&#xff0c;判断是否为空字段 .blank? 相当于同时满足.nil?和.empty? 注&#xff1a;Rails API中…

幻兽帕鲁专用服务器延迟高怎么解决?

幻兽帕鲁专用服务器延迟高的问题&#xff0c;可能是由于网络环境、服务器负载、数据传输等原因导致的。下面将针对这些问题&#xff0c;提供一些解决方案和建议&#xff0c;帮助您解决延迟高的问题&#xff0c;提升游戏体验。 1.检查网络环境。网络环境不稳定或者带宽较低&…

mysql navicat 定时执行sql脚本

1、查看数据库是否开启定时任务。 show variables like event_scheduler;2、没有开起的话&#xff0c;执行以下开启命令。 set global event_scheduler on;3、选择数据库&#xff0c;创建事件。 4、创建定义的执行函数或者存储过程。我自己写的是存储过程&#xff0c;如下。…

windows下postgresql的安装使用

一、安装 1、安装包安装 1.1 下载exe安装包 选择安装包&#xff1a;官网 或者点击下载&#xff1a;postgresql-12.12-1-windows-x64.exe Tip&#xff1a;此时若报错&#xff1a;There has been an error.An error occured executing the Microsoft VC runtime installer。 参…

解决分页插件结合collection标签后分页数量不准确的问题

原因分析: 分页插件是在执行你的sql之前,执行了一次select count&#xff0c;根据count来得出你的total是多少假设你使用了join语句就有可能导致这个count偏多(一对多,拼表后数据量就变大了) 解决方案 方案一. 手动修正&#xff0c;按照mybatis plus分页插件的步骤&#xff…

2024 高级前端面试题之 前端工程相关 「精选篇」

该内容主要整理关于 前端工程相关模块的相关面试题&#xff0c;其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 前端工程相关模块精选篇 1. webpack的基本配置2. webpack高级配置3. webpack性能优化-构建速度4. webpack性能优化-产出代码&#xff08;线上运行&am…

阿里云 DMS 执行sql变更

数据库开发-数据变更-无锁变更 选择数据库&#xff1a;比如要更新生产库&#xff0c;搜索生产库名字。 填入变更sql。