You are on page 1of 29

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HÒ CHÍ MINH

TRƯỜNG ĐẠI HỌC BÁCH KHOA


KHOA ĐIỆN – ĐIỆN TỬ

Bài tập lớn


Môn: Thiết Kế Hệ Thống Nhúng Nâng Cao

Đề tài: BÃI ĐẬU XE Ô TÔ THÔNG MINH

Giáo viên hướng dẫn:

TS. Trương Quang Vinh

Sinh viên thực hiện:

Võ Thị Phương An - 2070044

Trương Thuận An - 1710005

Bùi Lê Quốc Doanh -1710035

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.

Chúng em xin chân thành cảm ơn.

TP. HCM, ngày 28 tháng 12 năm 2020

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

3. Ngõ vào và ngõ ra:..................................................................................................................5

4. Trường hợp sử dụng:.............................................................................................................5

5. Chức năng:..............................................................................................................................5

6. Hiệu năng:...............................................................................................................................5

7. Giá thành sản phẩm:..............................................................................................................6

8. Nguồn cung cấp:.....................................................................................................................6

9. Kích thước vật lý:...................................................................................................................6

10. Lắp đặt:...................................................................................................................................6

B. Engineering specification:......................................................................................................6

1. Nguyên lý hoạt động:..............................................................................................................6

2. Môi trường hoạt động:...........................................................................................................6

3. Sơ đồ khối hệ thống:...............................................................................................................7

4. Mô tả các khối chính:.............................................................................................................7

5. Phân chia phần cứng phần mềm:..........................................................................................7

II. Hardware:...................................................................................................................................8

A. Lựa chọn phần cứng:.............................................................................................................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

C. Tính toán thông số cho từng khối:......................................................................................13

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

B. Lưu đồ giải thuật chính:......................................................................................................14

C. Lưu đồ dãy thuật chương trình con:...................................................................................15

D. Mô tả và lập trình các chương trình con:...........................................................................17

1. Code Arduino:.......................................................................................................................17

2. Code Raspberry:...................................................................................................................19

E. Tổng hợp phần mềm............................................................................................................22

1. Code cho Arduino:................................................................................................................22

2. Code cho Raspberry Pi:.......................................................................................................25

IV. Kết quả:.................................................................................................................................27

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

 Yêu cầu hệ thống hoạt động ổn định.


7. Giá thành sản phẩm:
Giá không vượt quá 2tr VNĐ.
8. Nguồn cung cấp:
Fử dụng nguồn pin từ cục sạc dự phòng 5V có thể tái sử dụng được.
9. Kích thước vật lý:
Kích thước nhỏ gọn, khoảng 50cmx50cm.
10. Lắp đặt:
Sản phẩm được tích hợp bởi các module có sẵn trên thị trường.
B. Engineering specification:
1. Nguyên lý hoạt động:
 Phía Node:
 Cảm biến hồng ngoại sẽ phát hiện rằng ô có xe hay là không dựa vào
ánh sáng hồng ngoại.
 Tín hiệu digital sẽ được truyền từ module cảm biến hồng ngoại về
Arduino Nano và chuyển thành 0 hoặc 1 tương ứng với 0 là không có
xe và 1 là có xe.
 Trong chương trình Arduino, ta thêm 1 kí tự vào gói tin gửi đi để
phân biệt vị trí các ô giữ xe với nhau.
 Arduino kết nối với module Ra-02 với chuẩn giao tiếp SPI, sau đó
truyền gói tin bằng cho Raspberry Pi đã kết nối với module Ra-02
khác cũng với chuẩn giao tiếp SPI bằng công nghệ Lora.
 Phía Gateway
 Raspberry Pi nhận gói tin và tách ra làm 2 phần, thông tin cần hiển thị
và kí tự phân biệt, sau đó gửi lên web server bằng giao thức MQTT, ở
đây nhóm sử dụng platform tên là Cayenne.
 Một màn hình lớn đã được đặt ở chỗ ra vào sẽ mở web Cayenne lên
cho người vào đỗ xe có thể biết được vị trí nào còn trống.
 Người quản trị cũng có thể thông qua web Cayenne 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.
2. Môi trường hoạt động:

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:

4. Mô tả các khối chính:


 Module cảm biến hồng ngoại: sử dụng nguyên lý ánh sáng hồng ngoại để nhận
diện xe.
 Arduino nano: sử dụng vi điều khiển ATmega328, nhận tín hiệu digital từ
