Hình 4.9 Lưu đồ thuật tốn điều khiển
4.5.4. Sơ đồ điện
Cơ cấu truyền động và cơ cấu hút
Ở cơ cấu truyền động và cơ cấu hút, những linh kiện cần sử dụng là NodeMCU ESP8266, L298N, 2 động cơ DC và 1 động cơ EDF.
Bảng 4.2 Danh sách nối dây cơ cấu truyền động và cơ cấu hút
STT NodeMCU ESP8266 L298N Động cơ EDF 1 D5 ENA 2 D6 ENB 3 D8 IN1 4 D7 IN2 5 D4 IN3 6 D3 IN4 7 D1 ESC 8 Vin 5V 9 GND GND GND ESC 10 OUT 1,2 Trái 11 OUT 3,4 Phải
Chân ENA và ENB trên L298N cần tín hiệu PWM để điều chỉnh tốc độ động cơ. Vì vậy nối ENA và ENB với chân D5 và D6 trên ESP8266. Tùy theo cách lập trình mà tốc độ của từng động cơ sẽ được điều chỉnh cho hợp lý. Khi rẽ trái thì động cơ phải sẽ quay nhanh hơn, tương tự khi rẽ phải thì động cơ trái sẽ quay nhanh hơn. Khi tiến hay lùi thì hai động cơ sẽ hoạt động ở cùng một tần số và một lượng xung như nhau.
Tín hiệu PWM là analog được quy định là 256 xung (từ 0 – 255). Vì vậy, giá trị 255 sẽ là 100%, 127 sẽ là 50% và 25 sẽ là 10%. Khi cấp lượng xung có giá trị bao nhiêu phần trăm vào chân ENA và ENB thì tốc độ của động cơ sẽ hoạt động bấy nhiêu phần trăm.
Với cơ cấu hút, động cơ BLDC sử dụng thư viện servo.h trên Arduino. Vì vậy tốc độ của động cơ BLDC sẽ phụ thuộc vào số góc từ 0 – 180 độ.
Thơng thường, khi sử dụng Arduino, người ta sẽ có 2 lựa chọn: 1. Tốc độ động cơ BLDC cố định.
2. Tốc độ động cơ BLDC điều chỉnh bằng triết áp chuyển đổi giá trị analog 0 – 1023 sang giá trị góc 0 – 180 độ.
Do mơ hình sử dụng Vi điều khiển NodeMCU ESP8266 nên sẽ tận dụng thư viện điều khiển của Blynk để điều chỉnh tốc độ của động cơ BLDC, vì vậy tốc độ của động cơ cũng như áp suất của cơ cấu hút sẽ phụ thuộc vào giá trị INPUT biến thiên.
Cơ cấu gắp
Hình 4.11 Sơ đồ đi dây cơ cấu gắp
Với cơ cấu gắp 4 bậc tự do sử dụng 4 servo. Thư viện servo.h trên Arduino cho phép điều chỉnh góc của servo từ 0 -180 độ. Vì vậy để điều chỉnh góc cho các servo thì phải nối vào các chân NodeMCU có cấp xung PWM và sử dụng lệnh analogWrite để cấp tín hiệu số cho servo.
CHƯƠNG 5
THI CƠNG
5.1 Mô phỏng điều khiển servo
Các Servo được điều khiển qua ESP8266 với phần mềm Blynk làm máy chủ điều khiển. Các Servo này điều khiển những khớp nối của cánh tay máy. Tiến hành mô phỏng bộ điều khiển bằng phần mềm Proteus.
Do Proteus không hiểu được cơ chế điều khiển qua giao tiếp không dây của Blynk và ESP8266. Vì vậy, nhóm vẫn tiến hành lập trình phần code điều khiển servo qua ESP8266, sau đó điều chỉnh lại đơi chút phần code cho mô phỏng.
Tải về phần mềm Virtual Serial Ports Emulator (VSPE) để tạo cổng COM ảo cho Proteus. Sau đó mang các linh kiện cần thiết lên Proteus và tiến hành mô phỏng, chỉ khác là thay thế ESP8266 bằng Arduino UNO và điều khiển qua cổng COM ảo.
Sau khi thiết lập cổng COM ảo, vào phần mềm Proteus sử dụng khối COMPIM để giao tiếp với cổng COM ảo vừa được thiết lập.
Hình 5.2 Giao diện mơ phỏng hoạt động Servo
Sau khi chạy mô phỏng, sử dụng tính năng Command Prompt (CMD) của Windows để kết nối thư viện Blynk với cổng COM của phần mềm VSPE.
Sau khi thiết lập các bước cần thiết, điều khiển mô phỏng qua app Blynk và xem kết quả mô phỏng trên Proteus.
Thư viện Servo.h cho giá trị từ 0 – 180. Servo trong Proteus được thiết lập trạng thái ban đầu là – 90 độ. Theo đúng lý thuyết, thì trạng thái ban đầu của Servo là 0. Xoay hết sang trái là – 90. Xoay hết sang phải là +90. Nhưng do thư viện Servo.h chỉ nhận giá trị dương nên phải thiết lập từ 0 – 180. Vì vậy khi để Servo 1 ở vị trí 0 thì trạng thái sẽ là – 90 độ, vị trí 90 thì trạng thái là 0 độ, vị trí 180 thì trạng thái là +90 độ.
Hình 5.4 Servo 1 - Khớp 1 ở trạng thái 0
Proteus sẽ hiểu giá trị 90 trong thư viện là trạng thái bình tường. Vì vậy khi để giá trị Servo ở 90 thì trạng thái trong Proteus sẽ là 0. Tương tự khi để giá trị 96 thì trạng thái hiển thị trong Proteus sẽ là +6.
Khi thiết lập giá trị trong Blynk là 180 thì trạng thái hiển thị trong Proteus sẽ là +90.
Hình 5.5 Servo 1 - Khớp 1 ở trạng thái 180
5.2 Mô phỏng cơ cấu truyền động
Với các thiết lập tương tự như phần 5.1, về phần cơ cấu truyền động sẽ sử dụng khối L298N trong Proteus.
Khi cho xe tiến về trước, 2 động cơ sẽ cùng tiến về trước. Khi cho xe lui về sau, 2 động cơ sẽ lùi về sau. Khi rẽ trái, động cơ phải sẽ quay nhanh hơn. Khi rẽ phải, động cơ trái sẽ quay nhanh hơn.
5.3 Thi cơng mơ hình
Tiến hành sử dụng dây testboard để nối dây cho L298N và ESP8266.
Với chân ENA và ENB sẽ nối vào D5, D6 (2 chân có PWM) để cấp xung PWM điều khiển tốc độ cho động cơ. Các chân IN1, IN2, IN3, IN4 lần lượt nối với D8, D7, D4, D3 để cấp tín hiệu HIGH, LOW cho động cơ.
Các chân OUT1, OUT2 nối với động cơ trái, OUT3, OUT4 nối với động cơ phải.
Hình 5.8 Phần cơ cấu gắp được đặt cắt Mica
Hình 5.10 Nguyên mẫu thử nghiệm Robot leo tường
Để đẩy nhanh tiến độ hoàn thiện sản phẩm theo đúng tiến độ đặt ra. Nhóm đã quyết định tham khảo các loại cơ cấu gắp đơn giản trên thị trường, thiết kế lại các điểm cho phù hợp với mục tiêu đặt ra. Sau đó đặt cắt Mica, do các cơ sở gia công hiện tại không làm việc trong mùa dịch.
Hình 5.12 Hình chụp 3D các khối của cơ cấu gắp
Hình 5.13 Cơ cấu gắp khi hoàn thiện
5.4 Bộ điều khiển
Về phần code do quá dài nên nhóm chèn ở phụ lục. Ở phần 5.3 này nhóm sẽ chỉ trình bày các bước thiết lập trong phần mềm Blynk để được đồng bộ với code.
Sau đó kết nối ESP8266 và thiết bị điều khiển đến cùng mạng Wifi.
Hình 5.14 Tạo Project Robot leo tường trong Blynk
Đầu tiên để sử dụng phần mềm Blynk, người dùng cần phải tạo tài khoản bằng Gmail, để Blynk Server sẽ tiện theo dõi và gửi những dữ liệu cần thiết cho người dùng. Tùy theo nhu cầu, cịn có thể lập trình cho Blynk gửi tín hiệu nhiệt độ, độ ẩm hoặc thậm chí là tin nhắn cảnh báo đến Gmail.
Ở phần devices sẽ chọn loại vi điều khiển phù hợp. Ở đây là NodeMCU. Phần Auth Token là loại mã sẽ nhập vào code lập trình để vi điều khiển có thể nhận ra tín hiệu điều khiển từ Blynk.
Token có thể được xem là một dạng chữ ký số hay chữ ký điện tử, được mã hóa thành dãy số trên thiết bị. Mã token thuộc dạng mã OTP, ngẫu nhiên và chỉ sử dụng được một lần kết nối trên thiết bị. Mã Token này được sinh ra để phân biệt tín hiệu giữa thiết bị này với thiết bị khác trên cùng Server Blynk để tránh nhầm lẫn khi dùng.
Hình 5.15 Tạo Joystick
Sau khi tạo Project Robot leo tường. Tiến hành lấy Joystick trong danh sách của Blynk. Joystick này dùng để điều khiển hệ truyền động của Robot.
V0 chính là một chân tín hiệu ảo được gán trong ESP8266 trong quá trình lập trình.
Khi V0 được tác động, Blynk sẽ dựa vào các đoạn lệnh bên dưới Blynk_Write mà thực thi nhiệm vụ. Trục X là rẽ trái phải, trục Y là tiến hoặc lùi.
Hình 5.16 Giao diện điều khiển
Gán thanh Silder là chân tín hiệu V1. Slider là một thanh ngang, tùy theo thiết lập mà giá trị của thanh ngang sẽ chạy dài từ 0 – 1023 (giá trị analog). Trong trường hợp này, cơ cấu hút sử dụng thư viện của Servo nên giá trị sẽ nằm trong khoảng từ 0 – 180 độ.
Decimal #.# là độ hiển thị chính xác đến số thập phân thứ nhất.
Khi Send values on release only được chuyển sang trạng thái ON tức là tín hiệu sẽ chỉ được truyền đến ESP khi ta thả tay ra khỏi thanh Slider. Khi ở trạng thái OFF thì ngược lại.
Hình 5.17 Thiết lập cơ cấu gắp
Thiếp lập các Servo với các Pin ảo từ V1 – V4. Sau đó gán mỗi servo với một thanh Slider với khoảng giá trị từ 0 – 180 độ theo thư viện Servo.h. Mỗi thanh Slider sẽ điều khiển 1 servo trên cơ cấu gắp.
CHƯƠNG 6
ĐÁNH GIÁ KẾT QUẢ, KẾT LUẬN
6.1 Đánh giá kết quả
6.1.1. Kết quả đạt được
Trong suốt quá trình thực hiện luận văn tốt nghiệp, với sự cố gắng của bản thân, sự chỉ dẫn tận tình của thầy hướng dẫn, nhóm đã hồn thành nội dung đề tài “Nghiên cứu thiết kế và chế tạo robot leo tường”, cụ thể đã làm được một số công việc cơ bản như sau:
- Tìm ra được phương án thiết kế cơ cấu hút.
- Thiết kế và chế tạo được bộ khung cơ khí, cơ cấu gắp của Robot leo tường. - Lập trình thành cơng phần code điều khiển cho Robot leo tường.
- Thiết kế mạch, ứng dụng thành công ESP8266 và L298N trong cơ cấu truyền động. - Mô phỏng thành công cơ cấu hoạt động của các Servo và cơ cấu truyền động qua L298N.
- Nghiên cứu được cơ bản cách tạo ra lực hút không tiếp xúc.
6.1.2. Hạn chế của đề tài
- Cơ cấu leo tường hoạt động chưa thực sự tốt.
- Thẩm mỹ chưa cao do hạn chế về thời gian thực hiện mơ hình và gặp sự cố trong quá trình leo tường.
- Cơ cấu gắp cịn bị nhiễu khơng rõ ngun do, thỉnh thoảng không hoạt động theo ý muốn.
- Mơ hình cịn khá nặng, chưa thực sự gọn nhẹ. - Do ưu tiên về moment nên tốc độ vẫn chưa cao lắm.
6.2 Kết luận
Sau khi thực hiện thành cơng mơ hình robot leo được trên tường, nhóm rút ra kết luận:
• Tính mới và sáng tạo: Mơ hình robot leo tường được thực hiện trong đề tài đã không sử dụng các kỹ thuật hút tường trước đây như: kỹ thuật hút chân không, kỹ thuật từ tính, kỹ thuật mơ phỏng sinh học từ những loài động vật leo trèo ... mà thay vào đó là kỹ thuật hút khơng tiếp xúc.
• Tính khoa học và thực tiễn: Mơ hình robot leo tường kèm với cơ cấu gắp nếu được quan tâm đầu tư và phát triển hơn nữa để áp dụng rộng rãi sẽ đáp ứng được yêu cầu thiết thực trong cuộc sống. Có thể áp dụng vào các nhu cầu cứu hộ, vận chuyển hàng hóa, lau chùi vệ sinh nhà cửa.
• Tính hiệu quả kinh tế: Áp dụng robot leo tường vào cuộc sống sẽ đem lại lợi ích kinh tế khá lớn bởi vì nó thay thế được nguồn nhân cơng khan hiếm hiện nay. Mặt khác chi phí đầu tư cho robot dạng này khơng cao nên có thể triển khai và áp dụng dễ dàng đem lại hiệu quả kinh tế lớn.
6.3 Hướng phát triển
Do phụ thuộc nhiều yếu tố khách quan lẫn chủ quan, trình độ có giới hạn, cơng việc chính q nhiều nhưng gặp thêm nhiều khó khăn do tình hình dịch bệnh Covid 19 nên cịn một số vấn đề của đề tài chưa thể thực hiện được, cần tiếp tục nghiên cứu phát triển để hồn thiện mơ hình robot leo tường.
Vì vậy hướng phát triển tiếp theo của đề tài cần tập trung vào những vấn đề sau để hồn thiện mơ hình robot leo tường và đưa vào ứng dụng thực tế:
• Hồn thiện cơ cấu leo từ đất lên tường và leo qua các mặt tường vng góc. • Gắn camera khơng dây gửi hình ảnh về máy tính.
• Xây dựng giao diện trên máy tính để người dùng có thể thao tác điều khiển dễ dàng, chọn chiến lược đường đi cho robot.
• Xử lý ảnh để robot có thể tránh vật cản trên tường như quạt, đèn, công tắc.. • Tìm cách tăng sức tải của Robot để có thể ứng dụng vào nhiều cơng việc nặng nhọc hơn.
TÀI LIỆU THAM KHẢO
[1] Ivan Margolius,“The Robot of Prague”, Friends of Czech Heritage số 17, xuất bản 2017, Trang 3 – 6.
[2] Pearce, Jeremy, “Bài báo George C.Devol, Inventor of Robot Arm”, The New York Times, ngày 15 tháng 8 năm 2011.
[3] Hồ Minh Phương (2012), “Nghiên cứu thiết kế và chế tạo robot leo tường, trần
nhà”, Luận văn Thạc sĩ, Trường Đại học Sư phạm Kỹ thuật Thành phố Hồ Chí Minh,
Hồ Chí Minh.
[4] Andreas Papadimitriou (2018), “Modeling, Identification and Control of a Wall
Climbing Robot Based on Vortex Actuation”, Luận văn Thạc sĩ, Trường Đại học
Cơng nghệ Lulể, Thụy Điển.
[5] M. Armada, M. Prieto, T. Akinfiev, R. Fernandez, P. Gonzalez, E. Garcia, H. Montes, S. Nabulsi, R. Ponticelli and J. Sarria, “On the Design and Development of
Climbing and Walking Robots for the Maritime Industries”, Journal on Maritime
PHỤ LỤC
CODE ĐIỀU KHIỂN
CƠ CẤU HÚT VÀ TRUYỀN ĐỘNG
#include <Servo.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
Servo esc_signal;
int speeds;
#define BLYNK_PRINT Serial
// Mã Token lấy từ Blynk
char auth[] = "VOAg2e21ZBc1YQXhxQ3br_WqXuhHNiaw"; //Nhập Token // Your WiFi credentials.
char ssid[] = "Be Cam"; //Tên Wifi
BlynkTimer timer;
const byte L298N_A_pin = D5; //Kết nối động cơ A const byte L298N_A_In1_pin = D8;
const byte L298N_A_In2_pin = D7;
const byte L298N_B_In3_pin = D4; const byte L298N_B_In4_pin = D3;
const byte L298N_B_pin = D6; //Kết nối động cơ B byte SolSinyal = 0;
byte SagSinyal = 0; byte ArkaLamba = 0;
void motorSpeed(int prmA, byte prmA1, byte prmA2, int prmB, byte prmB1, byte prmB2) { analogWrite(L298N_A_pin,prmA); analogWrite(L298N_B_pin,prmB); digitalWrite(L298N_A_In1_pin,prmA1); digitalWrite(L298N_A_In2_pin,prmA2); digitalWrite(L298N_B_In3_pin,prmB1); digitalWrite(L298N_B_In4_pin,prmB2);
} BLYNK_WRITE(V0) { int x = param[0].asInt(); int y = param[1].asInt(); // x = -2 -1 0 1 2 // Y = -2 -1 0 1 2 if (y>=0) { ArkaLamba = 0; // digitalWrite(Led4_pin,LOW); } else { ArkaLamba = 1; SolSinyal = 1; SagSinyal = 1; }
if ((x==0) && (y==0)) /// Trạng thái dừng {
motorSpeed(0,LOW,LOW,0,LOW,LOW); SolSinyal = 0;
}
else if ((x==0) && (y>0)) {
if (y==1){ motorSpeed(255,HIGH,LOW,255,HIGH,LOW); } // Tiến else { motorSpeed(255,HIGH,LOW,255,HIGH,LOW); }
SolSinyal = 0; SagSinyal = 0; }
else if ((y==0) && (x>0)) {
motorSpeed(255,HIGH,LOW,255,LOW,HIGH); SagSinyal = 1;
}
else if ((y>0) && (x>0)) {
motorSpeed(255,HIGH,LOW,200,LOW,LOW); SagSinyal = 1;
}
else if ((y==0) && (x<0)) {
motorSpeed(255,LOW,HIGH,255,HIGH,LOW); SolSinyal = 1;
else if ((y>0) && (x<0)) { motorSpeed(200,LOW,LOW,255,HIGH,LOW); SolSinyal = 1; } if ((y<0) && (x<0)) motorSpeed(200,LOW,LOW,255,LOW,HIGH); else if ((y<0) && (x>0))
motorSpeed(255,LOW,HIGH,200,LOW,LOW); else if ((y<0) && (x==0))
motorSpeed(255,LOW,HIGH,255,LOW,HIGH); } BLYNK_WRITE(V1) { speeds = param.asInt(); } void setup() { Serial.begin(115200); pinMode(L298N_A_In1_pin,OUTPUT); pinMode(L298N_A_In2_pin,OUTPUT);
pinMode(L298N_B_In3_pin,OUTPUT); pinMode(L298N_B_In4_pin,OUTPUT); digitalWrite(L298N_A_In1_pin,LOW); digitalWrite(L298N_A_In2_pin,LOW); digitalWrite(L298N_B_In3_pin,LOW); digitalWrite(L298N_B_In4_pin,LOW);
esc_signal.attach(D1); //Khai báo attach vào chân D1 của Arduino là chân tín hiệu của động cơ hút
esc_signal.write(30); //Giá trị mặc định của ESC, có thể thay đổi, dưới 30 thì động cơ sẽ khơng quay, 30 là số đo góc quay của servo
delay(3000);
Blynk.begin(auth, ssid, pass);
timer.setInterval(1000L, sendTemps); } void sendTemps() { } void loop() {
esc_signal.write(speeds); //Giá trị của ESC, từ 40 đến 130. Số càng cao động cơ quay càng nhanh.
Blynk.run(); timer.run(); }
CODE ĐIỀU KHIỂN
CƠ CẤU GẮP
#define BLYNK_PRINT Serial #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> #include <Servo.h> Servo servo1; Servo servo2; Servo servo3; Servo servo4;
char auth[] = "Blynk Auth Token"; char ssid[] = "your ssid";
char pass[] = "wifi password";
void setup() {
Serial.begin(9600);