python3實現(xiàn)raspberry pi(樹莓派)4驅(qū)小車控制程序
0. 寫在前面:
一兩個月前偶然得到一個樹莓派一代,發(fā)現(xiàn)還是挺強大的,然后就考慮著自己實現(xiàn)一個四驅(qū)小車。因為本身是學(xué)軟件的,所以利用軟件來控制實實在在可見的硬件一直是自己的一個夢想。所以當(dāng)時也是花了很多時間來琢磨、實驗小車控制方面的東西。因為時間過去比較久了,這里也就只是記錄一下當(dāng)時踩過的坑、實現(xiàn)的一些思路以及絕大部分源代碼。截止當(dāng)前,我的樹莓派小車實現(xiàn)的主要功能是:
- 控制小車前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)、后退左轉(zhuǎn)、后退右轉(zhuǎn)
- 攝像頭兩路舵機控制(實現(xiàn)攝像頭上下左右旋轉(zhuǎn))
- 網(wǎng)頁版小車控制程序(小車控制程序、實時監(jiān)控、攝像頭旋轉(zhuǎn)控制)
- 微信小程序版小車控制程序(功能基本同上)
(本文只是介紹上述的第一個功能,其他功能的實現(xiàn)在后續(xù)的博文中介紹)
1. 準(zhǔn)備:
- 給樹莓派安裝系統(tǒng)(這個網(wǎng)上資料太多,一搜一大把,我裝的是raspbian)
- 安裝python3
- 準(zhǔn)備四個步進(jìn)電機,電機驅(qū)動,并組裝連接好(我都是在某寶上買的,電機及其組件是在“亞博智能科技”買的,驅(qū)動是在“深圳市艾爾賽科技”上買的L298N四路電機驅(qū)動)
一些可能遇到的坑:
- 首先要注意電機驅(qū)動的輸入電壓,電壓過低很可能無法帶動電機(當(dāng)然也不可過高)
- 電機驅(qū)動輸入有一個GND,這個一定要連接樹莓派的一個GND輸出,否則可能出現(xiàn)電機驅(qū)動異常(我當(dāng)時遇到的情況是:手接觸驅(qū)動電路中的金屬電機就可以正常轉(zhuǎn)動,手一松開電機就不能正常運轉(zhuǎn)了)
2. 基本思路:
- 將連接端口作為一個配置文件,該配置文件定義小車需要使用的端口
- 控制程序讀取配置文件,并實現(xiàn)小車的方向控制
- 小車控制程序定義了私有的向各個方向移動的方法,然后定義一個方法接受方向參數(shù),該方法內(nèi)部再調(diào)用具體的移動方法
需要說明的是:由于使用引腳的不同,以及電機安裝位置的差異,所以不能保證以下程序能夠直接使用。
3. 配置文件內(nèi)容如下(文件名為:config.ini):
[car] # This is the parmaters that will control the car's wheels # The number is the interface number of GPIO (GPIO.BOARD) LEFT_FRONT_1 = 7 LEFT_FRONT_2 = 11 RIGHT_FRONT_1 = 13 RIGHT_FRONT_2 = 15 LEFT_BEHIND_1 = 31 LEFT_BEHIND_2 = 33 RIGHT_BEHIND_1 = 35 RIGHT_BEHIND_2 = 37
4. 小車控制程序(文件名為:car_controler.py):
# coding=utf-8
import RPi.GPIO as GPIO
import time
import configparser
class FourWheelDriveCar():
# Define the number of all the GPIO that will used for the 4wd car
def __init__(self):
'''
1. Read pin number from configure file
2. Init all GPIO configureation
'''
config = configparser.ConfigParser()
config.read("config.ini")
self.LEFT_FRONT_1 = config.getint("car", "LEFT_FRONT_1")
self.LEFT_FRONT_2 = config.getint("car", "LEFT_FRONT_2")
self.RIGHT_FRONT_1 = config.getint("car", "RIGHT_FRONT_1")
self.RIGHT_FRONT_2 = config.getint("car", "RIGHT_FRONT_2")
self.LEFT_BEHIND_1 = config.getint("car", "LEFT_BEHIND_1")
self.LEFT_BEHIND_2 = config.getint("car", "LEFT_BEHIND_2")
self.RIGHT_BEHIND_1 = config.getint("car", "RIGHT_BEHIND_1")
self.RIGHT_BEHIND_2 = config.getint("car", "RIGHT_BEHIND_2")
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(self.LEFT_FRONT_1, GPIO.OUT)
GPIO.setup(self.LEFT_FRONT_2, GPIO.OUT)
GPIO.setup(self.RIGHT_FRONT_1, GPIO.OUT)
GPIO.setup(self.RIGHT_FRONT_2, GPIO.OUT)
GPIO.setup(self.LEFT_BEHIND_1, GPIO.OUT)
GPIO.setup(self.LEFT_BEHIND_2, GPIO.OUT)
GPIO.setup(self.RIGHT_BEHIND_1, GPIO.OUT)
GPIO.setup(self.RIGHT_BEHIND_2, GPIO.OUT)
def reset(self):
# Rest all the GPIO as LOW
GPIO.output(self.LEFT_FRONT_1, GPIO.LOW)
GPIO.output(self.LEFT_FRONT_2, GPIO.LOW)
GPIO.output(self.RIGHT_FRONT_1, GPIO.LOW)
GPIO.output(self.RIGHT_FRONT_2, GPIO.LOW)
GPIO.output(self.LEFT_BEHIND_1, GPIO.LOW)
GPIO.output(self.LEFT_BEHIND_2, GPIO.LOW)
GPIO.output(self.RIGHT_BEHIND_1, GPIO.LOW)
GPIO.output(self.RIGHT_BEHIND_2, GPIO.LOW)
def __forword(self):
self.reset()
GPIO.output(self.LEFT_FRONT_1, GPIO.HIGH)
GPIO.output(self.LEFT_FRONT_2, GPIO.LOW)
GPIO.output(self.RIGHT_FRONT_1, GPIO.HIGH)
GPIO.output(self.RIGHT_FRONT_2, GPIO.LOW)
GPIO.output(self.LEFT_BEHIND_1, GPIO.HIGH)
GPIO.output(self.LEFT_BEHIND_2, GPIO.LOW)
GPIO.output(self.RIGHT_BEHIND_1, GPIO.HIGH)
GPIO.output(self.RIGHT_BEHIND_2, GPIO.LOW)
def __backword(self):
self.reset()
GPIO.output(self.LEFT_FRONT_2, GPIO.HIGH)
GPIO.output(self.LEFT_FRONT_1, GPIO.LOW)
GPIO.output(self.RIGHT_FRONT_2, GPIO.HIGH)
GPIO.output(self.RIGHT_FRONT_1, GPIO.LOW)
GPIO.output(self.LEFT_BEHIND_2, GPIO.HIGH)
GPIO.output(self.LEFT_BEHIND_1, GPIO.LOW)
GPIO.output(self.RIGHT_BEHIND_2, GPIO.HIGH)
GPIO.output(self.RIGHT_BEHIND_1, GPIO.LOW)
def __turnLeft(self):
'''
To turn left, the LEFT_FRONT wheel will move backword
All other wheels move forword
'''
self.reset()
GPIO.output(self.LEFT_FRONT_2, GPIO.HIGH)
GPIO.output(self.LEFT_FRONT_1, GPIO.LOW)
GPIO.output(self.RIGHT_FRONT_1, GPIO.HIGH)
GPIO.output(self.RIGHT_FRONT_2, GPIO.LOW)
GPIO.output(self.LEFT_BEHIND_1, GPIO.HIGH)
GPIO.output(self.LEFT_BEHIND_2, GPIO.LOW)
GPIO.output(self.RIGHT_BEHIND_1, GPIO.HIGH)
GPIO.output(self.RIGHT_BEHIND_2, GPIO.LOW)
def __turnRight(self):
'''
To turn right, the RIGHT_FRONT wheel move backword
All other wheels move forword
'''
self.reset()
GPIO.output(self.LEFT_FRONT_1, GPIO.HIGH)
GPIO.output(self.LEFT_FRONT_2, GPIO.LOW)
GPIO.output(self.RIGHT_FRONT_2, GPIO.HIGH)
GPIO.output(self.RIGHT_FRONT_1, GPIO.LOW)
GPIO.output(self.LEFT_BEHIND_1, GPIO.HIGH)
GPIO.output(self.LEFT_BEHIND_2, GPIO.LOW)
GPIO.output(self.RIGHT_BEHIND_1, GPIO.HIGH)
GPIO.output(self.RIGHT_BEHIND_2, GPIO.LOW)
def __backLeft(self):
'''
To go backword and turn left, the LEFT_BEHIND wheel move forword
All other wheels move backword
'''
self.reset()
GPIO.output(self.LEFT_FRONT_2, GPIO.HIGH)
GPIO.output(self.LEFT_FRONT_1, GPIO.LOW)
GPIO.output(self.RIGHT_FRONT_2, GPIO.HIGH)
GPIO.output(self.RIGHT_FRONT_1, GPIO.LOW)
GPIO.output(self.LEFT_BEHIND_1, GPIO.HIGH)
GPIO.output(self.LEFT_BEHIND_2, GPIO.LOW)
GPIO.output(self.RIGHT_BEHIND_2, GPIO.HIGH)
GPIO.output(self.RIGHT_BEHIND_1, GPIO.LOW)
def __backRight(self):
'''
To go backword and turn right, the RIGHT_BEHIND wheel move forword
All other wheels move backword
'''
self.reset()
GPIO.output(self.LEFT_FRONT_2, GPIO.HIGH)
GPIO.output(self.LEFT_FRONT_1, GPIO.LOW)
GPIO.output(self.RIGHT_FRONT_2, GPIO.HIGH)
GPIO.output(self.RIGHT_FRONT_1, GPIO.LOW)
GPIO.output(self.LEFT_BEHIND_2, GPIO.HIGH)
GPIO.output(self.LEFT_BEHIND_1, GPIO.LOW)
GPIO.output(self.RIGHT_BEHIND_1, GPIO.HIGH)
GPIO.output(self.RIGHT_BEHIND_2, GPIO.LOW)
def __stop(self):
self.reset()
def carMove(self, direction):
'''
Car move according to the input paramter - direction
'''
if direction == 'F':
self.__forword()
elif direction == 'B':
self.__backword()
elif direction == 'L':
self.__turnLeft()
elif direction == 'R':
self.__turnRight()
elif direction == 'BL':
self.__backLeft()
elif direction == 'BR':
self.__backRight()
elif direction == 'S':
self.__stop()
else:
print("The input direction is wrong! You can just input: F, B, L, R, BL,BR or S")
if __name__ == "__main__":
raspCar = FourWheelDriveCar()
while(True):
direction = input("Please input direction: ")
raspCar.carMove(direction)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 為什么說python更適合樹莓派編程
- 樹莓派升級python的具體步驟
- python3實現(xiàn)網(wǎng)頁版raspberry pi(樹莓派)小車控制
- Python樹莓派學(xué)習(xí)筆記之UDP傳輸視頻幀操作詳解
- 樹莓派4B+opencv4+python 打開攝像頭的實現(xiàn)方法
- 樹莓派使用python-librtmp實現(xiàn)rtmp推流h264的方法
- 樹莓派與PC端在局域網(wǎng)內(nèi)運用python實現(xiàn)即時通訊
- 樹莓派采用socket方式文件傳輸(python)
- 樹莓派用python中的OpenCV輸出USB攝像頭畫面
- python樹莓派紅外反射傳感器
- Python+樹莓派+YOLO打造一款人工智能照相機
- 在樹莓派2或樹莓派B+上安裝Python和OpenCV的教程
- Python實現(xiàn)樹莓派攝像頭持續(xù)錄像并傳送到主機的步驟
相關(guān)文章
Python深度學(xué)習(xí)實戰(zhàn)PyQt5信號與槽的連接
本文講解信號與槽的連接機制,詳細(xì)示范各種類型的信號/槽連接的實現(xiàn)方法,這是圖形用戶界面的核心內(nèi)容。還將介紹面向?qū)ο蟮某绦蛟O(shè)計,這是圖形用戶界面的基本思想2021-10-10
PyCharm 2020.2.2 x64 下載并安裝的詳細(xì)教程
這篇文章主要介紹了PyCharm 2020.2.2 x64 下載并安裝的詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
在Python中獲取兩數(shù)相除的商和余數(shù)方法
今天小編就為大家分享一篇在Python中獲取兩數(shù)相除的商和余數(shù)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11
selenium中g(shù)et_cookies()和add_cookie()的用法詳解
這篇文章主要介紹了selenium中g(shù)et_cookies()和add_cookie()的用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
關(guān)于Series的index的方法和屬性使用說明
這篇文章主要介紹了關(guān)于Series的index的方法和屬性使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06