module cảm biến hồng ngoại sau đó kết nối với Ra-02 để gửi tín hiệu đi.
 Module Ra-02: sử dụng chip SX1278 của nhà sản xuất SEMTECH, chuẩn giao
tiếp Lora, hoạt động ở tần số 434MHz, dùng để truyền nhận tín hiệu từ Arduino
sang Raspberry.
 Raspberry Pi: máy tính nhúng với chức năng là trung tâm xử lí, nhận tín hiệu từ
Arduino qua Module Ra-02 với chuẩn giao tiếp SPI bằng công nghệ Lora, sau đó
gửi dữ liệu lên web server.
 Web Server: sử dụng platform Cayenne và kết nối với Raspberry qua giao thức
MQTT.
5. Phân chia phần cứng phần mềm:
 Phần cứng: chia làm khối Node với khối Gateway.
 Khối Node gồm module cảm biến hồng ngoại, Arduino nano, module Ra-02
cùng với nguồn pin 5V.

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.

Arduino Nano Ardunio Uno R3 PIC 16f877a

Số chân analog 8 6 8

Số chân digital 14 14 25

Hỗ trợ giao tiếp SPI Có Có Có

Điện áp hoạt động 5V DC 5V DC 4-5.5V DC

Dòng tiêu thụ 30mA 30mA

Kích thước 1.85cm x 4.3cm 6.86cm x 5.34cm

Giá thành 40 nghìn đồng 120 nghìn đồng 65 nghìn đồng

 Do có nhiều ưu điểm hơn và sẵn có nên nhóm chọn Arduino Nano.


2. Modul Lora:

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

Ra - 02 E32 – TTL -100

IC chính SX1278 SX1278

Tần số 420MHz – 450MHz 410MHz - 441MHz

Công suất phát 20dBm 20dBm

Điện áp cung cấp 1.8-3.7V 2.3V – 5.5V

Dòng tiêu thụ Phát: 120mA Phát: 130mA

Thu: 10.8mA Thu: 13.5mA

Ngủ: 0.2uA Ngủ: 2uA

Khoảng cách <1km <3km

Kích thước 17x16mm 21x36mm

Giá thành 120 nghìn đồng 260 nghìn đồng

 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:

Bộ dò vòng từ IR Infrared E3F-DS100C4


Obstacle Adjustable IR
Avoidance Infrared
Proximity Sensor

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

Điện áp cung cấp 3.3 – 5V 3.3 – 5V 6 – 36V

Giá thành 50.000đ 12.000đ 105.000đ

Tín hiệu ngõ ra analog digital digital

Số dây kết nối 3 3 3

Kích thước 40x50mm 32x14mm 18x68 mm

Công nghệ cảm ứng điện từ hồng ngoại hồng ngoại

Khoảng cách 0-10cm 0-50cm 0-200cm

 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 Lora Ra-02:

 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:

 Sơ đồ module Raspberry Pi3:

 Do tích hợp module Raspberry Pi3 và module Lora Ra-02 có sẵn, sơ đồ


mạch như sau:

C. Tính toán thông số cho từng khối:


1. Khối Node:

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

C. Lưu đồ dãy thuật chương trình con:

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 <SPI.h> Khai báo thư viện sử dụng

#include <RH_RF95.h>

#define RFM95_CS 10 Khai báo các chân của module Lora


tương ứng
#define RFM95_RST

#define RFM95_INT 2

Chọn tần số hoạt động


#define RF95_FREQ 434.0

RH_RF95 rf95(RFM95_CS, RFM95_INT);


Khai báo chân cảm biến và điện trở kéo
int sensor = 3; lên
int pull_up = 4;

void setup()

