在家里制作一個基於樹莓派的智能小車


一、整體思路 

       組裝一台智能小車可以說是男人的浪漫,對一台操控自如、金屬底盤、指示燈交錯的酷炫智能車,許多理工男都會像第一次去歡樂谷仰望太陽飛車時候的感受。那么如何組裝一台這樣機械朋克感十足地小車呢?且聽我先闡述一下總體思路:

一台這樣的小車首先需要幾個重要系統組成,分別是底盤系統-包含車輪、底盤支架和固定螺絲,動力系統-包含電池組、控制板、發動機和串聯線路,指令系統)、樹莓派、指令控制程序、杜邦信號傳導線,和傳感系統-紅外避障模塊、避障程序、攝像頭傳感器(識別圖像)、攝像頭雲台、舵機;這些系統構成了小車的支撐、行動、輸入和輸出能力;當然我們也可以根據自己需要,增加一些擴展套件,這里使用樹莓派的主要原因就是便於擴展;

二、所需材料

      小車底盤金屬架一套,形狀自選;

  阻尼電機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電機驅動板說明 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM