1. Trang chủ
  2. » Luận Văn - Báo Cáo

Thiết kế chế tạo mạch điện và phần mềm giao diện điều khiển hệ thống phân loại ớt ứng dụng xử lý ảnh

108 14 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

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 MẠCH ĐIỆN VÀ PHẦN MỀM GIAO DIỆN ĐIỀU KHIỂN HỆ THỐNG PHÂN LOẠI ỚT ỨNG DỤNG XỬ LÝ ẢNH Giảng viên hướng dẫn: TS Nguyễn Thiên Chương Sinh viên thực hiện: Nguyễn Hoàng Huy Mã số sinh viên: 58131802 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 MẠCH ĐIỆN VÀ PHẦN MỀM GIAO DIỆN ĐIỀU KHIỂN HỆ THỐNG PHÂN LOẠI ỚT ỨNG DỤNG XỬ LÝ ẢNH Giảng viên hướng dẫn: TS Nguyễn Thiên Chương Sinh viên thực hiện: Nguyễn Hoàng Huy Mã số sinh viên: 58131802 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 (Dùng cho CBHD nộp báo cáo ĐA sinh viên) Tên đề tài: THIẾT KẾ CHẾ TẠO MẠCH ĐIỆN VÀ PHẦN MỀM GIAO DIỆN ĐIỀU KHIỂN 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: NGUYỄN HOÀNG HUY Mã sinh viên: 58131802 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 Chương trình giao diện chương trình điều khiển Python import cv2 from tkinter import * import tkinter as tk import Serial import Serial.tools.list_ports import time 86 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(): global TTXL global Arduino global start_button 87 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 def 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')) def 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')) def 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')) def tocdo_II(): global tocdoI_button global tocdoII_button global tocdoIII_button global t global tc t=0.3 tc=27 tocdoI_button['state']=tk.NORMAL tocdoII_button['state']=tk.DISABLED tocdoIII_button['state']=tk.NORMAL Arduino.write(bytes(str("@01M#"),'utf-8')) def tocdo_III(): 88 global tocdoI_button global tocdoII_button global tocdoIII_button global t global tc t=0.2 tc=34 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') t1.v4.set('0') window.update() def ClassifyColor(): 89 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) 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) 90 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=()) t.daemon = True t.start() return self def stop(self): 91 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

Ngày đăng: 17/05/2021, 14:35

Xem thêm:

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w