日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

树莓派小车避障之——超声波控制(2.1)

發布時間:2024/3/26 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树莓派小车避障之——超声波控制(2.1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?不帶舵機驅動代碼:

有障礙物的話------就右轉或者左轉避開

#!/usr/bin/env pythonimport RPi.GPIO as GPIO import time import sys #BCM編碼 PWMA = 18 AIN1 = 22 AIN2 = 27PWMB = 23 BIN1 = 25 BIN2 = 24BtnPin = 19#這三個引腳不曉得干啥的 Gpin = 5 Rpin = 6 #超聲波工作引腳 TRIG = 20 ##設置Trig和ECHO倆個引腳 ECHO = 21def t_up(speed,t_time):L_Motor.ChangeDutyCycle(speed)GPIO.output(AIN2,False)#AIN2GPIO.output(AIN1,True) #AIN1R_Motor.ChangeDutyCycle(speed)GPIO.output(BIN2,False)#BIN2GPIO.output(BIN1,True) #BIN1time.sleep(t_time)def t_stop(t_time):L_Motor.ChangeDutyCycle(0)GPIO.output(AIN2,False)#AIN2GPIO.output(AIN1,False) #AIN1R_Motor.ChangeDutyCycle(0)GPIO.output(BIN2,False)#BIN2GPIO.output(BIN1,False) #BIN1time.sleep(t_time)def t_down(speed,t_time):L_Motor.ChangeDutyCycle(speed)GPIO.output(AIN2,True)#AIN2GPIO.output(AIN1,False) #AIN1R_Motor.ChangeDutyCycle(speed)GPIO.output(BIN2,True)#BIN2GPIO.output(BIN1,False) #BIN1time.sleep(t_time)def t_left(speed,t_time):L_Motor.ChangeDutyCycle(speed)GPIO.output(AIN2,True)#AIN2GPIO.output(AIN1,False) #AIN1R_Motor.ChangeDutyCycle(speed)GPIO.output(BIN2,False)#BIN2GPIO.output(BIN1,True) #BIN1time.sleep(t_time)def t_right(speed,t_time):L_Motor.ChangeDutyCycle(speed)GPIO.output(AIN2,False)#AIN2GPIO.output(AIN1,True) #AIN1R_Motor.ChangeDutyCycle(speed)GPIO.output(BIN2,True)#BIN2GPIO.output(BIN1,False) #BIN1time.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)GPIO.setup(TRIG, GPIO.OUT)GPIO.setup(ECHO, GPIO.IN)GPIO.setup(Gpin, GPIO.OUT) # Set Green Led Pin mode to outputGPIO.setup(Rpin, GPIO.OUT) # Set Red Led Pin mode to outputGPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Set BtnPin's mode is input, and pull up to high level(3.3V)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) def distance():#同超聲波測量距離原理GPIO.output(TRIG, 0)time.sleep(0.000002)GPIO.output(TRIG, 1)time.sleep(0.00001)GPIO.output(TRIG, 0)#準備開始階段while GPIO.input(ECHO) == 0:a = 0time1 = time.time()while GPIO.input(ECHO) == 1:a = 1time2 = time.time()during = time2 - time1return during * 340 / 2 * 100def loop():#判斷要不要規避while True:dis = distance()if (dis < 40) == True: #前方有障礙物,進行規避右轉while (dis < 40) == True:#距離《40t_down(30,0.5) #占空比改變速度t_right(30,0.1)dis = distance()else:t_up(50,0)print(dis, 'cm')print('')def destroy():GPIO.cleanup()if __name__ == "__main__":setup() #設置對應輸入輸出引腳L_Motor= GPIO.PWM(PWMA,100) #左邊使能A#L_Motor.start(0)R_Motor = GPIO.PWM(PWMB,100)R_Motor.start(0)t_stop(.1)# keysacn()#不需要這一步也行!!!try:loop()except KeyboardInterrupt:destroy()

?二、帶舵機模塊:

舵機運轉:(如果舵機不是由樹莓派供電的話,需要將該電源與樹莓派共地,也就是說電源的負極必須與樹莓派任意一個GND連接,否則會出現舵機控制失常等現象。如果

  • DutyCycle =? angle/18 + 2-------通過改變占空比控制舵機轉換角度
  • 0度對應——2%占空比
  • 90度對應——7%占空比
  • 180度——12%占空比
  • 工作原理:


    控制電路板接受來自信號線的控制信號,控制電機轉動,電機帶動一系列齒輪組,減速后傳動至輸出舵盤。舵機的輸出軸和位置反饋電位計是相連的,舵盤轉動的同時,帶動位置反饋電位計,電位計將輸出一個電壓信號到控制電路板,進行反饋,然后控制電路板根據所在位置決定電機的轉動方向和速度,從而達到目標停止。

    帶舵機小車代碼 :

    #!/usr/bin/env python from Adafruit_PWM_Servo_Driver import PWM import RPi.GPIO as GPIO import time import sysPWMA = 18 AIN1 = 22 AIN2 = 27PWMB = 23 BIN1 = 25 BIN2 = 24BtnPin = 19#舵機接口 Gpin = 5 Rpin = 6TRIG = 20 ECHO = 21 # Initialise the PWM device using the default address # bmp = PWM(0x40, debug=True) pwm = PWM(0x40,debug = False)servoMin = 150 # Min pulse length out of 4096 servoMax = 600 # Max pulse length out of 4096def setServoPulse(channel, pulse):pulseLength = 1000000.0 # 1,000,000 us per secondpulseLength /= 50.0 # 60 Hzprint("%d us per period" % pulseLength)pulseLength /= 4096.0 # 12 bits of resolutionprint("%d us per bit" % pulseLength)pulse *= 1000.0pulse /= (pulseLength*1.0) # pwmV=int(pluse)print("pluse: %f " % (pulse))pwm.setPWM(channel, 0, int(pulse))#調用其他函數庫#Angle to PWM def write(servonum,x): #改變占空比-----》改變舵機角度!!!!!!!!!!!!!!!!!!!!y=x/90.0+0.5y=max(y,0.5)y=min(y,2.5)setServoPulse(servonum,y)def t_up(speed,t_time):L_Motor.ChangeDutyCycle(speed)GPIO.output(AIN2,False)#AIN2GPIO.output(AIN1,True) #AIN1R_Motor.ChangeDutyCycle(speed)GPIO.output(BIN2,False)#BIN2GPIO.output(BIN1,True) #BIN1time.sleep(t_time)def t_stop(t_time):L_Motor.ChangeDutyCycle(0)GPIO.output(AIN2,False)#AIN2GPIO.output(AIN1,False) #AIN1R_Motor.ChangeDutyCycle(0)GPIO.output(BIN2,False)#BIN2GPIO.output(BIN1,False) #BIN1time.sleep(t_time)def t_down(speed,t_time):L_Motor.ChangeDutyCycle(speed)GPIO.output(AIN2,True)#AIN2GPIO.output(AIN1,False) #AIN1R_Motor.ChangeDutyCycle(speed)GPIO.output(BIN2,True)#BIN2GPIO.output(BIN1,False) #BIN1time.sleep(t_time)def t_left(speed,t_time):L_Motor.ChangeDutyCycle(speed)GPIO.output(AIN2,True)#AIN2GPIO.output(AIN1,False) #AIN1R_Motor.ChangeDutyCycle(speed)GPIO.output(BIN2,False)#BIN2GPIO.output(BIN1,True) #BIN1time.sleep(t_time)def t_right(speed,t_time):L_Motor.ChangeDutyCycle(speed)GPIO.output(AIN2,False)#AIN2GPIO.output(AIN1,True) #AIN1R_Motor.ChangeDutyCycle(speed)GPIO.output(BIN2,True)#BIN2GPIO.output(BIN1,False) #BIN1time.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)GPIO.setup(TRIG, GPIO.OUT)GPIO.setup(ECHO, GPIO.IN)GPIO.setup(Gpin, GPIO.OUT) # Set Green Led Pin mode to outputGPIO.setup(Rpin, GPIO.OUT) # Set Red Led Pin mode to outputGPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Set BtnPin's mode is input, and pull up to high level(3.3V)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)pwm.setPWMFreq(50) # Set frequency to 60 Hzdef distance(): #測量距離函數GPIO.output(TRIG, 0)time.sleep(0.000002)GPIO.output(TRIG, 1)time.sleep(0.00001)GPIO.output(TRIG, 0)while GPIO.input(ECHO) == 0:a = 0time1 = time.time()while GPIO.input(ECHO) == 1:a = 1time2 = time.time()during = time2 - time1return during * 340 / 2 * 100def front_detection():#測量前后間距write(0,90)time.sleep(0.5)dis_f = distance()return dis_fdef left_detection():#write(0, 175)time.sleep(0.5)dis_l = distance()return dis_ldef right_detection():write(0,5)time.sleep(0.5)dis_r = distance()return dis_rdef loop():while True:dis1 = front_detection()if (dis1 < 40) == True:t_stop(0.2)t_down(50,0.5)t_stop(0.2)dis2 = left_detection()dis3 = right_detection()if (dis2 < 40) == True and (dis3 < 40) == True:t_left(50,1)elif (dis2 > dis3) == True:t_left(50,0.3)t_stop(0.1)else:t_right(50,0.3)t_stop(0.1)else:t_up(60,0)# print dis1, 'cm'# print ''def destroy():GPIO.cleanup()if __name__ == "__main__":setup()L_Motor= GPIO.PWM(PWMA,100)L_Motor.start(0)R_Motor = GPIO.PWM(PWMB,100)R_Motor.start(0)keysacn()try:loop()except KeyboardInterrupt:destroy()

    小車運行視頻 :

    總結

    以上是生活随笔為你收集整理的树莓派小车避障之——超声波控制(2.1)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。