TH CB CCCH
TH CB CCCH
2
2. Vẽ mạch mô phỏng trên Proteus
Sau khi đã cài đặt phần mềm Proteus và add thư viện mô phỏng Arduino thành
công, hãy mở Proteus 8 Professional. Để lấyArduino và một số linh kiện khác ra mô
phỏng click phím "P" sẽ xuất hiện hộp thoại Pick Devices. Tại Keywords gõ linh kiện
cần lấy. Trong bài ví dụ này, một board Arduino UNO, một điện trở trở và một led
đơn để mô phỏng chương trình chớp tắt led.
3
4
Sau khi lấy linh kiện xong, sinh viên sắp xếp và đi dây như trong hình, bạn nhớ
double vào con điện trở để thay đổi giá trị 10k thành 330.
Lưu ý: nguồn cấp cho board Arduino không xuất hiện. Khi mô phỏng, mặc định thư
viện này đã thiết lập cấp nguồn sẵn cho Arduino, nhưng khi lắp mạch thực tế sinh viên
cần cấp nguồn cho Arduino.
5
Tới đây vẫn chưa thể ấn nút PLAY để mô phỏng được, sẽ báo 2 Error(s)
như hình trên, bởi vì board Arduino UNO chưa có CODE nạp vào. Lúc này cần phải
đưa file .hex vào để mô phỏng.
2.1 File .hex là gì?
Hex ở đây được viết tắt bởi từ hexadecimal có nghĩa là hệ cơ số 16 hay hệ thập
lục phân. Khi viết code và nạp chương trình cho vi điều khiển (cụ thể với board
Arduino UNO là ATMEGA 328) thì không đơn thuần là nạp những "câu lệnh" đưa
vào vi điều khiển, mà phải thông qua trình biên dịch (Aruduino IDE, Code Vision,
Keil C...đều là trình biên dịch) dịch những "câu lệnh" và tạo ra một chuỗi kí tự gồm
những chữ (từ A đến F) và số (từ 0 đến 9) thuộc hệ thập lục phân hoặc 0-1 thuộc hệ
nhị phân, còn gọi đó là mã thực thi như minh hoạ hình bên dưới.
Mã thực thi nạp vào vi điều khiển thì vi điều khiển mới "hiểu" được. Những
chữ số này được đóng gói và lưu lại thành một file có đuôi mở rộng là ".hex". Arduino
IDE cũng dựa trên nguyên tắc cơ bản đó để nạp mã thực thi vào vi điều khiển nhưng
để đơn giản cho người dùng không phải phức tạp qua nhiều thao tác như các trình
biên dịch khác, Arduino IDE đã làm ẩn file .hex đi vì thế sinh viên chỉ cần click
"Upload" mà không cần phải tìm file .hex. Tuy nhiên, khi tiến hành mô phỏng trên
Proteus, file .hex cần phải được tìm.
6
3. Tạo file .hex từ Arduino IDE
Trong hướng dẫn này, mô phỏng led chớp tắt được thực hiện từ ví dụ có sẵn
(File - Examples - 01. Basics – Blink). Mở phần mềm Arduino IDE, trong giao diện
của phần mềm này click chọn File >> Preferences.
Khi hộp thoại Preferences xuất hiện, bạn hãy đánh dấu check vào ô compilation
và sau đó chọn OK.
7
Để mô phỏng mạch hãy click chuột vào nút PLAY. Để dừng mô phỏng click
STOP.
Lưu ý: để tạo file .hex vào đúng thư mục mong muốn thay vì phải tìm kiếm, sinh viên
có thể thực hiện như sau:
Bước 1: Mở tập tin C:\Program Files\Arduino\lib\preferences.txt bằng Notepad hoặc
Notepad++
Bước 2: Thêm dòng lệnh sau vào cuối file preferences.txt: build.path = <path>
(<path> là đường dẫn đến thư mục muốn chứa file hex sau khi Arduino hoàn tất quá
trình biên dịch)
8
Sau đó click để Built chương trình. Trình biên dịch IDE sẽ Built cho
chúng ta một file .hex được lưu ở đường dẫn như hình dưới.
9
Sinh viên có thể vào đường dẫn này để lấy file .hex ra mô phỏng bằng cách
copy file .hex ra một thư mục nào đó hoặc truy cập trực tiếp vào đường dẫn. Trong sơ
đồ mạch Proteus, double click vào Arduino Uno thì hộp thoại Edit Component xuất
hiện. Tại khung Program File, tìm đến thư mục chứa file .hex, sau đó click OK.
4. Giao Tiếp Python Với Arduino
Trong hướng dẫn này, sinh viên sẽ biết cách sử dụng Python để giao tiếp với
Arduino UNO cho việc bật tắt led đơn số 13. Một giao diện đơn giản cũng được trình
bày trong phần này. Nguyên tắc giao tiếp điều khiển được thể hiện trong sơ đồ khối
bên dưới.
10
4.1 Tạo một môi trường ảo và cài đặt PySerial
Để hoàn thành ví dụ này, cách tốt nhất là sử dụng môi trường ảo. Anaconda
của Python trên máy Windows 10 đã được cài đặt. Các bước thực hiện như sau:
Bước 1: Mở Anaconda Prompt
Bước 2: cập nhật môi trường conda
Bước 3: thiết lập môi trường ảo
▪ Nhập lệnh conda serach “^python$” để xem danh sách các phiên bản Python có
sẵn
▪ Thay envname bằng tên muốn đặt cho môi trường ảo, thay x.x bằng phiên bản
Python muốn sử dụng với lệnh
conda create --name envname python=x.x anaconda
▪ Tất cả các gói cần thiết cho phiên bản Python x.x và yêu cầu Processd ([y]/n)? sẽ
xuất hiện. Nếu người dùng nhập y và Enter, quá trình thiết lập môi trường ảo sẽ
bắt đầu. Ngược lại, quá trình thiết lập này sẽ bị huỷ
Bước 4: kích hoạt môi trường ảo bằng lệnh
Để kích hoạt môi trường ảo, hãy nhập lệnh đã cho và thay thế tên môi trường đã cho
của người dùng bằng envname. Khi môi trường conda được kích hoạt, nó sẽ sửa đổi
PATH và các biến shell trỏ cụ thể đến thiết lập Python biệt lập mà người dùng đã tạo
conda activate envname
Bước 5: cài đặt các gói cần thiết vào môi trường ảo. Trong phần này chúng ta cần cài
đặt hai gói chính là spyder (trình soạn thảo) và pyserial (giao tiếp nối tiếp giữa Arduino
và Python)
conda install spyder pyserial
11
Hoặc
conda install spyder
conda install pyserial
12
Sau khi chạy chương trình trên, một giao diện sẽ xuất hiện như hình bên dưới:
Khi nhấn nút Turn On ký tự ‘o’ sẽ được gửi xuống Arduino, nếu nhận được thì led
đơn số 13 sẽ ON. Khi nhấn nút Turn Off ký tự ‘x’ sẽ được gửi xuống Arduino, nếu
nhận được thì led đơn số 13 sẽ OFF.
13
4.3 Chương trình cho Arduino
4.4 Mô phỏng giao tiếp Arduino và giao diện bằng cổng COM
ảo
Tạo cặp cổng COM ảo
Virtual Serial Port Driver là phần mềm hữu hiệu để tạo ra các cổng nối tiếp ảo
và kết nối chúng theo cặp thông qua dây cáp null-modem ảo. Các ứng dụng trên cả
hai đầu của cặp đó sẽ có thể trao đổi dữ liệu cho nhau.
Khi đó, dữ liệu được ghi trên cổng đầu tiên sẽ xuất hiện ở cổng thứ hai và
ngược lại. Tất cả các cổng nối tiếp ảo đều hoạt động chính xác như những cổng thực,
mô phỏng các thiết lập của chúng. Do đó, bạn có thể tạo ra bao nhiêu cặp cổng ảo theo
ý muốn mà không cần phải sử dụng phần cứng bổ sung nào.
14
Các bước tạo cổng COM ảo:
Bước 1: Click Pair và cửa sổ Create a new pair xuất hiện
15
Bước 2: Chọn tên cặp cổng COM cần kết nối và chọn Create và kết quả như hình bên
dưới
Trong ví dụ này, COM2 cho Arduino UNO và COM5 cho máy vi tính để tạo giao
diện điều khiển
16
Sơ đồ mạch trên Proteus
Bước 1: Trước hết, hãy mở Proteus ISIS và click vào nút P để tìm kiếm thư viện,
tương tự như trình bày ở phần trên. Torng hộp tìm kiếm, hãy tìm “COMPIM”, kết quả
hiển thị như hình bên dưới.
17
Bước 2: Vẽ lại sơ đồ mạch
TXD và RXD của Arduino UNO sẽ nối lần lượt với TXD và RXD của COMPIM.
Bước 3: thiết cổng COM cho CMOPIM bằng cách double click, một cửa sổ xuất hiện
và thiết lập các thông số như hình.
18
Bây giờ, sinh viên có thể chạy Proteus và chương trình giao diện trên Python để kiểm
chứng kết quả.
4.5 Bài tập mở rộng
Trong ví dụ trên, giao diện điều khiển có chức năng điều khiển bật tắt led đơn
thông qua serial. Phần này hướng dẫn sinh viên giám sát trạng thái của led đơn trên
giao diện điều khiển. Nguyên tắc hoạt động chương trình như sau:
- Kết nối serial giữa giao diện điều khiển và Arduino UNO
- Khi click Turn On gửi tín hiệu điều khiển đến Arduino bật led, sau đó Arduino gửi
lại tín hiệu đã nhận được đến máy tính và led được thiết kế trên giao diện sẽ sáng
- Khi click Turn Off gửi tín hiệu điều khiển đến Arduino tắt led, sau đó Arduino gửi
lại tín hiệu đã nhận được đến máy tính và led được thiết kế trên giao diện sẽ tắt
Chương trình Arduino
19
char userInput;
void setup(){
Serial.begin(9600); // setup serial
pinMode(LED_BUILTIN, OUTPUT);
}
void loop(){
if(Serial.available()> 0){
userInput = Serial.read(); // read user input
if(userInput == 'o'){
digitalWrite(LED_BUILTIN, HIGH);
}
if(userInput == 'x'){
digitalWrite(LED_BUILTIN, LOW);
}
}
Serial.println(userInput);
delay(100);
}
Chương trình Python
import serial
import tkinter as tk
ser = serial.Serial("COM5", baudrate = 9600, timeout = 1)
def turnOnLED(): # Hàm gửi ký tự o
ser.write(b'o')
def turnOffLED(): # Hàm gửi ký tự 'x'
ser.write(b'x')
def readserial():
state = ser.readline()
20
state = state.decode("utf-8")
state = state[0]
if state == 'o':
canvas.itemconfig(led, fill='green')
else:
canvas.itemconfig(led, fill='black')
root.after(5,readserial) # Thực hiện hàm sau 50 ms
# Tạo giao diện điều khiển
root = tk.Tk()
root.title('Blink GUI')
root.geometry("250x50")
btn_On= tk.Button(root, text="Turn On", command=turnOnLED) #
tạo nút nhấn On
btn_On.place(x=20, y=10, height=30, width=70)
btn_Off = tk.Button(root, text="Turn Off", command=turnOffLED)
# Tạo nút nhấn Off
btn_Off.place(x=95, y=10, height=30, width=70)
# Tạo led trên giao diện
canvas_width = 50
canvas_height = 50
radius = 15
canvas = tk.Canvas(root, width=canvas_width,
height=canvas_height)
canvas.place(x=180, y=0)
x0 = (canvas_width / 2) - radius
y0 = (canvas_height / 2) - radius
x1 = (canvas_width / 2) + radius
y1 = (canvas_height / 2) + radius
21
led = canvas.create_oval(x0, y0, x1, y1, width=4, fill='black')
if __name__ == "__main__":
root.after_idle(readserial)
root.mainloop()
state = ser.readline()
state = state.decode("utf-8")
print(state)
print(type(state))
ser.close()
5. Bài tập
Câu 1: Thêm một nút nhận Exit trong trong giao diện, và viết hàm mỗi lần nhấn cổng
COM và giao diện được đóng.
Câu 2: Thêm một cặp nút Turn ON và Turn Off để điều khiển đóng mở một led đơn
khác.
Câu 3: Thiết giao diện chỉ có hai nút nhấn điều khiển hai led đơn. Thực hiện yêu cầu
sau:
- Ban đầu không có led nào sáng
- Khi nhấn nút 1, led 1 sáng. Nút 1 nhấn thêm 1 lần nữa led 1 tắt
- Khi nhấn nút 2, led 2 sáng. Nút 2 nhấn thêm 1 lần nữa led 2 tắt
Chức nhút nhấn trên được gọi là toggle.
22
Bài 2. CẢM BIẾN NHIỆT LM35
1. Đặc điểm của cảm biến LM35
Cảm biến LM35 là một cảm biến đo nhiệt độ của môi trường. Nhiệt độ được xác
định bằng cách đo hiệu điện thế ngõ ra (Vout) của LM35. Nhiệt độ lấy ra từ cảm biến
LM35 thay đổi theo hiệu điến thế, khoảng 10mV/°C. Cảm biến LM35 có thể lấy ra
nhiệt độ ở đơn vị °C hoặc đổi sang °F.
Nhiệt độ nhận được từ LM35 có thể chênh lệch với thực tế 0.25°C ở nhiệt độ
phòng và 0.75°C ngoài trời. LM35 có thể đo nhiệt độ trong khoảng -55°C tới 150°C.
Ưu điểm của LM35 là có hiệu năng cao, công suất tiêu thụ là 60µA. LM35 có
khả năng nhận được sự thay đổi nhiệt độ nhanh và tương đối chính xác.
2. Thiết kế sơ đồ mạch giao tiếp với LM35
Mạch giao tiếp LM35 với Arduino gồm 1 board Arduino và 1 cảm biến LM35.
Chân 1 của LM35 được cấp nguồn dương (+), chân 3 của LM35 được cấp nguồn âm
(-), chân 2 (Vout) của LM35 nối với 1 chân analog của Arduino để gửi tín hiệu nhiệt
độ cho Arduino.
23
Có thể sử dụng mạch giao tiếp giả lập trên Proteus.
24
3. Chương trình lấy giá trị nhiệt độ từ LM35 hiển thị lên LCD
Bằng cách cấp vào chân 1 của cảm biến LM35 một hiệu điện thế 5V, chân 3 nối
đất, lấy hiệu điện thế ở chân 2 bằng cách lấy tín hiệu tại chân analog (ví dụ chân A0)
trên Arduino. Từ đó, ta sẽ có được nhiệt độ ở đơn vị °C bằng công thức:
float tempCelsius = (5.0*analogRead(A0)*100.0/1024.0);
Nếu muốn đổi từ °C sang °F thì áp dụng công thức:
float tempFahrenheit = (tempCelsius * 1.8)+32;
Sau đó, chúng ta sử dụng hàm print() để in giá trị nhiệt độ lên LCD.
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int lm35 = A0;//chân analog kết nối LM35 với Arduino
void setup() {
lcd.begin(16, 2);
}
void loop() {
int tempCelsius = (5.0*analogRead(lm35)*100.0/1024.0);//độ C
int tempFahrenheit =(tempCelsius * 1.8)+32;//độ F
lcd.setCursor(0, 0);
lcd.print("TEMP ");
lcd.print(char(223));
lcd.print("C:");
lcd.print(tempCelsius);
lcd.print(char(223));
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("TEMP ");
lcd.print(char(223));
lcd.print("F:");
25
lcd.print(tempFahrenheit);
lcd.print(char(223));
lcd.print("F");
delay(1000);
lcd.clear();
}
4. Giao diện điều khiển
Trong phần này, giá trị nhiệt độ được gửi và hiển thị trên Tkinter bằng serial. Sơ
đồ mạch Proteus được bổ sung thêm COMPIM.
26
lcd.begin(16, 2);
Serial.begin(9600);
}
void loop() {
int tempCelsius = (5.0*analogRead(lm35)*100.0/1024.0);//độ C
int tempFahrenheit =(tempCelsius * 1.8)+32;//độ F
lcd.setCursor(0, 0);
lcd.print("TEMP ");
lcd.print(char(223));
lcd.print("C:");
lcd.print(tempCelsius);
lcd.print(char(223));
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("TEMP ");
lcd.print(char(223));
lcd.print("F:");
lcd.print(tempFahrenheit);
lcd.print(char(223));
lcd.print("F");
Serial.println(tempCelsius);// gửi nhiệt độ C
Serial.println(tempFahrenheit);// gửi nhiệt độ K
delay(100);
}
Chương trình Python:
import serial
import tkinter as tk
ser = serial.Serial("COM5", baudrate = 9600)
27
index = []
def readserial():
ser_bytes = ser.readline()
ser_bytes = ser_bytes.decode("utf-8")
val1 = ser_bytes
index.append(val1)
if len(index) > 1:
tC_display.delete(0,"end") # Xoá các ký tự
tC_display.insert(0,index[0]) # Hiển thị độ C
tK_display.delete(0,"end") # Xoá các ký tự
tK_display.insert(0,index[1]) # Hiển thị độ K
index.clear()
root.after(50,readserial) # Thực hiện hàm sau 50 ms
# Tạo giao diện điều khiển
root = tk.Tk()
root.title('LM35')
root.geometry("500x100")
tC_label = tk.Label(root, text = '*C: ')
tC_label.place(x=0, y=5, height=30, width=70)
tC_display = tk.Entry(root,font=("Times New Roman",10,
"bold"),justify='center')
tC_display.place(x=75, y=5,height=30, width=70)
tC_display.insert(0,'0')
tK_label = tk.Label(root, text = '*K: ')
tK_label.place(x=0, y=40, height=30, width=70)
tK_display = tk.Entry(root,font=("Times New Roman",10,
"bold"),justify='center')
tK_display.place(x=75, y=40,height=30, width=70)
28
tK_display.insert(0,'0')
if __name__ == "__main__":
root.after_idle(readserial)
root.mainloop()
ser.close()
5. Plot dữ liệu thời gian thực từ Arduino dùng Python pyplot
Phần này sẽ hướng dẫn sinh viên thực hiện vẽ đồ thị theo thời gian thực với dữ
liệu nhiệt độ (oC) được gửi từ Arduino lên máy tính thông qua serial.
Thư viện Matplotlib được sử dụng để thực hiện yêu cầu này. Matplotlib là một
thư viện toàn diện để tạo trực quan hóa tĩnh, hoạt hình và tương tác trong Python.
Matplotlib tạo ra các số liệu có chất lượng xuất bản ở nhiều định dạng bản cứng và
môi trường tương tác trên nhiều nền tảng. Matplotlib có thể được sử dụng trong các
tập lệnh Python, shell Python/IPython, các ứng dụng web server và các bộ công cụ
giao diện người dùng đồ họa khác nhau.
29
Chương trình Python
Nhiệt độ (oC) được hiển thị liên tục trên đồ thị được thể hiển trong lòng lặp
while và thoát khỏi vòng lặp, phím ‘q’ được nhấn. Python cung cấp một thư viện có
tên keyboard được sử dụng để có toàn quyền kiểm soát bàn phím. Đó là một thư viện
Python nhỏ có thể kết nối các sự kiện toàn cục, mô phỏng các lần nhấn phím và hơn
thế nữa.
Cài đặt bằng lệnh:
pip install keyboard
30
31
6. Plot dữ liệu thời gian thực từ Arduino trên python GUI
Trong chương trình này, hai nút nhấn Start và Stop được tạo trên GUI. Khi click
Start, giá trị nhiệt độ (oC) được hiển thị real-time trên đồ thị cho đến khi Stop được
nhấn. Chương trình Arduino được giữ nguyên như trong mục 5 và chương trình
Python được phát triển như sau:
32
33
34
7. Bài tập
Câu 1: Sinh viên thực hiện đọc cảm biến và hiển thị thực nghiệm sau khi hoàn thành
mô phỏng.
Câu 2: Viết chương trình cho Arduino chỉ gửi một trong hai giá trị nhiệt độ (oC hoặc
o
F) và hiển thị trên giao diện điều khiển.
Câu 3: Thiết kế mạch gồm 1 đèn led và 1 LM35. Nếu nhiệt độ môi trường >30 °C thì
cho phép led sáng.
Câu 4: Tạo một led trên giao diện điều khiển để thực hiện câu 3. Khi led sáng thì led
trên giao diện cũng sáng.
Câu 5: Thiết kế hai nút nhấn trong sơ đồ mạch. Viết chương trình thêm phần xử lý
nút nhấn, một nút nhấn cho phép hiển thị theo °C, một nút nhấn cho phép hiển thị oF.
Câu 6: Tạo hai nút nhấn trên giao diện điều khiển và thực hiện nhiệm vụ của câu 5
và vẽ đồ thị Real-time của giá trị nhiệt độ.
35
Bài 3. CẢM BIẾN KHÍ GAS MQ2
1. Giới thiệu
Cảm biến khí Gas MQ2 là một trong những cảm biến được sử dụng rộng rãi nhất
trong các dòng cảm biến MQ. Nó là một cảm biến MOS (Metal Oxide
Semiconductor). Cảm biến oxit kim loại hay còn được gọi là (Điện trở hóa trị) vì cảm
biến dựa trên sự thay đổi điện trở của cảm biến khi tiếp xúc với khí.
Cảm biến khí gas arduino hoạt động trên 5VDC và tiêu thụ khoảng 800mW. Nó
có thể phát hiện nồng độ LPG, Khói, Rượu, Propane, Hydrogen, Methane và Carbon
Monoxide từ 200 đến 10000 ppm.
2. Cấu tạo Cảm biến khí Gas MQ2
Cảm biến khí Gas MQ2 được bao phủ bởi hai lớp lưới thép không gỉ mịn được
gọi là “anti-explosion network”. Nó đảm bảo các bộ phận làm nóng bên trong cảm
biến không gây nổ vì đang cảm nhận các khí dễ gây cháy.
Ngoài ra, nó còn bảo vệ cảm biến và lọc các hạt bụi lơ lửng trong không khí và
chỉ cho phép các phần tử khí đi qua. Một vòng kẹp (Clamp Ring) được mạ đồng cố
định phần lưới vào phần còn lại của cảm biến.
36
Bên trong của cảm biến sẽ có sáu chân và có cấu trúc hình ngôi sao. Hai chân
(H) có nhiệm vụ làm nóng bộ phận cảm biến và được liên kết với nhau bằng một sợi
dây Niken-Crom.
Bốn dây còn lại (A và B) có nhiệm vụ truyền tín hiệu, được kết nối bằng dây
bạch kim. Các dây này được nối với phần thân của cảm biến và truyền những tín hiệu
khi dòng điện trong cảm biến có sự thay đổi.
Hình ống ở giữa của cảm biến được làm bằng gốm dựa trên Oxit nhôm
(AL2O3) và phủ thêm một lớp Thiếc Dioxide (SnO2). Tin Dioxide là vật liệu quan
trọng vì nó nhạy cảm với khí dễ cháy. Mặt khác, bề mặt gốm còn cải thiện hiệu quả
làm nóng và đảm bảo cảm biến được làm nóng liên tục đến nhiệt độ làm việc.
37
3. Nguyên tắc hoạt động
Cảm biến khí Gas MQ2 hoạt động dựa trên nguyên lý phản ứng hóa học khi tiếp
xúc các khí trong môi trường. Nguyên tắc hoạt động của nó là khi các khí trong môi
trường như khí CO, khí LPG, khí methane, khí Hydro, khói… tiếp xúc với phần tử
bên trong cảm biến, làm cho các electron được giải phóng vào Thiếc Dioxide cho
phép dòng điện chạy qua cảm biến một cách tự do.
Khi được làm nóng, phần tử cảm biến sẽ tạo ra phản ứng hóa học với các khí
tiếp xúc và làm thay đổi điện trở của phần tử cảm biến. Cảm biến MQ2 đo lường các
biến đổi điện trở này và chuyển đổi chúng thành tín hiệu điện analog hoặc Digital.
38
4. Tổng quan về Module Cảm biến khí Gas MQ2
Module cảm biến khí Gas MQ2 khá đơn giản có hai đầu ra AO và DO, có nhiệm
vụ dùng để phát hiện khí ở trong môi trường.
Sự thay đổi điện áp của chân đầu ra của cảm biến (tại chân AO) thay đổi tỷ lệ
thuận với nồng độ khói/khí. Nồng độ khí càng cao, điện áp đầu ra càng cao; nồng độ
khí càng thấp, điện áp đầu ra càng thấp.
Để xác định tín hiệu số, ở đây module sử dụng một IC so sánh với độ chính xác
cao LM393 và được ký hiệu chân Digital (DO).
39
Module sử dụng một chiết áp để điều chỉnh độ nhạy của cảm biến khi thiết lập
đầu ra Digital (DO). Các bạn có thể sử dụng để đặt ngưỡng khi nồng độ khí vượt quá
giá trị ngưỡng, module sẽ xuất ra trạng thái LOW nếu không thì ở mức HIGH.
Ngoài ra, module còn có hai đèn LED. Một đèn LED báo nguồn và một đèn
LED để báo trạng thái sáng khi nồng độ khí vượt quá giá trị ngưỡng.
4.1 Thông số kỹ thuật:
40
4.2 Sơ đồ chân Cảm biến khí Gas MQ2
▪ AO: chân analog output, được sử dụng để đọc giá trị tín hiệu analog từ cảm biến.
Giá trị đọc được từ chân này thay đổi tùy thuộc vào nồng độ khí trong môi trường.
▪ DO: chân digital output, được sử dụng để đọc giá trị tín hiệu số (0 hoặc 1) từ cảm
biến. Khi giá trị tín hiệu vượt quá một ngưỡng được thiết lập trước, chân DOUT
sẽ cho ra tín hiệu logic LOW (0), ngược lại sẽ là tín hiệu logic HIGH (1).
▪ VCC: chân nguồn, được nối với nguồn điện DC cung cấp cho cảm biến MQ2
Arduino. Thông thường, nguồn điện sử dụng là 5V.
▪ GND: chân nối đất (GND)
4.3 Tinh chỉnh Cảm biến khí Gas MQ2
Vì cảm biến MQ2 là một cảm biến hoạt động bằng cách làm nóng các phần tử
bên trong, độ nhạy của cảm biến có thể bị sai lệch nếu không được sử dụng trong một
khoảng thời gian dài.
Khi sử dụng lần đầu sau một thời gian không sử dụng (một tháng trở lên), cảm
biến phải được làm nóng trong 24-48h để đảm bảo độ chính xác.
Nếu cảm biến được sử dụng thường xuyên, nên làm nóng từ 5-10 phút. Cho cảm biến
đọc ở mức cao và giảm dần cho đến khi ổn định.
5. Hướng dẫn thực hành
▪ Các linh kiện cần thiết
41
5.1 Phát hiện khí Gas sử dụng chân Digital
Sơ đồ đấu nối Cảm biến khí Gas MQ2 với Arduino
Chân A0 trên module của cảm biến bằng chân D0 và nối với chân số 8 của Arduino.
42
Hướng dẫn mô phỏng trên Proteus
Trước hết, hãy tải xuống Thư viện cảm biến MQ2 cho Proteus. Sau khi tải xuống
tệp, sẽ nhận được một file rar để giải nén → tìm thấy ba tệp trong đó, có tên là:
▪ GasSensorTEP.LIB
▪ GasSensorTEP.IDX
▪ GasSensorTEP.HEX
Copy ba file này vào đường dẫn sau:
C:\Program Files\Labcenter Electronics\Proteus 8 Professional\DATA\LIBRARY\
Đối với win 64 bit
C:\Program Files(x86)\Labcenter Electronics\Proteus 8
Professional\DATA\LIBRARY\
Đối với win 32 bit
Sau đó mở Proteus và tìm kiếm với từ khoá “MQ” sẽ thấy cảm biến cần tìm
43
Có thể thấy tất cả các cảm biến này đều có bốn chân trên chúng. Hai trong số
các chân này là Vcc và GND trong khi chân thứ ba là OUT Pin. Test pin được sử dụng
cho mục đích mô phỏng, khi có mức CAO trên Test pin thì điều đó có nghĩa là có Khí
trong khí quyển và cảm biến cũng sẽ cho mức CAO trên Chân OUT.
Trước khi chạy mô phỏng, một điều cần làm là double click vào cảm biến khí
và mở Thuộc tính. Trong Thuộc tính, bạn sẽ tìm thấy phần Program File. Trong phần
này, hãy duyệt tìm tệp GasSensorTEP.HEX vừa tải xuống ở trên và đặt trong thư mục
thư viện của phần mềm Proteus.
44
Bây giờ hãy chạy mô phỏng và khi chuyển trạng thái logic CAO sẽ thấy Chân
OUT cũng sẽ ở mức CAO như trong hình bên dưới. Vì vậy, đó là cách có thể mô
phỏng khá dễ dàng Cảm biến khí này trong Proteus ISIS.
Có thể kết nối Chân OUT này của Cảm biến Khí vào Bộ vi điều khiển, ví dụ
như Arduino, Vi điều khiển PIC , v.v.
45
Chương trình Arduino:
- Khi không phát hiện được khí thì led xanh sáng và hiển thị Detected trên LCD
- Khi phát hiện được khí led đỏ sáng và hiển thị No Detected trên LCD
46
Yêu cầu:
Sinh viên hãy cải thiện sơ đồ mạch trong Proteus, chương trình Arduino và thiết kế
giao diện trên Python Tkinter để giám sát trạng thái hai led xanh và đỏ thông qua
serial.
47
Lưu ý: trong chương trình trên chưa có hàm readserial, sinh viên hãy viết chương
trình để thực hiện
5.2 Phát hiện khí Gas sử dụng chân Analog
Trong phần này dụng một chân Analog trên Arduino dùng để phát hiện khí gas
trong không khí. Sơ đồ đấu nối Cảm biến khí Gas MQ2 với Arduino:
Để xác định nồng độ khí có đang nằm trong giới hạn cho phép hay không, sinh
viên cần ghi lại các giá trị mà cảm biến đọc được khi tiếp xúc với khói/khí. Dưới đây
là một đoạn code dùng để tìm ra các giá trị ngưỡng:
48
▪ Trong trường hợp không có khói/khí (khoảng 100)
▪ Khi có khói/khí (khoảng 400)
49
Yêu cầu:
Trong phần này, cảm biến MQ2 mô phỏng trên Proteus không được trực quan. Do đó,
sinh viên sẽ tiến hành thực nghiệm.
Sinh viên hãy cải thiện chương trình Arduino và thiết kế giao diện trên Python Tkinter
để giám sát trạng thái phát hiện khói bằng chỉ thị led và vẽ đồ thị real-time giá trị
analog đọc từ Arduino.
50
Bài 4. ĐIỀU KHIỂN HƯỚNG ĐỘNG CƠ DC
BẰNG ARDUINO UNO VÀ L298
1. Giới thiệu
Để có thể kiểm soát trong việc điều khiển động cơ DC các bạn có thể kết hợp hai kỹ
thuật sau đây:
▪ PWM – Kiểm soát tốc độ động cơ
▪ Mạch cầu H – Đảo chiều quay động cơ DC
PWM – Kiểm soát tốc độ động cơ
PWM (Pulse Width Modulation) là một phương pháp dùng để kiểm soát tốc độ
của động cơ DC. Trong PWM, tín hiệu được tạo thành bằng cách thay đổi độ rộng của
xung (pulse) tại một tần số cố định.
Cách hoạt động của PWM là tạo ra một chuỗi các xung có độ rộng khác nhau
trong một chu kỳ thời gian. Độ rộng của xung (thời gian xung được bật) được điều
chỉnh để điều khiển mức độ công suất hay tín hiệu analog tương ứng. Mức độ công
suất được điều chỉnh bằng cách thay đổi tỷ lệ giữa thời gian xung bật và thời gian
xung tắt trong một chu kỳ.
Với Arduino, có thể sử dụng chức năng PWM trên một số Digital để điều khiển
độ rộng xung và tạo ra tín hiệu analog. Chức năng analogWrite() của Arduino được
sử dụng để tạo ra tín hiệu PWM trên các chân hỗ trợ PWM.
51
Mạch cầu H – Đảo chiều quay động cơ DC
Mạch cầu H (H-Bridge) là một loại mạch điện tử được sử dụng để điều khiển
động cơ DC. Nó bao gồm bốn công tắc điện tử (thường là transistor hoặc MOSFET)
được kết hợp thành một cấu trúc hình chữ H, cho phép điều khiển luân chuyển dòng
điện theo hướng thuận và hướng ngược một cách độc lập.
Mạch cầu H cho phép kiểm soát và thay đổi hướng chuyển động của động cơ
bằng cách tắt và bật các công tắc điện tử tương ứng. Khi hai công tắc cùng một phía
được bật, dòng điện sẽ chảy qua động cơ theo một hướng. Khi hai công tắc trên phía
ngược được bật, dòng điện sẽ chảy theo hướng ngược lại. Bằng cách kết hợp các trạng
thái công tắc, mạch cầu H cho phép điều khiển động cơ di chuyển theo cả hai hướng
và dừng lại.
52
2. IC điều khiển động cơ DC L298N
IC L298 là một vi mạch tích hợp được sử dụng rộng rãi để điều khiển động cơ
DC hai chiều. Nó là một mạch cầu H kép, điều khiển động cơ bằng cách điều chỉnh
dòng điện và hướng chuyển động của động cơ.
Module L298N được thiết kế để chịu được dòng điện cao và có khả năng điều
khiển động cơ với nguồn cấp tối đa lên đến 46V và dòng điện tối đa lên đến 2A cho
mỗi kênh động cơ. Nó hỗ trợ các chức năng như tăng tốc (PWM) và đảo hướng chuyển
động của động cơ.
L298N có các chân đầu vào điều khiển từ Arduino như chỉnh dòng điện và hướng
chuyển động của động cơ. Nó cũng cung cấp các chân đầu ra để kết nối với động cơ
và nguồn cấp.
53
Thông số kỹ thuật
54
Chân nguồn cấp cho động cơ (Power Pins)
Module điều khiển động cơ DC L298N arduino có 2 chân cấp nguồn đầu vào là
VS và VSS.
▪ VS: Chân này dùng để cung cấp cấp nguồn cho mạch cầu H bên trong của IC.
Nguồn điện áp đầu vào từ 5 đến 12V.
▪ VSS: Chân này được sử dụng để cấp nguồn cho mạch logic bên trong IC L298N
và điện áp nằm trong khoảng từ 5V đến 7V.
▪ GND: Chân này dùng để nối đất.
Chân đầu ra (Output Pins)
Các kênh đầu ra của module khiển động cơ L298N Arduino thứ tự: OUT1 &
OUT2 cho động cơ A và OUT3 & OUT4 động cơ B. Các bạn có thể sử dụng hai động
cơ DC 5-12V.
55
Đầu ra trên module L298N có thể chịu tải tới 2A cho mỗi động cơ DC. Tuy nhiên,
nó còn phụ thuộc vào công suất của nguồn điện cấp động cơ.
Chân điều khiển hướng di chuyển (Direction Control Pins)
Các chân trên module cho phép có thể thay đổi hướng chuyển động của động cơ,
ví dụ như đi thẳng hoặc lùi. Nguyên lý hoạt động này dựa vào việc điều khiển các
công tắc của mạch cầu H bên trong IC L298N.
Module điều khiển động cơ L298N Arduino có hai chân điều khiển hướng. IN1
& IN2 chân điều khiển chiều chuyển động của động cơ A và IN3 & IN4 điều khiển
hướng chuyển động của động cơ B.
Có thể điều khiển hướng chuyển động của động cơ bằng cách áp dụng logic ở
mức CAO (5V) hoặc logic ở mức THẤP (GND). Bảng thông số dưới đây sẽ cho các
bạn thấy được các chuyển động khi kết hợp các cặp đầu vào với nhau.
56
Chân điều khiển tốc độ (Speed Control Pins)
Các chân điều khiển tốc độ ENA & ENB được sử dụng để bật/tắt động cơ và kiểm
soát tốc độ quay của chúng.
Khi đặt các chân này ở mức CAO sẽ làm cho động cơ quay, khi đặt ở mức THẤP
sẽ dừng lại. Tuy nhiên, với việc sử dụng PWM các bạn có thể kiểm soát được tốc độ
của động cơ.
Trên module L298N arduino sẽ có một Jumper chốt đi kèm, khi có Jumper này
các động cơ sẽ quay với tốc độ tối đa. Nếu muốn điều khiển tốc độ của động cơ theo
chương trình, hãy tháo các Jumper này ra và nối các chân hỗ trợ ~PWM trên Arduino.
IC ổn áp 5V 78M05
Module tích hợp một IC ổn áp 5V 78M05 và có thể bật/tắt thông qua một Jumper
bên dưới.
57
Khi Jumper được cắm, IC ổn áp 78M05 hoạt động, chân VSS được cấp nguồn sử
dụng từ VS của động cơ. Trong trường hợp này, đầu vào 5V đóng vai trò là chân đầu
ra cấp nguồn 5V 0,5A. Các bạn có thể sử dụng để cấp cho Arduino.
Khi tháo jumper, IC 78M05 bị tắt và các bạn phải cung cấp nguồn riêng 5V thông
qua chân VSS.
Điện áp rơi của trình điều khiển động cơ L298N
Điện áp rơi (Voltage Drop) của L298N là thông số chỉ ra mức điện áp mất đi khi
dòng điện chạy qua IC. Điện áp rơi của L298N được xác định bởi hai yếu tố chính:
điện áp đầu vào và dòng điện đầu ra.
Thông thường, L298N có mức điện áp rơi khoảng 1.8V đến 2.5V khi dòng điện
đầu ra là 1A. Tuy nhiên, điện áp rơi có thể tăng lên đến khoảng 3V nếu dòng điện đầu
ra cao hơn. Do đó, khi tính toán và thiết kế mạch sử dụng L298N, cần lưu ý điện áp
rơi để đảm bảo điện áp đầu ra phù hợp với yêu cầu.
Ví dụ điện áp rơi ở đây mình cho là giảm 2V, trong trường hợp các bạn đang sử
dụng động cơ 5V, bạn sẽ cần cấp nguồn 7V cho động cơ. Nếu bạn có động cơ 12V thì
điện áp cấp cho động cơ là 14V.
Sơ đồ đấu nối Module điều khiển động cơ L298N với Arduino trên Proteus
Ở đây sử dụng động cơ vàng DC, thường dùng trong các mô hình xe điều khiển
và nó có thể sử dụng ở điện áp từ 3 đến 12V DC. Trong phần này sẽ sử dụng nguồn
12V cấp vào chân VS trên L298N, vì điện áp rơi khoảng 2V nên động cơ sẽ hoạt động
58
ở mức là 10V. Tiếp theo, để cấp nguồn cho IC L298N, giữ nguyên Jumper để cho IC
ổn áp 78M05 trên bo mạch hoạt động. Các chân điều khiển tốc độ và hướng chuyển
động của module động cơ DC L298N (ENA, IN1, IN2) sẽ nối tương ứng với các chân
Digital của Arduino (8, 7, 6,). Lưu ý: hai chân 8 phải được hỗ trợ PWM. Cuối cùng,
đấu dây của hai động cơ vào (OUT1 và OUT2).
59
60
Chương trình Python
61
Yêu cầu:
Sinh viên hãy sửa đổi chương trình Python và Arduino để điều khiển 2 động cơ.
62
Bài 5. MODBUS RTU ARDUINO (MÔ PHỎNG
PROTEUS + MODBUS POLL)
1. Giới thiệu
Trong bài này hướng dẫn sinh viên thực hiện mô phỏng Modbus RTU giữa
Arduino Mega2560 và phần mềm Modbus Poll trên Proteus, trong đó Arduino
Mega2560 đóng vai trò là Slave.
Modbus Poll là phần mềm giả lập Modbus Master, phần mềm được thiết kế cho
người lập trình Modbus Slave có thể thử nghiệm (test) hoặc mô phỏng giao thức
Modbus. Modbus Poll hỗ trợ nhiều cửa sổ, người sử dụng có thể giám sát nhiều
Modbus Slave và nhiều vùng dữ liệu cùng một lúc. Với mỗi cửa sổ, người sử dụng
chỉ cần khai báo ID của Slave, địa chỉ, kích cỡ (byte dữ liệu). Người sử dụng có thể
đọc và ghi thanh ghi (registers) và coils từ bất kì cửa sổ nào. Nếu người sử dụng muốn
thanh đổi một thanh ghi, chỉ cần nhấp đúp chuột để thay đổi.
63
Phần mềm Modbus Poll hỗ trợ giao thức:
▪ Modbus RTU
▪ Modbus ASCII
▪ Modbus TCP/IP
▪ Modbus RTU Over TCP/IP
▪ Modbus ASCII Over TCP/IP
▪ Modbus UDP/IP
▪ Modbus RTU Over UDP/IP
▪ Modbus ASCII Over UDP/IP
Phần mềm Modbus Poll hỗ trợ các hàm:
▪ 01: Read coil status
▪ 02: Read input status
▪ 03: Read holding registers
▪ 04: Read input registers
▪ 05: Force single coil
▪ 06: Preset single register
▪ 15: Force multiple coils
▪ 16: Preset multiple registers
▪ 17: Report slave ID
▪ 22: Mask write register
▪ 23: Read/Write registers
2. Thư viện Modbus
libmodbus là một thư viện cung cấp triển khai Serial Modbus cho Arduino. Mục
tiêu chính là cho phép giao tiếp công nghiệp cho Arduino để liên kết nó với các thiết
bị công nghiệp như HMI, CNC, PLC, bộ điều chỉnh nhiệt độ hoặc driver servo. Quy
trình cài đặt như sau:
▪ Tải thư viện Modbus tại: https://github.com/smarmengol/Modbus-Master-Slave-
for-Arduino
64
▪ Không cần giải nén thư viện đã tải xuống, hãy giữ nguyên file .Zip
▪ Trong Arduino IDE, chọn Sketch > Include Library. Ở đầu danh sách thả xuống,
chọn tùy chọn Add .Zip Library
65
3. Sơ đồ mạch trong Proteus
66
Tạo cổng COM ảo
COMPIM trong Proteus thiết lập là COM2 và COM5 cho PC
67
68
4. Modbus Poll
Sau khi hoàn thành các bước trong mục 3, hãy chạy mô phỏng trênb Proteus với
file .hex đã được thêm vào cho Arduino Mega2560. Mỏ phần mềm mô phỏng Modbus
Poll và làm theo các bước sau:
▪ Kết nối với Arduino. Chọn Connection > Connect và cửa sổ Connection Setup
xuất hiện, hãy thiết lập theo hình bên dưới
▪ Chọn Setup > Read/Write Definition… Sau đó chọn các thông số như hình bên
dưới
▪ Đặt tên cho từng địa chỉ Holding Register như một chú thích để dễ nhớ
69
▪ Bây giờ hãy test thử chương trình
70