樹莓派驅動的無人駕駛開發記錄--驅動電機

weixin_33711647發表於2018-06-11

樹莓派雖然是一款微型計算機,同時作為一塊開發板,其身上的I/O口就是證明,那麼就可以對其介面進行定義來實現我們想要的功能。首先來認識一下樹莓派引腳:如下圖放置樹莓派,下面的一排的引腳號是1、3、5、7等奇數號引腳,上面的是偶數號引腳。


2583457-298e155acf727728.jpg

在使用python對樹莓派進行程式設計的時候,其引腳宣告方式有三種

1,基於引腳的物理位置進行編號;

2,C語言GPIO庫wiringPi約定的編號方式;

3,Python語言GPIO庫RPi.GPIO約定的編號方式。

或者可以這樣理解:

控制GPIO口有很多方式,比如

》》shell直接控制

》》raspberry-gpio-python庫(Python語言)

》》wiringPi庫(C語言)

》》BCM2835 C Library(C語言)

而要用python語言來控制樹莓派,得首先安裝python支援環境

sudo apt-get install python-dev

然後安裝RPi.GPIO庫,以引入RPi.GPIO模組

sudo pip3 install RPi.GPIO

注意這裡的pip3,是由於python有2.0版本和3.0版本區別,所以其中pip安裝方式的命令也有所不同,這裡我們選擇python3.0版本的開發程式設計環境。

在 RPi.GPIO 中,同時支援樹莓派上的兩種 GPIO 引腳編號。

第一種編號是BOARD編號,這和樹莓派電路板上的物理引腳編號相對應。使用這種編號的好處是,你的硬體將是一直可以使用的,不用擔心樹莓派的版本問題。因此,在電路板升級後,你不需要重寫聯結器或程式碼。第二種編號是BCM規則,是更底層的工作方式,它和Broadcom的片上系統中通道編號相對應。在使用一個引腳時,你需要查詢通道號和物理引腳編號之間的對應規則。對於不同的樹莓派版本,編寫的指令碼檔案也可能是無法通用的。

你可以使用下列程式碼(強制的)指定一種編號規則:

GPIO.setmode(GPIO.BOARD) 

# or

#GPIO.setmode(GPIO.BCM)

首先用樹莓派作為硬體開發板,來體驗一下類似Arduino的功能效果--點亮一個LED燈。這裡我們使用python語言。

import RPi.GPIO as GPIO

import time

GPIO.setmode(GPIO.BOARD)

led = 7

GPIO.setup(led,GPIO.OUT)

while True:

    GPIO.output(led,True)

    time.sleep(1)

    GPIO.output(led,False)

    time.sleep(1)

通過LED瞭解了python控制驅動硬體的基本方式。那麼控制驅動電機也是類比著arduino來像這個樣子進行程式設計的。在開始之前再複習一下電機驅動模組的一些知識。

2583457-e144700cee1581f7.png
L298N電機驅動模組

使用該模組,可以設計一個雙輪差速驅動的車型。

該電機模組與樹莓派的連線是通過4個IO口連線控制的,可以任意選著樹莓派的GPIO引腳進行連線。

2583457-197d09350be52bb6.png

兩路使能引腳如果保持跳帽一直短接在5v電壓上保持高電平,那麼只需要控制樹莓派GPIO口輸出高低電平就能夠控制電機正反轉。想要再控制電機轉速的話,就是把兩個使能端也連線到主控的GPIO引腳。即如上表,對於IN1和IN2的高低電壓(在程式設計程式碼中用1和0表示)用於控制電機A;IN2和IN3用於控制電機B;而ENA和ENB稱為調速端,由PWM訊號空佔比來設定電機轉動速度。例如我們可以對ENA每隔1ms(1毫秒等於1000微秒)傳送一個訊號,而在這個訊號中高電壓持續時間與低電壓持續時間的比例就是電機A當前速度與全速比:


2583457-fa63606aa1ed7d36.png

這裡我們選著樹莓派11,12,13,15號引腳,並且先不考慮調速。那麼程式如下:

#引入gpio的模組

import RPi.GPIO as GPIO

import time

#設定GPIO模式

GPIO.setmode(GPIO.BOARD)

#設定in1到in4介面

IN1 = 11

IN2 = 12

IN3 = 13

IN4 = 15

#初始化介面

GPIO.setup(IN1,GPIO.OUT)

GPIO.setup(IN2,GPIO.OUT)

GPIO.setup(IN3,GPIO.OUT)

GPIO.setup(IN4,GPIO.OUT)

#電機正轉

GPIO.output(IN1,GPIO.HIGH)

GPIO.output(IN2,GPIO.LOW)

GPIO.output(IN3,GPIO.HIGH)

GPIO.output(IN4,GPIO.LOW)

time.sleep(2)

GPIO.cleanup()

電機轉動起來之後,那麼反轉也是類似的,兩個電機配合實現前進、後退、左轉、右轉

進行一下函式封裝之後:

#引入gpio的模組

import RPi.GPIO as GPIO

import time

#設定GPIO模式

GPIO.setmode(GPIO.BOARD)

#設定in1到in4介面

IN1 = 11

IN2 = 12

IN3 = 13

IN4 = 15

#初始化介面

def init():

    GPIO.setup(IN1,GPIO.OUT)

    GPIO.setup(IN2,GPIO.OUT)

    GPIO.setup(IN3,GPIO.OUT)

    GPIO.setup(IN4,GPIO.OUT)

#前進的程式碼

def car_forward(sleep_time):

    GPIO.output(IN1,GPIO.HIGH)

    GPIO.output(IN2,GPIO.LOW)

    GPIO.output(IN3,GPIO.HIGH)

    GPIO.output(IN4,GPIO.LOW)

    time.sleep(sleep_time)

    GPIO.cleanup()

#後退

def car_backward(sleep_time):

    GPIO.output(IN1,GPIO.LOW)

    GPIO.output(IN2,GPIO.HIGH)

    GPIO.output(IN3,GPIO.LOW)

    GPIO.output(IN4,GPIO.HIGH)

    time.sleep(sleep_time)

    GPIO.cleanup()

#左轉

def car_turnleft(sleep_time):

    GPIO.output(IN1,False)

    GPIO.output(IN2,False)

    GPIO.output(IN3,GPIO.HIGH)

    GPIO.output(IN4,GPIO.LOW)

    time.sleep(sleep_time)

        GPIO.cleanup()

#右轉

def car_turnright(sleep_time):

    GPIO.output(IN1,GPIO.HIGH)

    GPIO.output(IN2,GPIO.LOW)

    GPIO.output(IN3,False)

    GPIO.output(IN4,False)

    time.sleep(sleep_time)

    GPIO.cleanup()

#以上封裝好的函式,通過呼叫函式執行

init()#呼叫初始化方法初始化介面

car_forward(10)#前進10s

car_backward(10)後退10s

接下來試一下PWM調速:

相關文章