【方案一】 光电反射传感器跟随

思路:光电反射传感器检测到左侧有物体就左转,右侧检测到物体就右转,前方检测到物体就前进。

优点:成本低光电反射传感器(两块钱左右);简单。

缺点:检测距离: 2~30cm  无法区分物体还是人物。

核心代码 

#!/usr/bin/python  
# coding=utf-8  

import RPi.GPIO as GPIO  
import time  
import sys 
 
#SensorRight = 16
#SensorLeft  = 12

Lpin_avoid_obstacle=12
Rpin_avoid_obstacle=16

PWMA   = 18
AIN1   = 22
AIN2   = 27

PWMB   = 23
BIN1   = 25
BIN2   = 24

BtnPin  = 19
Gpin    = 5
Rpin    = 6

#智能小车运动函数 
def t_up(speed,t_time):
        L_Motor.ChangeDutyCycle(speed)
        GPIO.output(AIN2,False)#AIN2
        GPIO.output(AIN1,True) #AIN1

        R_Motor.ChangeDutyCycle(speed)
        GPIO.output(BIN2,False)#BIN2
        GPIO.output(BIN1,True) #BIN1
        time.sleep(t_time)
        
def t_stop(t_time):
        L_Motor.ChangeDutyCycle(0)
        GPIO.output(AIN2,False)#AIN2
        GPIO.output(AIN1,False) #AIN1

        R_Motor.ChangeDutyCycle(0)
        GPIO.output(BIN2,False)#BIN2
        GPIO.output(BIN1,False) #BIN1
        time.sleep(t_time)
        
def t_down(speed,t_time):
        L_Motor.ChangeDutyCycle(speed)
        GPIO.output(AIN2,True)#AIN2
        GPIO.output(AIN1,False) #AIN1

        R_Motor.ChangeDutyCycle(speed)
        GPIO.output(BIN2,True)#BIN2
        GPIO.output(BIN1,False) #BIN1
        time.sleep(t_time)

def t_left(speed,t_time):
        L_Motor.ChangeDutyCycle(speed)
        GPIO.output(AIN2,True)#AIN2
        GPIO.output(AIN1,False) #AIN1

        R_Motor.ChangeDutyCycle(speed)
        GPIO.output(BIN2,False)#BIN2
        GPIO.output(BIN1,True) #BIN1
        time.sleep(t_time)

def t_right(speed,t_time):
        L_Motor.ChangeDutyCycle(speed)
        GPIO.output(AIN2,False)#AIN2
        GPIO.output(AIN1,True) #AIN1

        R_Motor.ChangeDutyCycle(speed)
        GPIO.output(BIN2,True)#BIN2
        GPIO.output(BIN1,False) #BIN1
        time.sleep(t_time)
        
def keysacn():
    val = GPIO.input(BtnPin)
    while GPIO.input(BtnPin) == False:
        val = GPIO.input(BtnPin)
    while GPIO.input(BtnPin) == True:
        time.sleep(0.01)
        val = GPIO.input(BtnPin)
        if val == True:
            GPIO.output(Rpin,1)
            while GPIO.input(BtnPin) == False:
                GPIO.output(Rpin,0)
        else:
            GPIO.output(Rpin,0)
            
def setup():
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)       # 按物理位置给GPIOs编号
    GPIO.setup(Gpin, GPIO.OUT)     # 设置绿色Led引脚模式输出
    GPIO.setup(Rpin, GPIO.OUT)     # 设置红色Led引脚模式输出
    GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)    # 设置输入BtnPin模式,拉高至高电平(3.3V) 
    
    #GPIO.setup(SensorRight,GPIO.IN)
    #GPIO.setup(SensorLeft,GPIO.IN)
    
    GPIO.setup(Lpin_avoid_obstacle, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    GPIO.setup(Rpin_avoid_obstacle, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
	
    GPIO.setup(AIN2,GPIO.OUT)
    GPIO.setup(AIN1,GPIO.OUT)
    GPIO.setup(PWMA,GPIO.OUT)

    GPIO.setup(BIN1,GPIO.OUT)
    GPIO.setup(BIN2,GPIO.OUT)
    GPIO.setup(PWMB,GPIO.OUT)
    
if __name__ == '__main__':
    setup()
    keysacn()
    L_Motor= GPIO.PWM(PWMA,100)
    L_Motor.start(0)
    R_Motor = GPIO.PWM(PWMB,100)
    R_Motor.start(0)
    
    try:
        while True:
            SL_2 = GPIO.input(Lpin_avoid_obstacle)
            SR_2 = GPIO.input(Rpin_avoid_obstacle)
            if SL_2 == True and SR_2 == True:
                print('没有检测到')
                t_stop(0.3)
                #t_down(50,0.4)
                #t_up(50,0)
            elif SL_2 == True and SR_2 ==False:
                print('右侧检测')
                t_right(30,0)
            elif SL_2==False and SR_2 ==True:
                print('左侧检测到')
                t_left(30,0)
            else:
                print('两边检测到')
                t_up(20,0)
            time.sleep(0.5)
    except KeyboradInterrupt:
        GPIO.cleanup()

注意点:运动速度的调节。

实验视频

【红外跟随-哔哩哔哩】

红外跟随

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clark-dj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值