1. 程式人生 > >樹莓派小車(三)Python控制小車

樹莓派小車(三)Python控制小車

gpio 小車 沒有 物體 凹凸 img str 接口 表示

技術分享圖片

正文之前

由於最近忙於復習趕考,所以暫時沒有拿起樹莓派小車,直到昨天,終於空出時間來把代碼整理一下來和大家分享。


正文

在樹莓派小車系列之二中,講到了樹莓派的引腳定義方式有兩種:

  • PHYSICAL NUMBERING
  • GPIO NUMBERING

我采用的是第二種方式。

開始寫

1. 導入庫
import RPi.GPIO as GPIO
import time
2. 定義接口方式以及接口位置
GPIO.setmode(GPIO.BCM)
IN1 = 17
IN2 = 18
IN3 = 27
IN4 = 22
IN5 = 23
IN6 = 24 

IN1 - IN4為L298N接入,IN5和IN6為紅外線模塊接入。

車輪驅動方式:

IN1和IN2負責驅動車輪轉動(前進)。
IN3和IN4負責驅動車輪轉動(後退)。

3. 初始化
def init():
    GPIO.setup(IN1, GPIO.OUT)
    GPIO.setup(IN2, GPIO.OUT)
    GPIO.setup(IN3, GPIO.OUT)
    GPIO.setup(IN4, GPIO.OUT)
    GPIO.setup(IN5, GPIO.IN)
    GPIO.setup(IN6, GPIO.IN)

連接L298N的接口設為輸出,因為需要輸出的信號來驅動電機。
連接紅外線模塊的接口為輸入,因為需要輸入的信號來做出判斷。

4. 基礎方向行為
def up():
    GPIO.output(IN1, GPIO.HIGH)          //右側車輪前進
    GPIO.output(IN2, GPIO.HIGH)          //左側車輪前進
    GPIO.output(IN3, GPIO.LOW)
    GPIO.output(IN4, GPIO.LOW)


def down():
    GPIO.output(IN1, GPIO.LOW)
    GPIO.output(IN2, GPIO.LOW)
    GPIO.output(IN3, GPIO.HIGH)          //右側車輪後退
    GPIO.output(IN4, GPIO.HIGH)          //左側車輪後退


def turn_left():
    GPIO.output(IN1, GPIO.HIGH)          //右側車輪前進
    GPIO.output(IN2, GPIO.LOW)
    GPIO.output(IN3, GPIO.LOW)
    GPIO.output(IN4, GPIO.LOW)


def turn_right():
    GPIO.output(IN1, GPIO.LOW)
    GPIO.output(IN2, GPIO.HIGH)          //左側車輪前進
    GPIO.output(IN3, GPIO.LOW)
    GPIO.output(IN4, GPIO.LOW)

需要說明的是:由於不含舵機,轉彎的操作是單邊車輪驅動,帶動車身轉動

5. 紅外控制
init()

n = 5

while (n > 0):                                  //總共轉彎五次
    in_left = GPIO.input(IN5)                   //左側紅外線接收器
    in_right = GPIO.input(IN6)                  //右側紅外線接收器
    up()                                        //未遇到障礙時直行
    if (in_left == GPIO.LOW):
        down()
        time.sleep(1)
        turn_right()
        time.sleep(1)
        n = n - 1
        continue
    
    if (in_right == GPIO.LOW):
        down()
        time.sleep(1)
        turn_left()
        time.sleep(1)
        n = n - 1
        continue
    
    if (in_right == GPIO.LOW & in_left == GPIO.LOW):
        down()
        time.sleep(1)
        turn_right()               //如果兩側都有障礙,就右轉(個人喜好)
        time.sleep(1)
        n = n - 1
        continue

stop()                      
GPIO.cleanup()                    //清空GPIO接口配置信息

如果前方遇到障礙,就後退一秒,然後轉彎,最後繼續直行,直到遇到下一個障礙。

需要說明的是time.sleep()的用法:
time.sleep(time) 表示的是經過 time 秒後執行下一步操作,就是休眠一段時間的意思。
如果不使用time.sleep(),將會一直執行第一步操作。

關於運行:

  • 由於紅外傳感器的有效距離偏短(5cm左右),以及傳感器的安裝位置在車的底部,所以在車輛運動時,如果遇到凹凸不平的物體,有可能造成避障的延遲。

運行視頻

樹莓派小車

遇到凹凸不平的物體有些許碰撞(環境簡陋)

關於樹莓派信息的內容就先告一段落,等我做出遙控器再來介紹,謝謝大家的關註。

樹莓派小車(三)Python控制小車