Thiết kế và thi công một dây chuyền có thể phân loại đai ốc ứng dụng xử lý ảnh dùng thư viện mã nguồn mở OpenCV viết trên ngôn ngữ C++. Dây chuyền có thể phân loại các đai ốc bị sai kích thước, bị méo. Các thông số của dây chuyền có thể cài đặt và giám sát qua phần mềm trên máy tính sử dụng hệ điều hành Window. Máy tính sẽ giao tiếp với vi điều khiển thông qua giao tiếp UART.
BỘ GIÁO DỤC & ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HỒ CHÍ MINH KHOA ĐIỆN – ĐIỆN TỬ BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH ĐỒ ÁN TỐT NGHIỆP NGÀNH CÔNG NGHỆ KỸ THUẬT ĐIỆN TỬ TRUYỀN THÔNG ĐỀ TÀI: THIẾT KẾ VÀ THI CÔNG DÂY CHUYỀN PHÂN LOẠI ĐAI ỐC ỨNG DỤNG XỬ LÝ ẢNH GVHD: THS VÕ ĐỨC DŨNG SVTH: NGUYỄN VĂN TÀI 15141273 NGUYỄN MINH ĐỨC 15141135 Tp Hồ Chí Minh - 6/2019 TRƯỜNG ĐH SPKT TP HỒ CHÍ MINH KHOA ĐIỆN-ĐIỆN TỬ BỘ MƠN ĐIỆN TỬ CƠNG NGHIỆP – Y SINH CỘNG HỊA XÃ HỘI CHỦ NGHĨA VIỆT NAM ĐỘC LẬP - TỰ DO - HẠNH PHÚC o0o Tp HCM, ngày 20 tháng năm 2019 NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP Họ tên sinh viên: Chuyên ngành: Hệ đào tạo: Khóa: Nguyễn Văn Tài Nguyễn Minh Đức Kỹ thuật điện tử - truyền thơng Đại học quy 2015 MSSV: 15141273 MSSV: 15141135 Mã ngành: 141 Mã hệ: Lớp: 15141DT2C I TÊN ĐỀ TÀI: THIẾT KẾ VÀ THI CÔNG DÂY CHUYỀN PHÂN LOẠI ĐAI ỐC ỨNG DỤNG XỬ LÝ ẢNH II NHIỆM VỤ Các số liệu ban đầu: Mơ hình dây chuyền phân loại đai ốc ứng dụng xử lý ảnh sử dụng động DC 12V, khung xây dựng nhơm định hình, camera sử dụng loại webcam C270, vi điều khiển sử dụng STM32F103C8T6, phần xử lý ảnh dùng máy vi tính Giao tiếp máy tính vi điều khiển qua IC PL2303 dựa giao tiếp UART Chương trình xử lý ảnh máy tính viết ngơn ngữ C++ dựa thư viện mã nguồn mở OpenCV tạo giao diện phần mềm QT Creator Nội dung thực hiện: - Tìm hiểu cách thức hoạt động hệ thống phân loại dùng xử lý ảnh - Tìm hiểu chuẩn giao tiếp UART, động DC, cảm biến hồng ngoại, encoder - Tìm hiểu vi điều khiển STM32F103C8T6 - Thiết kế thi công mô hình dây chuyền phân loại - Thiết kế thi cơng mạch điện cho hệ thống - Viết chương trình xử lý ảnh máy tính dùng phần mềm QT Creator - Viết chương trình điều khiển cho vi điều khiển STM32F103C8T6 - Chạy thử nghiệm mơ hình, chỉnh sửa hoàn thiện hệ thống - Thực viết luận văn báo cáo - Tiến hành báo cáo đề tài tốt nghiệp III NGÀY GIAO NHIỆM VỤ: 18/2/2019 IV NGÀY HOÀN THÀNH NHIỆM VỤ: 20/6/2019 V HỌ VÀ TÊN CÁN BỘ HƯỚNG DẪN: ThS Võ Đức Dũng CÁN BỘ HƯỚNG DẪN SINH BM ĐIỆN TỬ CÔNG NGHIỆP – Y i TRƯỜNG ĐH SPKT TP HỒ CHÍ MINH KHOA ĐIỆN-ĐIỆN TỬ BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM ĐỘC LẬP - TỰ DO - HẠNH PHÚC o0o Tp HCM, ngày 18 tháng 02 năm 2019 LỊCH TRÌNH THỰC HIỆN ĐỒ ÁN TỐT NGHIỆP Họ tên sinh viên 1: Nguyễn Minh Đức Lớp: 15141DT2C MSSV: 15141135 Họ tên sinh viên 2: Nguyễn Văn Tài Lớp: 15141DT2C MSSV: 15141273 Tên đề tài: THIẾT KẾ VÀ THI CÔNG DÂY CHUYỀN PHÂN LOẠI ĐAI ỐC ỨNG DỤNG XỬ LÝ ẢNH Tuần/ngày Nội dung Xác nhận GVHD - Gặp GVHD để nghe phổ biến yêu cầu làm đồ án, tiến hành chọn đề tài, GVHD tiến hành xét (18/02 - 24/02) duyệt đề tài Tuần Tuần (25/02 - 03/03) Tuần (04/03 - 10/03) Tuần (11/03 - 17/03) - Viết đề cương tóm tắt nội dung đồ án - Tìm hiểu tổng quan phương thức hoạt động Module STM32f103c8t6, Camera - Tìm hiểu cơng nghệ xử lý ảnh - Tìm hiểu nghiên cứu điều khiển động khí nén dùng STM32f103c8t6 - Tìm hiểu kết nối Camera để thu thập hình ảnh Tuần - Tìm hiểu nghiêm cứu giao tiếp Uart máy (18/03 - 24/03) tính STM32f103c8t6 Tuần - - Tìm hiểu cách lập trình ngơn ngữ viết cho xử (25/03 - 07/04) lý ảnh ii Tuần - Mô mạch, kiểm tra cân chỉnh mạch (08/04 - 14/04) - Vẽ PCB Tuần - 10 - Tiến hành thi công mạch (15/04 - 28/04) - Kiểm tra mạch thi công Tuần 11 (29/04 - 05/05) Tuần 12 – 13 (06/05 - 19/05) Tuần 14 - Kiểm tra cải tiến hệ thống - Viết báo cáo nội dung làm (20/05- 26/05) - Hoàn thiện báo cáo gởi cho GVHD để xem xét góp ý lần cuối trước in báo cáo Tuần 15 - Nộp báo cáo báo cáo đề tài (27/05 - 02/06) - Thiết kế Slide báo cáo GV HƯỚNG DẪN (Ký ghi rõ họ tên) iii LỜI CAM ĐOAN Đề tài nhóm tự thực hiện, dựa vào số đề tài trước tài liệu tham khảo không chép từ tài liệu hay công trình có trước TP Hồ Chí Minh, ngày 20/6/2019 Người thực đề tài Nguyễn Văn Tài Nguyễn Minh Đức iv LỜI CẢM ƠN Lời đầu tiên, nhóm thực đề tài xin gửi lời cảm ơn chân thành đến thầy Võ Đức Dũng - giảng viên khoa Điện-Điện tử, theo sát hỗ trợ hướng dẫn nhóm cách chi tiết q trình thực đề tài Thầy ln hỗ trợ hết mình, giải đáp thắc mắc, sai sót gợi ý phương án thực cho khả thi dễ tiếp cận Trong trình thực Đồ án tốt ngiệp chúng em nhận giúp đỡ ủng hộ thầy, cô khoa Điện-Điện tử Sự hỗ trợ thầy, cô góp phần khơng nhỏ giúp chúng em hồn thành đề tài Nhóm đề tài xin cảm ơn bạn sinh viên khoa Điện-Điện tử nhiệt tình giúp đỡ, hỗ trợ nhóm, chia sẻ kinh nghiệm Những đóng góp bạn ln nhóm tiếp nhận xem xét kĩ lưỡng Cuối cùng, nhóm xin cảm ơn chân thành sâu sắc đến người thân đặc biệt quý phụ huynh - người bên cạnh hỗ trợ tài tinh thần suốt trình học tập thực đề tài Dù cố gắng nỗ lực nhiên với hạn chế kiến thức kinh nghiệm, đề tài tránh nhiều thiếu sót Nhóm mong nhận đóng góp, nhận xét để thầy, bạn bè để hồn thiện đề tài Xin chân thành cảm ơn! Người thực đề tài Nguyễn Văn Tài Nguyễn Minh Đức v MỤC LỤC LỊCH TRÌNH THỰC HIỆN ĐỒ ÁN TỐT NGHIỆP ii LỜI CAM ĐOAN iv LỜI CẢM ƠN v LIỆT KÊ HÌNH viii LIỆT KÊ BẢNG x TÓM TẮT xi Chương TỔNG QUAN 1.1 ĐẶT VẤN ĐỀ 1.2 MỤC TIÊU VÀ GIỚI HẠN 1.3 NỘI DUNG NGHIÊN CỨU 1.4 GIỚI HẠN 1.5 BỐ CỤC Chương CƠ SỞ LÝ THUYẾT 2.1 TỔNG QUAN VỀ XỬ LÝ ẢNH 2.1.1 Giới thiệu ảnh số 2.1.2 Phương pháp thu nhận ảnh 2.1.3 Giới thiệu thư viện OpenCV camera Logitech C270 2.1.4 Điều chỉnh độ sáng độ tương phản 2.1.5 Lọc nhiễu ảnh 2.2 TÌM ĐƯỜNG BIÊN CỦA ẢNH 13 2.3 GIAO TIẾP UART 15 2.4 VI ĐIỀU KHIỂN STM32F103C8T6 17 2.4.1 Tổng quan 17 2.4.2 Cấu trúc hệ thống 18 2.4.3 Tìm hiểu GPIO 21 2.4.4 Timer PWM 23 2.5 ĐỘNG CƠ DC 25 2.6 ENCODER 26 2.7 CẢM BIẾN HỒNG NGOẠI 29 Chương TÍNH TỐN VÀ THIẾT KẾ HỆ THỐNG 31 3.1 THIẾT KẾ SƠ ĐỒ KHỐI 31 3.2 TÍNH TỐN THIẾT KẾ MẠCH 32 3.2.1 Khối vi điều khiển giao tiếp máy tính 32 vi 3.2.2 Khối cảm biến encoder 35 3.2.3 Khối công suất điều khiển tải 35 3.2.4 Khối nguồn 39 3.2.5 Mạch PCB 41 3.2.6 Sơ đồ nguyên lý toàn mạch 43 3.3 TÍNH TỐN THIẾT KẾ MƠ HÌNH 44 3.3.1 Cơ cấu cấp phôi 44 3.3.2 Băng tải 46 3.3.3 Cơ cấu phân loại 46 3.3.4 Hộp điện 49 Chương THI CÔNG HỆ THỐNG 50 4.1 GIỚI THIỆU 50 4.2 THI CÔNG MẠCH ĐIỆN 50 4.2.1 Linh kiện sử dụng mạch điện 50 4.2.2 Lắp ráp kiểm tra mạch điện 51 4.3 THI CÔNG MÔ HÌNH 52 4.3.1 Vật liệu, linh kiện sử dụng 52 4.3.2 Các bước thi công 53 4.4 LẬP TRÌNH HỆ THỐNG 57 4.4.1 Lưu đồ giải thuật cho vi điều khiển 57 4.4.2 Lưu đồ giải thuật cho chương trình xử lý ảnh 63 4.4.3 Phần mềm QT Creator 65 4.4.4 Trình biên dịch Keil µVision 70 Chương KẾT QUẢ - NHẬN XÉT – ĐÁNH GIÁ 75 Chương KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 81 6.1 KẾT LUẬN 81 6.2 HƯỚNG PHÁT TRIỂN 81 TÀI LIỆU THAM KHẢO 82 PHỤ LỤC 83 vii LIỆT KÊ HÌNH Hình Trang Hình Các bước xử lý ảnh .5 Hình 2 Hình ảnh Webcam Logitech C270 Hình Một mặt nạ lọc kích thước 3x3 Hình Ví dụ phần tử trung vị 10 Hình Các hướng xét giá trị 15 Hình Sơ đồ cấu trúc khối STM32F103C8T6 18 Hình Sơ đồ nguồn xung clock STM32F103C8T6 20 Hình Thanh ghi cấu hình chức chân GPIO port 22 Hình Thanh ghi đọc giá trị ngõ vào 23 Hình 10 Thanh ghi chọn giá trị ngõ port 23 Hình 11 Động GA25 26 Hình 12 Đĩa encoder tương đối kiểu quay 28 Hình 13 Hình ảnh encoder quang 100 xung 28 Hình 14 Led phát hồng ngoại 29 Hình 15 Kí hiệu đi-ốt quang 29 Hình 16 Kí hiệu transistor quang 30 Hình 17 Cảm biến hồng ngoại E18-D80NK 30 Hình Sơ đồ khối hệ thống .31 Hình Sơ đồ mạch vi điều khiển 33 Hình 3 Mạch chuyển USB UART PL2303 34 Hình Cổng domino kết nối cảm biến encoder .35 Hình Sơ đồ kết nối cảm biến encoder 35 Hình Sơ đồ mạch công suất điều khiển động DC dùng PWM 36 Hình Sơ đồ mạch công suất điều khiển động DC relay .37 Hình Sơ đồ mạch công suất điều khiển servo 38 Hình Sơ đồ mạch cơng suất điều khiển led rọi 38 Hình 10 Sơ đồ mạch led báo trạng thái tải .39 Hình 11 Sơ đồ mạch nguồn 41 Hình 12 Hình ảnh mạch PCB 41 Hình 13 Hình ảnh 3D mạch in mặt 42 Hình 14 Hình ảnh 3D mạch in nhìn nghiêng 42 Hình 15 Sơ đồ nguyên lý toàn mạch .43 Hình 16 Hình ảnh lăn thiết kế 44 Hình 17 Hình ảnh bánh thiết kế 45 Hình 18 Mặt trước puly 46 Hình 19 Trục phụ đĩa quay .47 Hình 20 Puly trục đĩa 48 Hình 21 Sơ đồ nối dây hộp điện 49 viii Hình Servo gạt vật khơng đạt yêu cầu Sau camera chụp máy tính xử lý, đai ốc khơng đạt u cầu, có kích thước nhỏ, bị Servo gạt sang bên, đai ốc đạt yêu cầu không bị gạt Hình Thanh gạt đai ốc đạt yêu cầu Các đai ốc đạt yêu cầu qua Servo tới gạt lắp sau Servo, đai ốc bị gạt khỏi đĩa quay Như hai loại ốc phân loại riêng biệt BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH 78 Hình Các hình chụp lưu lại thư mục Sau camera chụp hình lưu lại thư mục đặt tên theo thời gian chụp với định dạng tên “Anh_giờ_phút_giây.jpg” Điều giúp kiểm tra quản lý việc xử lý ảnh cần thiết Sau trình làm việc nghiên cứu nhóm đạt số kết sau: Có thể lập trình cho vi điều khiển STM32F103C8T6 Với xu hướng xử dụng dòng vi điều khiển lõi ARM với chi phí rẻ hiệu suất cao STM32F103C8T6 số nhóm có kiến thức dòng vi điều khiển mở rộng loại vi điều khiển tương tự Có thể tính tốn, thiết kế vẽ mạch điện Tính tốn, thiết kế vẽ mạch yêu cầu thiếu người học điện tử, sau thực đề tài, nhóm biết vận dụng kiến thức học để tính tốn thiết kế mạch cơng suất theo u cầu Có thể vẽ mạch điện PCB phù hợp với tiêu chuẩn đảm bảo thẩm mĩ Biết cách lập trình phần mềm ứng dụng có giao diện QT Creator Qua trình làm việc nhóm có kiến thức đủ để tạo ứng dụng chạy máy tính có giao diện thân thiện với người dùng giúp người sử dụng dễ dàng BỘ MÔN ĐIỆN TỬ CƠNG NGHIỆP- Y SINH 79 Có thể giao tiếp máy tính vi điều khiển Giao tiếp vi điều khiển máy tính yêu cầu thường gặp thực tế sau thực đề tài, nhóm nắm rõ kiến thức cần thiết để giao tiếp thiết bị Hiểu sử dụng thư viện OpenCV cho việc xử lý ảnh Thư viện OpenCV thư viện tảng phổ biến cho việc lập trình xử lý ảnh, giúp việc xử lý nhanh chóng dễ dàng Nhóm tìm hiểu cách sử dụng kiến thức sử dụng thư viện OpenCV giúp việc hiểu rõ nguyên lý ứng dụng mở rộng thư viện khác tảng xử lý ảnh khác Hệ thống sau hồn thành hoạt động thiếu sót chưa thực ổn định, có tình trạng phân loại bị sai, nguyên nhân camera sử dụng chưa đáp ứng tốt yêu cầu hệ thống nên việc xử lý phân loại chưa tốt Ngoài mặt thẩm mĩ nhiều chi tiết chưa tốt BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH 80 Chương KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 6.1 KẾT LUẬN Sau thời gian nghiên cứu làm việc chăm nhóm đạt mục tiêu đề ra: Viết chương trình xử lý ảnh máy tính có giao diện Nhận dạng đai ốc có kích thước khác Giao tiếp từ máy tính tới vi điều khiển ổn định xác Các phận khí hoạt động tương đối tốt 6.2 HƯỚNG PHÁT TRIỂN Đề tài nhiều thiếu sót nhóm đề xuất số hướng để phát triển thêm: - Thay webcam loại camera có tốc độ chụp nhanh giúp xử lý hình ảnh tốc độ cao - Nghiên cứu thêm thuật toán hiệu việc phát lỗi - Thiết kế mạch phù hợp với môi trường công nghiệp, tiêu chuẩn cơng nghiệp - Hồn thiện phần mềm máy tính để đóng gói sử dụng cách hoàn chỉnh - Cải tiến cấu khí để hoạt động hiệu phù hợp với yêu cầu thực tế BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH 81 TÀI LIỆU THAM KHẢO [1] Nguyễn Đình Phú, “Giáo trình vi xử lý”, Trường ĐHSPKT, Tp.HCM, 2013 [2] Nguyễn Đình Phú, “Giáo trình: Thực hành vi điều khiển - ARM STM32”, Trường ĐHSPKT, Tp.HCM, 2014 [3] Phan Văn Phương, Trần Trí Tâm, “Ứng dụng xử lý ảnh cảnh báo tài xế ngủ gật”, Đồ án tốt nghiệp, Trường ĐHSPKT Tp HCM, 2014 [4] Phan Trọng Thuật, Nguyễn Văn Đúng, “Phân loại sản phẩm dùng camera”, Đồ án tốt nghiệp, Trường ĐHSPKT Tp HCM, 2014 [5] Lê Quốc Nhật, Châu Thái Bảo, “Nhận dạng thứ tự màu cho cáp kết nối công nghiệp dùng xử lý ảnh”, Đồ án tốt nghiệp, Trường ĐHSPKT Tp HCM, 2016 [6] Trần Thanh Sang, Trần Mạnh Hùng, “Thiết kế hệ thống nhận dạng biển số xe”, Đồ án tốt nghiệp, Trường ĐHSPKT Tp HCM, 2014 [7] Lê Dỗn Thắng, “Thiết kế thi cơng điều khiển máy chạy điện”, Đồ án tốt nghiệp, Trường ĐHSPKT Tp HCM, 2015 [8] T.Lê, ” Dùng webcam phân loại sản phẩm”, nld.com.vn, 8/2008 [9] Nguyễn Đình Phú, Nguyễn Trường Duy, “Giáo Trình: Kỹ Thuật Số”, Nhà xuất ĐH Quốc Gia Tp.HCM, 2013 [10] Trần Thu Hà, Trương Thị Bích Ngà, Nguyễn Thị Lưỡng, Bùi Thị Tuyết Đan, Phù Thị Ngọc Hiếu, Dương Thị Cẩm Tú, “Giáo Trình: Điện tử bản”, Nhà xuất ĐH Quốc Gia Tp.HCM, 2013 BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH 82 PHỤ LỤC CHƯƠNG TRÌNH VI ĐIỀU KHIỂN Hàm main.c #include "stm32f10x.h" GPIO_InitTypeDef TIM_TimeBaseInitTypeDef NVIC_InitTypeDef USART_InitTypeDef TIM_OCInitTypeDef TIM_BDTRInitTypeDef uint32_t uint32_t uint32_t float uint16_t uint8_t uint8_t uint8_t GPIO_InitStructure; TIM_TimeBaseInitStructure; NVIC_InitStructure; UART_InitStructure; TIM_OCInitStructure; TIM_BDTRInitStructure; encoder_pulse1=0; // khai bao bien doc encoder count_temp1=0, count_test=0; count_recent1 =0, count_update1=0; motor_speed1=0; data; fail; a[5]; number; void GPIO_Configuration(void); void Delay_ms(uint16_t time); void TIM4_TIME(void); // timer4 dem thoi gian toc void TIM1_PWM(void);// pwm dung timer1 dieu khien dong co void TIM2_ENCODER_Configuration(void);//doc gia tri encoder timer2,3 void UART_Configuration (void); //cau hinh cho UART void TIM3_SERVO(void); dung int main(void) { GPIO_Configuration(); UART_Configuration(); TIM4_TIME(); TIM1_PWM(); TIM2_ENCODER_Configuration(); TIM3_SERVO(); TIM_SetCompare2(TIM3,520); while (1) { if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==0)//tin hieu cam bien { if(USART_GetITStatus(USART2, USART_IT_TXE)== RESET) { Delay_ms(25); USART_SendData(USART2,0x64); } if(fail==1) { Delay_ms(1600); TIM_SetCompare2(TIM3,1400); Delay_ms(300); BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH 83 TIM_SetCompare2(TIM3,520); if(USART_GetITStatus(USART2,USART_IT_TXE)== RESET) USART_SendData(USART2,0x65); fail=0; } } } } void GPIO_Configuration(void) { /*Cap clock cho port*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin GPIO_Pin_1; GPIO_InitStructure.GPIO_Speed GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); } = = = = = = = = = void Delay_ms(uint16_t time) { uint32_t time_n=time*12000; while(time_n!=0){time_n ;} } /*Cấu hình giao tiếp UART*/ void UART_Configuration (void) BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH 84 { /*Cấp clock cho USART port A*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); /* Cấu hình chân TX RX*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; // chân TX UART2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //chân RX UART2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); /*Cau hinh USART*/ UART_InitStructure.USART_BaudRate = 9600; UART_InitStructure.USART_WordLength = USART_WordLength_8b; UART_InitStructure.USART_StopBits = USART_StopBits_1; UART_InitStructure.USART_Parity = USART_Parity_No; UART_InitStructure.USART_HardwareFlowControl= USART_HardwareFlowControl_None; UART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, &UART_InitStructure); /* Cấu hình ngắt UART */ NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_ClearFlag(USART2, USART_IT_RXNE); USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); /* Cho phep UART hoat dong */ USART_Cmd(USART2, ENABLE); } /*Cấu hình TIMER4 đếm thời gian*/ void TIM4_TIME(void) { RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM4 , ENABLE); /*cấu hình TIM4*/ TIM_TimeBaseInitStructure.TIM_Period = 99; // delay 10ms TIM_TimeBaseInitStructure.TIM_Prescaler = (7200 - 1);//1khz TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStructure); /* Cấu hình ngắt UART */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_ClearFlag(TIM4, TIM_FLAG_Update); BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH 85 TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); TIM_Cmd(TIM4, ENABLE); } /*Cấu hình PWM với TIMER1 điều khiển động cơ*/ void TIM1_PWM(void) { /*Cấp clock cho TIMER1 port A*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8| GPIO_Pin_9;// motor GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /*cấu hình TIM1*/ TIM_TimeBaseInitStructure.TIM_Prescaler =7; TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_Period = 899; TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure); /*Cấu hình PWM1*/ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; /*PWM Channel 1*/ TIM_OC1Init(TIM1, &TIM_OCInitStructure); TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1); TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable); /*PWM Channel 2*/ TIM_OC2Init(TIM1, &TIM_OCInitStructure); TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1); TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Enable); /*cho phép PWM_TIM1 hoạt động*/ TIM_Cmd(TIM1, ENABLE); TIM_CtrlPWMOutputs(TIM1, ENABLE); } /*Cấu hình TIMER2 đếm xung encoder*/ void TIM2_ENCODER_Configuration(void) { TIM_ICInitTypeDef TIM_ICInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); BỘ MÔN ĐIỆN TỬ CƠNG NGHIỆP- Y SINH 86 /* cấu hình TIM2*/ TIM_TimeBaseInitStructure.TIM_Prescaler=0; TIM_TimeBaseInitStructure.TIM_Period=0xFFFF; TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); TIM_ICInitStructure.TIM_Channel=TIM_Channel_1 | TIM_Channel_2; TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Falling; TIM_ICInitStructure.TIM_ICFilter=15; TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI; TIM_ICInit(TIM2, &TIM_ICInitStructure); TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Falling, TIM_ICPolarity_Falling); TIM_SetCounter(TIM2, 0); TIM_Cmd(TIM2, ENABLE); TIM_ClearFlag(TIM2, TIM_FLAG_Update); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } /*Cấu hình TIMER3 điều khiển Servo*/ void TIM3_SERVO(void) { /*Cấp xung clock cho TIMER3 port A*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; // servo GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /*Tao xung tan so 50hz dieu khien servo*/ TIM_TimeBaseInitStructure.TIM_Prescaler =99; TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_Period = 14399; TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure); /*Cấu hình PWM*/ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); /*PWM Channel 2*/ TIM_OC2Init(TIM3, &TIM_OCInitStructure); BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH 87 TIM_SelectOCxM(TIM3, TIM_Channel_2, TIM_OCMode_PWM1); TIM_CCxCmd(TIM3, TIM_Channel_2, TIM_CCx_Enable); TIM_Cmd(TIM3, ENABLE); TIM_CtrlPWMOutputs(TIM3, ENABLE); } Chương trình ngắt /* Hàm ngắt UART*/ void USART2_IRQHandler(void) { uint16_t data; if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) { data = USART_ReceiveData(USART2); if(data==0x61) // Start he thong chay- ki tu 'a' { GPIO_SetBits(GPIOA,GPIO_Pin_12); GPIO_SetBits(GPIOA,GPIO_Pin_11); TIM_SetCompare1(TIM1,170); TIM_SetCompare2(TIM1,150); } else if(data==0x62) // Stop he thong- ki tu 'b' { GPIO_ResetBits(GPIOA,GPIO_Pin_12); GPIO_ResetBits(GPIOA,GPIO_Pin_11); TIM_SetCompare1(TIM1,0); TIM_SetCompare2(TIM1,0); } else if(data==0x63)// co vat loi- ki tu 'c' { fail=1; } } } BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH 88 /* Hàm ngắt TIMER4*/ void TIM4_IRQHandler(void) { if (TIM_GetFlagStatus(TIM4, TIM_FLAG_Update)==SET) { TIM_ClearFlag(TIM4, TIM_FLAG_Update); encoder_pulse1 = 500000000 + TIM_GetCounter(TIM2) + 65536*count_temp1; count_recent1 = encoder_pulse1; if (count_recent1 > count_update1) {motor_speed1 = (float)(count_recent1 – count_update1)*6000/100;} else if (count_recent1 < count_update1) {motor_speed1 = 0- (float)(count_update1 – count_recent1)*6000/100;} else {motor_speed1 = 0;} count_update1 = count_recent1; } } /* Hàm ngắt TIMER2*/ void TIM2_IRQHandler(void) { uint16_t timer_temp1; if (TIM_GetFlagStatus(TIM2, TIM_FLAG_Update)==SET) { TIM_ClearFlag(TIM2, TIM_FLAG_Update); timer_temp1 = TIM2->CNT; if (timer_temp1 == 65535) count_temp1 ; if (timer_temp1 == 0) count_temp1++; } } BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH 89 CHƯƠNG TRÌNH XỬ LÝ ẢNH Hàm nhận liệu void MainWindow::readData() { const QByteArray data = m_serial->readAll(); if (data.size() == 0) { qDebug() dataGet->insertPlainText(QString(data.at(i))); } } const char* t = strstr(data, "d"); if(t != nullptr) { m_ui-> dataSend-> insertPlainText("ok"); flag=true; } const char* r = strstr(data, "e"); if(r != nullptr) fail++; } } Chương trình void MainWindow::on_StartBtn_clicked() { using namespace cv; using namespace std; if(video.isOpened()) { m_ui->StartBtn->setText("Start"); video.release(); writeData("b"); return; } if(!video.open(1)) { QMessageBox::critical(this,"Camera Lỗi"); return; } BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH 90 m_ui->StartBtn->setText("Stop"); writeData("a"); Mat frame,img; Mat canny_output; while(video.isOpened()) { video >> frame; if(!frame.empty()) { cvtColor(frame,frame,CV_RGB2GRAY); QImage qimg(frame.data,frame.cols,frame.rows, QImage::Format_Indexed8); pixmap.setPixmap( QPixmap::fromImage(qimg)); m_ui->IMG_1->fitInView(&pixmap, Qt::KeepAspectRatio); Mat threshold_output; vector contours; vector hierarchy; if(flag==1) { QTime ct = QTime::currentTime(); QString fileName=("G:/DATotNgiep/capture/Anh_"+ ct.toString("hh-mm-ss")+".jpg"); GaussianBlur(frame,img,Size(3, 3), 2); //loc anh threshold(img,threshold_output, m_SettingSystem.Thresh,255,THRESH_BINARY); findContours( threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0,0)); // Draw contours vector contours_poly(contours.size()); vectorcenter(contours.size()); vectorradius(contours.size()); for(unsigned int i=0;i 1000) && (contourArea(contours[i]) < 8000)) { drawContours(drawing, contours_poly, int(i), Scalar(255,0,255), 3, 8, vector(), 0, Point()); circle(drawing, center[i], int(radius[i]), Scalar(255,255,255), 2, 8, 0); if (max < radius[i]) max = radius[i]; BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH 91 } } if(max45) { writeData("c"); m_ui->lbl_Capture-> setText("FAIL"); } else if(max>63) { writeData("d"); m_ui->lbl_Capture-> setText("PASS"); } QImage imdisplay(drawing.data, drawing.cols, drawing.rows, QImage::Format_RGB888); m_ui->lEd_NumberFalse->setText(QString("%1").arg(fail)); pixmap2.setPixmap( QPixmap::fromImage(imdisplay)); m_ui->IMG_2->fitInView(&pixmap2, Qt::KeepAspectRatio); flag=false; } void MainWindow::on_Thresh_slider_valueChanged(int value) { m_ui-> lbl_Thresh_Value-> setText(QString("%1").arg(value)); m_SettingSystem.Thresh=value; } BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH 92 ... 15141DT2C I TÊN ĐỀ TÀI: THI T KẾ VÀ THI CÔNG DÂY CHUYỀN PHÂN LOẠI ĐAI ỐC ỨNG DỤNG XỬ LÝ ẢNH II NHIỆM VỤ Các số liệu ban đầu: Mơ hình dây chuyền phân loại đai ốc ứng dụng xử lý ảnh sử dụng động DC 12V,... nhóm định thực đề tài Thi t kế thi công dây chuyền phân loại đai ốc ứng dụng xử lý ảnh , mô hình phân loại sản phẩm Hoạt động mơ hình dựa ngun lý xử lý tín hiệu số (hình ảnh) với ngơn ngữ lập... SỞ LÝ THUYẾT Giới thi u sở lý thuyết gồm lý thuyết xử lý ảnh, linh kiện thi t bị sử dụng để thi t kế hệ thống trình bày chuẩn truyền, giao thức Chương 3: TÍNH TỐN VÀ THI T KẾ HỆ THỐNG Thi t kế