Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 106 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
106
Dung lượng
2,48 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC NHA TRANG KHOA CƠ KHÍ ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC CHUYÊN NGÀNH: CÔNG NGHỆ KỸ THUẬT CƠ ĐIỆN TỬ THIẾT KẾ, CHẾ TẠO PHẦN CƠ KHÍ CHO HỆ THỐNG PHÂN LOẠI ỚT ỨNG DỤNG XỬ LÝ ẢNH GVHD: TS NGUYỄN THIÊN CHƯƠNG SVTH: VÕ THÀNH TOÁN MSSV: 58131839 NHA TRANG, THÁNG NĂM 2020 BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC NHA TRANG KHOA CƠ KHÍ ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC CHUYÊN NGÀNH: CÔNG NGHỆ KỸ THUẬT CƠ ĐIỆN TỬ THIẾT KẾ, CHẾ TẠO PHẦN CƠ KHÍ CHO HỆ THỐNG PHÂN LOẠI ỚT ỨNG DỤNG XỬ LÝ ẢNH GVHD: TS NGUYỄN THIÊN CHƯƠNG SVTH: VÕ THÀNH TOÁN MSSV: 58131839 NHA TRANG, THÁNG NĂM 2020 i TRƯỜNG ĐẠI HỌC NHA TRANG Khoa: Cơ Khí PHIẾU THEO DÕI TIẾN ĐỘ VÀ ĐÁNH GIÁ ĐỒ ÁN / KHÓA LUẬN TỐT NGHIỆP (Dùng cho CBHD nộp báo cáo ĐA/KLTN sinh viên) Tên đề tài: THIẾT KẾ, CHẾ TẠO PHẦN CƠ KHÍ CHO HỆ THỐNG PHÂN LOẠI ỚT ỨNG DỤNG XỬ LÝ ẢNH Chuyên ngành: Công nghệ kỹ thuật Cơ điện tử Họ tên sinh viên: VÕ THÀNH TOÁN Mã sinh viên: 58131839 Người hướng dẫn (học hàm, học vị, họ tên): TS NGUYỄN THIÊN CHƯƠNG Cơ quan công tác: Bộ môn – Cơ điện tử, Khoa Cơ khí, Trường Đại học Nha Trang Phần đánh giá cho điểm người hướng dẫn (tính theo thang điểm 10) Tiêu chí đánh giá Trọng số (%) Xây dựng đề cương nghiên cứu 10 Tinh thần thái độ làm việc 10 Kiến thức kỹ làm việc 10 Nội dung kết đạt 40 Kỹ viết trình bày báo cáo 30 Mơ tả mức chất lượng Giỏi Khá Đạt yêu cầu Không đạt - 10 7-8 5-6 0) { Input = (xung / 480.0) * 60 ; double gap = abs(SetPoint - Input); t = millis(); xung = 0; myPID.run(); if(gap-5) { digitalWrite(LAMPPID,BATLAMPPID); } } else { digitalWrite(LAMPPID,TATLAMPPID); } } if(SetPoint==0) { Output=0; myPID.stop(); Input=0; t = millis(); xung = 0; digitalWrite(LAMPPID,TATLAMPPID); } analogWrite(6 , (unsigned char ) Output); } } void CTXILANH() { if(digitalRead(CAMBIENTU)==HIGH) { digitalWrite(XILANH, TATXILANH); delay(2000); } } void loop() { if (Serial.available() > 0) { String tmp = Serial.readString(); if (tmp == "batxl") { digitalWrite(XILANH, BATXILANH); } else if (tmp == "tatxl") { digitalWrite(XILANH, TATXILANH); } else if (tmp == "@01D#") { SetPoint = 0; } else if (tmp == "@01L#") { SetPoint = 60; } else if (tmp == "@01M#") { SetPoint = 80; } else if (tmp == "@01H#") { SetPoint = 100; } } activity(); } PHỤ LỤC 2: Chương trình điều khiển import cv2 from tkinter import * import tkinter as tk 85 import Serial import Serial.tools.list_ports import time import numpy as np import multiprocessing from multiprocessing import Queue, Value, Array from scipy.spatial import distance as dist from threading import Thread from imutils import perspective from imutils import contours import imutils TTXL=None Arduino = None td1=0 tdx1=0 chophep=0 chophepx=0 list1=[] list2=[] H=0 K=0 ca=0 PL=0 def midpoint(ptA, ptB): return ((ptA[0] + ptB[0]) * 0.5, (ptA[1] + ptB[1]) * 0.5) def create_capture(source=0,size=(720,480)): cap = cv2.VideoCapture(source) w,h=size cap.set(cv2.CAP_PROP_FRAME_WIDTH,w) cap.set(cv2.CAP_PROP_FRAME_HEIGHT,h) if cap is None or not cap.isOpened(): print('Warning:unable to open video source:{}'.format(source)) return cap def create_frame_label(parent=None,text1='',size1=14,clr1='red',w1=20): f=Frame(parent) h=StringVar() Label(f,textvariable=h,anchor=W,fg=clr1,width=w1,justify=LEFT,font=("Arial" ,size1,'bold')).pack(side=LEFT) h.set(text1) return f,h def create_frame_label3(parent=None,text1='',size1=14,clr1='#808000',w1=20): f=Frame(parent) h=StringVar() Label(f,textvariable=h,anchor=W,fg=clr1,width=w1,justify=LEFT,font=("Arial" ,size1,'bold')).pack(side=LEFT) h.set(text1) return f,h def create_frame_label2(parent=None,text1='',size1=14,clr1='green',w1=20): f=Frame(parent) h=StringVar() Label(f,textvariable=h,anchor=W,fg=clr1,width=w1,justify=LEFT,font=("Arial" ,size1,'bold')).pack(side=LEFT) h.set(text1) return f,h def start_TTXL(): 86 def def def def global TTXL global Arduino global start_button global tocdoI_button global tocdoII_button global tocdoIII_button global stop_button TTXL = chuongtrinhxuly() TTXL.start() start_button ['state']=tk.DISABLED tocdoI_button['state']=tk.NORMAL tocdoII_button['state']=tk.NORMAL tocdoIII_button['state']=tk.NORMAL stop_button['state']=tk.NORMAL stop_TTXL(): global tocdoI_button global tocdoII_button global tocdoIII_button global start_button global stop_button TTXL.stop() start_button ['state']=tk.NORMAL stop_button ['state']=tk.DISABLED tocdoI_button['state']=tk.DISABLED tocdoII_button['state']=tk.DISABLED tocdoIII_button['state']=tk.DISABLED Arduino.write(bytes(str("@01D#"),'utf-8')) reset_TTXL(): global MIN global MAX global H global K H=0 K=0 t1.v2.set('0') t1.v4.set('0') Arduino.write(bytes(str("@01D#"),'utf-8')) tocdo_I(): global tocdoI_button global tocdoII_button global tocdoIII_button global t global tc t=0.5 tc=20 tocdoI_button['state']=tk.DISABLED tocdoII_button['state']=tk.NORMAL tocdoIII_button['state']=tk.NORMAL Arduino.write(bytes(str("@01L#"),'utf-8')) tocdo_II(): global tocdoI_button global tocdoII_button global tocdoIII_button global t global tc t=0.3 tc=30 tocdoI_button['state']=tk.NORMAL tocdoII_button['state']=tk.DISABLED 87 tocdoIII_button['state']=tk.NORMAL Arduino.write(bytes(str("@01M#"),'utf-8')) def tocdo_III(): global tocdoI_button global tocdoII_button global tocdoIII_button global t global tc t=0.2 tc=40 tocdoI_button['state']=tk.NORMAL tocdoII_button['state']=tk.NORMAL tocdoIII_button['state']=tk.DISABLED Arduino.write(bytes(str("@01H#"),'utf-8')) class RobotControl(Frame): def init (self, parent=None, **options): Frame. init (self, parent, **options) self.pack(expand=YES,fill=BOTH) nhan = Label(self,text = " BẢNG ĐIỀU KHIỂN PHÂN LOẠI ỚT",font=("Arial",16,'bold'),fg='#000080',pady=25,padx=5) nhan.pack(fill=BOTH) self.giaodien() self.Arduino() def giaodien(self): g3 = LabelFrame(self,text='SỐ LƯỢNG ỚT PHÂN LOẠI',font=("Arial",10,'bold'),padx=5,pady=5) f1, self.v1 = create_frame_label(g3, 'Ớt đỏ :', w1=40) f2, self.v2 = create_frame_label3(g3, '0', w1=40) f3, self.v3 = create_frame_label2(g3, 'ỚT xanh :', w1=40) f4, self.v4 = create_frame_label3(g3, '0', w1=40) f1.grid(row=0, column=0) f2.grid(row=0, column=1) f3.grid(row=1, column=0) f4.grid(row=1, column=1) g3.pack(fill=X) def Arduino(self): global Arduino global start_button global stop_button global reset_button global tocdoI_button global tocdoII_button global tocdoIII_button global tocdoIII_button global tocdoIII_button def Camera(): global ca ca=i5.get() def Classifysize(): global PL global H global K PL=i1.get() if PL==1: t1.v1.set('Ớt lớn :') t1.v3.set('Ớt nhỏ :') H=0 K=0 t1.v2.set('0') 88 t1.v4.set('0') window.update() def ClassifyColor(): global PL global H global K PL=i1.get() if PL==0: t1.v1.set('Ớt đỏ :') t1.v3.set('Ớt xanh :') H=0 K=0 t1.v2.set('0') t1.v4.set('0') window.update() Arduino_ports = [p.device for p in Serial.tools.list_ports.comports() if 'Arduino' in p.description] if not Arduino_ports: Arduino_ports = ['COM6'] fcon = LabelFrame(self,text = 'KẾT NỐI HỆ THỐNG',pady=30,font=("Arial",10,'bold'),fg='#a52a2a',padx=30) Label(fcon, text='PORT:',font=("Arial",10,'bold')).grid(row=1, column=1, sticky=W) self.COM = StringVar() self.COM.set(Arduino_ports[0]) # defauit value w = OptionMenu(fcon, self.COM, Arduino_ports) w.grid(row=1, column=2) Label(fcon, text='BAUDRATE:',font=("Arial",10,'bold')).grid(row=2, column=1, sticky=W) self.Baudrate = StringVar() self.Baudrate.set('9600') # defauit value w1 = OptionMenu(fcon, self.Baudrate, '115200', '9600') w1.grid(row=2, column=2) self.btnConnect = Button(fcon, text='Kết nối',font=("Arial",10,'bold'), command=self.onConnect) self.btnConnect.grid(columnspan=3, row=3, column=0) fcon.place(x=10,y=180) g1 = LabelFrame(self,text='HỆ THỐNG VẬN HÀNH',font=("Arial",10,'bold'),fg='#a52a2a',pady=20,padx=50) start_button = tk.Button(g1, text='Bắt đầu', font=("Arial",10,'bold'),width=10,command=start_TTXL,state= tk.DISABLED) start_button.grid(row=0, column=0) stop_button = tk.Button(g1, text='Dừng',font=("Arial",10,'bold'),width=10,command=stop_TTXL,state= tk.DISABLED) stop_button.grid(row=0, column=1) reset_button = tk.Button(g1, text='Khởi động lại',font=("Arial",10,'bold'),width=12,command=reset_TTXL,state= tk.DISABLED) reset_button.grid(row=0,column=2) i1 = IntVar() i5 = IntVar() l0 = Label(g1, text=" Hình thức phân loại :",font=("Arial",10,'bold')) l0.grid(row=1, column=0) c2 = Checkbutton(g1, text="Màu ớt",font=("Arial",10,'bold'), variable=i1,onvalue=0, offvalue= 1,pady=8,width=10,command=ClassifyColor) c2.grid(row=1, column=1) 89 c3 = Checkbutton(g1, text="Kích thước ớt",font=("Arial",10,'bold'),variable=i1, onvalue=1, offvalue= 0,pady=8,width=10,command=Classifysize) c3.grid(row=1, column=2) l2 = Label(g1, text="Giám sát : ",font=("Arial",10,'bold')) l2.grid(row=3, column=0) c = Checkbutton(g1, text=" Kiểm tra",font=("Arial",10,'bold'),width=15, variable=i5,pady=8,command=Camera) c.grid(row=3, column=1) g1.place(x=240,y=185) g2 = LabelFrame(self,text='ĐIỀU KHIỂN TỐC ĐỘ',font=("Arial",10,'bold'),fg='#a52a2a',pady=30,padx=80) tocdoI_button = tk.Button(g2, text=' Tối đa 30 trái/phút',font=("Arial",10,'bold'),width=20,command=tocdo_I,state= tk.DISABLED) tocdoI_button.grid(row=0, column=1) tocdoII_button = tk.Button(g2, text='Tối đa 35 trái/phút' ,font=("Arial",10,'bold'),width=20,command=tocdo_II,state= tk.DISABLED) tocdoII_button grid(row=0, column=2) tocdoIII_button = tk.Button(g2, text='Tối đa 40 trái/phút' ,font=("Arial",10,'bold'),width=20,command=tocdo_III,state= tk.DISABLED) tocdoIII_button grid(row=0, column=3) g2.place(x=40,y=360) def onConnect(self): global Arduino if Arduino is None or not Arduino.isOpen(): self.btnConnect.config(text='Connecting ') self.connect_Arduino() self.btnConnect.config(text='Disconnect') else: self.disconnect_Arduino() self.btnConnect.config(text='Connected') def connect_Arduino(self): global Arduino global start_button global reset_button Arduino = Serial.Serial(self.COM.get(), self.Baudrate.get()) time.sleep(3) start_button ['state']=tk.NORMAL reset_button['state']=tk.NORMAL def disconnect_Arduino(self): global Arduino global start_button global stop_button global reset_button start_button ['state']=tk.DISABLED stop_button['state']=tk.DISABLED reset_button['state']=tk.DISABLED if Arduino.isOpen(): Arduino.close() time.sleep(3) class chuongtrinhxuly(object): def init (self, video_src=0): self.cam = create_capture(video_src) ret, self.frame = self.cam.read() self.stopped = False def start(self): t = Thread(target=self.run, args=()) 90 t.daemon = True t.start() return self def stop(self): self.stopped = True def run(self): global Arduino global td1 global chophep global chophepd global tdx1 global chophepx global t global tc global ca global PL global S global MIN global MAX while True: if self.stopped: cv2.destroyAllWindows() self.cam.release() return ret, self.frame = self.cam.read() if self.frame is None: return vis = self.frame.copy() if PL==0: hsv=cv2.cvtColor(vis,cv2.COLOR_BGR2HSV) red_lower=np.array([0,67,81],np.uint8) red_upper=np.array([14,255,255],np.uint8) green_lower=np.array([31,62,0],np.uint8) green_upper=np.array([76,148,255],np.uint8) red=cv2.inRange(hsv,red_lower, red_upper) green=cv2.inRange(hsv,green_lower,green_upper) kernal = np.ones((6 ,6), "uint8") red=cv2.erode(red,kernal) green=cv2.erode(green,kernal) (contours,hierarchy)=cv2.findContours(red,cv2.RETR_TREE,cv2.CHAIN_APPROX_SI MPLE) for pic, contour in enumerate(contours): M = cv2.moments(contour) area = cv2.contourArea(contour) if(area>1000): cX = int ( M [ "m10" ] / M [ "m00" ]) cY =int ( M [ "m01" ] / M [ "m00" ]) if 220