使用樹莓派製作智慧小車

摘要:該專案我會開源,大家一起參與進來,對智慧小車進行完善。一定要牢記樹莓派的GPIO引腳不能輸入大於3。3V的電壓,否則樹莓派變磚。

智慧小車實現的功能

超聲波測距

四路紅外避障

檢測周圍環境的溼度

檢測周圍環境的溫度

監控及拍照

與人的互動,語音控制

1。智慧小車概述

由於製作的初衷是送給我一歲多的閨女當作玩具的,所以給小車起名字叫——洋洋,閨女屬羊的,就用了諧音。先欣賞一下智慧小車的容貌

使用樹莓派製作智慧小車

來張側面圖

使用樹莓派製作智慧小車

來張正面圖

2。樹莓派簡介

智慧小車的大腦是一塊信用卡大小的樹莓派板子,所以DIY衝動的朋友可以到各大商城購買一塊最新版的樹莓派,鐺鐺鐺鐺:

使用樹莓派製作智慧小車

樹莓派第三代張這個樣子——正面照

簡單介紹:

Micro-USB Power——電源插槽

CPU

四個USB介面

一個HDMI介面

一個耳機插孔,也可以輸出影片

40個GPIO引腳

一個SD卡插槽,沒有硬碟

一個網線插口,自帶無線網絡卡

樹莓派相機插槽

所有具體介面如何使用,詳細講解的話會使該篇文章顯得拖沓,放在其它篇幅講解,目前不懂沒關係,不影響到我們製作智慧小車。跟著我一步步地進入探索之旅吧。

Micro-USB Power,樹莓派供電介面

1。電源介面卡 5V 2A

使用樹莓派製作智慧小車

IMG_20170527_193957

2。移動電源 輸出5V 2。1A

注意:Pi沒有板載穩壓晶片,只能且必須用5V的電源給Pi供電。如果電壓過大,Pi會永久“變磚”,等著流淚吧!

3。智慧小車底盤的製作

3.1車輪的選擇

有車軲轆才稱得上車。

車軲轆的選擇真是太多了,到各大商城上搜索,五花八門,看的真是眼花繚亂。根據個人喜好選擇車輪的外圍尺寸,有人習慣大輪子,看起來酷酷蠻拉風,當然大輪子重量上比較重,導致還要給它配上一副功率相對大的電機。

我比較喜歡大一點的輪子,因為以後還要在此基礎上新增很多的感測器:

超聲波感測器測距離,感應前方多少米有人。

溫度感測器測量周圍環境的溫度;

溼度感測器測量周圍環境的溼度;

紅外感測器測量前後左右方是否接近物體;

等一系列的感測器。所以平臺會比較大一點,基於大的輪子構建平臺比較合適。在你的大腦裡是否構建出一副你自己喜歡的小車模型呢。是否迫不及待想動手製作屬於你自己的玩具或者感測器站呢!

我選擇的車軲轆:

使用樹莓派製作智慧小車

車輪外側

使用樹莓派製作智慧小車

車輪內側

外圍尺寸:6。5CM

車輪寬度:2。6Cm

孔徑(上面右圖所示):六邊形(邊長7mm, 對邊到對邊是12mm)

選擇配套的六角聯軸器連結車輪(圓柱內孔徑:5mm):

使用樹莓派製作智慧小車

六角聯軸器圖一

使用樹莓派製作智慧小車

六角聯軸器圖二

使用樹莓派製作智慧小車

連結六角聯軸器與車輪的螺絲

六角聯軸器與車輪連結起來後的樣子:

使用樹莓派製作智慧小車

圖片發自簡書App

到此,車軲轆部分組裝完成。

3.2電機的選擇

上文也提到,想讓小車自己動起來,那就少不了驅動小車前進的電機。電機選擇也不那麼容易,能提供足夠的力量的同時不能太貴,手頭碎銀不多嘛,其次最好跟六角聯軸器配套,電機的軸徑匹配六角聯軸器的內徑,這樣安裝起來省很多麻煩。由於六角聯軸器的孔徑為5mm,選擇電機時,我們首當其衝的就是電機對外突出的軸的直徑也為5mm,這樣直接插入到六角聯軸器孔中,再次用小螺絲(購買六角聯軸器時會提供,並沒有展示固定用的小螺絲)固定一下就完成電機與輪子的組裝。

我選擇的電機的軸徑為4mm,第一次製作沒有考慮那麼多,不過有六角聯軸器有固定螺絲,可以很好的把電機軸跟六角聯軸器固定在一起。

使用樹莓派製作智慧小車

370直流電機

電機規格說明:3v -33轉/分鐘 6V - 133轉/分鐘 12V - 258轉/分鐘

