美文网首页玩转树莓派物联网IOT创意开发树莓派
人工智能-树莓派小车(3)——GPIO控制小车

人工智能-树莓派小车(3)——GPIO控制小车

作者: IConquer | 来源:发表于2018-01-28 17:38 被阅读525次

    上一个教程介绍了树莓派的GPIO接口,并且简单的利用这个接口控制了小灯的亮灭,详细见人工智能之我与树莓派(2),本次教程将更进一步,利用GPIO口实现控制智能小车的前进后退以及超声波避障、红外线探测等功能。

    智能小车硬件

    硬件包括小车底盘套装(底盘、车轮、电机)、超声波探测模块、红外线感应模块、树莓派、开发板(提供电机外部供电线路、扩展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   #超声波发射脚位
    
    ########红外传感器接口定义#################
    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)#超声波模块发射端管脚设置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)——用微信控制智能小车

    相关文章

      网友评论

      • HansYe:楼主好,请问您在bilibili上小车室内定位视频使用的是那种技术呢?
        IConquer:@HansYe UWB定位
      • Feezhen:你好楼主,请问你的车是两轮驱动的吗?
        IConquer:@Feezhen只做一条大咸鱼 是的
        Feezhen:@IConquer 就是把左侧电机正极接一起,负极接一起,右侧电机同理吗?
        IConquer:@Feezhen只做一条大咸鱼 两组四轮
      • 姜饼人_9e7b:楼主好!最近我也在玩树莓派,想弄个小车。
        文章提到的“开发板(提供电机外部供电线路、扩展GPIO口等)”
        是指L298n吗
        IConquer:@姜饼人_9e7b 我这个是定制的,直接在淘宝上买的,你也可以自己做,就是比较麻烦

      本文标题:人工智能-树莓派小车(3)——GPIO控制小车

      本文链接:https://www.haomeiwen.com/subject/mcczaxtx.html