Professional Documents
Culture Documents
TP HCM, 12/2020
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
LỜI CẢM ƠN
Nhóm chúng em xin cảm ơn Thầy – TS. Trương Quang Vinh đã truyền đặt cho chúng em
nhiều kiến thức bổ ích trong môn Thiết kế hệ thống nhúng nâng cao cũng như đã tạo điều kiện và
hỗ trợ, giúp đỡ chúng em trong suốt quá trình học tập và nghiên cứu đề tài này. Bên cạnh đó chúng
em còn rèn luyện thêm những kỹ năng thuyết trình, làm việc nhóm và viết báo cáo thông qua bài tập
lần này.
Cảm ơn các bạn trong nhóm đã dành nhiều thời gian cùng nhau làm việc và trao đổi, thảo
luận để có được một bài giải hoàn chỉnh.
2
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
MỤC LỤC
I. Contents
I. Specification................................................................................................................................5
A. Product requirement:.............................................................................................................5
1. Tên đề tài:................................................................................................................................5
2. Mục đích:.................................................................................................................................5
5. Chức năng:..............................................................................................................................5
6. Hiệu năng:...............................................................................................................................5
B. Engineering specification:......................................................................................................6
3. Sơ đồ khối hệ thống:...............................................................................................................7
II. Hardware:...................................................................................................................................8
3
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
1. Vi điều khiển:..........................................................................................................................8
2. Modul Lora:............................................................................................................................8
3. Loop Detector:........................................................................................................................9
B. Sơ đồ thiết kế:.......................................................................................................................10
1. Khối noded:...........................................................................................................................10
2. Khối Gateway:......................................................................................................................12
1. Khối Node:.............................................................................................................................13
2. Khối Gateway:......................................................................................................................14
III. Software:...............................................................................................................................14
A. Lựa chọn công cụ phần mềm: trình biên dịch, ngôn ngữ, thư viện:................................14
1. Code Arduino:.......................................................................................................................17
2. Code Raspberry:...................................................................................................................19
4
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
Mục tiêu:
Thiết kế ứng dụng mạng cảm biến không dây dùng công nghệ LoRa. Cụ thể, nhóm thiết
kế và thực hiện mô hình thực tế về hệ thống nhận diện xe ô tô trong bãi dùng cảm biến hồng
ngoại và hiển thị dữ liệu lên web để người dùng có thể biết được trạng thái của bãi đỗ.
I. Specification
A. Product requirement:
1. Tên đề tài:
Bãi đậu xe ô tô thông minh
2. Mục đích:
Xác định chỗ trống trong bãi đậu xe ô tô bằng cảm biến hồng ngoại và biết được
còn bao nhiêu chỗ trống trong bãi đậu xe.
3. Ngõ vào và ngõ ra:
Input: Tín hiệu từ cảm biến hồng ngoại.
Output: Trạng thái của các ô đỗ xe (có xe hoặc không) xuất lên web server.
4. Trường hợp sử dụng:
Người vào đỗ xe: biết được còn bao nhiêu chỗ trống thông qua màn hình hiển thị
trên LED.
Người quản trị: sẽ biết được còn bao nhiêu chỗ trống trong bãi đậu xe thông qua
việc truy cập vào trang web quản lý bãi đậu xe. Từ đó điều phối người đậu xe
vào khu vực còn trống. Bên cạnh đó, có thể điều khiển các khu vực đậu xe hoạt
động hay không khi có sự cố trong bãi đậu xe. Ngoài ra thông qua dự liệu lưu trữ
trong web server, người quản trị có thể biết được công suất sử dụng của bãi đổ
xe theo tuần/tháng/năm để quyết định việc tăng giảm sức chứa của bãi đậu xe.
5. Chức năng:
Arduino nano nhận dữ liệu từ cảm biến hồng ngoại (có xe hay không) sau đó
gửi cho Raspberry bằng truyền tín hiệu theo chuẩn Lora; rồi đưa dữ liệu lên
server.
Web server sẽ mô phỏng lại sơ đồ của bãi đậu xe.
Giúp người dùng biết được các vị trí còn trống, giúp người quản lý theo dõi
được mật độ và những khung giờ cao điểm để đưa ra những giải pháp (sẽ có
người trực tiếp hướng dẫn xe lưu thông đến các vị trí thích hợp).
6. Hiệu năng:
Sử dụng Lora để truyền nhận dữ liệu với tần số 434Mhz, tốc độ baud 9600bps,
cập nhật dữ liệu mỗi 2s lên server.
Với khoảng cách truyền trong khoảng 120m thì tỉ lệ lỗi bit thấp, xấp xỉ bằng 0.
5
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
6
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
Hoạt động trong điều kiện ngoài trời, cảm biến hồng ngoại được gắn phía trên và
chính giữa của mỗi ô giữ xe, các tín hiệu được truyền trong mộ trường không khí
bình thường.
3. Sơ đồ khối hệ thống:
7
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
Khối Gateway gồm máy tính nhúng Raspberry Pi model 3B+ kết nối với
module Ra-02.
Phần mềm: viết chương trình cho Arduino sử dụng môi trường Arduino IDE,
máy tính nhúng Raspberry sử dụng hệ điều hành Raspbian và viết chương trình
với ngôn ngữ lập trình Python.
II. Hardware:
A. Lựa chọn phần cứng:
1. Vi điều khiển:
Bên cạnh Raspberry Pi là máy tính nhúng đóng vai trò xử lý trung tâm,
chúng ta cần một vi điều khiển để các node.
Số chân analog 8 6 8
Số chân digital 14 14 25
8
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
Do chỉ sử dụng trong khoảng cách ngắn <500m và để tiết kiệm chi phí,
nhóm chọn Module LoRa Ra-02.
3. Loop Detector:
9
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
Do cảm biến vật ở khoảng cách ngắn nên chỉ và để tiết kiệm chi phí nên
IR Infrared Obstacle Avoidance được sử dụng.
B. Sơ đồ thiết kế:
1. Khối noded:
Loop detector block (Detector):
Tạo symbol cho khối Detector, có 2 chân nguồn, 1 chân in để nối với vòng
từ, 1 chân out nối với ngõ vào của Arduino:
10
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
Sơ đồ module Arduino
11
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
Do tích hợp module Arduino Nano và Lora RA-02 có sẵn, nên sơ đồ mạch
như sau:
12
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
2. Khối Gateway:
13
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
Cấp nguồn cho Arduino thông qua 2 pin Lion 4.2V thành 8.4V, qua mạch
ổn định điện áp còn 5V
Điện áp cung cấp cho Ra-02 là từ chân 3.3V của Arduino
Tần số hoạt động: 443MHz
Dòng tiêu thụ:
Với Arduino: 30mA
Với Ra-02: lúc phát là 120mA, lúc ngủ là 0.2uA
Công suất phát: 20dBm = 10mW
2. Khối Gateway:
Điện áp cung cấp cho Raspberry là từ adapter 220V AC sang 5V DC
Điện áp cung cấp cho Ra-02 là từ chân 3.3V của Raspberry
Tần số hoạt động: 443MHz
Dòng tiêu thụ: 10.8mA
III. Software:
A. Lựa chọn công cụ phần mềm: trình biên dịch, ngôn ngữ, thư viện:
Nhóm sử dụng 2 arduino nano là các node, sử dụng trình biên dịch là Arduino
IDE,ngôn ngữ lập trình là C, và sử dụng 2 thư viên là <SPI.h> để giao tiếp SPI
và <RH_RF95.h> của module Lora.
Đối với máy tính nhúng Raspberry Pi, nhóm cài đặt cho nó hệ điều hành là
Raspbian, sử dụng trình biên dịch là python3 với ngôn ngữ lập trình là Python.
Đầu tiên nhóm sử dụng thư viện RPi.GPIO để khai báo các chân, tiếp theo là thư
viện SX127x.LoRa để có thể giao tiếp với module LoRa và cuối cùng là thư viện
paho.mqtt.client để có thể giao tiếp MQTT gửi dữ liệu lên server.
B. Lưu đồ giải thuật chính:
14
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
15
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
16
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
D. Mô tả và lập trình các chương trình con:
1. Code Arduino:
Các bước đầu tiên là khai báo thư viện và khai báo các chân GPIO được chọn.
Kèm theo đó là tần số mặc định để phát sóng Lora là 434 MHz.
Trong phần set up, nhóm khai báo các chân được sử dụng là input hay output,
đồng thời đưa điện áp ở chân reset về thấp rồi lên cao để khởi động module
Lora. Sau đó là các câu lệnh kiểm tra kết nối và báo lỗi nếu chưa thành công và
nếu thành công thì cài đặt công suất phát là 20dBm.
Trong phần loop, đọc giá trị analog (0-1024) rồi đưa vào biến counter, nếu
counter > 100 nghĩa là có xe, gán biến counter = 1 và ngược lại counter <100
nghĩa là không có xe, gán biến counter = 0. Tiếp theo, để phân biệt các module
Lora khác nhau, ta phải thêm các kí tự nhận biết vào gói tin. Cụ thể ở đây là
thêm “5” vào gói tin nếu gửi từ module 1 và “6” nếu là module 2. Dùng câu lệnh
“data.toCharArray(d, 3);” để chuyển về định dạng theo đúng mà thư viện Lora
đã đề ra. Cuối cùng là gửi gói tin đi.
#include <RH_RF95.h>
#define RFM95_INT 2
void setup()
17
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
Serial.begin(9600);
pinMode(sensor, INPUT);
pinMode(pull_up, OUTPUT);
digitalWrite(RFM95_RST, LOW);
delay(10);
digitalWrite(RFM95_RST, HIGH);
delay(10);
while (1);
while (1);
rf95.setTxPower(18);
void loop()
18
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
String data = "6" + String(counter); Thêm kí hiệu phân biệt giữa hai node
char d[3];
rf95.waitPacketSent();
Serial.print("counter: ");
Serial.println(counter);
2. Code Raspberry:
Đầu tiên, ta cũng khai báo các thư viện sử dụng cùng các chân GPIO được chọn
và tần số là 434 MHz.
Tiếp theo, ta điền username, password và client id tương ứng các thông tin nhận
được khi truy cập vào tài khoản ở trang web Cayenne. Sau đó ta tạo 2 topic để
gửi tin lên server.
Tiếp theo ta cũng có các hàm để kiểm tra kết nối và thông báo giống như ở
chương trình Arduino. Sau khi đã kết nối thành công, gói tin bắt đầu được nhận
và ta sẽ dùng các câu lệnh để tách và phân biệt.
Gói tin sẽ bao gồm 8 byte trong đó byte 1 là byte đệm theo như thư viện Lora,
byte 2 là byte dùng để phân biệt xem là từ module nào gửi đến và byte 3 là data
cần hiển thị.
Nếu nhận được byte 2 là 5 thì có nghĩa là module 1 gửi đến và nếu là 6 thì có
nghĩa là module 2 gửi đến.
Sau đó dùng các câu lệnh để cập nhật đúng định dạng và publish lên server
dùng MQTT.
19
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
password = "281c05992bbff24e24744c050ad3eb382f472719"
clientid = "5efb48b0-bcf4-11ea-93bf-d33a96695544"
mqttc = mqtt.Client(client_id=clientid)
mqttc.username_pw_set(username, password=password)
mqttc.connect("mqtt.mydevices.com", port=1883,
keepalive=60)
BOARD.setup()
class LoRaRcvCont(LoRa):
super(LoRaRcvCont, self).__init__(verbose)
self.set_mode(MODE.SLEEP)
self.set_dio_mapping([0] * 6)
def start(self):
self.reset_ptr_rx()
self.set_mode(MODE.RXCONT)
while True:
sleep(.5)
rssi_value = self.get_rssi_value()
status = self.get_modem_status()
sys.stdout.flush()
20
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
def on_rx_done(self):
self.clear_irq_flags(RxDone=1)
payload = self.read_payload(nocheck=True)
car = (data[3:4])
Tách được kí tự nhận
if select == 5: biết và dữ liệu cần
truyền lên server từ
counter1 = car data ( có xe là 1,
mqttc.publish(topic_counter_1, payload=counter1, không có xe là 0)
retain=True) Nếu kí tự nhận biết là
print ("Counter 1:",counter1,"xe") 5, thêm thông tin vào
topic 1 rồi gửi lên
elif select == 6: server
self.set_mode(MODE.SLEEP)
self.reset_ptr_rx()
self.set_mode(MODE.RXCONT)
21
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
lora.set_pa_config(pa_select=1)
try:
lora.start()
except KeyboardInterrupt:
sys.stdout.flush()
print ("")
sys.stderr.write("KeyboardInterrupt\n")
finally:
sys.stdout.flush()
BOARD.teardown()
22
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
void setup()
Serial.begin(9600);
pinMode(button, INPUT);
pinMode(RFM95_RST, OUTPUT);
digitalWrite(RFM95_RST, LOW);
delay(10);
digitalWrite(RFM95_RST, HIGH);
delay(10);
while (!rf95.init()) {
while (1);
23
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
if (!rf95.setFrequency(RF95_FREQ)) {
Serial.println("setFrequency failed");
while (1);
rf95.setTxPower(20);
void loop()
delay(2000);
char d[3];
data.toCharArray(d, 3);
rf95.send(d, sizeof(d));
rf95.waitPacketSent();
Serial.print("counter: ");
Serial.println(counter);
24
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
2. Code cho Raspberry Pi:
GPIO.setwarnings(False)
sleep(30)
username = "420f9120-bcf4-11ea-b767-3f1a8f1211ba"
password = "281c05992bbff24e24744c050ad3eb382f472719"
clientid = "5efb48b0-bcf4-11ea-93bf-d33a96695544"
mqttc = mqtt.Client(client_id=clientid)
mqttc.username_pw_set(username, password=password)
mqttc.loop_start()
BOARD.setup()
class LoRaRcvCont(LoRa):
super(LoRaRcvCont, self).__init__(verbose)
self.set_mode(MODE.SLEEP)
self.set_dio_mapping([0] * 6)
def start(self):
self.reset_ptr_rx()
self.set_mode(MODE.RXCONT)
while True:
25
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
sleep(.5)
rssi_value = self.get_rssi_value()
status = self.get_modem_status()
sys.stdout.flush()
def on_rx_done(self):
self.clear_irq_flags(RxDone=1)
payload = self.read_payload(nocheck=True)
data = bytes(payload).decode("utf-8",'ignore')
select = (data[2:3])
car = (data[3:4])
if select == 5:
counter1 = car
elif select == 6:
counter2 = car
self.set_mode(MODE.SLEEP)
self.reset_ptr_rx()
self.set_mode(MODE.RXCONT)
lora = LoRaRcvCont(verbose=False)
lora.set_mode(MODE.STDBY)
# Medium Range Defaults after init are 434.0MHz, Bw = 125 kHz, Cr = 4/5, Sf =
128chips/symbol, CRC on 13 dBm
26
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
lora.set_pa_config(pa_select=1)
try:
lora.start()
except KeyboardInterrupt:
sys.stdout.flush()
print ("")
sys.stderr.write("KeyboardInterrupt\n")
finally:
sys.stdout.flush()
print ("")
lora.set_mode(MODE.SLEEP)
BOARD.teardown()
27
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
House of quality:
28
Bài tập cuối kì môn Thiết kế hệ thống nhúng nâng cao TS. Trương Quang Vinh
29