日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用树莓派制作智能小车

發布時間:2024/3/26 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用树莓派制作智能小车 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

電影里,時不時地可以看到一些這樣的場景,一輛小車,上面裝有攝像頭,這輛小車可以通過電腦或都是手機進行遠程遙控,車上攝像頭拍到的畫面,可以實時地顯示在電腦或手機上,就像下圖這樣。

沒有接觸過這方面的朋友或許會覺得這是一門很高大上的技術活,其實,并不然,這種小車做起來其實很簡單。那么,這樣子的小車,需要怎么去做呢?

其實,我們只需要準備一塊控制小車的電路板(開發板),2到4個電機(馬達)、小車架子一個、攝像頭以及攝像頭云臺一個,以上這些基礎配件,然后對開發板進行編程、控制就可以了,整 體硬件成本加起來不到500塊錢。

開發板:

開發板有很多種,比如51單片機、樹莓派、STM32、Arduino、micro:bit等等,都可以做為小車的控制板,我使用的是樹莓派開發板,然后,可持樹莓派有很多版本、型號,最便宜的樹莓派zero 68元就可以買到,不過不建議買這種,沒有網卡,需要另外買網線模塊,我使用的是樹莓派3B,價格220元,帶有無線和有線網卡,還帶有藍牙。

小車架子: 某寶上有很多這種車架子,各式各樣的,只需要在某寶上搜索“智能小車”就能找到,帶上馬達一整套,也就五六十塊錢。

攝像頭+云臺: 某寶上也是一搜一大堆,比如我下面用的那個,45塊錢。

配件準備好了,就是給小車的開發板裝系統,然后對小車進行編程控制。

小車的控制最主要有兩方面的控制,一個是小車的前后左右的運動控制,一個是攝像頭的拍攝、上下左右轉運的控制。

小車的前后左右控制:

#-*- coding:UTF-8 -*- import RPi.GPIO as GPIO import time#小車電機引腳定義 LeftIn1 = 20 LeftIn2 = 21 LeftSpeed = 16RightIn1 = 19 RightIn2 = 26 RightSpeed = 13#設置GPIO口為BCM編碼方式 GPIO.setmode(GPIO.BCM)#忽略警告信息 GPIO.setwarnings(False)#電機引腳初始化操作 def car_init():global pwm_LeftSpeedglobal pwm_RightSpeedglobal delaytimeGPIO.setup(LeftSpeed,GPIO.OUT,initial=GPIO.LOW)GPIO.setup(LeftIn1,GPIO.OUT,initial=GPIO.LOW)GPIO.setup(LeftIn2,GPIO.OUT,initial=GPIO.LOW)GPIO.setup(RightSpeed,GPIO.OUT,initial=GPIO.LOW)GPIO.setup(RightIn1,GPIO.OUT,initial=GPIO.LOW)GPIO.setup(RightIn2,GPIO.OUT,initial=GPIO.LOW)#設置pwm引腳和頻率為2000hzpwm_LeftSpeed = GPIO.PWM(LeftSpeed, 2000)pwm_RightSpeed = GPIO.PWM(RightSpeed, 2000)pwm_LeftSpeed.start(0)pwm_RightSpeed.start(0)#小車前進 def run(delaytime):GPIO.output(LeftIn1, GPIO.HIGH)GPIO.output(LeftIn2, GPIO.LOW)GPIO.output(RightIn1, GPIO.HIGH)GPIO.output(RightIn2, GPIO.LOW)pwm_LeftSpeed.ChangeDutyCycle(80)pwm_RightSpeed.ChangeDutyCycle(80)time.sleep(delaytime)#小車后退 def back(delaytime):GPIO.output(LeftIn1, GPIO.LOW)GPIO.output(LeftIn2, GPIO.HIGH)GPIO.output(RightIn1, GPIO.LOW)GPIO.output(RightIn2, GPIO.HIGH)pwm_LeftSpeed.ChangeDutyCycle(80)pwm_RightSpeed.ChangeDutyCycle(80)time.sleep(delaytime)#小車左轉 def left(delaytime):GPIO.output(LeftIn1, GPIO.LOW)GPIO.output(LeftIn2, GPIO.LOW)GPIO.output(RightIn1, GPIO.HIGH)GPIO.output(RightIn2, GPIO.LOW)pwm_LeftSpeed.ChangeDutyCycle(80)pwm_RightSpeed.ChangeDutyCycle(80)time.sleep(delaytime)#小車右轉 def right(delaytime):GPIO.output(LeftIn1, GPIO.HIGH)GPIO.output(LeftIn2, GPIO.LOW)GPIO.output(RightIn1, GPIO.LOW)GPIO.output(RightIn2, GPIO.LOW)pwm_LeftSpeed.ChangeDutyCycle(80)pwm_RightSpeed.ChangeDutyCycle(80)time.sleep(delaytime)#小車原地左轉 def spin_left(delaytime):GPIO.output(LeftIn1, GPIO.LOW)GPIO.output(LeftIn2, GPIO.HIGH)GPIO.output(RightIn1, GPIO.HIGH)GPIO.output(RightIn2, GPIO.LOW)pwm_LeftSpeed.ChangeDutyCycle(80)pwm_RightSpeed.ChangeDutyCycle(80)time.sleep(delaytime)#小車原地右轉 def spin_right(delaytime):GPIO.output(LeftIn1, GPIO.HIGH)GPIO.output(LeftIn2, GPIO.LOW)GPIO.output(RightIn1, GPIO.LOW)GPIO.output(RightIn2, GPIO.HIGH)pwm_LeftSpeed.ChangeDutyCycle(80)pwm_RightSpeed.ChangeDutyCycle(80)time.sleep(delaytime)#小車停止 def brake(delaytime):GPIO.output(LeftIn1, GPIO.LOW)GPIO.output(LeftIn2, GPIO.LOW)GPIO.output(RightIn1, GPIO.LOW)GPIO.output(RightIn2, GPIO.LOW)pwm_LeftSpeed.ChangeDutyCycle(80)pwm_RightSpeed.ChangeDutyCycle(80)time.sleep(delaytime)

