人工智能-樹莓派小車(3)——GPIO控制小車

上一個教程介紹了樹莓派的GPIO接口,并且簡單的利用這個接口控制了小燈的亮滅,詳細見人工智能之我與樹莓派(2),本次教程將更進一步,利用GPIO口實現控制智能小車的前進后退以及超聲波避障、紅外線探測等功能。

智能小車硬件

硬件包括小車底盤套裝(底盤、車輪、電機)、超聲波探測模塊、紅外線感應模塊、樹莓派、開發(fā)板(提供電機外部供電線路、擴展GPIO口等)、電池。

GPIO接口設置

引腳定義

GPIO.setmode(GPIO.BCM)

使用BCM編號

通道配置

########LED口定義#################
LED0 = 10
LED1 = 9
LED2 = 25
LED_L = 11
LED_R = 8
LED_F = 7
LED_CTR = 5

########電機驅動接口定義#################
ENA = 13    #//L298使能A
ENB = 20    #//L298使能B
IN1 = 19    #//電機接口1
IN2 = 16    #//電機接口2
IN3 = 21    #//電機接口3
IN4 = 26    #//電機接口4

########舵機接口定義#################

########超聲波接口定義#################
ECHO = 4    #超聲波接收腳位  
TRIG = 17   #超聲波發(fā)射腳位

########紅外傳感器接口定義#################
IR_R = 18   #小車右側巡線紅外
IR_L = 27   #小車左側巡線紅外
IR_M = 22   #小車中間避障紅外
IRF_R = 23  #小車跟隨右側紅外
IRF_L = 24  #小車跟隨左側紅外

管腳類型設置及初始化

##########忽略警告###############
GPIO.setwarnings(False)

#########led初始化為000##########
GPIO.setup(LED0,GPIO.OUT,initial=GPIO.HIGH)
GPIO.setup(LED1,GPIO.OUT,initial=GPIO.HIGH)
GPIO.setup(LED2,GPIO.OUT,initial=GPIO.HIGH)
GPIO.setup(LED_L,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(LED_R,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(LED_F,GPIO.OUT,initial=GPIO.LOW)

#########電機初始化為LOW##########
GPIO.setup(ENA,GPIO.OUT,initial=GPIO.LOW)
ENA_pwm=GPIO.PWM(ENA,1000) 
ENA_pwm.start(0) 
ENA_pwm.ChangeDutyCycle(50)
GPIO.setup(IN1,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(IN2,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(ENB,GPIO.OUT,initial=GPIO.LOW)
ENB_pwm=GPIO.PWM(ENB,1000) 
ENB_pwm.start(0) 
ENB_pwm.ChangeDutyCycle(50)
GPIO.setup(IN3,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(IN4,GPIO.OUT,initial=GPIO.LOW)



#########紅外初始化為輸入,并內部拉高#########
GPIO.setup(IR_R,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(IR_L,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(IR_M,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(IRF_R,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(IRF_L,GPIO.IN,pull_up_down=GPIO.PUD_UP)



##########超聲波模塊管腳類型設置#########
GPIO.setup(TRIG,GPIO.OUT,initial=GPIO.LOW)#超聲波模塊發(fā)射端管腳設置trig
GPIO.setup(ECHO,GPIO.IN,pull_up_down=GPIO.PUD_UP)#超聲波模塊接收端管腳設置echo

接口連線

控制小車接線圖.jpg

控制代碼

開關前大燈

####################################################
##名稱 Open_Light()
##功能 開大燈LED_F
##入口參數 :無
##出口參數 :無
####################################################

def Open_Flight():#開大燈LED_F
    GPIO.output(LED_F,GPIO.HIGH)#大燈正極接IO  負極接GND

####################################################
##名稱 Close_Light()
##功能 關大燈LED_F
##入口參數 :無
##出口參數 :無
####################################################

def Close_Flight():#關大燈
    GPIO.output(LED_F,GPIO.LOW)#大燈正極接IO  負極接GND

機器人方向控制

def Motor_Forward():
    print ( 'motor forward' )
    GPIO.output(ENA,True)
    GPIO.output(ENB,True)
    GPIO.output(IN1,True)
    GPIO.output(IN2,False)
    GPIO.output(IN3,True)
    GPIO.output(IN4,False)
    
def Motor_Backward():
    print ( 'motor_backward' )
    GPIO.output(ENA,True)
    GPIO.output(ENB,True)
    GPIO.output(IN1,False)
    GPIO.output(IN2,True)
    GPIO.output(IN3,False)
    GPIO.output(IN4,True)
    
def Motor_TurnLeft():
    print ( 'motor_turnleft' )
    GPIO.output(ENA,True)
    GPIO.output(ENB,True)
    GPIO.output(IN1,True)
    GPIO.output(IN2,False)
    GPIO.output(IN3,False)
    GPIO.output(IN4,True)
    
def Motor_TurnRight():
    print ( 'motor_turnright' )
    GPIO.output(ENA,True)
    GPIO.output(ENB,True)
    GPIO.output(IN1,False)
    GPIO.output(IN2,True)
    GPIO.output(IN3,True)
    GPIO.output(IN4,False)
    
def Motor_Stop():
    print ( 'motor_stop' )
    GPIO.output(ENA,False)
    GPIO.output(ENB,False)
    GPIO.output(IN1,False)
    GPIO.output(IN2,False)
    GPIO.output(IN3,False)
    GPIO.output(IN4,False)
    

超聲波避障

def checkdist():
    GPIO.output(17,GPIO.HIGH)
    time.sleep(0.000015)
    GPIO.output(17,GPIO.LOW)
    while not GPIO.input(4):
               pass
    t1 = time.time()
    while GPIO.input(4):
               pass
    t2 = time.time()
    return (t2-t1)*340/2
try:
         while True:
        ds = checkdist()
        if ds > 0.15:
            print 'Distance: %0.3f m' %ds
            Motor_Forward()
        else:
            Motor_Stop()
        time.sleep(0.1)
except KeyboardInterrupt:
         GPIO.cleanup()

紅外線避障

def Avoiding():#紅外避障函數
    if GPIO.input(IR_M) == False:
        Motor_Stop()
    else:
        Motor_Forward()
try:
        while True:
            Avoiding()
            time.sleep(0.1)
except KeyboardInterrupt:
         GPIO.cleanup()

效果演示

GPIO控制小車

系列教程

人工智能-樹莓派小車(1)——DuerOS語音喚醒
人工智能-樹莓派小車(2)——GPIO接口介紹
人工智能-樹莓派小車(3)——GPIO控制小車
人工智能-樹莓派小車(4)——通過語音玩轉智能小車
人工智能-樹莓派小車(5)——用微信控制智能小車

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容