洪嵐峰 發表於 2023-3-29 06:08:59

Raspberry Pi Zero製作自動導航系統

Raspberry Pi Zero是一款迷你的單板電腦,具有小巧、低功耗等特點,非常適合用來製作自動導航系統。以下是您需要的零件和程式碼:

零件:

Raspberry Pi Zero主板
Pi Camera模組
USB WiFi模組
4輪驅動智能小車底盤
L298N雙路H橋驅動模組
HC-SR04超聲波傳感器
面包板和電線
4顆18650鋰電池及電池盒
程式碼:

首先,您需要安裝Python程式語言和GPIO庫,這可以通過以下命令在Raspberry Pi上完成:
sql

sudo apt-get update
sudo apt-get install python-dev python-rpi.gpio
然後,您需要下載和安裝Picamera庫,這可以通過以下命令在Raspberry Pi上完成:
arduino

sudo apt-get install python-picamera
接下來,您需要編寫Python代碼,該代碼可以讓Raspberry Pi控制智能小車底盤,使用超聲波傳感器實現障礙物檢測,並使用Pi Camera模組實現影像擷取和處理。以下是一個簡單的示例代碼,供您參考:
python

import RPi.GPIO as GPIO
import time
from picamera import PiCamera
import numpy as np
import cv2

GPIO.setmode(GPIO.BOARD)

# Define pins for ultrasonic sensor
TRIG = 16
ECHO = 18
GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)

# Define pins for L298N motor driver
ENA = 13
IN1 = 11
IN2 = 15
IN3 = 19
IN4 = 21
ENB = 23
GPIO.setup(ENA, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(IN1, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(IN2, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(IN3, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(IN4, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(ENB, GPIO.OUT, initial=GPIO.LOW)

# Set up PiCamera
camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 32
rawCapture = PiRGBArray(camera, size=(640, 480))

# Define motor control functions
def stop():
    GPIO.output(ENA, GPIO.LOW)
    GPIO.output(ENB, GPIO.LOW)
    GPIO.output(IN1, GPIO.LOW)
    GPIO.output(IN2, GPIO.LOW)
    GPIO.output(IN3, GPIO.LOW)
    GPIO.output(IN4, GPIO.LOW)

def forward():
    GPIO.output(ENA, GPIO.HIGH)
    GPIO.output(ENB, GPIO.HIGH)
    GPIO.output(IN1, GPIO.GPIO.HIGH)

GPIO.output(IN2, GPIO.LOW)
GPIO.output(IN3, GPIO.HIGH)
GPIO.output(IN4, GPIO.LOW)

def backward():
GPIO.output(ENA, GPIO.HIGH)
GPIO.output(ENB, GPIO.HIGH)
GPIO.output(IN1, GPIO.LOW)
GPIO.output(IN2, GPIO.HIGH)
GPIO.output(IN3, GPIO.LOW)
GPIO.output(IN4, GPIO.HIGH)

def left():
GPIO.output(ENA, GPIO.HIGH)
GPIO.output(ENB, GPIO.HIGH)
GPIO.output(IN1, GPIO.LOW)
GPIO.output(IN2, GPIO.HIGH)
GPIO.output(IN3, GPIO.HIGH)
GPIO.output(IN4, GPIO.LOW)

def right():
GPIO.output(ENA, GPIO.HIGH)
GPIO.output(ENB, GPIO.HIGH)
GPIO.output(IN1, GPIO.HIGH)
GPIO.output(IN2, GPIO.LOW)
GPIO.output(IN3, GPIO.LOW)
GPIO.output(IN4, GPIO.HIGH)

Define distance measurement function
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
start = time.time()

while GPIO.input(ECHO) == 1:
    pass
stop = time.time()

return (stop - start) * 34000 / 2
Main loop
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
# Get current frame from camera
img = frame.array

# Convert to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Threshold the image
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# Find contours in the image
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# Check if any obstacles are detected
for cnt in contours:
    area = cv2.contourArea(cnt)
    if area > 500:
        stop()
        time.sleep(0.5)
        backward()
        time.sleep(1)
        left()
        time.sleep(1)
        forward()

# Check distance to nearest obstacle
dist = distance()
if dist < 30:
    stop()
    time.sleep(0.5)
    backward()
    time.sleep(1)
    left()
    time.sleep(1)
    forward()

# Clear the stream in preparation for the next frame
rawCapture.truncate(0)
markdown


這個示例代碼會進行以下操作:

1. 初始化GPIO設置,包括超聲波傳感器和L298N雙路H橋驅動模組的設置。
2. 初始化PiCamera模組並設置分辨率和幀速率。
3. 定義控制小車底盤的函數,包括前進、後退、向左轉、向右轉和停止。
4. 定義測量超聲波傳感器距離的函數。
5. 在主循環中,捕獲相機的當前幀,將其轉換為灰度圖像,並將其二值化處理。然後,使用cv2.findContours函數找到圖像中的輪廓,檢查是否檢測到任何障礙物。如果發現障礙物,則調用相應的小車底盤控制函數來避免障礙物。接著,檢查距離最近的障礙物距離是否小於30厘米,如果是,則採取相同的操作以避免障礙物。

這是示例代碼中使用的GPIO和其他硬件部件的配置:


# Define GPIO pins
ENA = 27
IN1 = 17
IN2 = 22
ENB = 18
IN3 = 23
IN4 = 24

TRIG = 19
ECHO = 26

# Set GPIO mode
GPIO.setmode(GPIO.BCM)

# Set GPIO pin directions
GPIO.setup(ENA, GPIO.OUT)
GPIO.setup(IN1, GPIO.OUT)
GPIO.setup(IN2, GPIO.OUT)
GPIO.setup(ENB, GPIO.OUT)
GPIO.setup(IN3, GPIO.OUT)
GPIO.setup(IN4, GPIO.OUT)

GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)

# Set camera resolution and framerate
camera.resolution = (640, 480)
camera.framerate = 32

# Create stream object for camera captures
rawCapture = PiRGBArray(camera, size=(640, 480))
這個示例代碼使用了Python的OpenCV庫來處理圖像和輪廓,以及RPi.GPIO庫來控制GPIO引腳。如果您將代碼保存為名為“autopilot.py”的文件,可以在Raspberry Pi上運行它,方法是在終端中運行以下命令:

請注意,為了讓這個示例代碼正常運行,您需要安裝OpenCV和RPi.GPIO庫,以及PiCamera模塊和相應的硬件。
頁: [1]
查看完整版本: Raspberry Pi Zero製作自動導航系統