Phương pháp tương tự được sử dụng để di chuyển xe sang phải.
Tùy thuộc vào điện áp ứng dụng và động cơ chính, ở tốc độ thấp hơn, động cơ khơng thể bắt đầu di chuyển và nó tạo ra âm thanh ù. Trong trường hợp của tôi, các động cơ không thể di chuyển nếu giá trị của tín hiệu PWM dưới 70. Do đó, sử dụng hai câu lệnh if này tôi đã giới hạn ở phạm vi tốc độ từ 70 đến 255. Cuối cùng, chúng tôi chỉ gửi tốc độ động cơ cuối cùng hoặc Tín hiệu PWM đến các chân cho phép của trình điều khiển L298N.
70
// Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70)
if (motorSpeedA < 70) { motorSpeedA = 0; } if (motorSpeedB < 70) { motorSpeedB = 0; }
analogWrite(enA, motorSpeedA); // Send PWM signal to motor A analogWrite(enB, motorSpeedB); // Send PWM signal to motor B
Đây là code hồn chỉnh của ví dụ xe robot Arduino:
#define enA 9 #define in1 4 #define in2 5 #define enB 10 #define in3 6 #define in4 7 int motorSpeedA = 0; int motorSpeedB = 0; void setup() { pinMode(enA, OUTPUT); pinMode(enB, OUTPUT); pinMode(in1, OUTPUT);
71 pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); } void loop() {
int xAxis = analogRead(A0); // Read Joysticks X-axis int yAxis = analogRead(A1); // Read Joysticks Y-axis
// Y-axis used for forward and backward control if (yAxis < 470) {
// Set Motor A backward digitalWrite(in1, HIGH); digitalWrite(in2, LOW); // Set Motor B backward digitalWrite(in3, HIGH); digitalWrite(in4, LOW);
// Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed
motorSpeedA = map(yAxis, 470, 0, 0, 255); motorSpeedB = map(yAxis, 470, 0, 0, 255); }
else if (yAxis > 550) { // Set Motor A forward digitalWrite(in1, LOW); digitalWrite(in2, HIGH); // Set Motor B forward
72
digitalWrite(in3, LOW); digitalWrite(in4, HIGH);
// Convert the increasing Y-axis readings for going forward from 550 to 1023 into 0 to 255 value for the PWM signal for increasing the motor speed motorSpeedA = map(yAxis, 550, 1023, 0, 255);
motorSpeedB = map(yAxis, 550, 1023, 0, 255); }
// If joystick stays in middle the motors are not moving else {
motorSpeedA = 0; motorSpeedB = 0; }
// X-axis used for left and right control if (xAxis < 470) {
// Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value
int xMapped = map(xAxis, 470, 0, 0, 255);
// Move to left - decrease left motor speed, increase right motor speed motorSpeedA = motorSpeedA - xMapped;
motorSpeedB = motorSpeedB + xMapped; // Confine the range from 0 to 255
if (motorSpeedA < 0) { motorSpeedA = 0; }
if (motorSpeedB > 255) { motorSpeedB = 255;
73
} }
if (xAxis > 550) {
// Convert the increasing X-axis readings from 550 to 1023 into 0 to 255 value
int xMapped = map(xAxis, 550, 1023, 0, 255);
// Move right - decrease right motor speed, increase left motor speed motorSpeedA = motorSpeedA + xMapped;
motorSpeedB = motorSpeedB - xMapped; // Confine the range from 0 to 255
if (motorSpeedA > 255) { motorSpeedA = 255; } if (motorSpeedB < 0) { motorSpeedB = 0; } }
// Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70) if (motorSpeedA < 70) { motorSpeedA = 0; } if (motorSpeedB < 70) { motorSpeedB = 0; }
analogWrite(enA, motorSpeedA); // Send PWM signal to motor A analogWrite(enB, motorSpeedB); // Send PWM signal to motor B
74
}
4.1.6 Điều khiển động cơ bằng L298n và Blynk.
Với những kiến thức như trên đã đề cập đến khi kết nối L298n với động cơ DC chúng ta sẽ cải tiến để điều khiển qua wifi bằng app Blynk.
a. Sơ đồ nguyên lý.
Chúng ta có thể kết nối các linh kiện theo sơ đồ nguyên lý như sau:
Hình 4.14 Sơ dồ nguyên lý
Chúng ta vẫn có thể sử dụng hai động cơ DC hay bốn động cơ DC để điều khiển và chuyển hướng của thiết bị.
75
Bảng 4.1 Sơ đồ nối chân
NodeMCU L298n D5 ENA D6 ENB D7 IN1 D8 IN2 D4 IN3 D3 IN4 Vin +5V Gnd Gnd
4.1.7 Thiết kế app Blynk để điều khiển và giải thích code.
Blynk là một phần mềm được thiết kế cho Internet of Things (IoT), phục vụ cho các nhu cầu tiếp cận IoT, là một Platform để chúng ta có thể tự tạo ra một sản phẩm IoT do it yourself (DIY) một cách dễ dàng nhất. Nó có thể:
Điều khiển các thiết bị phần cứng từ xa.
Hiển thị dữ liệu cảm biến.
Lưu trữ dữ liệu… và nhiều điều thú vị khác.
Blynk hoạt động như thế nào ?
Có ba thành phần chính trong nền tảng:
Blynk App - cho phép tạo giao diện cho sản phẩm bằng cách kéo thả các widget
khác nhau mà nhà cung cấp đã thiết kế sẵn.
Blynk Server - chịu trách nhiệm xử lý dữ liệu trung tâm giữa điện thoại, máy
tính bảng và phần cứng. Chúng ta có thể sử dụng Blynk Cloud của Blynk cung cấp hoặc tự tạo máy chủ Blynk riêng của mình. Vì đây là mã nguồn mở, nên mọi người đều có thể dễ dàng intergrate vào các thiết bị và thậm chí có thể sử dụng Raspberry Pi làm server của mỗi cá nhân.
76
Library Blynk – support cho hầu hết tất cả các nền tảng phần cứng phổ biến -
cho phép giao tiếp với máy chủ và xử lý tất cả các lệnh đến và đi.
Bây giờ hãy tưởng tượng: mỗi khi chúng ta nhấn một nút trong ứng dụng Blynk, yêu cầu sẽ chuyển đến server của Blynk, server sẽ kết nối đến phần cứng thông qua library . Tương tự thiết bị phần cứng sẽ truyền dữ liệu ngược lại đến server.
Tính năng, đặc điểm
Cung cấp API & giao diện người dùng tương tự cho tất cả các thiết bị và phần cứng được hỗ trợ
Kết nối với server bằng cách sử dụng:
Wifi
Bluetooth và BLE
Ethernet
USB (Serial)
GSM
Các tiện ích trên giao diện được nhà cung cấp dễ sử dụng: - Thao tác kéo thả trực tiếp giao diện mà không cần viết mã.
77
- Dễ dàng tích hợp và thêm chức năng mới bằng cách sử dụng các cổng kết nối ảo được tích hợp trên blynk app.
- Theo dõi lịch sử dữ liệu.
- Thông tin liên lạc từ thiết bị đến thiết bị bằng Widget.
- Gửi email, tweet, thơng báo realtime, v.v.... được cập nhật các tính năng liên tục và còn rất nhiều các phiên bản.
Làm thế nào để sử dụng Blynk?
Những phần cần thiết để có thể tạo một sản phẩm IoT bằng Blynk bao gồm
Hardware: Bao gồm các thiết bị phần cứng như Arduino, Raspberry Pi, Esp8266, esp32 ….
Smartphone: Hiện tại thì Blynk hỗ trợ 2 nền tảng là Android và IOS. Các bạn có thể search trên Blynk trên AppStore và GooglePlay.
Internet: chắc chắn là phải cần internet thì các thiết bị có thể giao tiếp được với nhau.
Library: Chắn chắn mỗi thiết bị sẽ phải cài các thư viện khác nhau: Ngồi ra chúng ta cịn phải cần cài: Bridge trên arduino
Sau đó có thể tìm thư viện cho board của chúng ta tại github.com
78
Chúng ta có thể tải app Blynk ngay tại các cửa hàng ứng dụng như: Google Play (Android) và App Store (IOS). Ta chỉ việc vào cửa hàng ứng dụng, nhập [Blynk] vào thanh tìm kiếm sau đó ấn cài đặt để tải về và chờ đợi thiết bị được cài đặt Blynk.
Tạo tài khoản Blynk
Để có thể sử dụng App Blynk chúng ta cần phải đăng ký một tài khoản mới. Ở đây có 2 cách đăng ký bằng Facebook hoặc tạo một tài khoản mới (Create New Account). Việc đăng kí bằng Facebook sẽ mang lại khá nhiều rủi ro như: Tài khoản Facebook bị mất, đánh cắp, quên mật khẩu,… Do đo trong bài viết sẽ chỉ đề cập tới việc tạo tài khoản mới để tiện cho việc phục hồi cũng như tránh được phần lớn các rủi ro.
79
Nhập thông tin tài khoản Gmail. Rồi nhấn Sign Up để tiến hành đăng ký.
Sau khi đăng ký hoàn thành, chúng ta sẽ tiến hành tạo một Project mới. Nhấn vào New Project để tạo một Project mới
80
Blynk sẽ cấp cho các bạn một mã Token, mã này sẽ gửi trực tiếp vào Gmail mà lúc nãy bạn đăng ký.
Mã Token này dùng để chèn vào code Example của Blynk.
Như vậy chúng ta đã hoàn thành việc đăng ký tài khoản và tạo một Project mới, Một Project mới sẽ có giao diện như sau:
81
Hình 4.15 Giao diện app Blynk
Lưu đồ giải thuật.
83
4.1.2. Thiết kế timer hẹn giờ cho app Blynk.
Hình 4.17 Hướng dẫn set up timer
Bước 1: Chọn nút “+” để thêm tiện ích Bước 2: Chọn tiện ích “Timer”
84
Vậy là tiện ích đã được thêm vào màn hình chính của Project. Tiếp theo ta cần tìm hiểu về code của tiện ích Timer này như sau: #define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
// Chúng ta có thể lấy Token tại app Blynk hoặc lấy từ Gmail được gửi về khi tạo Project mới.
char auth[] = "YourAuthToken";
// Cần phải nhập tên Wifi và mật khẩu của Wifi để phần cứng kết nối mạng.
char ssid[] = "YourNetworkName"; char pass[] = "YourPassword"; BLYNK_WRITE(V5)
{
// Ta có thể set mức High/1 tại thời điểm bắt đầu và mức Low/0 tại thời điểm kết thúc.
// Timer sẽ được kích hoạt mỗi ngày cho đến khi bạn tắt Project hoặc dừng/ xóa Timer đi Serial.print("Got a value: "); Serial.println(param.asStr()); } void setup() { // Debug Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
// Bạn cũng có thể chỉ định máy chủ như sau:
85
//Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8080); }
void loop()
{
Blynk.run(); }
4.1.8. Thiết kế phím điều hướng Joystick
Joystick là một giả lập điều khiển trên Blynk, Joystick có thể giúp điều khiển các hướng linh hoạt.
Để thêm Joystick vào giao diện Blynk như sau:
Hình 4.19 Thiết kế giao diện Joystrick
Bước 1: Click vào dấu “+” Bước 2: Chọn Joystick
86
Hình 4.20 Thiết lập Joystrick Setting
Bước 3: Click 2 lần vào Joystick Bước 4: Thiết lập thông số như sau
Tiếp theo là code của phần Joystick được thực hiện như sau: #define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h> // Có thể lấy Token trong ứng dụng Blynk char auth[] = "…"; //Token của ứng dụng // Code kết nối Wifi.
char ssid[] = "…"; //tên wifi char pass[] = "…"; //mật khẩu BlynkTimer timer;
87 const byte L298N_A_pin = D5; // GPI05 const byte L298N_A_In1_pin = D8; //GPI04 const byte L298N_A_In2_pin = D7; //GPI0 const byte L298N_B_In3_pin = D4; // GPI02 const byte L298N_B_In4_pin = D3; // GPIO14 const byte L298N_B_pin = D6; //GPI12
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); }
88 else { ArkaLamba = 1; SolSinyal = 1; SagSinyal = 1; }
if ((x==0) && (y==0)) /// stop {
motorSpeed(0,LOW,LOW,0,LOW,LOW); SolSinyal = 0;
SagSinyal = 0; }
else if ((x==0) && (y>0)) { if (y==1){ motorSpeed(700,HIGH,LOW,700,HIGH,LOW); } // else { motorSpeed(900,HIGH,LOW,900,HIGH,LOW); } SolSinyal = 0; SagSinyal = 0; }
else if ((y==0) && (x>0)) {
motorSpeed(900,HIGH,LOW,900,LOW,HIGH); SagSinyal = 1;
}
else if ((y>0) && (x>0)) {
motorSpeed(900,HIGH,LOW,700,LOW,LOW); SagSinyal = 1;
}
89 {
motorSpeed(900,LOW,HIGH,900,HIGH,LOW); SolSinyal = 1;
}
else if ((y>0) && (x<0)) { motorSpeed(700,LOW,LOW,900,HIGH,LOW); SolSinyal = 1; } if ((y<0) && (x<0)) motorSpeed(700,LOW,LOW,900,LOW,HIGH); else if ((y<0) && (x>0))
motorSpeed(900,LOW,HIGH,700,LOW,LOW); else if ((y<0) && (x==0))
motorSpeed(900,LOW,HIGH,900,LOW,HIGH); } 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);
90 Blynk.begin(auth, ssid, pass);
timer.setInterval(1000L, sendTemps); } void sendTemps() { } void loop() { Blynk.run(); timer.run(); }
Như vậy sau khi đã hoàn thành việc cài đặt và thiết lập, ta sẽ màn hình điều khiển như sau:
91
- Xe sẽ di chuyển theo hướng mà chúng ta điều khiển. Có thể “Tiến – Lùi – Trái – Phải” theo ý mong chúng ta mong muốn.
- Quỹ đạo hướng đi có thể điều khiển theo hướng ziczac, thẳng về phía trước, lui về phía sau, rẽ hướng trái ,rẽ hướng phải… tuỳ khu vực và mục đích sử dụng.
4.1.9. Tính tốn mơ phỏng
Sau đây là mô phỏng quỹ đạo đường đi của mơ hình:
Hình 4.22 Quỹ đạo dự kiến của mơ hình
Tính tốn thời gian:
92 - Bánh xe quay được : 300vịng/phút
Từ đó ta có quảng đường bánh xe đi được trong 1 phút là : s = d x 300 vòng/phút = 3000 cm = 3m/phút
Giả sử chọn phịng có diện tích là: 6 x 6 = 36 m2 gần với diện tích thực tế nhất là 37m2 .
Điều khiển mơ hình chạy theo quỹ đạo:
Tổng thời gian để mơ hình di chuyển được qng đường 6 mét là 2 phút, Thiết bị phải thực hiện số lần chạy này là 15 lần, như vậy tổng thời gian dự kiến để thiết bị chạy được hết diện tích 36m2 là 30 phút.
Tuy nhiên đối với khu vực hành lang có diện tích rộng, thì thời gian hoạt động cũng sẽ tăng theo tỉ lệ thuận với diện tích hành lang.
Tính tốn về nguồn
Tổng cơng suất của mơ hình dự kiến như sau:
Bảng 4.2 Bảng công suất dự kiến của các thành phần
STT Tên Công suất
1 Quạt 60 W ± 5% 2 L298N 20 W ± 5% 3 Motor 10 W ± 5% 4 Máy bơm 2,6 W ± 5% Tổng cộng 92.6 W ± 5% 6m 40 cm
93
Dựa vào cơng thức sau để tính thời gian sử dụng của ắc - quy, phụ thuộc vào dung lượng và công suất tải của ắc - quy :
t = (Ah.V. η)/P Trong đó:
- t : là thời gian sử dụng điện từ Ắc quy (Giờ) - A: Dung lượng Ắc quy (Ah)
- V: Điện áp Ắc quy (Volt) - P: Công suất tải(W)
- η: Hệ số sử dụng Ắc quy . Thông thường η=0,7. Thời gian sạc ắc – quy: 𝐷𝑢𝑛𝑔 𝑙ượ𝑛𝑔 ắ𝑐−𝑞𝑢𝑦
𝐷ò𝑛𝑔 đ𝑖ệ𝑛 𝑛ạ𝑝 Chọn dòng điện nạp là 10A Bảng 4.3 Số liệu ác quy Thời gian sử dụng (t1) Thời gian sạc (t2) Dung
lượng (Ah) Sai số
0.35 giờ 0.4 giờ 4 Ah ± 5% 0.63 giờ 0.7 giờ 7 Ah ± 5% 1.05 giờ 1,2 giờ 12 Ah ± 5% 1.75 giờ 2 giờ 20 Ah ± 5% 2.65 giờ 3 giờ 30 Ah ± 5% 4.375 giờ 5 giờ 50 Ah ± 5% 8.75 giờ 10 giờ 100 Ah ± 5%
94 4.2. Bảng Vẽ Mặt cắt Dọc Hình 4.23 Mặt Cắt Dọc Bảng Vẽ Mặt cắt Ngang Hình 4.24 Mặt cắt ngang bản vẽ Mặt cắt đứng 1 m 1 m
95 Hình 4.25 Mặt cắt đứng bản vẽ Bảng 4.26 Khung 3D 40 c m 1 m 40 cm Ø = 2cm Rộng 2 cm Dày 2.5 cm
96
Hình 4.27 Lắp ráp mơ hình với từng khối
* Khối lượng dự kiến của các thành phần:
Bảng 4.4 khối lượng mơ hình
STT Tên Khối lượng Sai số
1 Hóa chất (tuỳ loại hố chất) 1,5-3 kg 5%
2 Máy bơm 1 kg 5% 3 Dây dẫn 0.2 kg 5% 4 Quạt 2.5 kg 5% 5 Khung xe 2 kg 5% 6 Đầu phun 0.1 kg 5% Tổng khối lượng thành phần dự kiến 7,3 – 8,8 kg 5%
Với mỗi hóa chất sẽ có một khối lượng riêng khác nhau tương ứng, do đó tổng khối lượng dự kiến của mơ hình sẽ thay đổi khác nhau theo từng hóa chất.
97
4.3. Sơ đồ khối và ngun lí hoạt động. 4.3.1. Sơ đồ khối. 4.3.1. Sơ đồ khối.
Hình 4.28 Sơ đồ khối
- Khối điện thoại: Đây là khối được xem như "đầu não", nơi tập hợp các chức năng điều khiển cả hệ thống thông qua apps Blynk. Bao gồm 2 chức năng điều khiển chính là Timer và bàn phím điều hướng cho xe.
- Khối điện thoại sẽ được kết nối với ESP8266 bằng đường truyền không dây