TRƯỜNG ĐẠI HỌC LÂM NGHIỆP KHOA CƠ ĐIỆN VÀ CÔNG TRÌNH BỘ MƠN KỸ THUẬT ĐIỆN TỬ & TỰ ĐỘNG HÓA - KHÓA LUẬN TỐT NGHIỆP NGHIÊN CỨU, VIẾT CHƯƠNG TRÌNH ĐIỀU KHIỂN CHO MƠ HÌNH ROBOT ĐIỀU KHIỂN BẰNG SÓNG RF SỬ DỤNG IC PIC 18F46K22 NGÀNH : CÔNG NGHỆ KỸ THUẬT CƠ ĐIỆN TỬ MÃ NGÀNH: 7510203 Giáo viên hướng dẫn : ThS Lê Minh Đức Sinh viên thực : Vũ Viết Phong Mã sinh viên : 1851070038 Lớp : K63 - CĐT Khóa học : 2018 - 2022 Hà Nội - 2022 LỜI NÓI ĐẦU Từ công nghiệp đời, người đã được giải phóng khỏi lao động chân tay rất nhiều Bên cạnh đó, sản phẩm làm được tăng lên đáng kể về số lượng và chất lượng được ổn định Đây chính là một bước ngoặt lớn thứ hai nền sản xuất hàng hóa của người Con người giờ đây thật sự được giải phóng khỏi lao động chân tay hay những lao động các môi trường độc hại Khi điện tử đời thì tự động hóa công nghiệp ngày càng được hoàn thiện hơn Cho đến thì sản xuất công nghiệp không chỉ ở mức tự động hóa cao mà nó còn được điều khiển, giám sát từ xa thông qua máy tính và các phần mềm giao tiếp người máy Vì vậy với mong muốn tìm hiểu có phần cứng em đã quyết định chọn đề tài “Nghiên cứu, viết chương trình điều khiển cho mơ hình Robot điều khiển sóng RF sử dụng IC PIC 18F46K22” Khóa luận tốt nghiệp của em gồm chương: Chương 1: Giới thiệu chung Chương 2: Cơ sở lí thuyết Chương 3: Lập trình điều khiển cho Robot Chương 4: Vận hành thử nghiệm Kết thúc thời gian được giao để hoàn thành khóa luận, một số kiến thức còn hạn hẹp và đặc biệt với được sự giúp đỡ tận tình của anh Phạm Hồng Dương giám đốc Công Ty Điện Tử Anh Việt và thầy Ths.Lê Minh Đức, em đã hoàn thành thời hạn khóa luận Do thời gian có hạn, và kiến thức còn hạn chế nên đề tài không thể tránh khỏi những thiếu sót Em rất mong nhận được sự đóng góp ý kiến của các thầy cô để đề tài khóa luận này được hoàn thiện hơn Em xin chân thành cảm ơn thầy giáo ThS.Lê Minh Đức, các thầy cô giáo bộ môn kỹ thuật điện và tự động hóa Trường Đại Học Lâm Nghiệp Việt Nam đã tạo điều kiện giúp đỡ em thời gian thực hiện đề tài tốt nghiệp Hà Nội, ngày tháng năm 2022 SINH VIÊN THỰC HIỆN Vũ Viết Phong i NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN Họ và tên sinh viên: Mã sinh viên: Lớp: Kết luận: Đồng ý/Không đồng ý cho sinh viên… ………nộp báo cáo khóa luận tốt nghiệp Hà Nội, ngày…… tháng……năm…… GIÁO VIÊN HƯỚNG DẪN (Chữ ký, Họ tên) ii NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN Họ tên sinh viên: Mã sinh viên: Lớp: GIÁO VIÊN PHẢN BIỆN (Chữ ký, Họ tên) iii MỤC LỤC LỜI NÓI ĐẦU i MỤC LỤC iv DANH MỤC CÁC BẢNG BIỂU v DANH MỤC CÁC HÌNH VẼ vi CHƯƠNG 1: GIỚI THIỆU CHUNG 1.1 Giới thiệu chung về Robot 1.2 Phân loại Robot 1.3 Công dụng của Robot 1.4 Giới thiệu về điều khiển Robot sóng NRF24L01 1.5 Một số loại Robot trên thị trường 1.6 Một số dạng thông tin điều khiển robot CHƯƠNG 2: CƠ SỞ LÍ THUYẾT 2.1 Nguyên lí điều khiển Robot 2.1.1 Sử dụng vi điều khiển để điều khiển Robot 2.1.2 Sử dụng bộ thu phát Module Dò Đường - Cặp Phát Hồng Ngoại dẫn đường cho Robo 2.1.3 Sử dụng module cảm biến ánh sáng để nhận biết vật cản (Cảm biến hồng ngoại TCRT5000) 2.2 Thu phát sóng NRF24L01 2.3 Truyền dữ liệu NRF24L01 2.4 Sơ đồ mạch điều khiển CHƯƠNG 3: LẬP TRÌNH ĐIỀU KHIỂN CHO ROBOT 11 3.1 Cơ sở lý thuyết lập trình 11 3.1.1 Ngôn ngữ lập trình 11 3.1.2 Giới thiệu về các phần mềm 13 3.1.3 Cấu trúc chương trình cơ bản trên MPLAP 15 3.2 Thuật toán điều khiển Robot 16 3.2.1 Thuật toán 16 3.2.2 Lý thuyết điều khiển 17 3.2.3 Cơ sở dữ liệu 19 CHƯƠNG 4: VẬN HÀNH THỬ NGHIỆM 20 4.1 Quá trình vận hành 20 4.2 Kết quả thu được 22 KẾT LUẬN, KIẾN NGHỊ 25 PHỤ LỤC TÀI LIỆU THAM KHẢO iv DANH MỤC CÁC BẢNG BIỂU Bảng 3.1: Cơ sở dữ liệu 19 Bảng 4.1 Phím điều khiển Robot chạy tay 23 Bảng 4.2 Phím điều khiển Robot chạy tự động 23 v DANH MỤC CÁC HÌNH VẼ Hình 2.1: Dò Đường - Cặp Phát Hồng Ngoại dẫn đường cho Robot Hình 2.2: Cảm biến hồng ngoại TCRT5000 Hình 2.3: Sơ đồ khối Hình 2.4: Sơ đồ nguyên lý Hình 2.5: Sơ đồ chân NRF24L01 Hình 2.6: Thiết kế mạch điều khiển Hình 2.7: Mắc nối dây mô phỏng 10 Hình 3.1: Hợp ngữ của MPLAP 12 Hình 3.2: File ngôn ngữ C++ của MPLAP 13 Hình 3.3: Phần mêm MPLAP XIDE 13 Hình 3.4: Phần mềm MPLAP XC8 14 Hình 3.5: Phần mềm MCC 14 Hình 3.6: Lưu đồ thuật toán 16 Hình 3.7: Sa hình xưởng 18 Hình 4.1: Bộ nạp PICKIT3 20 Hình 4.2: Sau dịch chương trình thành công 20 Hình 4.3: Cấu hình cho trình biên dịch Project 21 Hình 4.4: Chọn đường chuyền 21 Hình 4.5: Bàn phím HMI điều khiển Robot chạy tay 22 Hình 4.6: Bàn phím HMI điều khiển Robot chạy Tự động 23 vi CHƯƠNG 1: GIỚI THIỆU CHUNG 1.1 Giới thiệu chung Robot Robot là một cỗ máy đặc có khả năng thực hiện một loạt các hành động phức tạp một cách tự động Robot có thể được dẫn đường thiết bị điều khiển bên ngoài (ray trượt, vít me) hoặc điều khiển có thể được nhúng bên (động cơ, bánh xe, xích di chuyển…) Robot có thể được chế tạo để gợi lên hình dáng người, nhưng hầu hết các robot là những cỗ máy thực hiện nhiệm vụ, được thiết kế với trọng tâm là chức năng rõ ràng, hơn là thẩm mỹ bên ngoài Nhánh công nghệ liên quan đến thiết kế, xây dựng, vận hành và ứng dụng robot, như các hệ thống máy tính để điều khiển, phản hồi cảm giác và xử lý thông tin là robot Những công nghệ này xử lý các máy móc tự động có thể thay thế người môi trường nguy hiểm hoặc quy trình sản xuất hoặc giống người về ngoại hình, hành vi hoặc nhận thức Nhiều robot ngày được lấy cảm hứng từ thiên nhiên đóng góp vào lĩnh vực robot lấy cảm hứng từ sinh học Những robot này đã tạo một nhánh robot mới hơn Từ rất lâu, đã có rất nhiều các thiết bị tự động có thể định cấu hình của người dùng và thậm chí là các ô tô tự động giống người và các loài động vật khác, được thiết kế chủ yếu để giải trí Khi kỹ thuật cơ khí phát triển qua thời đại công nghiệp, đã xuất hiện nhiều ứng dụng thực tế hơn như máy móc tự động, điều khiển từ xa và điều khiển từ xa không dây Thuật ngữ này xuất phát từ một gốc Slavic, robot, với các ý nghĩa liên quan đến lao động Từ ‘robot’ lần đầu tiên được sử dụng để biểu thị một hình người hư cấu vở kịch tiếng Séc năm 1920 RUR (Rossumovi Univerzální Roboti – Rossum’s Universal Roboti) của Karel Čapek, mặc dù anh trai của Karel là Josef Čapek mới là người phát minh từ này Điện tử phát triển thành động lực của sự phát triển với sự đời của robot tự động điện tử đầu tiên được tạo bởi William Grey Walter ở Bristol, Anh vào năm 1948, như máy công cụ Máy tính Điều khiển Số (CNC) cuối những năm 1940 bởi John T Parsons Frank L Stulen Robot kỹ thuật số và có thể lập trình hiện đại đầu tiên được phát minh bởi George Devol vào năm 1954 và sinh công ty robot Unimation của ông Chiếc Unimate đầu tiên được bán cho General Motors vào năm 1961, nơi nó nâng các mảnh kim loại nóng từ máy đúc khuôn tại Nhà máy Inland Fisher Guide ở khu vực West Trenton của Ewing Township, New Jersey Robot đã thay thế người việc thực hiện các nhiệm vụ lặp lặp lại và nguy hiểm mà người không muốn làm hoặc không thể làm vì giới hạn kích thước hoặc diễn môi trường khắc nghiệt như ngoài không gian hoặc dưới đáy biển Có những lo ngại về việc sử dụng ngày càng nhiều robot và vai trò của chúng xã hội Robot được cho là nguyên nhân dẫn đến tình trạng thất nghiệp công nghệ gia tăng chúng thay thế công nhân số lượng chức năng ngày càng tăng 1.2 Phân loại Robot - Robot sử dụng ngành sản xuất oto xe máy – Automotive Industry - Robot sử dụng gia công cơ khí - Robot sử dụng ngành dược phẩm, y tế - Robot sử dụng ngành hóa chất - Robot sử dụng ngành công nghiệp gỗ - Robot sử dụng ngành chế tạo linh kiện điện tử 1.3 Cơng dụng Robot * Những lợi ích sử dụng robot: Việc sử dụng robot trở thành xu thế, chúng không chỉ được ứng dụng công nghiệp mà còn cả đời sống Tuy nhiên đa số các lợi ích này đều được thấy từ việc sử dụng robot tại các doanh nghiệp lớn a Giảm chi phí vận hành Sử dụng robot từ lâu đã trở thành xu thế thế giới hiện đại, nhất là công nghệ 4.0 ngày càng được đẩy mạnh Sử dụng robot dây truyền sản xuất giúp giảm chi phí vận hành Chất lượng sản xuất ổn định từ đó nâng cao khả năng cạnh tranh Chưa kể các sản phẩm hư hỏng được giảm thiểu từ những sản phẩm đầu tiên, vì vậy giảm bớt các sản phẩm hư hỏng, giảm chi phí nguyên liệu Ngoài việc giảm thiểu về cắt giảm chi phí lao động, ứng dụng robot còn giúp giảm thiểu chi phí đào tạo, sức khỏe an toàn như quản lý nhân công… b Nâng cao hiệu sản xuất Công dụng của robot còn là khả năng tạo sự đồng đều của sản phẩm Robot được thiết kế và sản xuất với các thiết lập cài đặt luôn sẵn sàng Nhờ đó mà chúng có thể tạo sự đồng nhất của sản phẩm Không ảnh hưởng bởi sự mệt mỏi, nhãng hay bị ảnh hưởng bởi các công việc lặp lại và buồn tẻ Sự chính xác và các thiết lập sẵn có tạo nên tính ổn định của sản phẩm từ đó nâng cao chất lượng c Khả làm việc hiệu công nhân Ứng dụng robot giúp nâng cao điều kiện, cải thiện môi trường làm việc của công nhân, họ không phải làm việc các môi trường bụi bẩn, nóng hay nguy hiểm Chỉ cần đào tạo các kỹ năng quản lý và thể lập trình robot để công việc có thể hoàn thành hiệu quả 1.4 Giới thiệu điều khiển Robot sóng NRF24L01 NRF24L01+ là bộ thu phát 2.4GHz chip đơn với công cụ giao thức băng tần cơ sở nhúng (Enhanced ShockBurst ™), thích hợp cho các ứng dụng không dây công suất cực thấp NRF24L01 + được thiết kế để hoạt động dải tần ISM rộng khắp thế giới với tốc độ 2.400 - 2.4835GHz 1.5 Một số loại Robot thị trường - Robot dọn vệ sinh - Robot pha chế - Robot vận chuyển hàng hóa 1.6 Một số dạng thông tin điều khiển robot - Điều khiển robot vi điều khiển - Điều khiển robot PLC - Điều khiển robot sóng NRF24L01 20 21 22 23 { 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 } { rrc_dat.Rb_StaL.bits.ViTri = 28; } else if(rrc_dat.Rb_StaL.bits.ViTri >= 28) // Tro lai vi tri xuat phat rrc_dat.Rb_StaL.bits.ViTri = 1; } } // Co luu if(rrc_dat.Rb_CtrL.bits.LenhChayTD) { rrc_dat.rrc_temp.bits.LenhChayTDLuu } else { rrc_dat.rrc_temp.bits.LenhChayTDLuu } if(rrc_dat.Rb_StaL.bits.ViTriBPD) { rrc_dat.rrc_temp.bits.ViTriBPDLuu = } else { rrc_dat.rrc_temp.bits.ViTriBPDLuu = } = 1; = 0; 1; 0; * Chương trình RrcState(void)( lái tự động) void ChuongTrinhLaiTuDong(void) { if(rrc_dat.Rb_StaL.bits.CoHang && !rrc_dat.Rb_StaL.bits.ViTriBPD) { if(!rrc_dat.rrc_temp.bits.DanDuongTrai && rrc_dat.rrc_temp.bits.DanDu ongGiua && !rrc_dat.rrc_temp.bits.DanDuongPhai) { MenuClearLenhRobot(); rrc_dat.Rb_CtrL.bits.LenhTienThang = 1; } 10 else if(rrc_dat.rrc_temp.bits.DanDuongTrai && rrc_dat.rrc_temp.bits.D anDuongGiua && !rrc_dat.rrc_temp.bits.DanDuongPhai) 11 { 12 MenuClearLenhRobot(); 13 rrc_dat.Rb_CtrL.bits.LenhTienPhai = 1; 14 } 15 else if(rrc_dat.rrc_temp.bits.DanDuongTrai && !rrc_dat.rrc_temp.bits DanDuongGiua && !rrc_dat.rrc_temp.bits.DanDuongPhai) 16 { 17 MenuClearLenhRobot(); 18 rrc_dat.Rb_CtrL.bits.LenhTienPhai = 1; 19 } 20 else if(!rrc_dat.rrc_temp.bits.DanDuongTrai && rrc_dat.rrc_temp.bits DanDuongGiua && rrc_dat.rrc_temp.bits.DanDuongPhai) 21 { 22 MenuClearLenhRobot(); 23 rrc_dat.Rb_CtrL.bits.LenhTienTrai = 1; 24 } 25 else if(!rrc_dat.rrc_temp.bits.DanDuongTrai && !rrc_dat.rrc_temp.bits DanDuongGiua && rrc_dat.rrc_temp.bits.DanDuongPhai) 26 { 27 MenuClearLenhRobot(); 28 rrc_dat.Rb_CtrL.bits.LenhTienTrai = 1; 29 } 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 else if(!rrc_dat.rrc_temp.bits.DanDuongTrai && !rrc_dat.rrc_temp.bits DanDuongGiua && !rrc_dat.rrc_temp.bits.DanDuongPhai) { MenuClearLenhRobot(); rrc_dat.Rb_CtrL.bits.LenhLuiThang = 1; } else if(rrc_dat.rrc_temp.bits.DanDuongTrai && rrc_dat.rrc_temp.bits.D anDuongGiua && rrc_dat.rrc_temp.bits.DanDuongPhai) { MenuClearLenhRobot(); rrc_dat.Rb_CtrL.bits.LenhTienThang = 1; } else { MenuClearLenhRobot(); rrc_dat.Rb_CtrL.bits.LenhDung = 1; } } else { MenuClearLenhRobot(); rrc_dat.Rb_CtrL.bits.LenhDung = 1; } if((rrc_dat.Rb_CtrL.byte != rrc_dat.Rb_CtrLSave2.byte) || \ (rrc_dat.Rb_CtrH.byte != rrc_dat.Rb_CtrHSave2.byte)) { rrc_dat.Rb_CtrLSave2.byte = rrc_dat.Rb_CtrL.byte; rrc_dat.Rb_CtrHSave2.byte = rrc_dat.Rb_CtrH.byte; } * Chương trình RrcControl(void) (quét trạng thái điều khiển) void RrcControl(void) { if(rrc_dat.Rb_CtrL.bits.LenhTienThang) { MTA0_SetHigh(); MTB0_SetLow(); MTC0_SetHigh(); MTD0_SetLow(); MTA1_SetHigh(); 10 MTB1_SetLow(); 11 MTC1_SetHigh(); 12 MTD1_SetLow(); 13 } 14 else if(rrc_dat.Rb_CtrL.bits.LenhTienPhai) 15 { 16 MTA0_SetHigh(); 17 MTB0_SetLow(); 18 MTC0_SetLow(); 19 MTD0_SetLow(); 20 MTA1_SetLow(); 21 MTB1_SetLow(); 22 MTC1_SetHigh(); 23 MTD1_SetLow(); 24 } 25 else if(rrc_dat.Rb_CtrL.bits.LenhTienTrai) 26 { 27 MTA0_SetLow(); 28 MTB0_SetLow(); 29 MTC0_SetHigh(); 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 MTD0_SetLow(); MTA1_SetHigh(); MTB1_SetLow(); MTC1_SetLow(); MTD1_SetLow(); } else if(rrc_dat.Rb_CtrL.bits.LenhLuiThang) { MTA0_SetLow(); MTB0_SetHigh(); MTC0_SetLow(); MTD0_SetHigh(); MTA1_SetLow(); MTB1_SetHigh(); MTC1_SetLow(); MTD1_SetHigh(); } else if(rrc_dat.Rb_CtrL.bits.LenhLuiPhai) { MTA0_SetLow(); MTB0_SetLow(); MTC0_SetLow(); MTD0_SetHigh(); MTA1_SetLow(); MTB1_SetHigh(); MTC1_SetLow(); MTD1_SetLow(); } else if(rrc_dat.Rb_CtrL.bits.LenhLuiTrai) { MTA0_SetLow(); MTB0_SetHigh(); MTC0_SetLow(); MTD0_SetLow(); MTA1_SetLow(); MTB1_SetLow(); MTC1_SetLow(); MTD1_SetHigh(); } else if(rrc_dat.Rb_CtrL.bits.LenhDung) { MTA0_SetLow(); MTB0_SetLow(); MTC0_SetLow(); MTD0_SetLow(); MTA1_SetLow(); MTB1_SetLow(); MTC1_SetLow(); MTD1_SetLow(); } else // dung lai { MTA0_SetLow(); MTB0_SetLow(); MTC0_SetLow(); MTD0_SetLow(); MTA1_SetLow(); MTB1_SetLow(); MTC1_SetLow(); MTD1_SetLow(); } rrc_dat.rrc_outp.byte = 0; if(MTA0_GetValue()) rrc_dat.rrc_outp.bits.do0 = 1; if(MTB0_GetValue()) rrc_dat.rrc_outp.bits.do1 = 1; 96 97 98 99 100 101 102 103 104 105 106 107 108 } if(MTC0_GetValue()) rrc_dat.rrc_outp.bits.do2 if(MTD0_GetValue()) rrc_dat.rrc_outp.bits.do3 if(MTA1_GetValue()) rrc_dat.rrc_outp.bits.do4 if(MTB1_GetValue()) rrc_dat.rrc_outp.bits.do5 if(MTC1_GetValue()) rrc_dat.rrc_outp.bits.do6 if(MTD1_GetValue()) rrc_dat.rrc_outp.bits.do7 = 1; = 1; = 1; = 1; = 1; = 1; Ví dụ đoạn lệnh lái tự động (tiến thẳng) như sau: + Đoạn lệnh từ 369 đến 372 là: lệnh chạy tự động tiến thẳng + Câu lệnh 367-372: có hàng và không ở vị trí buộc phải dừng, thì đó tiếp tục sang câu lệnh 369, dẫn đường trái, dẫn đường phải có phản xạ, dẫn đường giữa không phản xạ, câu lệnh 371 xóa hết các lệnh và ưu tiên sang lệnh tiến thẳng và khởi tạo nó * File menu - Để vận hành Robot một cách rõ ràng và chính sác hơn thì cần đến hình hiển thị để hiển thị và điều khiển trạng thái di chuyển của Robot qua màn hình hiển thị LCD Muốn điều khiển và hiển thị trạn thái của Robot thì thông qua HMI( bàn phím HMI ) để điều khiển và giám sát, vận hành trạng thái của Robot - Mã code chương trình hiển thị trạng thái và điều khiển Robot trên HMI + Chương trình RrcVarIndicator(void) void RrcVarIndicator(void) { clear_bcd_array(&itf_dat.int_data_hd[0], TER_CHAR_ADD); fill_bcd_array_ascii_null(&itf_dat.int_data_hd[TER_CHAR_ADD], 80); // Line if(rrc_dat.rrc_sta.bits.RrcAutoOperation) fill_bcd_array_ascii_char("RB ChayTD", &itf_dat.int_data_hd[TER_CHAR_ ADD + 0], 9); 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 else fill_bcd_array_ascii_char("RB Dung", &itf_dat.int_data_hd[TER_CHAR_AD D + 0], 7); itf_dat.int_data_hd[TER_CHAR_ADD + 11] = 'I'; convert_uint8_dec_array3_bcd_ascii(rrc_dat.rrc_inp.byte, &itf_dat.int_dat a_hd[TER_CHAR_ADD + 12]); itf_dat.int_data_hd[TER_CHAR_ADD + 16] = 'O'; convert_uint8_dec_array3_bcd_ascii(rrc_dat.rrc_outp.byte, &itf_dat.int_da ta_hd[TER_CHAR_ADD + 17]); // line fill_bcd_array_ascii_char("Vi tri RB:", &itf_dat.int_data_hd[TER_CHAR_ADD + 20], 10); convert_uint8_dec_array3_bcd_ascii(rrc_dat.Rb_StaL.bits.ViTri, &itf_dat.i nt_data_hd[TER_CHAR_ADD + 30]); // line if(rrc_dat.Rb_StaL.bits.CoHang) fill_bcd_array_ascii_char("CoHang", &itf_dat.int_data_hd[TER_CHAR_ADD + 40], 6); else fill_bcd_array_ascii_char("KoHang", &itf_dat.int_data_hd[TER_CHAR_ADD + 40], 6); if(rrc_dat.Rb_StaL.bits.TTChayDung) fill_bcd_array_ascii_char("CoChay", &itf_dat.int_data_hd[TER_CHAR_ADD + 47], 6); else fill_bcd_array_ascii_char("KoChay", &itf_dat.int_data_hd[TER_CHAR_ADD + 47], 6); if(rrc_dat.Rb_StaL.bits.ViTriBPD) fill_bcd_array_ascii_char("PhDung", &itf_dat.int_data_hd[TER_CHAR_ADD + 54], 6); else fill_bcd_array_ascii_char("KoDung", &itf_dat.int_data_hd[TER_CHAR_ADD + 54], 6); // Line if(rrc_dat.Rb_CtrL.bits.LenhChayTD) fill_bcd_array_ascii_char("Chay TD", &itf_dat.int_data_hd[TER_CHAR_AD D + 60], 7); else fill_bcd_array_ascii_char("Khong TD", &itf_dat.int_data_hd[TER_CHAR_A DD + 60], 8); if(rrc_dat.Rb_CtrL.bits.LenhTienThang) fill_bcd_array_ascii_char("TienThang", &itf_dat.int_data_hd[TER_CHAR_ ADD + 70], 9); else if(rrc_dat.Rb_CtrL.bits.LenhLuiThang) fill_bcd_array_ascii_char("LuiThang", &itf_dat.int_data_hd[TER_CHAR_A DD + 70], 8); else if(rrc_dat.Rb_CtrL.bits.LenhTienTrai) fill_bcd_array_ascii_char("TienTrai", &itf_dat.int_data_hd[TER_CHAR_A DD + 70], 9); else if(rrc_dat.Rb_CtrL.bits.LenhTienPhai) fill_bcd_array_ascii_char("TienPhai", &itf_dat.int_data_hd[TER_CHAR_A DD + 70], 9); else if(rrc_dat.Rb_CtrL.bits.LenhDung) fill_bcd_array_ascii_char("Dung", &itf_dat.int_data_hd[TER_CHAR_ADD + 70], 4); else fill_bcd_array_ascii_char("Dung", &itf_dat.int_data_hd[TER_CHAR_ADD + 70], 4); } + Chương trình cài đặt phím uint8_t MenuNumber(void) { 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 } uint8_t Temp = 0; switch(com_dat.menu_kc_data.byte) { case K_0: case K_0_RC: Temp = 0; break; case K_1: case K_1_RC: Temp = 1; break; case K_2: case K_2_RC: Temp = 2; break; case K_3: case K_3_RC: Temp = 3; break; case K_4: case K_4_RC: Temp = 4; break; case K_5: case K_5_RC: Temp = 5; break; case K_6: case K_6_RC: Temp = 6; break; case K_7: case K_7_RC: Temp = 7; break; case K_8: case K_8_RC: Temp = 8; break; case K_9: case K_9_RC: Temp = 9; break; default: Temp = 11; break; } return(Temp); - Trong hàm menu_fun.c chứa phần chính gồm: MenuCommand MenuDisplay + MenuCommand: Giải mã các lệnh từ HMI đưa sang và thực hiện lệnh - Trong MenuCommand thiết lập các nút nhấn điều khiển Clear(Start), Tab(Stop), P1(Left), P2(Up), P3(Down), P4(Right), hai trạng thái điều khiển tự động và điều khiển tay * Chương trình điều khiển với MenuCommand void MenuCommand(void) { uint8_t temp = 0; if(rrc_dat.rrc_sta.bits.RrcAutoOperation) { switch(com_dat.menu_kc_data.byte) { case K_MENU: case K_MENU_RC: 10 MenuClearAll(); 11 break; 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 case K_OK: case K_OK_RC: break; case K_ESC: case K_ESC_RC: MenuClearAll(); break; case K_STOP: case K_STOP_RC: MenuClearAll(); MenuClearLenhRobot(); rrc_dat.Rb_CtrL.bits.LenhDung = 1; break; default: break; } } else if(menu_dat.menu_sta.bits.SetGeneral) { switch(com_dat.menu_kc_data.byte) { case K_MENU: case K_MENU_RC: MenuClearAll(); menu_dat.menu_sta.bits.SetGeneral = 0; break; case K_OK: case K_OK_RC: break; case K_ESC: case K_ESC_RC: MenuClearAll(); menu_dat.menu_sta.bits.SetGeneral = 0; break; default: break; } } else if(menu_dat.menu_sta.bits.SetCommunication) { switch(com_dat.menu_kc_data.byte) { case K_MENU: case K_MENU_RC: MenuClearAll(); menu_dat.menu_sta.bits.SetCommunication = menu_dat.menu_sta.bits.SetGeneral = 1; break; case K_OK: case K_OK_RC: break; case K_ESC: case K_ESC_RC: MenuClearAll(); menu_dat.menu_sta.bits.SetCommunication = break; default: break; } } else if(menu_dat.menu_sta.bits.RrcManualOperation) { switch(com_dat.menu_kc_data.byte) { case K_MENU: case K_MENU_RC: MenuClearAll(); menu_dat.menu_sta.bits.RrcManualOperation menu_dat.menu_sta.bits.SetCommunication = MenuClearLenhRobot(); rrc_dat.Rb_CtrL.bits.LenhDung = 1; break; case K_ESC: case K_ESC_RC: MenuClearAll(); menu_dat.menu_sta.bits.RrcManualOperation MenuClearLenhRobot(); 0; 0; = 0; 1; = 0; 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 rrc_dat.Rb_CtrL.bits.LenhDung = 1; break; case K_UP: case K_UP_RC: if(HmiCursorPositions == 0) HmiCursorPositions = 1; else HmiCursorPositions -= 1; HmiVariablePositions = 0; break; case K_DOWN: case K_DOWN_RC: if(++HmiCursorPositions > 1) HmiCursorPositions = 0; HmiVariablePositions = 0; break; case K_LEFT: case K_LEFT_RC: if(HmiCursorPositions == 0) { if(HmiVariablePositions == 0) HmiVariablePositions = 1; else HmiVariablePositions -= 1; } else if(HmiCursorPositions == 1) { if(HmiVariablePositions == 0) HmiVariablePositions = 6; else HmiVariablePositions -= 1; } break; case K_RIGHT: case K_RIGHT_RC: if(HmiCursorPositions == 0) { if(++HmiVariablePositions > 1) HmiVariablePositions = 0; } else if(HmiCursorPositions == 1) { if(++HmiVariablePositions > 6) HmiVariablePositions = 0; } break; case K_START: case K_START_RC: if(HmiCursorPositions == 1) { if(HmiVariablePositions == 0) { rrc_dat.Rb_CtrL.bits.LenhChayTD = 0; } else if(HmiVariablePositions == 1) { rrc_dat.Rb_CtrL.bits.LenhChayTD = 1; } } if(HmiCursorPositions == 1) { if(HmiVariablePositions == 0) { MenuClearLenhRobot(); rrc_dat.Rb_CtrL.bits.LenhDung = 1; } else if(HmiVariablePositions == 1) { MenuClearLenhRobot(); rrc_dat.Rb_CtrL.bits.LenhTienThang = 1; } 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 else if(HmiVariablePositions == 2) { MenuClearLenhRobot(); rrc_dat.Rb_CtrL.bits.LenhTienPhai = 1; } else if(HmiVariablePositions == 3) { MenuClearLenhRobot(); rrc_dat.Rb_CtrL.bits.LenhTienTrai = 1; } else if(HmiVariablePositions == 4) { MenuClearLenhRobot(); rrc_dat.Rb_CtrL.bits.LenhLuiThang = 1; } else if(HmiVariablePositions == 5) { MenuClearLenhRobot(); rrc_dat.Rb_CtrL.bits.LenhLuiPhai = 1; } else if(HmiVariablePositions == 6) { MenuClearLenhRobot(); rrc_dat.Rb_CtrL.bits.LenhLuiTrai = 1; } else if(HmiVariablePositions == 7) { MenuClearLenhRobot(); rrc_dat.Rb_CtrL.bits.LenhDung = 1; } } break; case K_2 case K_2_RC: MenuClearLenhRobot(); if(com_dat.menu_kc_cmd.bits.k_hold) { rrc_dat.Rb_CtrL.bits.LenhTienThang = 1; } break; case K_8: case K_8_RC: MenuClearLenhRobot(); if(com_dat.menu_kc_cmd.bits.k_hold) { rrc_dat.Rb_CtrL.bits.LenhLuiThang = 1; } break; case K_4: case K_4_RC: MenuClearLenhRobot(); if(com_dat.menu_kc_cmd.bits.k_hold) { rrc_dat.Rb_CtrL.bits.LenhTienTrai = 1; } break; case K_6: case K_6_RC: MenuClearLenhRobot(); if(com_dat.menu_kc_cmd.bits.k_hold) { rrc_dat.Rb_CtrL.bits.LenhTienPhai = 1; } break; case K_5: case K_5_RC:// stop MenuClearLenhRobot(); rrc_dat.Rb_CtrL.bits.LenhDung = 1; break; case K_0: case K_0_RC: // start MenuClearLenhRobot(); 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 if(com_dat.menu_kc_cmd.bits.k_hold) { rrc_dat.Rb_CtrL.bits.LenhTienThang = 1; } break; default: break; } if(!(HmiCursorPositions == 1)) { if(!com_dat.menu_kc_cmd.bits.k_hold) { MenuClearLenhRobot(); rrc_dat.Rb_CtrL.bits.LenhDung = 1; } } } else if(board_dat.board_sta.bits.PowerOk) { switch(com_dat.menu_kc_data.byte) { case K_MENU: case K_MENU_RC: MenuClearAll(); menu_dat.menu_sta.bits.RrcManualOperation = 1; break; case K_OK: case K_OK_RC: break; case K_ESC: case K_ESC_RC: MenuClearAll(); break; case K_START: case K_START_RC: MenuClearAll(); rrc_dat.rrc_sta.bits.RrcAutoOperation = 1; break; default: break; } + MenuDisplay: Menu hiển thị trạng thái Robot hình LCD Di chuyển trỏ đến các hàng, các cột hiển thị LCD * Chương trình hiển thị trạng thái void MenuDisplay(void) { clear_bcd_array(&itf_dat.int_data_hd[0], TER_CHAR_ADD); fill_bcd_array_ascii_null(&itf_dat.int_data_hd[TER_CHAR_ADD], INT_DATA_HD _LEN - TER_CHAR_ADD); if(rrc_dat.rrc_sta.bits.RrcAutoOperation) { ; } else if(menu_dat.menu_sta.bits.SetGeneral) 10 { 11 fill_bcd_array_ascii_char("Set General", &itf_dat.int_data_hd[TER_CHA R_ADD + 0], 11); 12 } 13 else if(menu_dat.menu_sta.bits.SetCommunication) 14 { 15 fill_bcd_array_ascii_char("Set Communication", &itf_dat.int_data_hd[T ER_CHAR_ADD + 0], 17); 16 } 17 else if(menu_dat.menu_sta.bits.RrcManualOperation) 18 { 19 // Hang 0-3 20 switch(HmiCursorPositions) 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 { case 0: case 1: itf_dat.int_data_hd[0] = ADD_ROW_3 | LCD_CMD_BON_COL; break; default: break; } // Cot 0-19 switch(HmiCursorPositions) { case 0: itf_dat.int_data_hd[0+1] = 0; break; case 1: itf_dat.int_data_hd[0+1] = 10; default: break; } // Line if(menu_dat.menu_sta.bits.RrcManualOperation) fill_bcd_array_ascii_char("RB ChayBT", &itf_dat.int_data_hd[TER_C HAR_ADD + 0], 9); else fill_bcd_array_ascii_char("RB Dung", &itf_dat.int_data_hd[TER_CHA R_ADD + 0], 7); itf_dat.int_data_hd[TER_CHAR_ADD + 11] = 'I'; convert_uint8_dec_array3_bcd_ascii(rrc_dat.rrc_inp.byte, &itf_dat.int _data_hd[TER_CHAR_ADD + 12]); itf_dat.int_data_hd[TER_CHAR_ADD + 16] = 'O'; convert_uint8_dec_array3_bcd_ascii(rrc_dat.rrc_outp.byte, &itf_dat.in t_data_hd[TER_CHAR_ADD + 17]); // line fill_bcd_array_ascii_char("Vi tri RB:", &itf_dat.int_data_hd[TER_CHAR _ADD + 20], 10); convert_uint8_dec_array3_bcd_ascii(rrc_dat.Rb_StaL.bits.ViTri, &itf_d at.int_data_hd[TER_CHAR_ADD + 30]); // line if(rrc_dat.Rb_StaL.bits.CoHang) fill_bcd_array_ascii_char("CoHang", &itf_dat.int_data_hd[TER_CHAR _ADD + 40], 6); else fill_bcd_array_ascii_char("KoHang", &itf_dat.int_data_hd[TER_CHAR _ADD + 40], 6); if(rrc_dat.Rb_StaL.bits.TTChayDung) fill_bcd_array_ascii_char("CoChay", &itf_dat.int_data_hd[TER_CHAR _ADD + 47], 6); else fill_bcd_array_ascii_char("KoChay", &itf_dat.int_data_hd[TER_CHAR _ADD + 47], 6); if(rrc_dat.Rb_StaL.bits.ViTriBPD) fill_bcd_array_ascii_char("PhDung", &itf_dat.int_data_hd[TER_CHAR _ADD + 54], 6); else fill_bcd_array_ascii_char("KoDung", &itf_dat.int_data_hd[TER_CHAR _ADD + 54], 6); // Line if(HmiCursorPositions == 0) { if(HmiVariablePositions == 1) fill_bcd_array_ascii_char("Chay TD", &itf_dat.int_data_hd[TER _CHAR_ADD + 60], 7); else fill_bcd_array_ascii_char("Khong TD", &itf_dat.int_data_hd[TE R_CHAR_ADD + 60], 8); if(rrc_dat.Rb_CtrL.bits.LenhTienThang) 72 fill_bcd_array_ascii_char("TienThang", &itf_dat.int_data_hd[T ER_CHAR_ADD + 70], 9); 73 else if(rrc_dat.Rb_CtrL.bits.LenhLuiThang) 74 fill_bcd_array_ascii_char("LuiThang", &itf_dat.int_data_hd[TE R_CHAR_ADD + 70], 9); 75 else if(rrc_dat.Rb_CtrL.bits.LenhTienTrai) 76 fill_bcd_array_ascii_char("TienTrai", &itf_dat.int_data_hd[TE R_CHAR_ADD + 70], 9); 77 else if(rrc_dat.Rb_CtrL.bits.LenhTienPhai) 78 fill_bcd_array_ascii_char("TienPhai", &itf_dat.int_data_hd[TE R_CHAR_ADD + 70], 9); 79 else if(rrc_dat.Rb_CtrL.bits.LenhLuiPhai) 80 fill_bcd_array_ascii_char("LuiPhai", &itf_dat.int_data_hd[TER _CHAR_ADD + 70], 7); 81 else if(rrc_dat.Rb_CtrL.bits.LenhLuiTrai) 82 fill_bcd_array_ascii_char("LuiTrai", &itf_dat.int_data_hd[TER _CHAR_ADD + 70], 7); 83 else if(rrc_dat.Rb_CtrL.bits.LenhDung) 84 fill_bcd_array_ascii_char("Dung", &itf_dat.int_data_hd[TER_CH AR_ADD + 70], 4); 85 else 86 fill_bcd_array_ascii_char("Dung", &itf_dat.int_data_hd[TER_CH AR_ADD + 70], 4); 87 } 88 else if(HmiCursorPositions == 1) 89 { 90 if(rrc_dat.Rb_CtrL.bits.LenhChayTD) 91 fill_bcd_array_ascii_char("Khong TD", &itf_dat.int_data_hd[TE R_CHAR_ADD + 60], 8); 92 else 93 fill_bcd_array_ascii_char("Chay TD", &itf_dat.int_data_hd[TER _CHAR_ADD + 60], 7); 94 if(HmiVariablePositions == 0) 95 fill_bcd_array_ascii_char("Dung", &itf_dat.int_data_hd[TER_CH AR_ADD + 70], 4); 96 else if(HmiVariablePositions == 1) 97 fill_bcd_array_ascii_char("TienThang", &itf_dat.int_data_hd[T ER_CHAR_ADD + 70], 9); 98 else if(HmiVariablePositions == 2) 99 fill_bcd_array_ascii_char("TienPhai", &itf_dat.int_data_hd[TE R_CHAR_ADD + 70], 9); 100 else if(HmiVariablePositions == 3) 101 fill_bcd_array_ascii_char("TienTrai", &itf_dat.int_data_hd[TE R_CHAR_ADD + 70], 9); 102 else if(HmiVariablePositions == 4) 103 fill_bcd_array_ascii_char("LuiThang", &itf_dat.int_data_hd[TE R_CHAR_ADD + 70], 9); 104 else if(HmiVariablePositions == 5) 105 fill_bcd_array_ascii_char("LuiPhai", &itf_dat.int_data_hd[TER _CHAR_ADD + 70], 7); 106 else if(HmiVariablePositions == 6) 107 fill_bcd_array_ascii_char("LuiTrai", &itf_dat.int_data_hd[TER _CHAR_ADD + 70], 7); 108 else 109 fill_bcd_array_ascii_char("Dung", &itf_dat.int_data_hd[TER_CH AR_ADD + 70], 4); 110 } * Chương trình thu phát sóng Rf điều khiển qua HMI #ifdef UART_E #endif if(board_dat.board_sta.bits.PowerOk && !board_dat.board_sta.bits.PowerUp) { #ifdef RFT_2G4HZ if(!com_dat.rft_flg.bits.putData && \ !com_dat.rft_flg.bits.putDelay && !get_rft_bytes_count) { if(com_dat.rft_flg.bits.nextSlave) 10 { 11 com_dat.rft_flg.bits.nextSlave = 0; 12 //if(rft_terminal_count == NA_HMI) 13 // rft_terminal_count = NA_PLC; 14 //else 15 rft_terminal_count = NA_HMI; 16 } 17 // a HMI 18 if(rft_terminal_count == NA_HMI) 19 { 20 if(com_dat.rft_tran_hmi.bits.put_sta || com_dat.rft_tran_hmi bits.put_data) 21 { 22 // Write device 23 if(menu_dat.menu_sta.bits.RrcManualOperation) 24 { 25 MenuDisplay(); 26 } 27 else if(!menu_dat.menu_sta.bits.SetCommunication && \ 28 !menu_dat.menu_sta.bits.SetGeneral) 29 { 30 RrcVarIndicator(); 31 } 32 // Write RFT_2G4HZ 33 RftWriteTxBuffer(); 34 } 35 com_dat.rft_flg.bits.nextSlave = 1; 36 } 37 // b RB1 38 else if(rft_terminal_count == NA_PLC) 39 { 40 if(com_dat.rft_tran_plc.bits.put_sta || com_dat.rft_tran_plc bits.put_data) 41 { 42 // Write device 43 if(menu_dat.menu_sta.bits.RrcManualOperation) 44 { 45 MenuDisplay(); 46 } 47 else if(!menu_dat.menu_sta.bits.SetCommunication && \ 48 !menu_dat.menu_sta.bits.SetGeneral) 49 { 50 RrcVarIndicator(); 51 } 52 // Write RFT_2G4HZ 53 RftWriteTxBuffer(); 54 } 55 com_dat.rft_flg.bits.nextSlave = 1; 56 } 57 } 58 // Get RFT_2G4HZ 59 RftGetting(); 60 // Put RFT_2G4HZ 61 RftPutting(); 62 // Got data 63 if(com_dat.rft_flg.bits.gotData) 64 { 65 com_dat.rft_flg.bits.gotData = 0; 66 RftReadRxBuffer(); 67 } 68 69 70 71 72 73 74 75 if(com_dat.rft_tran_hmi.bits.get_data) { com_dat.rft_tran_hmi.bits.get_data = 0; com_dat.menu_kc_data.byte = com_dat.rft_kc_data.byte; com_dat.menu_kc_cmd.byte = com_dat.rft_kc_cmd.byte; menu_dat.menu_sta.bits.menu_ic = 1; } if(com_dat.rft_tran_plc.bits.get_data || com_dat.rft_tran_plc.bits.ge t_sta) 76 77 78 79 { com_dat.rft_tran_plc.bits.get_data = 0; com_dat.rft_tran_plc.bits.get_sta = 0; } TÀI LIỆU THAM KHẢO Tiếng việt Nguyễn Mạnh Tiến (2007), Điều khiển robot công nghiệp, NXB Khoa học và kỹ thuật Nguyễn Thúy Vân (1999), Kỹ thuật số, NXB Khoa học và kỹ thuật Nguyễn Mạnh Hùng (2006), Ngơn ngữ lập trình C++, NXB Khoa học và kỹ thuật Website https://www.vinabook.com/dieu-khien-robot-cong-nghiep-p28423.html https://lic.haui.edu.vn/vn/gioi-thieu-sach-moi/ky-thuat-so-nguyen-thuyvan/67193 3.https://drive.google.com/file/d/1Ex62uhCIhD2AuzAjQSum6pJ8ndwWT0n4/ view