Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 91 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
91
Dung lượng
3,58 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.HCM KHOA ĐÀO TẠO CHẤT LƯỢNG CAO ĐỒ ÁN TỐT NGHIỆP NGÀNH CÔNG NGHỆ KỸ THUẬT MÁY TÍNH THIẾT KẾ VÀ THI CƠNG MƠ HÌNH XE TỰ ĐỘNG VỆ SINH GVHD: ThS HUỲNH HOÀNG HÀ SVTH : LÊ ĐÌNH TÍN MSSV : 12119131 SVTH : LÊ TRẦN THIỆN MINH MSSV : 12119018 SKL 0 8 Tp Hồ Chí Minh, tháng năm 2016 an TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HỒ CHÍ MINH KHOA ĐÀO TẠO CHẤT LƯỢNG CAO ĐỒ ÁN TỐT NGHIỆP THIẾT KẾ VÀ THI CƠNG MƠ HÌNH XE TỰ ĐỘNG VỆ SINH SVTH : LÊ ĐÌNH TÍN MSSV : 12119131 SVTH : LÊ TRẦN THIỆN MINH MSSV : 12119018 Khóa : 2012 Ngành : CƠNG NGHỆ KỸ THUẬT MÁY TÍNH GVHD: ThS HUỲNH HỒNG HÀ TP HỒ CHÍ MINH – 07/2016 an CỘNG HỊA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự – Hạnh phúc *** -Tp Hồ Chí Minh, ngày - tháng - năm 2016 NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP Họ tên sinh viên: Lê Đình Tín MSSV: 12119131 Họ tên sinh viên: Lê Trần Thiện Minh MSSV: 12119018 Lớp: 12119CLC Ngành: Công Nghệ Kỹ Thuật Máy Tính ĐT: THIẾT KẾ VÀ THI Giảng viên hướng dẫn: ThS Huỳnh Hồng Hà CƠNG MƠ HÌNH XE TỰ ĐỘNG VỆ SINH Ngày nhận đề tài: 1/2016 Ngày nộp đề tài: 7/2016 Tên đề tài: THIẾT KẾ VÀ THI CƠNG MƠ HÌNH XE TỰ ĐỘNG VỆ SINH Các số liệu, tài liệu ban đầu: Ý tưởng thiết kế xe tự hành điều khiển qua máy tính Nội dung thực đề tài: Thiết kế xe tự hành tự chỉnh hướng ổn định thực chức hút/qt bụi, có giao tiếp máy tính Sản phẩm: Hệ thống xe tự hành, tự chỉnh hướng bị lệch, giao tiếp máy tính TRƯỞNG NGÀNH GIẢNG VIÊN HƯỚNG DẪN an CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự – Hạnh Phúc ******* PHIẾU NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN Họ tên Sinh viên: MSSV: Họ tên Sinh viên: MSSV: Ngành: Tên đề tài: Họ tên Giáo viên hướng dẫn: NHẬN XÉT Về nội dung đề tài & khối lượng thực hiện: Ưu điểm: Khuyết điểm: Đề nghị cho bảo vệ hay không? an Đánh giá loại: Điểm:……………….(Bằng chữ: ) Tp Hồ Chí Minh, ngày tháng năm 20… Giáo viên hướng dẫn (Ký & ghi rõ họ tên) an CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự – Hạnh Phúc ******* PHIẾU NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN Họ tên Sinh viên: MSSV: Họ tên Sinh viên: MSSV: Ngành: Tên đề tài: Họ tên Giáo viên phản biện: NHẬN XÉT Về nội dung đề tài & khối lượng thực hiện: Ưu điểm: Khuyết điểm: Đề nghị cho bảo vệ hay không? an Đánh giá loại: Điểm:……………….(Bằng chữ: ) Tp Hồ Chí Minh, ngày Giáo viên phản biện (Ký & ghi rõ họ tên) an tháng năm 20… LỜI CẢM ƠN Trong suốt thời gian từ bắt đầu thực đồ án mơn học đến nay, nhóm nhận nhiều quan tâm, giúp đỡ quý Thầy Cô Với lòng biết ơn sâu sắc, chúng em xin gửi đến quý Thầy Cô Khoa Đào Tạo Chất Lượng Cao quý Thầy Cô Khoa Điện – Điẹn Tử khoa Đào tạo chất lượng cao Trường Đại Học Sư Phạm Kỹ Thuật Thành Phố Hồ Chí Minh với tri thức, tâm huyết để truyền đạt vốn kiến thức quý báu cho chúng em suốt thời gian qua Chúng em xin chân thành cảm ơn Thầy Huỳnh Hoàng Hà trực tiếp hướng dẫn, tận tâm truyền đạt kiến thức, kinh nghiệm cho chúng em qua buổi học buổi báo cáo, thảo luận Hơn hết, Thầy hỗ trợ, góp ý, giúp nhóm hồn thiện đề tài, đạt mục tiêu ban đầu, trang bị cho chúng em kiến thức bản, hướng dẫn chúng em tiếp cận với vi điều khiển Bước đầu vào thực tế, tìm hiểu lĩnh vực sáng tạo nghiên cứu khoa học, kiến thức chúng em nhiều hạn chế bỡ ngỡ Do vậy, tránh khỏi thiếu sót, nhóm mong nhận ý kiến đóng góp q báu Thầy Cơ để chúng em tiếp thu, rút kinh nghiệm cho tương lai Sau cùng, chúng em xin kính chúc q Thầy Cơ thật dồi sức khỏe, niềm tin để tiếp tục thực sứ mệnh cao đẹp truyền đạt kiến thức cho hệ mai sau i an LỜI NÓI ĐẦU Ngày nay, với bùng nổ ngành công nghệ thông tin, điện tử,… làm cho đời sống người ngày hoàn thiện Các thiết bị tự động hóa ngày xâm lấn vào nhiều lĩnh vực: sản xuất, công nghiệp chí vào sống sinh hoạt ngày người Do hệ thống xe tự động vệ sinh khơng cịn mơ ước, xe tự động vệ sinh nhiều nhà sản xuất thực hóa Nhiều mơ hình đời Hịa vào xu hướng chung thời đại, đề tài đồ án tốt nghiệp “” đời Nước ta tiến tới trở thành nước cơng nghiệp hóa đại hóa, việc thiết kế hộ thống xe tự hành nhằm mục đích tự động hố giúp giảm thời gian, công sức tài nguyên trở thành xu Việc nghiên cứu sử dụng cảm biến la bàn số HMC5883L Việt Nam tương đối mẻ chưa vào thực tiễn ứng dụng Hầu hết nghiên cứu nghiên cứu tự phát cá nhân chưa phải hoạt động nghiên cứu chuyên nghiệp để đưa vào ứng dụng Việc tập đoàn nước lẫn nước đầu tư mạnh vào cơng nghiệp nước ta, tảng, lợi cho việc nghiên cứu phát triển ứng dụng ii an MỤC LỤC CHƯƠNG GIỚI THIỆU 1.1 Tình hình nghiên cứu nay: 1.2 Mục tiêu đề tài: 1.3 Phương pháp nghiên cứu: 1.4 Đối tượng phạm vi nghiên cứu: 1.5 Bố cục đồ án: .2 CHƯƠNG CƠ SỞ LÝ THUYẾT LIÊN QUAN .3 2.1 Giới thiệu chung ARM 2.2 Giới thiệu dòng STM32: .3 2.3 Giới thiệu ARM Cortex M3 STM32F103 2.4 Giới thiệu Timer 2.5 Giới thiệu I2C 2.6 Giới thiệu UART .11 2.7 Giới thiệu cảm biến quang phản xạ 13 2.8 Giới thiệu mạch cầu H L298 15 2.9 Giới thiệu Động DC giảm tốc .19 2.10 Giới thiệu Encoder 20 2.11 Giới thiệu Module giao tiếp rf HC-11 22 2.12 Giới thiệu Cảm biến La bàn số HMC5883L 25 2.13 Giới thiệu Relay đóng ngắt 27 2.14 Giới thiệu Nguồn cung cấp 30 CHƯƠNG THIẾT KẾ PHẦN CỨNG VÀ PHẦN MỀM .33 3.1 Sơ đồ khối hệ thống 33 3.1.1 Yêu cầu hệ thống 33 3.1.2 Hoạt động hệ thống 34 3.2 Thiết kế, tính tốn hệ thống .34 3.2.1 Khối 1: Khối nguồn 34 iii an if((TIM3->CR1)&0x10) // true = giam total_pluse_left -= 1; else total_pluse_left += 1; old_pluse_left=new_pluse_left; } if(new_pluse_right-old_pluse_right!=0) { if((TIM4->CR1)&0x10) // true = giam total_pluse_right -= 1; else total_pluse_right += 1; old_pluse_right=new_pluse_right; } } void fix_degree() { if ((HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4)==0)) { // Bouncing has started so increment BTN_press with 1, for each "high" bounce BTN_press2++; cc=!cc; // "reset" BTN_release BTN_release2 = 0; // If it bounces so much that BTN_press is greater than Bouncevalue // then button must be pressed if (BTN_press2> Bouncevalue2) { 64 an // This is initial value of BTN_pressed // If program gets here, button must be pressed if (BTN_pressed2 == 0) { allow_read_deg++; BTN_pressed2 = 1; } // LEDs toggled, set BTN_pressed to 0, so we can enter // toggle code block again BTN_press2 = 0; } } else { // Increment the "low" in the bouncing BTN_release2++; BTN_press2 = 0; // If BTN_release is greater than Bouncevalue, we not have a // pressed button if (BTN_release2 > Bouncevalue2) { BTN_pressed2 = 0; BTN_release2 = 0; } } } void read_step() { if ((HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2)==0)) 65 an { // Bouncing has started so increment BTN_press with 1, for each "high" bounce BTN_press++; // "reset" BTN_release BTN_release = 0; // If it bounces so much that BTN_press is greater than Bouncevalue // then button must be pressed if (BTN_press > Bouncevalue) { // This is initial value of BTN_pressed // If program gets here, button must be pressed if (BTN_pressed == 0) { step_to_run++; BTN_pressed = 1; } // LEDs toggled, set BTN_pressed to 0, so we can enter // toggle code block again BTN_press = 0; } } else { // Increment the "low" in the bouncing BTN_release++; BTN_press = 0; // If BTN_release is greater than Bouncevalue, we not have a // pressed button 66 an if (BTN_release > Bouncevalue) { BTN_pressed = 0; BTN_release = 0; } } } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { HAL_UART_Receive_IT(&huart1, Rx_data, 1); //Kich hoat UART nhan du lieu ngat moi luc Rx_Buffer[count_rx++]=Rx_data[0]; if(count_rx>14){count_rx=0;Transfer_cplt=1;} } void process_data() { int32_t temp; if(Rx_Buffer[0]=='*'&&Rx_Buffer[14]=='#') { temp=(Rx_Buffer[1]-48)*1000+(Rx_Buffer[2]-48)*100+(Rx_Buffer[3]48)*10+(Rx_Buffer[4]-48); Speed=temp;temp=0; printf("Speed: %d \n",Speed); temp=(Rx_Buffer[5]-48)*10+(Rx_Buffer[6]-48); run_time=(uint8_t)temp;temp=0; printf("Run time: %d \n",run_time); temp=(Rx_Buffer[7]-48); left_motor.Kp=temp;temp=0; 67 an printf("left_motor.Kp: %d \n",left_motor.Kp); temp=(Rx_Buffer[8]-48); left_motor.Ki=temp;temp=0; printf("left_motor.Ki: %d \n",left_motor.Ki); temp=(Rx_Buffer[9]-48); left_motor.Kd=temp;temp=0; printf("left_motor.Kd: %d \n",left_motor.Kd); temp=(Rx_Buffer[10]-48); right_motor.Kp=temp;temp=0; printf("right_motor.Kd: %d \n",right_motor.Kp); temp=(Rx_Buffer[11]-48); right_motor.Ki=temp;temp=0; printf("right_motor.Kd: %d \n",right_motor.Ki); temp=(Rx_Buffer[12]-48); right_motor.Kd=temp;temp=0; printf("right_motor.Kd: %d \n",right_motor.Kd); temp=(uint8_t)(Rx_Buffer[13]-48); if(temp==1) { printf("Command: RUN\n"); step_to_run=1; } else { printf("Command: Stop\n"); step_to_run=0; } 68 an } } void run3() { new_time=millis(); switch (step_to_run)// biến chạy { case 0:// trạng thái chờ { Motor_Speed_PID(0,0); break; } case 1: { step1(0); if(step_by_step1_finish==1) { Motor_Speed_PID(0,0); HAL_Delay(500); step_to_run++; step_by_step1=0; step_by_step1_finish=0; } break; } case 2: { step2(0); break; 69 an } case 3: { Motor_Speed_PID(0,0); SP=total_pluse_right+60000; step_to_run++; break; } case 4: { new_time=millis(); if(new_time-old_time>25) { Motor_position_PID(SP,total_pluse_right,1); old_time=new_time; } if(total_pluse_right>SP) { step_to_run++; } break; } case 5: { step1(1); if(step_by_step1_finish==1) { 70 an Motor_Speed_PID(0,0); HAL_Delay(500); step_to_run++; step_by_step1=0; step_by_step1_finish=0; } break; } case 6: { step2(1); break; } case 7: { Motor_Speed_PID(0,0); HAL_Delay(100); SP=total_pluse_left+60000; step_to_run++; break; } case 8: { new_time=millis(); if(new_time-old_time>25) { Motor_position_PID(SP,total_pluse_left,0); old_time=new_time; 71 an } if(total_pluse_left>SP){step_to_run++;} break; } case 9: { step1(0); if(step_by_step1_finish==1) { Motor_Speed_PID(0,0); HAL_Delay(500); step_to_run++; step_by_step1=0; flag_next=1; step_by_step1_finish=0; } break; } case 10: { Motor_Speed_PID(0,0); HAL_Delay(100); step_to_run++; break; } case 11: { 72 an if(run_time>0) { total_pluse_left=total_pluse_right=0; SP=0; step_to_run=2; run_time ; } else { Motor_Speed_PID(0,0); run_time=0; } break; } case 12: { Motor_Speed_PID(0,0); break; } default:break; } } void step1(uint8_t dir) { switch (step_by_step1)// biến chạy { case 0: 73 an { Motor_Speed_PID(0,0); step_by_step1++; break; } case 1:// lấy góc để chuẩn bị sửa sai lần chạy { now_deg=HMC5883L_heading(); abs_now_deg=(int32_t)now_deg; fix_err=0; if(dir==0) { deg_err=abs_now_deg-abs_setpoint; } else if(dir==1) { deg_err=abs_now_deg-abs_setpoint+150; } deg_err=deg_err*290;//~45000/150 fix_err=(int32_t)deg_err; step_by_step1++; break; } case 2://tính tốn góc xoay { Motor_Speed_PID(0,0); if(deg_err>0) { 74 an SP=total_pluse_right+fix_err; } else { SP=total_pluse_left-fix_err+1340; } step_by_step1++; break; } case 3:// bắt đầu xoay { if(new_time-old_time>25) { if(deg_err>0) { Motor_position_PID(SP,total_pluse_right,1); if(total_pluse_right>SP) { step_by_step1_finish=1; } } else { Motor_position_PID(SP,total_pluse_left,0); if(total_pluse_left>SP) { step_by_step1_finish=1; 75 an } } old_time=new_time; } } default:break; } } void step2(uint8_t dir) { new_time=millis(); if(new_time-old_time>25) { cc++; if(cc