正文之前
由于最近忙于復習趕考,所以暫時沒有拿起樹莓派小車,直到昨天,終于空出時間來把代碼整理一下來和大家分享。
正文
在樹莓派小車系列之二中,講到了樹莓派的引腳定義方式有兩種:
- 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左右),以及傳感器的安裝位置在車的底部,所以在車輛運動時,如果遇到凹凸不平的物體,有可能造成避障的延遲。
運行視頻
遇到凹凸不平的物體有些許碰撞(環境簡陋)
關于樹莓派信息的內容就先告一段落,等我做出安卓遙控app再來介紹,謝謝大家的關注。