>> Có Link Full Youtube hướng dẫn trong cuối file 255) XungENA = 255; else if (XungENA < 0) XungENA = 0; analogWrite(ENB, XungENB );//100 analogWrite(ENA, XungENA);//100 } 3.4 Ứng Dụng 22 Robot giúp cơng việc công việc sơn dọc mép tường, di chuyển hàng hóa … KẾT LUẬN Kết đạt được: Phần cứng: - Thiết kế nhỏ gọn, đáp ứng di chuyển thoải mái mơ hình mê cung - Hệ thống cảm biến cung cấp giá trị tương đối tốt - Động nhỏ gọn khỏe nên việc di chuyển thuận tiện, quán tính đáp ứng nhanh Giải thuật: - Đo khoảng cách từ robot tới tường, từ xác định vị trí Robot - Luật điều khiển đơn giản hiệu Hướng phát triển: - Kết hợp công nghệ xử lí ảnh vẽ lại hình dạng đường robot tự hành để ứng dụng việc tìm đường đến vị trí nguy hiểm thực tế - Tùy thuộc vào ứng dụng đường mà áp dụng thuật toán khác để đem lại hiệu cao 23 TÀI LIỆU THAM KHẢO [1] https://vi.wikipedia.org/wiki/Thu%E1%BA%ADt_to%C3%A1n_t %C3%ACm_%C4%91%C6%B0%E1%BB%9Dng_%C4%91i_trong_m %C3%AA_cung [2] https://vi.wikipedia.org/wiki/B%E1%BB%99_%C4%91i%E1%BB%81u_khi %E1%BB%83n_PID [3] http://www.stdio.vn/articles/read/467/dieu-khien-2-dong-co-bang-ic-l298 [4.] http://doc.edu.vn/tai-lieu/do-an-thiet-ke-bo-pid-so-dieu-khien-toc-do-dong-co-dc3828/ 24 Link YOUTUBE Hướng Dẫn Full Phần https://goo.gl/TtSyiN 25 PHỤ LỤC #define ENA #define ENB #define in1 #define in2 #define in3 #define in4 10 int cambientrai; int cambientruoc; int cambienphai; int hientai=0, quakhu=0 ; int TT; float XungENB=0,XungENA=0; void doccambien() { cambientrai=analogRead(A0); cambientruoc=analogRead(A1); cambienphai=analogRead(A2); Serial.print(" Trai "); //70 Serial.print(cambientrai); Serial.print(" Truoc "); //50 Serial.print(cambientruoc); Serial.print(" Phai "); //40 Serial.println(cambienphai); } //============Thiết kế cho xe quẹo trái========== 26 void QueoTrai() // cho bám phải { nghichtrai(); nghichphai(); analogWrite(ENA,150);//110 // giá trị đo thực tế analogWrite(ENB,150); delay(10); while (cambientruoc 255) XungENA = 255; else if (XungENA < 0) XungENA = 0; analogWrite(ENB, XungENB );//100 analogWrite(ENA, XungENA);//100 } void BamTrai() // bám trái trái trừ, phải cộng (XungENB,XungENA) { float Kp = 16 , Kd =1.1 , Ki = 0.1;//float Kp = 15 , Kd =0.75 , Ki = 0; float P, I, D; static int lasterror; int out; float SamplingTime = 0.01; 29 int error = 680 - cambientrai; thuantrai(); thuanphai(); P = error * Kp; I += Ki * error * SamplingTime; D = (Kd * (error - lasterror )) / SamplingTime; out = P + I + D; lasterror = error; XungENA = 60 - out; // XungENA = 50 - out; XungENB = 60 + out; // XungENB = 50 + out; if (XungENB > 255) XungENB = 255; else if (XungENB < 0) XungENB = 0; if (XungENA > 255) XungENA = 255; else if (XungENA < 0) XungENA = 0; analogWrite(ENB, XungENB); //100 analogWrite(ENA, XungENA); //100 } void setup() { Serial.begin(9600); pinMode(ENA,OUTPUT); pinMode(ENB,OUTPUT); pinMode(in1,OUTPUT); pinMode(in2,OUTPUT); pinMode(in3,OUTPUT); pinMode(in4,OUTPUT); 30 } void loop() { hientai=millis(); if(hientai-quakhu>=5000) { TT=1; quakhu=hientai; } else TT=0; doccambien(); if(TT==0) { BamPhai(); if(cambientruoc