0 前言
?? 這兩年開始畢業(yè)設(shè)計和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點,往往達(dá)不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長自己做的項目系統(tǒng)達(dá)不到老師的要求。
為了大家能夠順利以及最少的精力通過畢設(shè),學(xué)長分享優(yōu)質(zhì)畢業(yè)設(shè)計項目,今天要分享的是
?? 畢業(yè)設(shè)計 基于樹莓派的AI視覺機械臂小車
??學(xué)長這里給一個題目綜合評分(每項滿分5分)
- 難度系數(shù):3分
- 工作量:3分
- 創(chuàng)新點:5分
?? 選題指導(dǎo), 項目分享:
https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md
1 簡介
基于樹莓派的AI視覺和機械臂。視覺識別是一個主要內(nèi)容,是信息輸入的重要方式,而機械臂是機器人輸出、工作的重要方式,比如農(nóng)業(yè)采摘機器人。因此,AI視覺和機器的互相配合加持對實際生產(chǎn)生活具有很大的意義。
2 主要機器
- 機器人套件
- 蜂鳴器
- 輕觸按鍵
- 漫反射紅外光電避障傳感模塊
3 樹莓派簡介
智能小車的大腦是一塊信用卡大小的樹莓派板子,所以DIY沖動的朋友可以到各大商城購買一塊最新版的樹莓派,:
樹莓派第三代張這個樣子——正面照
簡單介紹:
- Micro-USB Power–電源插槽
- CPU
- 四個USB接口
- 一個HDMI接口
- 一個耳機插孔,也可以輸出視頻
- 40個GPIO引腳
- 一個SD卡插槽,沒有硬盤
- 一個網(wǎng)線插口,自帶無線網(wǎng)卡
- 樹莓派相機插槽
- Micro-USB Power,樹莓派供電接口
所有具體接口如何使用,詳細(xì)講解的話會使該篇文章顯得拖沓,放在其它篇幅講解,目前不懂沒關(guān)系,不影響到我們制作智能小車。
1.電源適配器 5V 2A
2.移動電源 輸出5V 2.1A
注意:Pi沒有板載穩(wěn)壓芯片,只能且必須用5V的電源給Pi供電。如果電壓過大,Pi會永久“變磚”,等著流淚吧!
4 基本運動-TB6612FNG驅(qū)動芯片
采用了TB6612FNG驅(qū)動芯片,電機電源接口帶有反接保護電路,相對于傳統(tǒng)的L298N在效率上提高很多,體積上也大幅減小,使用方法和L298N類似。
同時除了使用RPi.GPIO庫編程以外,再使用gpiozero庫的Motor類來實現(xiàn)電機控制。
實驗原理
TB6612FNG是東芝半導(dǎo)體公司生產(chǎn)的一款直流電機驅(qū)動器件,具有大電流MOSFET-H橋結(jié)構(gòu),雙通道電路輸出,也就是可以驅(qū)動兩個電機。
擴展板上使用了兩塊TB6612FNG芯片,但是并聯(lián)的,只有兩路輸出,可以用作備份,也可以用作2路4驅(qū)。
下面分別是控制兩個電機的IO口:
STBY口接單片機的IO口清零電機全部停止,置1通過AIN1 AIN2,BIN1,BIN2 來控制正反轉(zhuǎn)
VM 接15V以內(nèi)電源
VCC 接2.7v – 5V電源
GND 接地
驅(qū)動1路:
PWMA 接單片機的PWM口
A01、AO2 接電機1的兩個腳
驅(qū)動2路:
PWMB 接單片機的PWM口
B01、BO2 接電機2的兩個腳
注意: 若是pwm控制,則需要pwm頻率100khz ,親測80khz也好用,同時STBY引腳需要接高電平。
程序編寫
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
PWMA = 18
AIN1 = 22
AIN2 = 27
PWMB = 23
BIN1 = 25
BIN2 = 24
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
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)
L_Motor= GPIO.PWM(PWMA,80000)
L_Motor.start(0)
R_Motor = GPIO.PWM(PWMB,80000)
R_Motor.start(0)
def t_up(speed,t_time):
L_Motor.ChangeDutyCycle(speed)
GPIO.output(AIN2,False)
GPIO.output(AIN1,True) # AIN1高電平為前進(jìn)
R_Motor.ChangeDutyCycle(speed)
GPIO.output(BIN2,False)
GPIO.output(BIN1,True) # BIN1高電平為前進(jìn)
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)
R_Motor.ChangeDutyCycle(speed)
GPIO.output(BIN2,True) # BIN2高電平為后退
GPIO.output(BIN1,False)
time.sleep(t_time)
def t_left(speed,t_time):
L_Motor.ChangeDutyCycle(speed)
GPIO.output(AIN2,True) # 左輪后退
GPIO.output(AIN1,False)
R_Motor.ChangeDutyCycle(speed)
GPIO.output(BIN2,False)
GPIO.output(BIN1,True) # 右輪前進(jìn)
time.sleep(t_time)
def t_right(speed,t_time):
L_Motor.ChangeDutyCycle(speed)
GPIO.output(AIN2,False)
GPIO.output(AIN1,True) # 左輪前進(jìn)
R_Motor.ChangeDutyCycle(speed)
GPIO.output(BIN2,True) # 右輪后退
GPIO.output(BIN1,False)
time.sleep(t_time)
try:
while True:
t_up(50,3)
t_down(50,3)
t_left(50,3)
t_right(50,3)
t_stop(3)
except KeyboardInterrupt:
GPIO.cleanup()
5 紅外避障功能
采用了E18-D80NK漫反射式紅外光電開關(guān)避障傳感器模塊。同時除了使用RPi.GPIO庫編程以外,再使用gpiozero庫來實現(xiàn)。
實驗原理
E18-D80NK是一種及發(fā)射與接收于一體的光電傳感器,發(fā)射光經(jīng)過調(diào)制后發(fā)出,接收頭對反射光進(jìn)行解調(diào)輸出,有效的避免了可見光的干擾。透鏡的使用,也使得這款傳感器最遠(yuǎn)可以檢測80厘米距離的物體(由于紅外光的特性,不同顏色的物體,能探測到的最大距離也不同,白色物體最遠(yuǎn),黑色物體最近)。
檢測障礙物的距離可以根據(jù)要求,通過尾部的電位器旋鈕進(jìn)行調(diào)節(jié)。
傳感器相關(guān)參數(shù)
這個NPN型光電開關(guān)的輸出組是0或1,即數(shù)字電路中的高電平與低電平。檢測到目標(biāo)是低電平輸出,正常狀態(tài)是高電平輸出。光電開關(guān)就三條線:電源、地、輸出,輸出不需要進(jìn)行AD轉(zhuǎn)換。
在上面的擴展板TB6612FNG芯片電路圖上可以知道連接GPIO的接線情況,A通道為左輪控制,B通道為右輪控制:
程序編寫文章來源:http://www.zghlxwxcb.cn/news/detail-416512.html
這里先使用RPi.GPIO庫來編寫程序,當(dāng)按下按鍵后車輛開始行進(jìn),左右都沒探測到障礙物時直行,左側(cè)探測到障礙物時右轉(zhuǎn),右側(cè)探測到障礙物時左轉(zhuǎn),否則就是左右都探測到障礙物停止0.3秒,再后退0.4秒,再左轉(zhuǎn)0.5秒。文章來源地址http://www.zghlxwxcb.cn/news/detail-416512.html
#!/usr/bin/python
# coding=utf-8
#本段代碼實現(xiàn)樹莓派智能小車的紅外避障效果
#代碼使用的樹莓派GPIO是用的BCM編碼方式。
import RPi.GPIO as GPIO
import time
import sys
SensorRight = 16
SensorLeft = 12
PWMA = 18
AIN1 = 22
AIN2 = 27
PWMB = 23
BIN1 = 25
BIN2 = 24
BtnPin = 19
Gpin = 6
Rpin = 5
#智能小車運動函數(shù)
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():
# 按下按鍵后,車輛才行進(jìn)
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) # 設(shè)置綠色Led引腳模式輸出
GPIO.setup(Rpin, GPIO.OUT) # 設(shè)置紅色Led引腳模式輸出
GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP) # 設(shè)置輸入BtnPin模式,拉高至高電平(3.3V)
GPIO.setup(SensorRight,GPIO.IN)
GPIO.setup(SensorLeft,GPIO.IN)
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:
SR_2 = GPIO.input(SensorRight)
SL_2 = GPIO.input(SensorLeft)
if SL_2 == True and SR_2 == True: # 高電平表示無障礙
print("t_up")
t_up(50,0)
elif SL_2 == True and SR_2 ==False:
print("Left")
t_left(50,0)
elif SL_2==False and SR_2 ==True:
print("Right")
t_right(50,0)
else:
t_stop(0.3)
t_down(50,0.4)
t_left(50,0.5)
except KeyboardInterrupt: # 當(dāng)按下Ctrl+C時,將執(zhí)行子程序destroy()。
GPIO.cleanup()
6 最后
到了這里,關(guān)于畢業(yè)設(shè)計 基于樹莓派的AI視覺機械臂小車的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!