{ Đặt tốc độ baud là 9600

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(pull_up,HIGH); Cấp nguồn để có điện trở kéo lên

pinMode(RFM95_RST, OUTPUT); Đóng mở để khởi động module Lora

digitalWrite(RFM95_RST, LOW);

delay(10);

digitalWrite(RFM95_RST, HIGH);

delay(10);

while (!rf95.init()) { Kiểm tra kết nối Lora

Serial.println("LoRa radio init failed");

while (1);

if (!rf95.setFrequency(RF95_FREQ)) { Kiểm tra tần số


Serial.println("setFrequency failed");

while (1);

rf95.setTxPower(18);

} Đặt công suất phát là 18dBm

void loop()

delay(1000); Gửi dữ liệu mỗi giây 1 lần

int counter = !digitalRead(sensor); Đọc dữ liệu từ cảm biến

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];

data.toCharArray(d, 3); Chuyển gói tin thành kiểu mảng

rf95.send(d, sizeof(d)); Truyền gói tin đi

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.

import RPi.GPIO as GPIO Khai báo thư viện


GPIO, Lora và MQTT
GPIO.setwarnings(False)

from time import sleep

from SX127x.LoRa import *

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

from SX127x.board_config import BOARD

import paho.mqtt.client as mqtt Bộ 3 thông số để kết


nối với Web Cayenne
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.connect("mqtt.mydevices.com", port=1883,
keepalive=60)

mqttc.loop_start() Tạo 2 topic để gửi dữ


liệu đến server từ 2
topic_counter_1 = "v1/" + username + "/things/" + clientid + node
"/data/1"

topic_counter_2 = "v1/" + username + "/things/" + clientid +


"/data/2"

BOARD.setup()

class LoRaRcvCont(LoRa):

def __init__(self, verbose=False):

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):

print ("\nReceived: ")

self.clear_irq_flags(RxDone=1)

payload = self.read_payload(nocheck=True)

data = bytes(payload).decode("utf-8",'ignore') Gói tin nhận được sẽ


gán vào data
select = (data[2:3])

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

counter2 = car Nếu kí tự nhận biết là


6, thêm thông tin vào
mqttc.publish(topic_counter_2, payload=counter2, topic 2 rồi gửi lên
retain=True) server

print ("Counter 2:",counter2,"xe")

print ("Sent to Cayenne")

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 = LoRaRcvCont(verbose=False) Cấu hình các thông số


cho Module Lora, ở
lora.set_mode(MODE.STDBY) đây dùng những giá trị
mặc định.
# Medium Range Defaults after init are 434.0MHz, Bw =
125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on 13 dBm

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 ("") Đưa về chế độ ngủ để


tiết kiệm năng lượng
lora.set_mode(MODE.SLEEP)

BOARD.teardown()

E. Tổng hợp phần mềm


1. Code cho Arduino:

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

#include <SPI.h> //Import SPI librarey

#include <RH_RF95.h> // RF95 from RadioHead Librarey

#define RFM95_CS 10 //CS if Lora connected to pin 10

#define RFM95_RST 9 //RST of Lora connected to pin 9

#define RFM95_INT 2 //INT of Lora connected to pin 2

// Change to 434.0 or other frequency, must match RX's freq!

#define RF95_FREQ 434.0

// Singleton instance of the radio driver

RH_RF95 rf95(RFM95_CS, RFM95_INT);

int button = A6;

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()) {

Serial.println("LoRa radio init failed");

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);

int counter = analogRead(button);

if (counter > 100) {counter = 1;}

else {counter = 0;}

String data = "5" + String(counter);

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:

import RPi.GPIO as GPIO

GPIO.setwarnings(False)

from time import sleep

from SX127x.LoRa import *

from SX127x.board_config import BOARD

import paho.mqtt.client as mqtt

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.connect("mqtt.mydevices.com", port=1883, keepalive=60)

mqttc.loop_start()

topic_counter_1 = "v1/" + username + "/things/" + clientid + "/data/1"

topic_counter_2 = "v1/" + username + "/things/" + clientid + "/data/2"

BOARD.setup()

class LoRaRcvCont(LoRa):

def __init__(self, verbose=False):

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):

print ("\nReceived: ")

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

mqttc.publish(topic_counter_1, payload=counter1, retain=True)

print ("Counter 1:",counter1,"xe")

elif select == 6:

counter2 = car

mqttc.publish(topic_counter_2, payload=counter2, retain=True)

print ("Counter 2:",counter2,"xe")

print ("Sent to Cayenne")

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()

IV. Kết quả:


 Mục tiêu thực hiện là kiểm tra khoảng cách truyền nhận và tỉ lệ lỗi bit giữa
các Node cảm biến và Gateway.
 Đầu tiên, nhóm thực hiện test ở khoảng cách 50m, kết quả nhận được là
không có bit nào lỗi
 Tiếp theo, nhóm test ở khoảng cách là 150m thì tỉ lệ lỗi bit cao (>50%),
xuất hiện nhiều kí tự không mong muốn (ví dụ như d)
 Cuối cùng, nhóm giảm khoảng cách lại thì tìm được khoảng cách xa nhất
để việc truyền nhận không có lỗi là 120m
 Dữ liệu sẽ được hiển thị trên web Cayenne như hình dưới đây:

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

You might also like