:光电反射传感器检测到左侧有物体就左转,右侧检测到物体就右转,前方检测到物体就前进。
:低成本光电反射传感器(约2元);简单。
:检测距离:2~30cm 无法区分物体或人物。
核心代码
#!/usr/bin/python # coding=utf-8 import RPi.GPIO as GPIO import time import sys #SensorRight = 16#SensorLeft = 12Lpin_avoid_obstacle=12Rpin_avoid_obstacle=16PWMA = 18AIN1 = 22AIN2 = 27PWMB = 23BIN1 = 25BIN2 = 24BtnPin = 19Gpin = 5Rpin = 6#智能汽车运动函数 def t_up(speed,t_time): L_Motor.ChangeDutyCycle(speed) GPIO.output(AIN2,False)#AIN2 GPIO.output(AIN1,True) #AIN R_Motor.ChangeDutyCycle(speed) GPIO.output(BIN2,False)#BIN2 GPIO.output(BIN1,True) #BIN time.sleep(t_time) def t_stop(t_time): L_Motor.ChangeDutyCycle(0) GPIO.output(AIN2,False)#AIN2 GPIO.output(AIN1,False) #AIN R_Motor.ChangeDutyCycle(0) GPIO.output(BIN2,False)#BIN2 GPIO.output(BIN1,False) #BIN time.sleep(t_time) def t_down(speed,t_time): L_Motor.ChangeDutyCycle(speed) GPIO.output(AIN2,True)#AIN2 GPIO.output(AIN1,False) #AIN R_Motor.ChangeDutyCycle(speed) GPIO.output(BIN2,True)#BIN2 GPIO.output(BIN1,False) #BIN time.sleep(t_time)def t_left(speed,t_time): L_Motor.ChangeDutyCycle(speed) GPIO.output(AIN2,True)#AIN2 GPIO.output(AIN1,False) #AIN R_Motor.ChangeDutyCycle(speed) GPIO.output(BIN2,False)#BIN2 GPIO.output(BIN1,True) #BIN time.sleep(t_time)def t_right(speed,t_time): L_Motor.ChangeDutyCycle(speed) GPIO.output(AIN2,False)#AIN2 GPIO.output(AIN1,True) #AIN R_Motor.ChangeDutyCycle(speed) GPIO.output(BIN2,True)#BIN2 GPIO.output(BIN1,False) #BIN 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.1) 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)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()
注:调整运动速度。
实验视频
【红外跟随-比利比利】
红外跟随