我們不著急把電機跟車軲轆固定在一起,因為還缺少一個電機的固定座。固定座的作用把電機固定在小車的透明亞克力板(俗稱塑膠板)。

選擇電機固定座,商城中搜索“電機座”,尋找符合我們條件的電機座。電機座上的小孔徑一方面負責與亞克力板固定在一起,另一方面負責與電機固定在一起。選擇小孔孔徑為3mm大小,這個很重要,因為電機前端固定孔直徑為3mm。

需要注意的細節太多了,一環扣一環,環環相扣,而且在北京,基本沒有DIY的五金店,DIY全都是南方的企業在做,而且北方並沒有代理商,只能網上購買。

製作過程中,杜邦線(就是細細的電線,製作成兩頭方便插拔的)不夠了,到一個大型的建材批發城,被人一臉鄙視加不屑的“轟”了出來,無奈。

如果你嫌麻煩,或者動手能力差的話,那麼就購買成品的玩具小車底盤(含有馬達的那種更省事)。

電機電源

12V電池

使用樹莓派製作智慧小車

IMG_20170525_171800

3.3智慧小車車體的製作

挑來挑去,選擇瞭如下的電機座(每個小孔徑直徑3mm),不配備螺絲與螺帽,更沒有墊片,說到墊片不得不說六角聯軸器,也是沒有配備墊片的,一個小小的墊片折射出了國內的工業標準跟某些回家還是有差距的距離的。

使用樹莓派製作智慧小車

電機固定座

電機固定座(¥4。5)一個小小的鐵片竟然值這個價格,如果你有條件的話很容易製作出來的,不必花這冤枉錢,我沒有電鑽,沒辦法鑽孔。

既然沒有配備螺絲,那我們還要購買3mm的螺絲及3mm的螺帽,我也是第一次知道購買螺絲只是螺絲並沒有螺帽,螺帽還得花錢購買。我第一次買回來後,傻眼了並沒有螺帽,抓狂~~~這樣網購的事情來來回回還幾次,真是隔行如隔山啊,不親身體驗事情的原本,根本沒有身臨其境的感受。

3mm的螺絲,3mm的螺帽,3mm的墊片。一切就緒,開始組裝。等等,哪裡不對勁,安裝在哪裡呢,還缺少一個亞克力板(俗稱塑膠板)作為小車的載體。開始選擇小車板吧,根據自己的喜好,我選擇了:透明200

300

3mm規格的板子。

我購買的板子是沒有鑽孔的,需要自己想辦法鑽孔,這裡推薦你購買已經鑽過孔的小車板子,注意一點的是孔的直徑大小為3mm,需要固定電機座,孔之間的距離跟電機座上面的孔距離一直,否則也是沒有用的。

鑽孔的過程是極其手疼的,因為我沒有電鑽。所以對於喜歡DIY的朋友來說,一把電鑽是必不可少的工具。

