冰楓論壇

 找回密碼
 立即註冊
ads_sugarbook
搜索
查看: 559|回覆: 0
打印 上一主題 下一主題

[討論] Raspberry Pi Zero製作自動導航系統

[複製鏈接]

2609

主題

0

好友

945

積分

高級會員

Rank: 4

UID
373967
帖子
7402
主題
2609
精華
0
積分
945
楓幣
1002
威望
925
存款
26000
贊助金額
0
推廣
0
GP
1205
閱讀權限
50
在線時間
405 小時
註冊時間
2023-1-12
最後登入
2024-4-29

2023端午節紀念勳章 2023中秋節紀念勳章 2023聖誕節紀念勳章

跳轉到指定樓層
1
發表於 2023-3-29 06:08:59 |只看該作者 |倒序瀏覽
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模塊和相應的硬件。
收藏收藏0 推0 噓0


把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1骰子
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們職位招聘本站規範DMCA隱私權政策

Copyright © 2011-2024 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2024-4-29 21:05

回頂部