Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 116 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
116
Dung lượng
21,82 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH ĐỒ ÁN TỐT NGHIỆP NGÀNH CÔNG NGHỆ KỸ THUẬT ĐIỆN TỬ TRUYỀN THÔNG THIẾT KẾ VÀ THI CÔNG DÂY CHUYỀN PHÂN LOẠI ĐAI ỐC ỨNG DỤNG XỬ LÝ ẢNH GVHD: VÕ ĐỨC DŨNG SVTH: NGUYỄN VĂN TÀI 15141273 NGUYỄN MINH ĐỨC 15141135 SKL006081 Tp Hồ Chí Minh, tháng 6/2019 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 NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP Họ tên sinh viên: Chuyên ngành: Hệ đào tạo: Khóa: 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 LỊCH TRÌNH THỰC HIỆN ĐỒ ÁN TỐT NGHIỆP Họ tên sinh viên 1: 15141135 Nguyễn Minh Đức Lớp: 15141DT2C MSSV: Họ tên sinh viên 2: 15141273 Nguyễn Văn Tài Lớp: 15141DT2C MSSV: 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 Tuần (18/02 - 24/02) Tuần (25/02 - 03/03) Tuần (04/03 - 10/03) Tuần (11/03 - 17/03) Tuần (18/03 - 24/03) Tuần - (25/03 - 07/04) ii Tuần (08/04 - 14/04) Tuần - 10 (15/04 - 28/04) Tuần 11 (29/04 - 05/05) Tuần 12 – 13 (06/05 - 19/05) Tuần 14 (20/05- 26/05) Tuần 15 (27/05 - 02/06) 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, 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 ln 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 khơng thể tránh cịn 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 in 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 LỜI CAM ĐOAN LỜI CẢM ƠN LIỆT KÊ HÌNH LIỆT KÊ BẢNG TÓM TẮT 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 n 2.2 TÌM ĐƯỜNG BIÊN CỦA ẢNH 2.3 GIAO TIẾP UART 2.4 VI ĐIỀU KHIỂN STM32F103C8T6 2.4.1 Tổng 2.4.2.Cấu trúc hệ thống 2.4.3 Tìm h 2.4.4 Time 2.5 ĐỘNG CƠ DC 2.6 ENCODER 2.7 CẢM BIẾN HỒNG NGOẠI Chương TÍNH TỐN VÀ THIẾT KẾ HỆ THỐNG 3.1 THIẾT KẾ SƠ ĐỒ KHỐI 3.2 TÍNH TỐN THIẾT KẾ MẠCH 3.2.1.Khối vi điều khiển giao tiếp máy tính vi 3.2.2.Khối cảm biến encoder gạt Các đai ốc đạt yêu cầu qua Servo tới gạt lắp sau Servo, Hình Các hình chụp lưu lại thư mục đai ốc bị gạt khỏi đĩa quay Như hai loại ốc phân loại riêng biệt 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 yê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ĩ BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH Biết cách lập trình phần mềm ứng dụng có giao diện QT Creator Qua q 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 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 hoàn thành hoạt động cịn 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ĩ cịn nhiều chi tiết chưa tốt BỘ MƠN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH 87 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 cịn 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 hồ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 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ê Doã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 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 GPIO_InitStructure; TIM_TimeBaseInitStructure; NVIC_InitStructure; UART_InitStructure; TIM_OCInitStructure; TIM_BDTRInitStructure; uint32_t encoder_pulse1=0; // khai bao bien doc encoder uint32_t count_temp1=0, count_test=0; uint32_t count_recent1 =0, count_update1=0; float motor_speed1=0; uint16_t data; uint8_t fail; uint8_t a[5]; uint8_t 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 dung timer2,3 void UART_Configuration (void); //cau hinh cho UART void TIM3_SERVO(void); 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) { BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH Delay_ms(25); USART_SendData(USART2,0x64); } if(fail==1) { Delay_ms(1600); TIM_SetCompare2(TIM3,1400); Delay_ms(300); 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) { /*Cấp clock cho USART port A*/ BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH 91 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); TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH 92 } 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); /* cấu hình TIM2*/ BỘ MƠN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH 93 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); TIM_SelectOCxM(TIM3, TIM_Channel_2, TIM_OCMode_PWM1); TIM_CCxCmd(TIM3, TIM_Channel_2, TIM_CCx_Enable); BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH 94 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; } } } /* Hàm ngắt TIMER4*/ BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH 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++; } } CHƯƠNG TRÌNH XỬ LÝ ẢNH BỘ MƠN ĐIỆN TỬ CƠNG NGHIỆP- Y SINH 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; } m_ui->StartBtn->setText("Stop"); BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP- Y SINH 97 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 98 } } 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 99 ... 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:... ĐỒ ÁN TỐT NGHIỆP Họ tên sinh viên: Chuyên ngành: Hệ đào tạo: Khóa: 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. .. 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ế