BỘ CÔNG THƯƠNG TRƯỜNG ĐẠI HỌC ĐIỆN LỰC KHOA ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA ĐỒ ÁN THIẾT KẾ HỆ THỐNG NHÚNG Đề tài: Xe tự hành tránh vật cản và điều khiển từ xa Giảng viên hướng dẫn : TS... Xuất
PHÂN TÍCH BÀI TOÁN
Lý do chọn đề tài
Ngày nay, con người đang trải qua sự thay đổi mạnh mẽ nhờ vào những ứng dụng tiên tiến của khoa học kỹ thuật, dẫn đến một nền văn minh hiện đại hơn.
Sự phát triển của kỹ thuật điện tử đã mang lại nhiều thiết bị nổi bật với độ chính xác cao, tốc độ nhanh và gọn nhẹ, góp phần nâng cao hiệu quả hoạt động của con người Vi xử lý và điều khiển đã trở thành một ngành khoa học đa nhiệm vụ, đáp ứng nhu cầu ngày càng cao của các lĩnh vực khác nhau và nhu cầu thiết yếu trong cuộc sống hàng ngày Dựa trên những ứng dụng này, chúng em đã thiết kế và thực hiện đề tài: “Xe tự hành tránh vật cản và điều khiển từ xa”.
Mục đích thiết kế
❖ Đề tài có những mục tiêu chính như sau:
• Điều khiển xe robot chạy tiến, lùi, trái và phải
• Sử dụng cảm biến siêu âm ở trước để tránh vật cản
• Viết chương trình điều khiển cho ESP32
• Thi công mô hình xe robot
• Sản phẩm cuối cùng và chạy thực tế
Phương pháp nghiên cứu
• Tìm hiểu tổng quan về lý thuyết của đề tài
• Đọc hiểu các tài liệu liên quan đến đề tài
• Thảo luận nhóm để thống nhất ý kiến
• Thực nghiệm và kiểm chứng sản phẩm
Giới hạn cho hệ thống
• Mô hình xe chỉ chạy trên địa hình bằng phẳng dễ chạy.
• Điều khiển thông qua mạng mạng wifi nên chỉ có thể điều khiển ở một phạm vi nhất định nếu vượt quá thì sẽ không hoạt động được.
• Nguồn hoạt động chính của mạch là pin nên do đó có hạn chế về thời gian sử dụng
• Mô hình thi công có kích thước khoảng 26 x 17.5cm.
• Tính bảo mật của ứng dụng điều khiển không cao.
THIẾT KẾ HỆ THỐNG
Sơ đồ khối tổng thể hệ thống
Sơ đồ tổng thể của hệ thống
Khối nguồn: Nguồn vào dùng pin 3s(3 cell mắc nối tiếp) là viên pin có điện áp
11.1V (3.7V x 3),điện áp khi sạc đủ 100% sẽ là 12.6V (4.2V x 3 = 12.6V) sau đó được đưa qua module hạ áp biến đổi thành nguồn DC 5V cung cấp cho khối điều khiển, hiển thị, cảm biến
Khối cảm biến có chức năng nhận diện các vật cản và đo khoảng cách bằng cách sử dụng nguyên lý phát sóng và phản xạ sóng, sau đó truyền tín hiệu về khối xử lý.
Khối xử lý nhận thông tin từ khối cảm biến và xuất tín hiệu điều khiển đến khối chấp hành dựa trên các chương trình đã được lập sẵn.
Khối chấp hành nhận tín hiệu điều khiển từ khối xử lý và thực hiện các lệnh để tạo ra sự di chuyển của xe.
Đặc tả phần cứng
Hệ thống sử dụng vi điều khiển ESP32 Đầu vào:
- Dữ liệu truyền từ App BLynk Đầu ra :
- 1 Servo dùng để thay đổi góc của cảm biến siêu âm
- 1 Servo dùng để thay đổi góc lái giúp xe quay trái, phỉa
- 1 Động cơ 12v giúp xe có thể chạy tiến lùi
Đặc tả phần mềm
Chức năng di chuyển của xe được thực hiện khi nhận tín hiệu từ ứng dụng Blynk vào vi xử lý, cho phép xe di chuyển tiến, lùi, sang trái và sang phải theo ý muốn của người dùng.
- Đo khoảng cách để thực hiện chức năng phát hiện vật cản.
Xe có khả năng phát hiện vật cản ở phía trước, bên trái và bên phải, từ đó gửi tín hiệu về vi xử lý để thực hiện chức năng di chuyển sang hướng khác nhằm tránh va chạm.
+ Hàm đo khoảng cách : đọc tín hiệu từ cảm biến siêu âm về sau đó thực hiện tính toán khoảng cách.
+ Hàm đọc dữ liệu từ AppBlynk : appBlynk sẽ gửi 1 chuỗi dữ liệu xuống khi đó hàm này sẽ đọc dữ liệu và đưa ra lệnh điều khiển
+ Hàm điều khiển động cơ : Thực hiện điều khiển chức năng tiến lùi, quay trái, quay phải và điều khiển góc của biến siêu âm
Sơ đồ nguyên lý và các module
2.4.1 Sơ đồ nguyên lý tổng thể
Trong đồ án môn học Hệ thống nhúng với đề tài "Xe tự hành tránh vật cản và điều khiển từ xa", thiết kế phần cứng của mạch hệ thống được chia thành nhiều giai đoạn cụ thể.
Sơ đồ mạch nguyên lý tổng quát của hệ thống như sau :
Sơ đồ mạch tổng quát
Khối điều khiển trung tâm sử dụng vi điều khiển ESP32 để nhận tín hiệu từ ứng dụng Blynk hoặc cảm biến siêu âm Khi có tín hiệu tác động, vi điều khiển sẽ phát tín hiệu điều khiển khối chấp hành (module động cơ) theo các chương trình đã được lập trình sẵn.
Module L298 là một thiết bị điều khiển động cơ, cho phép điều chỉnh tốc độ và hướng di chuyển của động cơ thông qua các tín hiệu điều khiển được kết nối vào ba chân EN3, EN4 và ENB.
Trong bài hệ thống dùng 3 động cơ :
- Động cơ RS380 : Động cơ được nối với module L298 để nhận lệnh điều khiển từ vi xử lí giúp cho xe có thể chạy tiến lùi.
Động cơ Servo MG996R là phiên bản nâng cấp của servo MG995, mang lại tốc độ, lực kéo và độ chính xác cao hơn, rất phù hợp cho việc điều chỉnh bánh lái của xe, giúp xe quay trái và phải một cách mượt mà và chính xác.
- Động cơ Servo SG90 : Dùng để quay cảm biến siêu âm điều nhiều góc khác nhau giúp cho việc phát hiện được vật ở nhiều hướng khác nhau
Đây là module dùng để tạo ra nguồn điện áp chuẩn +5V Mạch giảm áp DC-
DC Buck LM2596 3A là một bộ giảm áp nhỏ gọn, có khả năng hạ áp từ 30VDC xuống 1.5VDC với hiệu suất cao lên đến 92% Sản phẩm này rất phù hợp cho các ứng dụng chia nguồn, giảm áp và cung cấp điện cho các thiết bị như camera, robot, và nhiều thiết bị điện tử khác.
Đầu vào của mạch là pin 18650 với điện áp khoảng 11,1V Sau khi đi qua IC ổn áp, nguồn điện áp chuẩn +5V được tạo ra để cung cấp cho mạch.
Hình 2.1 Module hạ áp LM2596
Cảm biến khoảng cách siêu âm HC-SRF04 là một thiết bị phổ biến nhờ vào giá thành rẻ và độ chính xác cao Thiết bị này sử dụng sóng siêu âm để đo khoảng cách trong khoảng từ 2 đến 300 cm, với độ chính xác chủ yếu phụ thuộc vào cách lập trình.
Cấu tạo :Có 4 chân là Vcc, Trig, Echo, GND
Cảm biến SR04 hoạt động bằng cách phát một xung ngắn (5 microSeconds) từ chân Trig Sau đó, nó tạo ra một xung High ở chân Echo cho đến khi nhận được sóng phản xạ Chiều rộng của xung tương ứng với thời gian sóng siêu âm di chuyển từ cảm biến và quay trở lại Tốc độ âm thanh trong không khí là 340 m/s, tương đương với 29,412 microSeconds/cm Để tính khoảng cách, ta chia thời gian nhận được xung cho 29,412.
Lựa chọn linh kiện
KIT WiFi Bluetooth ESP32 được xây dựng trên nền tảng module ESP32, tích hợp công nghệ Wifi, BLE và nhân ARM SoC tiên tiến Kit này có thiết kế phần cứng và firmware tương tự như Kit NodeMCU ESP8266, mang lại sự dễ dàng trong sử dụng Với đầy đủ chân ra, mạch nạp tích hợp và giao tiếp UART CP2102, KIT WiFi Bluetooth ESP32 là lựa chọn hàng đầu cho các nghiên cứu và ứng dụng liên quan đến Wifi, BLE và IoT.
- Module trung tâm: Wifi BLE SoC ESP32
- Nguồn sử dụng: 5VDC từ cổng Micro USB.
- Tích hợp mạch nạp và giao tiếp UART CP2102
- Ra chân đầy đủ module ESP32, chuẩn chân cắm 2.54mm
- Tích hợp Led Status, nút BOOT và ENABLE.
Các thiết bị ngoại vi ESP32 bao gồm:
18 kênh Bộ chuyển đổi tương tự sang kỹ thuật số (ADC)
2 Bộ chuyển đổi kỹ thuật số sang tương tự (DAC)
10 GPIO cảm biến điện dung
Các chân tĩnh cụ thể được gán cho các tính năng của ADC (Bộ chuyển đổi tương tự sang kỹ thuật số) và DAC (Bộ chuyển đổi kỹ thuật số sang tương tự).
- Driver: L298N tích hợp hai mạch cầu H.
- Dòng tối đa cho mỗi cầu H là: 2A (=>2A cho mỗi motor)
- Điện áp của tín hiệu điều khiển: +5 V ~ +7 V
- Dòng của tín hiệu điều khiển: 0 ~ 36mA (Arduino có thể chơi đến 40mA nên khỏe re nhé các bạn)
- Công suất hao phí: 20W (khi nhiệt độ T = 75 ℃)
- 12V power, 5V power Đây là 2 chân cấp nguồn trực tiếp đến động cơ.
- Power GND chân này là GND của nguồn cấp cho Động cơ.
- Gồm có 4 chân Input IN1, IN2, IN3, IN4
Hình 2.4 Động cơ RS380 Thông số kỹ thuật của động cơ RS380
+ tốc độ động cơ: 4000 vòng/phút
Hình 2.5 Động cơ servo MG996R Thông số kỹ thuật:
- Tốc độ quay: 0.19 sec/60° (4.8V), 0.15 sec/60° (6.0V)
- Hỗ trợ: vòng bi đôi
Hình 2.6 Module hạ áp LM2596
Mạch giảm áp DC-DC LM2596 có led hiển thị điện áp ngõ ra - vào, cho dòng điện ngõ ra lên đến 3A.
- Điện áp đầu vào: 2,5 - 36 VDC.
- Điện áp đầu ra: 1.25 - 35 VDC (Xoay trở điều chỉnh).
- Tần số chuyển đổi: 150 kHz.
- Có nút nhấn thay đổi hiển thị điện áp ngõ ra - vào.
- Dòng ngõ ra tối đa: 3A.
Hình 2.7 Module cảm biến siêu âm hc-sr04 Thông số kỹ thuật của cảm biến siêu âm HC-SR04
Hình 2.8 Động Cơ Servo SG90 Thông Số Kỹ Thuật Động Cơ Servo SG90
- Kích thước: 23mmX12.2mmX29mm
- Tốc độ hoạt động: 60 độ trong 0.1 giây
- Nhiệt độ hoạt động: 0 ºC – 55 ºC
XÂY DỰNG HỆ THỐNG
Lưu đồ thuật toán hệ thống
3.2.1 Lưu đồ thuật toán điều khiển
3.2.2 Lưu đồ thuật toán tránh vật cản
Chương trình điều khiển
Servo myservo; // create servo object to control a servo int pos = 0; // variable to store the servo position
#define BLYNK_TEMPLATE_ID "TMPLdj6EXQA1"
#define BLYNK_TEMPLATE_NAME "CarRC"
#define BLYNK_AUTH_TOKEN "0y3J_iq-XGqSd7aNbZ_rAx_OzdVyxSap"
// Comment this out to disable prints and save space
The code defines constants for triggering and echoing signals, initializes a servo motor variable, and sets a distance threshold for object detection It includes a function to measure distance, as well as functions to control movement in various directions: forward, left, right, and backward Additionally, there are functions to reset the motor and to rotate it to the left or right.
//=====================// char auth[] = BLYNK_AUTH_TOKEN;
// Set password to "" for open networks. char ssid[] = "TienDatAbc"; char pass[] = "12345678"; int ENB = 14; int servoPin = 27; int IN3 = 13; int IN4 = 12; int x = 90; int y = 50; int Speed; int Auto = 0;
// put your setup code here, to run once: myservo.attach(dongcoservo); pinMode(trig, OUTPUT); pinMode(echo, INPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); pinMode(ENB, OUTPUT); myservo.write(90);
Serial.begin(115200); myS.attach(servoPin); myS.write(90);
Blynk.begin(auth, ssid, pass, "blynk.cloud", 8080);
} else if (x < 75 && y > 70) { carForward(); myS.write(x);
} else if (x > 105 && y > 70) { carForward(); myS.write(x);
}else if (x > 105 && y < 30) { carBackward(); myS.write(x);
}else if (x < 75 && y < 30) { carBackward(); myS.write(x);
} else if (x == 90 && y == 50) { carStop(); myS.write(x);
Blynk.run(); if(Auto == 0){ smartcar();
Serial.println(khoangcach); if (khoangcach > gioihan || khoangcach == 0)
Serial.println(khoangcach); khoangcachtrai = khoangcach; quaycbsangphai(); dokhoangcach();
Serial.println(khoangcach); khoangcachphai = khoangcach; if (khoangcachphai < 15 && khoangcachtrai < 15) { dilui();delay(300);dunglai();delay(300);
{ dilui();delay(300);dunglai();delay(300); disangphai();
Serial.println("Di sang phai"); delay(400);dunglai();delay(300);
{ dilui();delay(300);dunglai();delay(300); disangtrai();
Serial.println("Di sang trai"); delay(400);dunglai();delay(300);
} void carForward() { analogWrite(ENB, Speed); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
} void carBackward() { analogWrite(ENB, Speed); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
} void carStop() { digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
{ analogWrite(ENB, Speed); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
} void dunglai(){ analogWrite(ENB, Speed); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); delay(500 );. digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
{ analogWrite(ENB, Speed); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); myS.write(119);
{ analogWrite(ENB, Speed); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); myS.write(60);
{ analogWrite(ENB, Speed); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); myS.write(90);
{ digitalWrite(trig, LOW); delayMicroseconds(2); digitalWrite(trig, HIGH); delayMicroseconds(10); digitalWrite(trig, LOW);
// Đo độ rộng xung HIGH ở chân echo. thoigian = pulseIn(echo, HIGH); khoangcach = thoigian / 2 / 29.412;
{ myservo.write(150); // tell servo to go to position in variable 'pos' delay(1000); dokhoangcach(); myservo.write(90); // tell servo to go to position in variable 'pos'
{ myservo.write(30); // tell servo to go to position in variable 'pos' delay(1000); dokhoangcach(); myservo.write(90); // tell servo to go to position in variable 'pos'