- Sơ đồ kết nối các thiết bị với mô hình (cảm biến CLM):
Hình 3.4. Sơ đồ kết nối các thiết bị điện tử với mô hình
- Cảm biến sử dụng nguồn 12V-5A nên ta sử dung 1 Adapter có nguồn tương đương để cấp cho cảm biến.
- Sử dụng chân Digital 7 (tự chọn) của Adruino Uno R3 là chân nhận tín hiệu gửi về từ cảm biến.
- GND của cảm biến kết nối với GND của Adruino Uno R3.
- Kết nối chân 5V Adruino Uno R3 với chân VCC của module SIM900A để cấp nguồn cho module.
- Kết nối chân 8 của Adruino Uno R3 với chân 5VT (TX – Transmitter – phát tín hiệu) của module SIM900A, kết nối chân 9 của Adruino Uno R3 với chân 5VR (RX – Receiver – thu tín hiệu) của module SIM900A.
19 - Nút nhấn 3 chân: 1 chân gắn trở gắn với chân 5V, 1 chân gắn với GND của
adruino, và 1 chân gắn với chân số 2 của adruino.
20
3.2. Giao tiếp giữa mô hình với Adruino Uno, giao diện tƣơng tác Matlab GUI và Callback
- Tập trung vào tìm hiểu việc kết nối và giao tiếp giữa máy tính, các thiết bị điện tử cũng như cảm biến. Hướng dẫn phương thức giao tiếp của Matlab (Matlab GUI) với cảm biến, cách lấy tín hiệu và cách tính toán thành kết quả từ tín hiệu nhận được. Cách thiết lập các giao diện và kết nối chúng với nhau, giải thích các thông số có trong giao diện.
3.2.1. Giao tiếp giữa mô hình với Adruino Uno
- Sau khi kết nối các thiết bị điện tử với nhau, ta tiến hành viết code cho Adruino để nhận được tín hiệu từ cảm biến.
- Khởi động chương trình Adruino IDE. - Code Arduino IDE:
int sig=7; byte x; void setup() { pinMode(sig,INPUT); Serial.begin(115200); } void loop() { x=digitalRead(sig); Serial.println(x); }
21
Bảng 3.1. Giải thích code Adruino IDE để lấy tín hiệu từ cảm biến
Code Adruino IDE Giải thích công dụng
int sig = 7; byte x;
Tạo biến chân tín hiệu là chân 7 Khai báo biến x là tín hiệu cảm biến
void setup() {
pinMode(sig,INPUT); Serial.begin(115200); }
Thiết lập
Chân tín hiệu INPUT
Mở cổng Serial 115200 baurdrate void loop() { x=digitalRead(sig); Serial.println(x); } Vòng lặp đọc tín hiệu từ cảm biến Gởi tín hiệu cảm biến qua serial
- Chọn mạch Adruino kết nối và chọn cổng giao tiếp cho Adruino.
22
Hình 3.7 Chọn cống giao tiếp (Port) cho Adruino
23
3.2.2. Giao diện tƣơng tác Matlab GUI và Callback
- Tạo giao diện điều khiển trên Matlab GUI:
Bật Matlab và đánh chữ “guide” để mở Matlab GUI, sau đó chọn
Blank GUI (Default) và ấn nút OK.
Tạo các thành phần trong giao diện điều khiển.
Hình 3.9. Giao diện khởi tạo, thiết kế giao diện trong GUI
Các công cụ biểu tượng cần để thực hiện tạo giao diện cho chương trình:
Push Button: là nút nhấn, khi nhấn vào sẽ thực thi lệnh trong cấu
trúc hàm callback của nó.
Edit Text: là nơi các kí tự được nhập vào từ người dùng, người
dùng có thể thay đổi được.
Static Text: Là các kí tự được hiển thị thông qua các callback,
hoặc thông thường để viết nhãn cho các biểu tượng.
Axes: ây là giao diện đồ họa hiển thị hình ảnh, nó có nhiều thuộc
tính bao gồm: không gian 2D (theo trục đứng và trục ngang), 3D (hiển thị không gian 3 chiều).
24 - Khi nhấp chọn và kéo thả vào vùng cần thiết kế, mỗi hộp thoại có các thông số chỉnh riêng, để chỉnh các thông số liên quan đến hộp thoại nào ta nhấp đôi vào hộp thoại đó hoặc chuột phải vào đối tượng và chọn
Property Inspector.
25 - Phía bên trái của Menu Inspector là tên thuộc tính, có thể gọi thực thi các
thuộc tính này bằng các lệnh.
- Phía bên trái là giá trị của thuộc tính, giá trị này do người dùng đặt, có thể thay đổi thông qua các lệnh gọi (Callback), hoặc được thiết lập trước. - 2 mục quan trọng là:
String: Tên của đối tượng xuất hiện trên giao diện. Tag: Tên của đối tượng xuất hiện trong Callback. - Và sau khi thiết kế ta có 1 giao diện sau:
Hình 3.11. Giao diện Matlab GUI giao tiếp với mô hình
- Thành phần của giao diện Matlab:
Nút Calculate : Chạy chương trình tính toán của Matlab và đửa ra kết quả theo số điểm Points Num.
Nút Clear: Xóa biến khi có lỗi và xóa lỗi.
Ô nhập Points Num: Số điểm chọn để đo và đưa ra đồ thị. Ô Pulse Period: ộ dài của một chu kỳ.
26 Hai ô Vulume: Kết quả tính toán mức dầu theo thể tích (mm3) và theo
phần trăm bình chứa (%).
ồ thị: ồ thị tín hiệu của cảm biến đo được bằng Arduino.
- Bắt đầu thực hiện viết code Matlab với việc thực thi hàm Callback: Nhấp chuột phải chọn View Callbacks và chọn tiếp Callback.
Hình 3.12. Gọi hàm Callback
- Sau đó hàm Callback sẽ tự động được gọi và con trỏ chuột sẽ tìm đến vị trí của nó trong Mfile.
- Khi muốn gọi một hàm nào cho đối tượng khác cũng có thể thực hiện như trên, sau đó tiến hành viết câu lệnh cho nó.
- Code tập trung vào 2 Push Button “Calculate” và “Clear” để kết nối các thành phần trong giao diện lại với nhau:
Calculate: Tính toán và đưa ra thông số tại các ô Edit Text và thể hiện
sự thay đổi xung của cảm biến trên ô Axes.
27
- Chương trình tính toán nút Calculate: global s ;
s = serial('COM5','BaudRate',115200); fopen(s);
num = get(handles.num,'string');
num = str2num(num); i=1; tic while i<=num z = fscanf(s,'%f'); if (isnumeric(z)==1)&&(isempty(z)==0) x(i)=z; i=i+1; end end t = toc; fclose(s); delete(s); ts = linspace(0,t,num); plot(ts,x); axis([0 t -0.5 1.5]);
xlabel('Time(s)'); ylabel('Signal'); grid on pw = pulsewidth (x); pw = pw(end); pp = pulseperiod (x); pp = pp(end);
28
set(handles.pw,'string',pw);
set(handles.pp,'string',pp);
min = 123; max = 5026; %Thuc nghiem tim ra min va max
pw
level = percent(max,min,pw); V = volume (60,30,level);
set(handles.V,'string',V);
set(handles.lvl,'string',level);
clear all
- Chương trình con được sử dụng tích hợp trong nút Calculate: Chương trình Volume:
function x = volume (d,hmax,level) S = pi*(d/2)^2; h = hmax*level/100; x = S*h; Chương trình Percent: function x = percent(max,min,pw) x = ((pw-min)/(max-min))*100;
29
Bảng 3.2. Giải thích code cho nút Calculate trong giao diện giao tiếp Matlab GUI
Code tính toán Giải thích công dụng
global s; Tạo biến toàn cục s
s = serial('COM5','BaudRate',115200); Gán biến s là cổng giao tiếp Seial 115200 baudrate fopen(s); fclose(s); delete(s); Mở cổng giao tiếp s óng cổng giao tiếp s
Xóa cổng giao tiếp s để đo ở các lần tiếp theo
num = get(handles.num,'string'); num = str2num(num);
Lấy chuỗi từ ô Points Num Chuyển chuổi sang dạng số Tic
t = toc;
Bắt đầu bấm thời gian đo
Kết thúc thời gian đo và gán cho biến thời gian t i=1; while i<=num z = fscanf(s,'%f'); if (isnumeric(z)==1)&&(isempty(z)==0) x(i)=z; i= i+1; end end
Tạo biến đếm i=1
Vòng lặp nhận tín hiệu của cảm biến Gán z bằng tín hiệu gởi qua cổng Serial Hàm isnumeric(z)kiểm z có phải là số
Hàm isempty(z)kiểm tra z có rống nếu z là số thì gán x=z
30 ts = linspace(0,t,num); Chia khoảng thời gian đo t ra số điểm
đã chọn ở ô Points Num để vẽ đồ thị plot(ts,x); axis([0 t -0.5 1.5]); xlabel('Time(s)'); ylabel('Signal'); grid on Vẽ đồ thị trục x là thời gian và trục y là tín hiệu
Lệnh axis chọn giới hạn cho 2 trục x và y Gán tên cho trục x và y Vẽ lưới pw = pulsewidth (x); pw = pw(end); pp = pulseperiod (x); pp = pp(end);
Tính độ rộng xung và chu kỳ xung sau đó lấy giá trị cuối cùng trong ma trận giá trị
set(handles.pw,'string',pw); set(handles.pp,'string',pp);
In kết quả độ rộng xung và chu kỳ xung ra ô Pulse Width và Pulse Period min = 123; max = 5026; Gán giá trị độ rộng xung lớn nhất và
nhỏ nhất được lấy từ thực nghiệm vào 2 biến min và max
level = percent(max,min,pw); V = volume (60,30,level);
Gọi chương trình con Percent và Volume tính mực dầu và thể tích dầu trong bình chứa
set(handles.V,'string',V);
set(handles.lvl,'string',level);
Dán giá trị thể tích và mực dầu ra ô Volume
31 - Chương trình nút Clear: clc; cla; global s ; fclose(s); delete(s); clear all;
Bảng 3.3. Giải thích code cho nút Clear trong giao diện giao tiếp Matlab GUI
Code tính toán Giải thích công dụng
clc; cla; Xóa command window và đồ thị
global s ; Tạo biến toàn cục s
fclose(s); delete(s);
óng cổng giao tiếp s Xóa cổng giao tiếp s clear all; Xóa toàn bộ dữ liệu biến
32 - Chúng ta đổ chương trình code Adruino Uno để lấy tín hiệu từ cảm biến
phục vụ cho chương trình Matlab GUI.
- Thiết lập cảm biến: khi chưa có dầu nhấn giữ nút SET trên cảm biến cho đến khi đèn sang lên rồi tắt, tiếp đến đổ đầy dầu và nhấn giữ nút SET như trên một lần nữa.
Hình 3.14. Vị trí nút “SET” trên cảm biến
- Sau đó, chạy trương trình code Matlab GUI mà chúng ta vừa thiết kế và khi xuất hiện giao diện chúng ta ấn nút Calculate, lúc đó ta sẽ nhận được kết
quả trên giao diện.
33
Hình 3.15. Thông số hiện thị khi chưa đổ dầu
34
3.3. Kết nối với modul GPRS/GSM SIM900A và gửi dữ liệu lên trang web
- Tập trung vào việc thiết lập và giao tiếp giữa mạch điều khiển Adruino và module. Cách tạo kết nối với 1 trang web và gửi dữ liệu lên đó. Hướng dẫn một số AT commands để giao tiếp serial.
3.3.1. Kết nối sim điện thoại với module GPRS/GSM SIM900A và thử nghiệm một số chức năng của module nghiệm một số chức năng của module
- ầu tiên, tải thư viện Softwareserial trên web về. Vì mạch điều khiển Adruino giao tiếp với module GPRS/GSM qua thư viện này.
- Cho sim điện thoại vào khe sim của module GPRS/GSM và kết nối với Adruino bằng code Adruino IDE sau đây:
#include <SoftwareSerial.h> SoftwareSerial GPRS(8, 9); byte incoming; void setup() { GPRS.begin(9600); Serial.begin(9600); GPRS.println("AT"); delay(1000); } void loop(){ while (Serial.available()){ incoming = Serial.read(); if (incoming == '*') GPRS.write((char)26); else GPRS.write(incoming); }
35
while (GPRS.available()) { Serial.write(GPRS.read());} }
Bảng 3.4. Giải thích code Adruino IDE để kết nối với mudule GPRS/GSM
Code Adruino IDE Giải thích công dụng
#include <SoftwareSerial.h> Khai báo thư viện Softwareserial
SoftwareSerial GPRS(8, 9); byte incoming;
Mở cổng giao tiếp có tên “GPRS” với module, RX và TX lần lượt ứng với chân 8 và 9 của Adruino Khai báo biến incoming void setup() { GPRS.begin(9600); Serial.begin(9600); GPRS.println("AT"); delay(1000); }
Thiết lập cổng mạch điều khiển Mở cổng giao tiếp GPRS Mở cổng giao tiếp Serial Viết lệnh vào GPRS lệnh AT Chờ 1 giây void loop(){ while (Serial.available()){ incoming = Serial.read(); if (incoming == '*') GPRS.write((char)26); else GPRS.write(incoming); Vòng lặp
Khi có giá trị đến Serial thì đọc từng giá trị và gán cho biến incoming Nếu biến nhập vào * thì viết và GPRS ký tự CTRL+Z (mã ASCII là 26) phục vụ việc gởi tin nhắn sms bằng module
36 } while (GPRS.available()) { Serial.write(GPRS.read());} } Và khi có phản hồi từ GPRS thì in ra phản hồi ra Serial
- Khi điều khiển gián tiếp module qua Serial thì sử dụng các lệnh AT.
Bảng 3.5. Một số lệnh AT cơ bản
Lệnh AT và cú pháp Giải thích lệnh Phản hồi
AT Lệnh thử mạch OK
A/ Lặp lại lệnh vừa sử dụng
ATD<số điện thoại>; Gọi đến số điện thoại bắt buộc phải có dấu ;
OK
ATH Tắt máy khi có cuộc gọi đến OK
ATA Bắt máy khi có cuộc gọi
đến
OK
AT+CMGF=1 Cài đặt module vào chế độ nhắn tin
OK
AT+CMGS=”<số điện thoại>”
Gởi tin nhắn đến số điện thoại
Sau khi gởi lệnh thì nhập tin nhắn và sau đó kết thúc bằng ctrl-Z để gởi tin nhắn
37 - Một số hình ảnh điểu khiển module với lệnh AT
38
Hình 3.18. Dùng lệnh AT điều khiển module gọi điện thoại
3.3.2. Thiết lập kết nối GPRS cho module GPRS/GSM SIM900A và gửi dữ liệu lên trang web liệu lên trang web
- Các bước kết nối sim với dịch vụ GPRS và gửi dữ liệu lên trang web: ăng ký GPRS cho sim trên điện thoại.
Gắn sim vào module và kết nối với mạch điều khiển. Nhập các lệnh AT và đợi phản hồi.
Khi có phản hồi thì nhập tiếp lệnh tiếp theo.
Khi kết nối được và có địa chỉ IP thì kết nối với trang web và thực hiện gửi dữ liệu lên.
Các lệnh được thực hiện theo các bước và được giải thích qua bảng sau đây:
39
Bảng 3.6. Cái lệnh AT và giải thích các bước để thiết lập và gửi dữ liệu lên trang web
Lệnh Nhập vào Giải thích Kết quả ví dụ trả về
Giải thích kết quả
AT+CSQ Kiểm tra chất
lượng sóng điện thoại
+CSQ: 24,0
OK
AT+CGATT? Kiểm tra đã kết
nối với GPRS +CGATT: 1 OK 1 là đã kết nối 0 là chưa kết nối AT+CGREG=2 Hiện tình trạng kết nối GPRS +CGREG: 2,1,"4EFE","C05 1" OK
ợi đến khi hiện 2: cho phép hiện tình trạng kết nối GPRS 1: đã kết nối Và mã vùng và ID ở dạng hex
AT+SAPBR= Tình trạng dịch vụ mang chuyển trong viễn thông 1: Mở dịch vụ 2: Tình trạng dịch vụ 3: Thiết lập các thông số Số thứ 2 là chọn CID để đăng ký AT+SAPBR=3,1,"Contyp e","GPRS" AT+SAPBR=3,1,"APN"," m-wap" AT+SAPBR=3,1,"USER" Thiết lập dịch vụ theo mạng mobifone OK
40 ,"mms" AT+SAPBR=3,1,"PWD", "mms" AT+SAPBR=1,1 Mở dịch vụ OK Nếu OK là đã mở được dịch vụ và tra trong 2,1 sẽ có địa chỉ IP Nếu ERROR thì chưa có IP và chưa thể sử dụng mạng GPRS
AT+HTTPINIT Kết nối vào mạng internet
OK Nếu sử dụng 2 lần
liên tiếp sẽ ERROR AT+HTTPPARA="CID", 1 Sử dụng CID 1 OK AT+HTTPPARA="URL" ,"http://ptsv2.com/t/w3cb z-1531242254/post" Xác định máy chủ để gởi lên
AT+HTTPDATA=<>,<> Xác định data gởi lên web
Byte, thời gian chờ
DOWNLOAD Khi hiện
DOWNLOAD thì ta nhập dữ liệu cần gởi lên với số ký tự là đúng với số byte đã nhập AT+HTTPACTION=1 0 hoặc 1
Nếu 0 là GET tải dữ liệu về có thể
OK 1 là phương pháp sử
41 bỏ qua bước trên
Nếu 1 là POST tải dữ liệu lên web
+HTTPACTION: 1,200,1160 200 là mã OK Nếu là số khác phải tra là lỗi gì 1160 là số byte đã gởi lên
AT+HTTPREAD Nếu dùng GET
thì dùng lệnh này để đọc dữ liệu đã tải về AT+HTTPTERM Ngắt kết nối mạng internet OK Nếu sử dụng 2 lần
liên tiếp sẽ ERROR
42
CHƢƠNG 4: THỰC NGHIỆM VÀ ĐÁNH GIÁ MÔ HÌNH GIÁM SÁT NHIÊN LIỆU
4.1. Khảo sát và đánh giá kết quả đo đạc mức nhiên liệu với mô hình 4.1.1. Khảo sát cảm biến đo nhiên liệu 4.1.1. Khảo sát cảm biến đo nhiên liệu
- Thực hiện đo nhiên liệu sử dụng cảm biến:
Dụng cụ: Mô hình bình nhiên liệu, cảm biến CLM, Adruino Uno R3. Set cảm biến mức thấp bằng cách nhấn và giữ nút cảm trên cảm. biến,
chờ đèn SET sáng và tắt đi thì thả ra. ổ dầu đến mức 30 cm.
Set cảm biến mức cao bằng cách nhấn và giữ nút cảm trên cảm biến, chờ đèn set sáng và tắt đi thì thả ra.
o bằng phần mềm Matlab.
Tháo dần nhiên liệu và thực hiện đo, mỗi vị trí thực hiện đo 3 lần. - Kết quả:
Khi nhiên liệu mức cao nhất (30 cm): giá trị đo được là 5022 Khi nhiên liệu mức thấp nhất (0 cm): giá trị đo được là 123