1。把四個電機固定座固定在亞克力板上(

2。把小車後面兩個輪子固定在車上,由於我們製作的是兩後驅動小車,所以把電機固定在後面的電機座上,把車輪固定在電機軸上。

3。固定前面兩個輪子。

前面兩個車輪如何固定呢?

我的做法不是最好的,因為之前選車輪子時決定了我現在必須按照如下步驟安裝車輪子:

首先我們需要兩個軸承,兩根直徑5mm長度8cm的兩根小鋼棍當作小車的前軸(我們稱之為A,B軸,方便下文描述),與左右車輪相連線。

想辦法把兩個軸承透過電機座固定在小車板上,因為車輪上安裝軸承有相當大的困難,我試圖尋找解決方案,結果放棄了。

然後再分別把A,B軸固定在兩個軸承上,固定好以後。就可以分別在A,B軸上安裝車輪了,安裝起來相對簡單。

到此,智慧小車的底盤製作完成。來個全景圖:

使用樹莓派製作智慧小車

智慧小車底盤完整圖

4。連結電機和控制器

控制器的選擇標準

我們製作的兩驅智慧小車,使用的直流電機370。

電機規格說明:3V -33轉/分鐘 6V - 133轉/分鐘 12V - 258轉/分鐘

電機驅動器輸出電壓不能低於3V,否則電機不工作。

L298N雙H橋直流電機驅動器

使用樹莓派製作智慧小車

引入一個詞——“跳線帽”

跳線帽的作用是控制線路板上電流流動的小開關。

使用樹莓派製作智慧小車

馬達A輸出——————控制小車左後輪電機的旋轉;

馬達B輸出——————控制小車右後輪電機的旋轉;

12V輸入——————-連結外部電源“+”極;

電源地————————連結外部電源“-”極;

微控制器I/O控制輸入——連結樹莓派GPIO引腳;

A通道使能——————預設跳線帽(可拔掉)連結上面5V引腳;

B通道使能——————預設跳線帽(可拔掉)連結上面5V引腳;

板載5V輸出使能——預設跳線帽(可拔掉)連結兩個引腳;

5V輸入————————該介面功能與板載5V輸出使能有關;

4.1L298N控制器使用說明

L298N電機控制器工作電壓為5V。

L298N電機控制器輸出電壓與供電電源電壓大小有關,供電電源電壓越大輸出的電壓也就越大。

L298N板子供電方式

方式一:板載5V輸出使能供電

板載5V輸出使能不拔跳線帽,板子有一個穩壓晶片把12V輸入的電壓穩定在5V,透過板載5V輸出使能給電機控制器供電。

透過12V輸入的電壓不能大於12V,否則會燒燬穩壓晶片。

5V輸入變成了對外提供5V電壓介面。不能再透過該介面輸入電壓,否則會燒燬穩壓晶片。

方式二:5V輸入

拔掉板載5V輸出使能跳線帽。透過5V輸入5V的電壓

一定要拔掉板載5V輸出使能跳線帽,5V輸入介面輸入穩定的5V電壓。切記不要大於5V。

杜邦線

使用樹莓派製作智慧小車

1495779235172

公對公

使用樹莓派製作智慧小車

母對母

使用樹莓派製作智慧小車

公對母

使用樹莓派製作智慧小車

IMG_20170527_213908

連結說明:

12V電源連線一個開關

使用樹莓派製作智慧小車

連線開關保持斷開狀態

使用樹莓派製作智慧小車

IMG_20170525_172056

與麵包版連結

使用樹莓派製作智慧小車

Pi的GPIO引腳輸入電壓一定不要大於3。3V

需要配備一個萬用表來測試各種輸入輸出電壓,對於除錯程式有很大的幫助。

使用樹莓派製作智慧小車

從另一個角度說明“板載5V輸出使能”:

12V輸入接入12V的電壓時,板載5V輸出使能透過穩壓晶片可以給板子提供穩定的5V電壓。控制器開始工作。這時5V輸入介面變成了5V輸出,對外提供穩定的5V電壓 ,切記一定不要再輸入任何電壓,否則,會燒燬穩壓晶片的,切記!切記!切記!

12V輸入接入大於12V電壓,5V輸出使能必須拔掉跳線帽。控制器的工作電壓由5V輸入提供。

理解了板載5V輸出使能介面,5V輸入介面的功能,接下來我們開始連線。

電源地,接地,GND這些詞表達的都是一個意思。

板載5V輸出使能拔掉跳線帽。

使能A拔掉跳線帽。

使能B拔掉跳線帽。

5V輸入接樹莓派5V輸出引腳(2/4),電源地接連結樹莓派GND引腳(6/9/14/20/25/30/34/39)。

12V輸入接電源正極。電源地接電源負極。

連結過程可以藉助麵包版。

連結完成後,檢查兩遍線路,沒問題後接通開關,檢視指示燈的狀態是否正確。

5 開始程式設計:

5.1電機驅動器的工作原理

使用樹莓派製作智慧小車

電機控制器工作原理

B輸出與A一致。

5.2Python程式碼實現

因為我們使用RPi。GPIO庫,只需用下列命令向樹莓派引腳傳送高低電平就可控制電機的旋轉。

GPIO。setup(PinNumber, GPIO。OUTPUT)GPIO。out(PinNumber, GPIO。HIGH)GPIO。out(PinNumber, GPIO。LOW)

一個互動式Python指令碼修改電機控制器的輸入訊號,對電機進行控制。

連結好電機和電源以後,為了測試不同命令的執行效果,把智慧小車的後輪抬高,防止在地上亂跑。只有在修復了程式碼中的Bug以後(不要太樂觀,錯誤總是伴隨著你粗心和興奮而來)才能進行下一個環節,在不同的環境下測試效果。現在的工作相當於在生產車間對車輛進行改造。

IN1 -13腳

IN2 -11腳

ENA -15腳

IN3 -40腳

IN4 -38腳

ENB-36腳

把後輪抬高離開地面,建立一個Python指令碼,名為car。py:

# -*- coding:utf-8 -*-import RPi。GPIO as GPIOimport timeclass Car(): def __init__(self, left_in1, left_in2, left_ena, right_in3, right_in4, right_enb, low_electrical_level, hight_electrical_level): GPIO。setwarnings(False) GPIO。setmode(GPIO。BOARD) self。left_in1 = left_in1 self。left_in2 = left_in2 self。left_ena = left_ena if self。left_ena > 0: GPIO。setup(self。left_ena, GPIO。OUT) GPIO。setup(self。left_in1, GPIO。OUT) GPIO。setup(self。left_in2, GPIO。OUT) self。right_in3 = right_in3 self。right_in4 = right_in4 self。right_enb = right_enb GPIO。setup(self。right_in3, GPIO。OUT) GPIO。setup(self。right_in4, GPIO。OUT) if self。right_enb > 0: GPIO。setup(self。right_enb, GPIO。OUT) self。hight_electrical_level = hight_electrical_level self。low_electrical_level = low_electrical_level ‘’‘ 右邊輪子前進 ’‘’ def rFoward(self): GPIO。output(self。right_in3, self。hight_electrical_level) GPIO。output(self。right_in4, self。low_electrical_level) if self。right_enb > 0: GPIO。output(self。right_enb, self。hight_electrical_level) ‘’‘ 左邊輪子前進 ’‘’ def lFoward(self): GPIO。output(self。left_in1, self。hight_electrical_level) GPIO。output(self。left_in2, self。low_electrical_level) if self。left_ena > 0: GPIO。output(self。left_ena, self。hight_electrical_level) ‘’‘ 右邊輪子後退 ’‘’ def rBackward(self): GPIO。output(self。right_in3, self。low_electrical_level) GPIO。output(self。right_in4, self。hight_electrical_level) if self。right_enb > 0: GPIO。output(self。right_enb, self。hight_electrical_level) ‘’‘ 左邊邊輪子後退 ’‘’ def lBackward(self): GPIO。output(self。left_in1, self。low_electrical_level) GPIO。output(self。left_in2, self。hight_electrical_level) if self。left_ena > 0: GPIO。output(self。left_ena, self。hight_electrical_level) ‘’‘ 左邊輪子停止 ’‘’ def lStop(self): if self。left_ena > 0: GPIO。output(self。left_ena, self。low_electrical_level) else: GPIO。output(self。left_in2, self。low_electrical_level) GPIO。output(self。left_in1, self。low_electrical_level) ‘’‘ 右邊輪子停止 ’‘’ def rStop(self): if self。right_enb > 0: GPIO。output(self。right_enb, self。low_electrical_level) else: GPIO。output(self。right_in3, self。low_electrical_level) GPIO。output(self。right_in4, self。low_electrical_level) ‘’‘ 小車前進 ’‘’ def moveForward(self): self。lFoward() self。rFoward() ‘’‘小車後退 ’‘’ def moveBackground(self): self。lBackward() self。rBackward() ‘’‘小車右轉 ’‘’ def spinRight(self): self。rFoward() self。lBackward() ‘’‘小車左轉 ’‘’ def spinLeft(self): self。rBackward() self。lFoward() ‘’‘ 小車停止——左邊及右邊輪子都停止 ’‘’ def stop(self): self。lStop() self。rStop() def cleanup(self): GPIO。cleanup()def instanceCar(): return Car(11, 13, 15, 38, 40, 36, 0, 1)

儲存。然後命令執行car。py檢視執行效果:

sudo python3 car。py

如果正確無誤,車輪會向前旋轉2秒,暫停,再向後旋轉兩秒,然後停止旋轉,試試其他的值,熟悉小車的狀態。

接下來編寫一個指令碼controlcar。py,使用字元選單來控制智慧小車的行走軌跡。

import timeimport osimport subprocess as callimport carimport cameracar = car。instanceCar()def raw_input(content): return str(input(content))if __name__ == “__main__”: try: while True: #Get command from user os。system (“clear”) print (“W = forward”) print (“Z = background”) print (“A = left”) print (“D = right”) print (“S = stop”) print(“t = take pictures”) print(“v = record video”) command = raw_input(“Enter command(Q to quit)”) if (command == “w” or command == “W” ): car。moveForward() time。sleep(5) car。stop() continue elif (command == “a” or command == “A” ): car。spinLeft() time。sleep(5) car。stop() continue elif (command == “z” or command == “Z” ): car。moveBackground () time。sleep (5) car。stop() continue elif (command == “d” or command == “D” ): car。spinRight() time。sleep(5) car。stop() continue elif (command == “s” or command == “S” ): car。stop() time。sleep(5) continue elif “q” == command or “Q” == command: car。stop() car。cleanup() break else: print(“Enter Error”) continue except (KeyboardInterrupt, SystemExit): car。stop() GPIO。clearup()

儲存。命令執行指令碼controlcar。py

sudo pyhton3 controllcar。py

執行結果如下所示的命令視窗:

使用樹莓派製作智慧小車

對電機驅動器L298N操作不清楚的,可到這裡檢視具體使用

四路紅外避障

使用樹莓派製作智慧小車

圖片發自簡書App