一、整體思路
組裝一台智能小車可以說是男人的浪漫,對一台操控自如、金屬底盤、指示燈交錯的酷炫智能車,許多理工男都會像第一次去歡樂谷仰望太陽飛車時候的感受。那么如何組裝一台這樣機械朋克感十足地小車呢?且聽我先闡述一下總體思路:
一台這樣的小車首先需要幾個重要系統組成,分別是底盤系統-包含車輪、底盤支架和固定螺絲,動力系統-包含電池組、控制板、發動機和串聯線路,指令系統)、樹莓派、指令控制程序、杜邦信號傳導線,和傳感系統-紅外避障模塊、避障程序、攝像頭傳感器(識別圖像)、攝像頭雲台、舵機;這些系統構成了小車的支撐、行動、輸入和輸出能力;當然我們也可以根據自己需要,增加一些擴展套件,這里使用樹莓派的主要原因就是便於擴展;
二、所需材料
小車底盤金屬架一套,形狀自選;
阻尼電機4個,輪子4個(看架子支持,有2個的,也有8個的,需要幾個買幾個);
樹莓派 4B 版本 一個;
L298N 2路控制板2個(如果想要支持4驅,可以買8路控制器版本,價格20多大洋吧)
子母杜邦線和連接線 N個(看接線復雜度);
其他功能組件(例如紅外線避障檢測器,溫感檢測,雷達檢測等等)
18650鋰電池組一套(這個不是必須,我買這個是為了給L298N單獨供能已提高小車續航)
三、制作過程
動力架構圖如下:
L298N原理圖:
底盤實物(改良后)
這里需要注意一下
馬達接線時候注意是有方向的,注意正極接入的方向要統一,不然會出現四個輪子分別轉向不動方向的情況;
L298N的輸出,最好是 1,2路輸出用於一側的正向和逆向行駛(也就是1負責右側正向,2就負責右側反向)。3,4路輸出用於另一側。這樣在后面寫驅動時候會方便控制一些。
驅動編寫,這里我選擇的是python實現,主要是寫起來簡單高效;
還是先上一個設計架構:
指令通訊系統
Python驅動代碼程序地址:https://github.com/yzzhanga/car
1 #!/usr/bin/python3 2 # -*- coding: UTF-8 -*- 3 from time import sleep 4 import RPi.GPIO as GPIO 5 6 # POINT = [5,6,16,26] 7 # GPIO接口結合 8 LEFT_FRONT_PORT = [26,17] #左前輪 正負輸出,這兩個輸出互斥,不能同時為正,但可以同時為負,不管同時為正或負,都視為剎車; 9 LEFT_BACK_PORT = [27,22] #左后輪 10 RIGHT_FRONT_PORT = [18,23] #右前輪 11 RIGHT_BACK_PORT = [24,25] #右后輪 12 13 #忽略重復setmode導致的報警,一般是在關閉程序時候沒有調用destory方法導致 14 GPIO.setwarnings(False) 15 16 class L298nOrder: 17 18 def setup(): 19 print("指令集初始化成功") 20 GPIO.setmode(GPIO.BCM) 21 GPIO.setup(LEFT_FRONT_PORT,GPIO.OUT) 22 GPIO.setup(LEFT_BACK_PORT,GPIO.OUT) 23 GPIO.setup(RIGHT_FRONT_PORT,GPIO.OUT) 24 GPIO.setup(RIGHT_BACK_PORT,GPIO.OUT) 25 26 #關閉GPIO的輸出設置(這里有個前提是GPIO全部服務本集合,右可能會誤關閉其他GPIO組合程序) 27 def destory(): 28 print("指令驅動銷毀") 29 GPIO.cleanup() 30 31 #轉向程序 左中心線的順時針和逆時針旋轉 32 def turnLeftRound(leftBool): 33 if (leftBool): 34 GPIO.output(LEFT_FRONT_PORT[0],True) 35 GPIO.output(LEFT_FRONT_PORT[1],False) 36 GPIO.output(RIGHT_BACK_PORT[0],False) 37 GPIO.output(RIGHT_BACK_PORT[1],True) 38 print ("執行指令:左轉向") 39 else: 40 GPIO.output(LEFT_FRONT_PORT[0],False) 41 GPIO.output(LEFT_FRONT_PORT[1],True) 42 GPIO.output(RIGHT_BACK_PORT[0],True) 43 GPIO.output(RIGHT_BACK_PORT[1],False) 44 print ("執行指令:左轉倒車") 45 #轉向程序 右中心線的順時針和逆時針旋轉 46 def turnRightRound(rightBool): 47 if (rightBool): 48 GPIO.output(RIGHT_FRONT_PORT[0],True) 49 GPIO.output(RIGHT_FRONT_PORT[1],False) 50 GPIO.output(LEFT_BACK_PORT[0],False) 51 GPIO.output(LEFT_BACK_PORT[1],True) 52 print ("執行指令:右轉向") 53 else: 54 GPIO.output(RIGHT_FRONT_PORT[0],False) 55 GPIO.output(RIGHT_FRONT_PORT[1],True) 56 GPIO.output(LEFT_BACK_PORT[0],True) 57 GPIO.output(LEFT_BACK_PORT[1],False) 58 print ("執行指令:右轉倒車") 59 #前進擋 60 def allMove(): 61 GPIO.output(LEFT_FRONT_PORT[0],True) 62 GPIO.output(LEFT_FRONT_PORT[1],False) 63 GPIO.output(LEFT_BACK_PORT[0],True) 64 GPIO.output(LEFT_BACK_PORT[1],False) 65 GPIO.output(RIGHT_FRONT_PORT[0],True) 66 GPIO.output(RIGHT_FRONT_PORT[1],False) 67 GPIO.output(RIGHT_BACK_PORT[0],True) 68 GPIO.output(RIGHT_BACK_PORT[1],False) 69 print ("執行指令:前進") 70 #倒車擋 71 def allBack(): 72 GPIO.output(LEFT_FRONT_PORT[0],False) 73 GPIO.output(LEFT_FRONT_PORT[1],True) 74 GPIO.output(LEFT_BACK_PORT[0],False) 75 GPIO.output(LEFT_BACK_PORT[1],True) 76 GPIO.output(RIGHT_FRONT_PORT[0],False) 77 GPIO.output(RIGHT_FRONT_PORT[1],True) 78 GPIO.output(RIGHT_BACK_PORT[0],False) 79 GPIO.output(RIGHT_BACK_PORT[1],True) 80 print ("執行指令:后退") 81 #剎車 82 def stop(): 83 GPIO.output(LEFT_FRONT_PORT[0],False) 84 GPIO.output(LEFT_FRONT_PORT[1],False) 85 GPIO.output(LEFT_BACK_PORT[0],False) 86 GPIO.output(LEFT_BACK_PORT[1],False) 87 GPIO.output(RIGHT_FRONT_PORT[0],False) 88 GPIO.output(RIGHT_FRONT_PORT[1],False) 89 GPIO.output(RIGHT_BACK_PORT[0],False) 90 GPIO.output(RIGHT_BACK_PORT[1],False) 91 print ("執行指令:停止")
注意事項:
樹莓派我安裝的是ubuntu 21.0版本,默認是python3, 沒有pip也沒有rpi包,需要手動安裝一下;
1 sudo apt-get install -y python-pip 2 sudo pip install rpi-python
或
1 sudo apt-get instail -y python-pip 2 sudo apt--get install -y rpi-python
四、參考資料
- https://www.jianshu.com/p/f31b90cc756f 樹莓派GPIO引腳和python gpio編程api介紹
- https://zhuanlan.zhihu.com/p/106592873 GPIO說明
- https://zhuanlan.zhihu.com/p/346930154 L298N電機驅動板說明