攝像頭控制有兩部分,一是拍攝、二是云臺轉動。

攝像頭的拍攝: 拍攝部分,我使用的是mjpg-streamer,這個工具可以把小車上的攝像頭當作遠程攝像頭(Web Camera)使用,安裝的方式也很簡單:

#安裝必要的庫 sudo apt-get update sudo apt-get install libjpeg8-dev sudo apt-get install imagemagick sudo apt-get install libv4l-dev sudo apt-get autoremove cmake sudo apt-get install cmake

必要庫安裝好后,下載mjpg-streamer到樹莓派上,并執行編譯即可:

cd mjpg-streamer/mjpg-streamer-experimental make all sudo make install

通過以上操作,就可以啟動攝像頭了:

#運行mjpg-streamer./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"

攝像頭啟動后,可以在局域網內的任何一臺電腦上使用瀏覽器輸入:http://樹莓派IP:8080/?action=stream 即可看到攝像頭拍到的畫面。

云臺控制: 云臺的主是對控制上下和左右的兩舵機進行編碼控制:

import RPi.GPIO as GPIO import time import pygame#舵機引腳定義 ServoUpDownPin = 9 ServoLeftRightPin = 11#設置GPIO口為BCM編碼方式 GPIO.setmode(GPIO.BCM)#忽略警告信息 GPIO.setwarnings(False)#初始化上下左右角度為90度 ServoLeftRightPos = 90 ServoUpDownPos = 90def init():global pwm_UpDownServoglobal pwm_LeftRightServoGPIO.setup(ServoUpDownPin, GPIO.OUT)GPIO.setup(ServoLeftRightPin, GPIO.OUT)#設置舵機的頻率和起始占空比pwm_UpDownServo = GPIO.PWM(ServoUpDownPin, 50)pwm_LeftRightServo = GPIO.PWM(ServoLeftRightPin, 50)pwm_UpDownServo.start(0)pwm_LeftRightServo.start(0)#攝像頭舵機左右旋轉到指定角度 def leftrightservo_appointed_detection(pos): for i in range(1): pwm_LeftRightServo.ChangeDutyCycle(2.5 + 10 * pos/180)time.sleep(0.02) #等待20ms周期結束pwm_LeftRightServo.ChangeDutyCycle(0) #歸零信號#攝像頭舵機上下旋轉到指定角度 def updownservo_appointed_detection(pos): for i in range(1): pwm_UpDownServo.ChangeDutyCycle(2.5 + 10 * pos/180)time.sleep(0.02) #等待20ms周期結束pwm_UpDownServo.ChangeDutyCycle(0) #歸零信號#攝像頭舵機向上運動 def servo_up():global ServoUpDownPospos = ServoUpDownPosupdownservo_appointed_detection(pos)#time.sleep(0.05)pos +=0.7 ServoUpDownPos = posif ServoUpDownPos >= 180:ServoUpDownPos = 180#攝像頭舵機向下運動 def servo_down():global ServoUpDownPospos = ServoUpDownPosupdownservo_appointed_detection(pos)#time.sleep(0.05)pos -= 0.7ServoUpDownPos = posif ServoUpDownPos <= 45:ServoUpDownPos = 45#攝像頭舵機向左運動 def servo_left():print("servo_left")global ServoLeftRightPospos = ServoLeftRightPosleftrightservo_appointed_detection(pos)#time.sleep(0.10)pos += 0.7ServoLeftRightPos = posprint('ServoLeftRightPos:',ServoLeftRightPos)if ServoLeftRightPos >= 180:ServoLeftRightPos = 180#攝像頭舵機向右運動 def servo_right():global ServoLeftRightPospos = ServoLeftRightPosleftrightservo_appointed_detection(pos)#time.sleep(0.10)pos -= 0.7 ServoLeftRightPos = posif ServoLeftRightPos <= 0:ServoLeftRightPos = 0#所有舵機歸位 def servo_init():servoflag = 0servoinitpos = 90if servoflag != servoinitpos: updownservo_appointed_detection(servoinitpos)leftrightservo_appointed_detection(servoinitpos)time.sleep(0.5) pwm_LeftRightServo.ChangeDutyCycle(0) #歸零信號pwm_UpDownServo.ChangeDutyCycle(0) #歸零信號#舵機停止 def servo_stop():pwm_LeftRightServo.ChangeDutyCycle(0) #歸零信號pwm_UpDownServo.ChangeDutyCycle(0) #歸零信號

對小車的控制編程完成后,最后我們使用WebSocket遠程連接小車,發送相關的控制命令,就可以使用電腦或手機遠程控制小車了。


完整的教學視頻可查看:http://www.diyabc.com/frontweb/product400.html

總結

以上是生活随笔為你收集整理的使用树莓派制作智能小车的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。