智能小车案例:基于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()  # 退出程序(可选)或执行其他操作(如循环检测等)以继续控制小车移动或避障。

避障逻辑实现

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

智能小车案例:基于Raspberry Pi的自动巡航与避障系统_第1张图片 

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

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

当然,以下是一个简单的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操作之后再进行更深入的探索和开发。智能小车案例:基于Raspberry Pi的自动巡航与避障系统_第2张图片

你可能感兴趣的:(单片机,嵌入式硬件,人工智能,python,自动驾驶)