python3實(shí)現(xiàn)raspberry pi(樹(shù)莓派)4驅(qū)小車(chē)控制程序
0. 寫(xiě)在前面:
一兩個(gè)月前偶然得到一個(gè)樹(shù)莓派一代,發(fā)現(xiàn)還是挺強(qiáng)大的,然后就考慮著自己實(shí)現(xiàn)一個(gè)四驅(qū)小車(chē)。因?yàn)楸旧硎菍W(xué)軟件的,所以利用軟件來(lái)控制實(shí)實(shí)在在可見(jiàn)的硬件一直是自己的一個(gè)夢(mèng)想。所以當(dāng)時(shí)也是花了很多時(shí)間來(lái)琢磨、實(shí)驗(yàn)小車(chē)控制方面的東西。因?yàn)闀r(shí)間過(guò)去比較久了,這里也就只是記錄一下當(dāng)時(shí)踩過(guò)的坑、實(shí)現(xiàn)的一些思路以及絕大部分源代碼。截止當(dāng)前,我的樹(shù)莓派小車(chē)實(shí)現(xiàn)的主要功能是:
- 控制小車(chē)前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)、后退左轉(zhuǎn)、后退右轉(zhuǎn)
- 攝像頭兩路舵機(jī)控制(實(shí)現(xiàn)攝像頭上下左右旋轉(zhuǎn))
- 網(wǎng)頁(yè)版小車(chē)控制程序(小車(chē)控制程序、實(shí)時(shí)監(jiān)控、攝像頭旋轉(zhuǎn)控制)
- 微信小程序版小車(chē)控制程序(功能基本同上)
(本文只是介紹上述的第一個(gè)功能,其他功能的實(shí)現(xiàn)在后續(xù)的博文中介紹)
1. 準(zhǔn)備:
- 給樹(shù)莓派安裝系統(tǒng)(這個(gè)網(wǎng)上資料太多,一搜一大把,我裝的是raspbian)
- 安裝python3
- 準(zhǔn)備四個(gè)步進(jìn)電機(jī),電機(jī)驅(qū)動(dòng),并組裝連接好(我都是在某寶上買(mǎi)的,電機(jī)及其組件是在“亞博智能科技”買(mǎi)的,驅(qū)動(dòng)是在“深圳市艾爾賽科技”上買(mǎi)的L298N四路電機(jī)驅(qū)動(dòng))
一些可能遇到的坑:
- 首先要注意電機(jī)驅(qū)動(dòng)的輸入電壓,電壓過(guò)低很可能無(wú)法帶動(dòng)電機(jī)(當(dāng)然也不可過(guò)高)
- 電機(jī)驅(qū)動(dòng)輸入有一個(gè)GND,這個(gè)一定要連接樹(shù)莓派的一個(gè)GND輸出,否則可能出現(xiàn)電機(jī)驅(qū)動(dòng)異常(我當(dāng)時(shí)遇到的情況是:手接觸驅(qū)動(dòng)電路中的金屬電機(jī)就可以正常轉(zhuǎn)動(dòng),手一松開(kāi)電機(jī)就不能正常運(yùn)轉(zhuǎn)了)
2. 基本思路:
- 將連接端口作為一個(gè)配置文件,該配置文件定義小車(chē)需要使用的端口
- 控制程序讀取配置文件,并實(shí)現(xiàn)小車(chē)的方向控制
- 小車(chē)控制程序定義了私有的向各個(gè)方向移動(dòng)的方法,然后定義一個(gè)方法接受方向參數(shù),該方法內(nèi)部再調(diào)用具體的移動(dòng)方法
需要說(shuō)明的是:由于使用引腳的不同,以及電機(jī)安裝位置的差異,所以不能保證以下程序能夠直接使用。
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. 小車(chē)控制程序(文件名為: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)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 為什么說(shuō)python更適合樹(shù)莓派編程
- 樹(shù)莓派升級(jí)python的具體步驟
- python3實(shí)現(xiàn)網(wǎng)頁(yè)版raspberry pi(樹(shù)莓派)小車(chē)控制
- Python樹(shù)莓派學(xué)習(xí)筆記之UDP傳輸視頻幀操作詳解
- 樹(shù)莓派4B+opencv4+python 打開(kāi)攝像頭的實(shí)現(xiàn)方法
- 樹(shù)莓派使用python-librtmp實(shí)現(xiàn)rtmp推流h264的方法
- 樹(shù)莓派與PC端在局域網(wǎng)內(nèi)運(yùn)用python實(shí)現(xiàn)即時(shí)通訊
- 樹(shù)莓派采用socket方式文件傳輸(python)
- 樹(shù)莓派用python中的OpenCV輸出USB攝像頭畫(huà)面
- python樹(shù)莓派紅外反射傳感器
- Python+樹(shù)莓派+YOLO打造一款人工智能照相機(jī)
- 在樹(shù)莓派2或樹(shù)莓派B+上安裝Python和OpenCV的教程
- Python實(shí)現(xiàn)樹(shù)莓派攝像頭持續(xù)錄像并傳送到主機(jī)的步驟
相關(guān)文章
Python深度學(xué)習(xí)實(shí)戰(zhàn)PyQt5信號(hào)與槽的連接
本文講解信號(hào)與槽的連接機(jī)制,詳細(xì)示范各種類(lèi)型的信號(hào)/槽連接的實(shí)現(xiàn)方法,這是圖形用戶(hù)界面的核心內(nèi)容。還將介紹面向?qū)ο蟮某绦蛟O(shè)計(jì),這是圖形用戶(hù)界面的基本思想2021-10-10PyCharm 2020.2.2 x64 下載并安裝的詳細(xì)教程
這篇文章主要介紹了PyCharm 2020.2.2 x64 下載并安裝的詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10在Python中獲取兩數(shù)相除的商和余數(shù)方法
今天小編就為大家分享一篇在Python中獲取兩數(shù)相除的商和余數(shù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11selenium中g(shù)et_cookies()和add_cookie()的用法詳解
這篇文章主要介紹了selenium中g(shù)et_cookies()和add_cookie()的用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01關(guān)于Series的index的方法和屬性使用說(shuō)明
這篇文章主要介紹了關(guān)于Series的index的方法和屬性使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06Python專(zhuān)用方法與迭代機(jī)制實(shí)例分析
這篇文章主要介紹了Python專(zhuān)用方法與迭代機(jī)制,包括類(lèi)的私有方法、專(zhuān)有方法、模塊私有對(duì)象、迭代__iter__()方法的對(duì)象等,需要的朋友可以參考下2014-09-09