最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python3實(shí)現(xiàn)raspberry pi(樹莓派)4驅(qū)小車控制程序

 更新時間:2020年02月12日 10:09:01   作者:weixin_42534940  
這篇文章主要為大家詳細(xì)介紹了python3實(shí)現(xiàn)raspberry pi(樹莓派)4驅(qū)小車控制程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

 0. 寫在前面:

一兩個月前偶然得到一個樹莓派一代,發(fā)現(xiàn)還是挺強(qiáng)大的,然后就考慮著自己實(shí)現(xiàn)一個四驅(qū)小車。因為本身是學(xué)軟件的,所以利用軟件來控制實(shí)實(shí)在在可見的硬件一直是自己的一個夢想。所以當(dāng)時也是花了很多時間來琢磨、實(shí)驗小車控制方面的東西。因為時間過去比較久了,這里也就只是記錄一下當(dāng)時踩過的坑、實(shí)現(xiàn)的一些思路以及絕大部分源代碼。截止當(dāng)前,我的樹莓派小車實(shí)現(xiàn)的主要功能是:

  • 控制小車前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)、后退左轉(zhuǎn)、后退右轉(zhuǎn)
  • 攝像頭兩路舵機(jī)控制(實(shí)現(xiàn)攝像頭上下左右旋轉(zhuǎn))
  • 網(wǎng)頁版小車控制程序(小車控制程序、實(shí)時監(jiān)控、攝像頭旋轉(zhuǎn)控制)
  • 微信小程序版小車控制程序(功能基本同上)

(本文只是介紹上述的第一個功能,其他功能的實(shí)現(xiàn)在后續(xù)的博文中介紹)

1. 準(zhǔn)備:

  • 給樹莓派安裝系統(tǒng)(這個網(wǎng)上資料太多,一搜一大把,我裝的是raspbian)
  • 安裝python3
  • 準(zhǔn)備四個步進(jìn)電機(jī),電機(jī)驅(qū)動,并組裝連接好(我都是在某寶上買的,電機(jī)及其組件是在“亞博智能科技”買的,驅(qū)動是在“深圳市艾爾賽科技”上買的L298N四路電機(jī)驅(qū)動)

一些可能遇到的坑:

  • 首先要注意電機(jī)驅(qū)動的輸入電壓,電壓過低很可能無法帶動電機(jī)(當(dāng)然也不可過高)
  • 電機(jī)驅(qū)動輸入有一個GND,這個一定要連接樹莓派的一個GND輸出,否則可能出現(xiàn)電機(jī)驅(qū)動異常(我當(dāng)時遇到的情況是:手接觸驅(qū)動電路中的金屬電機(jī)就可以正常轉(zhuǎn)動,手一松開電機(jī)就不能正常運(yùn)轉(zhuǎn)了)

2. 基本思路:

  • 將連接端口作為一個配置文件,該配置文件定義小車需要使用的端口
  • 控制程序讀取配置文件,并實(shí)現(xiàn)小車的方向控制
  • 小車控制程序定義了私有的向各個方向移動的方法,然后定義一個方法接受方向參數(shù),該方法內(nèi)部再調(diào)用具體的移動方法

需要說明的是:由于使用引腳的不同,以及電機(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. 小車控制程序(文件名為: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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一文帶你掌握Python中textwrap庫文本包裝的藝術(shù)

    一文帶你掌握Python中textwrap庫文本包裝的藝術(shù)

    在Python編程中,處理文本是一項基礎(chǔ)且常見的任務(wù),textwrap模塊正是為此而生,它提供了一系列簡單而強(qiáng)大的工具,幫助我們優(yōu)雅地完成文本包裝和格式化工作,下面就跟隨小編來看看它的具體使用吧
    2024-12-12
  • Python中l(wèi)ist列表的賦值方法及遇到問題處理

    Python中l(wèi)ist列表的賦值方法及遇到問題處理

    這篇文章主要介紹了Python中l(wèi)ist列表的賦值方法及遇到問題處理,記錄在列表list的賦值過程中遇到的問題,并對列表的拷貝相關(guān)知識進(jìn)行匯總,需要的朋友可以參考一下
    2022-03-03
  • Python基礎(chǔ)之文件操作及光標(biāo)移動詳解

    Python基礎(chǔ)之文件操作及光標(biāo)移動詳解

    這篇文章主要為大家介紹了Python基礎(chǔ)之文件操作及光標(biāo)移動詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 用python批量下載apk

    用python批量下載apk

    這篇文章主要介紹了用python批量下載apk的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • 利用Python實(shí)時獲取steam特惠游戲數(shù)據(jù)

    利用Python實(shí)時獲取steam特惠游戲數(shù)據(jù)

    Steam是由美國電子游戲商Valve于2003年9月12日推出的數(shù)字發(fā)行平臺,被認(rèn)為是計算機(jī)游戲界最大的數(shù)碼發(fā)行平臺之一。本文將利用Python實(shí)時獲取steam特惠游戲數(shù)據(jù),感興趣的可以嘗試一下
    2022-06-06
  • python導(dǎo)出requirements.txt的幾種方法以及環(huán)境配置詳細(xì)流程

    python導(dǎo)出requirements.txt的幾種方法以及環(huán)境配置詳細(xì)流程

    這篇文章主要給大家介紹了關(guān)于python導(dǎo)出requirements.txt的幾種方法以及環(huán)境配置詳細(xì)流程,requirements.txt 文件是一個文本文件,用于列出你的Python項目所依賴的軟件包及其版本,需要的朋友可以參考下
    2023-11-11
  • 利用在Python中數(shù)值模擬研究氣體擴(kuò)散

    利用在Python中數(shù)值模擬研究氣體擴(kuò)散

    在 Python 中,可以使用數(shù)值模擬來研究氣體擴(kuò)散。本文就來通過一些示例為大家講講具體的實(shí)現(xiàn)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下
    2023-01-01
  • Python遞歸生成全排列序列實(shí)操

    Python遞歸生成全排列序列實(shí)操

    這篇文章主要介紹了Python遞歸生成全排列序列實(shí)操,文章給予Python遞歸的相關(guān)資料展開對全排列序列的實(shí)現(xiàn)介紹,需要的小伙伴可以參考一下
    2022-04-04
  • Python splitlines使用技巧

    Python splitlines使用技巧

    Python中的splitlines用來分割行。當(dāng)傳入的參數(shù)為True時,表示保留換行符 \n。通過下面的例子就很明白了
    2008-09-09
  • 基于Python函數(shù)和變量名解析

    基于Python函數(shù)和變量名解析

    今天小編就為大家分享一篇基于Python函數(shù)和變量名解析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07

最新評論

德清县| 威信县| 井研县| 咸丰县| 中西区| 任丘市| 新巴尔虎左旗| 马边| 白山市| 平陆县| 萍乡市| 准格尔旗| 赣州市| 大冶市| 双牌县| 瑞安市| 准格尔旗| 丹棱县| 平顺县| 左贡县| 孝昌县| 阿克陶县| 合山市| 藁城市| 诸城市| 剑阁县| 三都| 星座| 荣成市| 海兴县| 波密县| 镇安县| 正蓝旗| 翁源县| 涪陵区| 尉氏县| 怀化市| 赣榆县| 新绛县| 万全县| 雷州市|