這篇文章將為大家詳細(xì)講解有關(guān)如何使用樹(shù)莓派制作智能小車(chē),小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
成都創(chuàng)新互聯(lián)公司憑借在網(wǎng)站建設(shè)、網(wǎng)站推廣領(lǐng)域領(lǐng)先的技術(shù)能力和多年的行業(yè)經(jīng)驗(yàn),為客戶(hù)提供超值的營(yíng)銷(xiāo)型網(wǎng)站建設(shè)服務(wù),我們始終認(rèn)為:好的營(yíng)銷(xiāo)型網(wǎng)站就是好的業(yè)務(wù)員。我們已成功為企業(yè)單位、個(gè)人等客戶(hù)提供了網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)服務(wù),以良好的商業(yè)信譽(yù),完善的服務(wù)及深厚的技術(shù)力量處于同行領(lǐng)先地位。
電影里,時(shí)不時(shí)地可以看到一些這樣的場(chǎng)景,一輛小車(chē),上面裝有攝像頭,這輛小車(chē)可以通過(guò)電腦或都是手機(jī)進(jìn)行遠(yuǎn)程遙控,車(chē)上攝像頭拍到的畫(huà)面,可以實(shí)時(shí)地顯示在電腦或手機(jī)上,就像下圖這樣。
沒(méi)有接觸過(guò)這方面的朋友或許會(huì)覺(jué)得這是一門(mén)很高大上的技術(shù)活,其實(shí),并不然,這種小車(chē)做起來(lái)其實(shí)很簡(jiǎn)單。那么,這樣子的小車(chē),需要怎么去做呢?
其實(shí),我們只需要準(zhǔn)備一塊控制小車(chē)的電路板(開(kāi)發(fā)板),2到4個(gè)電機(jī)(馬達(dá))、小車(chē)架子一個(gè)、攝像頭以及攝像頭云臺(tái)一個(gè),以上這些基礎(chǔ)配件,然后對(duì)開(kāi)發(fā)板進(jìn)行編程、控制就可以了,整 體硬件成本加起來(lái)不到500塊錢(qián)。
** 開(kāi)發(fā)板:**
開(kāi)發(fā)板有很多種,比如51單片機(jī)、樹(shù)莓派、STM32、Arduino、micro:bit等等,都可以做為小車(chē)的控制板,我使用的是樹(shù)莓派開(kāi)發(fā)板,然后,可持樹(shù)莓派有很多版本、型號(hào),最便宜的樹(shù)莓派zero 68元就可以買(mǎi)到,不過(guò)不建議買(mǎi)這種,沒(méi)有網(wǎng)卡,需要另外買(mǎi)網(wǎng)線(xiàn)模塊,我使用的是樹(shù)莓派3B,價(jià)格220元,帶有無(wú)線(xiàn)和有線(xiàn)網(wǎng)卡,還帶有藍(lán)牙。
**小車(chē)架子:**某寶上有很多這種車(chē)架子,各式各樣的,只需要在某寶上搜索“智能小車(chē)”就能找到,帶上馬達(dá)一整套,也就五六十塊錢(qián)。
**攝像頭+云臺(tái):**某寶上也是一搜一大堆,比如我下面用的那個(gè),45塊錢(qián)。
配件準(zhǔn)備好了,就是給小車(chē)的開(kāi)發(fā)板裝系統(tǒng),然后對(duì)小車(chē)進(jìn)行編程控制。
小車(chē)的控制最主要有兩方面的控制,一個(gè)是小車(chē)的前后左右的運(yùn)動(dòng)控制,一個(gè)是攝像頭的拍攝、上下左右轉(zhuǎn)運(yùn)的控制。
小車(chē)的前后左右控制:
#-*- coding:UTF-8 -*- import RPi.GPIO as GPIO import time #小車(chē)電機(jī)引腳定義 LeftIn1 = 20 LeftIn2 = 21 LeftSpeed = 16 RightIn1 = 19 RightIn2 = 26 RightSpeed = 13 #設(shè)置GPIO口為BCM編碼方式 GPIO.setmode(GPIO.BCM) #忽略警告信息 GPIO.setwarnings(False) #電機(jī)引腳初始化操作 def car_init(): global pwm_LeftSpeed global pwm_RightSpeed global delaytime GPIO.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) #設(shè)置pwm引腳和頻率為2000hz pwm_LeftSpeed = GPIO.PWM(LeftSpeed, 2000) pwm_RightSpeed = GPIO.PWM(RightSpeed, 2000) pwm_LeftSpeed.start(0) pwm_RightSpeed.start(0) #小車(chē)前進(jìn) 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) #小車(chē)后退 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) #小車(chē)左轉(zhuǎn) 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) #小車(chē)右轉(zhuǎn) 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) #小車(chē)原地左轉(zhuǎn) 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) #小車(chē)原地右轉(zhuǎn) 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) #小車(chē)停止 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)
攝像頭控制有兩部分,一是拍攝、二是云臺(tái)轉(zhuǎn)動(dòng)。
**攝像頭的拍攝:**拍攝部分,我使用的是mjpg-streamer,這個(gè)工具可以把小車(chē)上的攝像頭當(dāng)作遠(yuǎn)程攝像頭(Web Camera)使用,安裝的方式也很簡(jiǎn)單:
#安裝必要的庫(kù) 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
必要庫(kù)安裝好后,下載mjpg-streamer到樹(shù)莓派上,并執(zhí)行編譯即可:
cd mjpg-streamer/mjpg-streamer-experimental make all sudo make install
通過(guò)以上操作,就可以啟動(dòng)攝像頭了:
#運(yùn)行mjpg-streamer ./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"
攝像頭啟動(dòng)后,可以在局域網(wǎng)內(nèi)的任何一臺(tái)電腦上使用瀏覽器輸入:http://樹(shù)莓派IP:8080/?action=stream 即可看到攝像頭拍到的畫(huà)面。
**云臺(tái)控制:**云臺(tái)的主是對(duì)控制上下和左右的兩舵機(jī)進(jìn)行編碼控制:
import RPi.GPIO as GPIO import time import pygame #舵機(jī)引腳定義 ServoUpDownPin = 9 ServoLeftRightPin = 11 #設(shè)置GPIO口為BCM編碼方式 GPIO.setmode(GPIO.BCM) #忽略警告信息 GPIO.setwarnings(False) #初始化上下左右角度為90度 ServoLeftRightPos = 90 ServoUpDownPos = 90 def init(): global pwm_UpDownServo global pwm_LeftRightServo GPIO.setup(ServoUpDownPin, GPIO.OUT) GPIO.setup(ServoLeftRightPin, GPIO.OUT) #設(shè)置舵機(jī)的頻率和起始占空比 pwm_UpDownServo = GPIO.PWM(ServoUpDownPin, 50) pwm_LeftRightServo = GPIO.PWM(ServoLeftRightPin, 50) pwm_UpDownServo.start(0) pwm_LeftRightServo.start(0) #攝像頭舵機(jī)左右旋轉(zhuǎn)到指定角度 def leftrightservo_appointed_detection(pos): for i in range(1): pwm_LeftRightServo.ChangeDutyCycle(2.5 + 10 * pos/180) time.sleep(0.02) #等待20ms周期結(jié)束 pwm_LeftRightServo.ChangeDutyCycle(0) #歸零信號(hào) #攝像頭舵機(jī)上下旋轉(zhuǎn)到指定角度 def updownservo_appointed_detection(pos): for i in range(1): pwm_UpDownServo.ChangeDutyCycle(2.5 + 10 * pos/180) time.sleep(0.02) #等待20ms周期結(jié)束 pwm_UpDownServo.ChangeDutyCycle(0) #歸零信號(hào) #攝像頭舵機(jī)向上運(yùn)動(dòng) def servo_up(): global ServoUpDownPos pos = ServoUpDownPos updownservo_appointed_detection(pos) #time.sleep(0.05) pos +=0.7 ServoUpDownPos = pos if ServoUpDownPos >= 180: ServoUpDownPos = 180 #攝像頭舵機(jī)向下運(yùn)動(dòng) def servo_down(): global ServoUpDownPos pos = ServoUpDownPos updownservo_appointed_detection(pos) #time.sleep(0.05) pos -= 0.7 ServoUpDownPos = pos if ServoUpDownPos <= 45: ServoUpDownPos = 45 #攝像頭舵機(jī)向左運(yùn)動(dòng) def servo_left(): print("servo_left") global ServoLeftRightPos pos = ServoLeftRightPos leftrightservo_appointed_detection(pos) #time.sleep(0.10) pos += 0.7 ServoLeftRightPos = pos print('ServoLeftRightPos:',ServoLeftRightPos) if ServoLeftRightPos >= 180: ServoLeftRightPos = 180 #攝像頭舵機(jī)向右運(yùn)動(dòng) def servo_right(): global ServoLeftRightPos pos = ServoLeftRightPos leftrightservo_appointed_detection(pos) #time.sleep(0.10) pos -= 0.7 ServoLeftRightPos = pos if ServoLeftRightPos <= 0: ServoLeftRightPos = 0 #所有舵機(jī)歸位 def servo_init(): servoflag = 0 servoinitpos = 90 if servoflag != servoinitpos: updownservo_appointed_detection(servoinitpos) leftrightservo_appointed_detection(servoinitpos) time.sleep(0.5) pwm_LeftRightServo.ChangeDutyCycle(0) #歸零信號(hào) pwm_UpDownServo.ChangeDutyCycle(0) #歸零信號(hào) #舵機(jī)停止 def servo_stop(): pwm_LeftRightServo.ChangeDutyCycle(0) #歸零信號(hào) pwm_UpDownServo.ChangeDutyCycle(0) #歸零信號(hào)
對(duì)小車(chē)的控制編程完成后,最后我們使用WebSocket遠(yuǎn)程連接小車(chē),發(fā)送相關(guān)的控制命令,就可以使用電腦或手機(jī)遠(yuǎn)程控制小車(chē)了。
關(guān)于“如何使用樹(shù)莓派制作智能小車(chē)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。