HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG
KHOA KỸ THUẬT ĐIỆN TỬ 1
BÁO CÁO
HỆ THỐNG TƯỚI TIÊU TỰ ĐỘNG
Môn: Hệ Thống nhúng
Hà Nội - 2022
0 | 32
Mục lục
I. SƠ ĐỒ KHỐI .......................................................................................................... 2
II. GIỚI THIỆU LINH KIỆN ...................................................................................... 2
1. STM32F103C8T6 ................................................................................................ 2
2. ESP8266............................................................................................................... 6
3. DHT11 ................................................................................................................. 8
4. Module cảm biến độ ẩm đất................................................................................. 9
5. Module cảm biến ánh sáng ................................................................................ 10
III.
CÁC GIAO TIẾP SỬ DỤNG ............................................................................ 11
1. Hệ điều hành FREERTOS ................................................................................. 11
2. Chuyển đổi ADC ............................................................................................... 16
3. Giao tiếp One Wire ............................................................................................ 18
4. Giao tiếp UART ................................................................................................. 21
5. Giao tiếp MQTT ................................................................................................ 24
6. Giao tiếp API ..................................................................................................... 27
IV.
HOẠT ĐỘNG CỦA HỆ THỐNG ..................................................................... 28
1. Phương thức hoạt động ...................................................................................... 28
2. Lưu đồ thuật toán ............................................................................................... 28
3. PCB .................................................................................................................... 30
4. Mạch chạy .......................................................................................................... 30
5. Hiển thị dữ liệu lên Web (Demo) ...................................................................... 31
V. ỨNG DỤNG ......................................................................................................... 31
1 | 32
I.
II.
SƠ ĐỒ KHỐI
GIỚI THIỆU LINH KIỆN
1. STM32F103C8T6
STM32 là một trong những dòng chip phổ biến của ST với nhiều họ thông dụng
như F0,F1,F2,F3,F4….. Stm32f103 thuộc họ F1 với lõi là ARM COTEX M3.
STM32F103 là vi điều khiển 32 bit, tốc độ tối đa là 72Mhz. Giá thành cũng khá rẻ so
2 | 32
với các loại vi điều khiển có chức năng tương tự. Mạch nạp cũng như cơng cụ lập
trình khá đa dạng và dễ sử dụng.
Một số ứng dụng chính: dùng cho driver để điều khiển ứng dụng, điều khiển ứng
dụng thơng thường, thiết bị cầm tay và thuốc, máy tính và thiết bị ngoại vi chơi
game, GPS cơ bản, các ứng dụng trong cơng nghiệp, thiết bị lập trình PLC, biến tần,
máy in, máy quét, hệ thống cảnh báo, thiết bị liên lạc nội bộ…
Phần mềm lập trình: có khá nhiều trình biên dịch cho STM32 như IAR Embedded
Workbench, Keil C… Ở đây mình sử dụng Keil C nên các bài viết sau mình chỉ đề
cập đến Keil C.
Thư viện lập trình: có nhiều loại thư viện lập trình cho STM32 như:
STM32snippets, STM32Cube LL, STM32Cube HAL, Standard Peripheral Libraries,
Mbed core. Mỗi thư viện đều có ưu và khuyết điểm riêng, ở đây mình xin phép sử
3 | 32
dụng Standard Peripheral Libraries vì nó ra đời khá lâu và khá thông dụng, hỗ trợ
nhiều ngoại vi và cũng dễ hiểu rõ bản chất của lập trình.
Mạch nạp: có khá nhiều loại mạch nạp như : ULINK, J-LINK , CMSIS-DAP,
STLINK… ở đây mình sử dụng Stlink vì giá thành khá rả và debug lỗi cũng tốt.
Cấu hình chi tiết của STM32F103C8T6:
•
ARM 32-bit Cortex M3 với clock max là 72Mhz.
•
Bộ nhớ:
•
•
•
•
o
64 kbytes bộ nhớ Flash (bộ nhớ lập trình).
o
20 kbytes SRAM.
Clock, reset và quản lý nguồn.
o
Điện áp hoạt động 2.0V -> 3.6V.
o
Power on reset (POR), Power down reset (PDR) và programmable
voltage detector (PVD).
o
Sử dụng thạch anh ngoài từ 4Mhz -> 20Mhz.
o
Thạch anh nội dùng dao động RC ở mode 8Mhz hoặc 40khz.
o
Sử dụng thạch anh ngoài 32.768khz được sử dụng cho RTC.
Trong trường hợp điện áp thấp:
o
Có các mode: ngủ, ngừng hoạt động hoặc hoạt động ở chế độ chờ.
o
Cấp nguồn ở chân Vbat bằng pin để hoạt động bộ RTC và sử dụng lưu
trữ data khi mất nguồn cấp chính.
2 bộ ADC 12 bit với 9 kênh cho mỗi bộ.
o
Khoảng giá trị chuyển đổi từ 0 – 3.6V.
o
Lấy mẫu nhiều kênh hoặc 1 kênh.
o
Có cảm biến nhiệt độ nội.
DMA: bộ chuyển đổi này giúp tăng tốc độ xử lý do khơng có sự can thiệp
q sâu của CPU.
4 | 32
•
•
o
7 kênh DMA.
o
Hỗ trợ DMA cho ADC, I2C, SPI, UART.
7 timer
o
3 timer 16 bit hỗ trợ các mode IC/OC/PWM.
o
1 timer 16 bit hỗ trợ để điều khiển động cơ với các mode bảo vệ như
ngắt input, dead-time..
o
2 watdog timer dùng để bảo vệ và kiểm tra lỗi.
o
1 sysTick timer 24 bit đếm xuống dùng cho các ứng dụng như hàm
Delay….
Hỗ trợ 9 kênh giao tiếp bao gồm:
o
2 bộ I2C(SMBus/PMBus).
o
3 bộ USART(ISO 7816 interface, LIN, IrDA capability, modem
control).
o
2 SPIs (18 Mbit/s).
o
1 bộ CAN interface (2.0B Active)
o
USB 2.0 full-speed interface
Thông số kỹ thuật:
•
Vi điều khiển: STM32F103C8T6.
•
Điện áp cấp 5VDC qua cổng Micro USB sẽ được chuyển đổi thành 3.3VDC
qua IC nguồn và cấp cho Vi điều khiển chính.
•
Tích hợp sẵn thạch anh 8Mhz.
•
Tích hợp sẵn thạnh anh 32Khz cho các ứng dụng RTC.
•
Ra chân đầy đủ tất cả các GPIO và giao tiếp: CAN, I2C, SPI, UART,
USB,…
•
Tích hợp Led trạng thái nguồn, Led PC13, Nút Reset.
•
Kích thước: 53.34 x 15.24mm
•
Sử dụng với các mạch nạp:
5 | 32
o
ST-Link Mini
o
J-link
USB TO COM
Kết nối chân khi nạp bằng ST-Link Mini
o
•
•
Nạp theo chuẩn SWD
o TCK — SWCLK
o
TMS — SWDIO
o
GND — GND
o
3.3V — 3.3V
2. ESP8266
ESP8266 là một mạch vi điều khiển có thể giúp chúng ta điều khiển các thiết bị
điện tử. Thêm vào đó nó được tích hợp wi-fi 2.4GHz có thể dùng cho lập trình.
ESP8266 có thể được dùng làm module Wifi bên ngoài, sử dụng firmware tập
lệnh AT tiêu chuẩn bằng cách kết nối nó với bất kỳ bộ vi điều khiển nào sử dụng
UART nối tiếp hoặc trực tiếp làm bộ vi điều khiển hỗ trợ Wifi, bằng cách lập trình
một chương trình cơ sở mới sử dụng SDK được cung cấp.
6 | 32
Các chân GPIO cho phép IO Analog và Digital, cộng với PWM, SPI, I2C, v.v.
ESP8266 có nhiều ứng dụng khi nói đến IoT. Đây chỉ là một số chức năng mà
chip này được sử dụng
Kết nối mạng: Ăng-ten Wi-Fi của module cho phép các thiết bị nhúng kết nối với
bộ định tuyến và truyền dữ liệu
Xử lý dữ liệu: Bao gồm xử lý đầu vào cơ bản từ cảm biến analog và kỹ thuật số để
tính tốn phức tạp hơn nhiều với RTOS hoặc SDK không phải hệ điều hành
Kết nối P2P: Tạo giao tiếp trực tiếp giữa các ESP và các thiết bị khác bằng kết nối
IoT P2P
Máy chủ Web: Truy cập các trang được viết bằng HTML hoặc ngôn ngữ phát
triển.
WiFi: 2.4 GHz hỗ trợ chuẩn 802.11 b/g/n
- Điện áp hoạt động: 3.3V
- Điện áp vào: 5V thông qua cổng USB
- Số chân I/O: 11 (tất cả các chân I/O đều có Interrupt/PWM/I2C/One-wire.
- Số chân Analog Input: 1 (điện áp vào tối đa 3.3V)
- Bộ nhớ Flash: 4MB
- Giao tiếp: Cable Micro USB ( tương đương cáp sạc điện thoại )
- Hỗ trợ bảo mật: WPA/WPA2
- Tích hợp giao thức TCP/IP
- Lập trình trên các ngơn ngữ: C/C++, Micropython,…
7 | 32
3. DHT11
DHT-11 là module cảm biến nhiệt độ, độ ẩm có giao tiếp 1 dây (one wire). Cấu
tạo cảm biến gồm 2 phần: một điện trở nhiệt và một cảm biến độ ẩm điện dung.
Ngồi ra bên trong module cịn có các mạch chuyển đổi tương tự sang số. Cảm biến
được tích hợp bộ tiền xử lý giúp cho dữ liệu nhận về được chính xác mà khơng cần
phải qua bất kỳ khâu phân tích hay tính tốn nào. Các thông số kỹ thuật của module
cảm biến nhiệt độ, độ ẩm DHT-11 được cho như sau:
-
Điện áp hoạt động +5Vdc
Dòng điện hoạt động cực đại là 2,5mA
Dải độ ẩm hoạt động 20%÷90% RH, sai số ±4%RH (range humidity)
Dải nhiệt độ hoạt động 0÷50℃, sai số ±2℃
Nhiệt độ và độ ẩm đều có độ phân giải 16 bit.
Tốc độ lấy mẫu không quá 1Hz (mỗi giây một lần).
Tốc độ cảm nhận: trung bình 2s
Khoảng cách truyền tối đa 20m.
Chân DATA được nối với giắc cắm DATA trên KIT thí nghiệm IoT
8 | 32
4. Module cảm biến độ ẩm đất
Cảm biến này chủ yếu sử dụng điện dung để đo hàm lượng nước trong đất (điện
môi cho phép). Hoạt động của cảm biến này có thể được thực hiện bằng cách đưa
cảm biến này vào trái đất và trạng thái của hàm lượng nước trong đất có thể được báo
cáo dưới dạng phần trăm.
•
Nguồn cấp 3.3~5 VDC
•
Đầu ra digital DO (0 và 1)
•
Đầu ra điện áp analog AO
9 | 32
5. Module cảm biến ánh sáng
Thơng số kỹ thuật:
•
Sử dụng cảm biến photoresistor loại nhạy
•
Dùng IC so sánh LM393 cho dịng ra lớn đến 15mA.
•
Nguồn cấp 3.3~5 VDC
•
Đầu ra digital DO (0 và 1)
•
Đầu ra điện áp analog AO
•
Một lỗ bu lơng cố định để lắp đặt dễ dàng
•
Kích thước: 3.2 x 1.4cm
Cách hoạt động
•
Khi mức ánh sáng xung quanh chưa đạt đến ngưỡng, DO ở mức cao. Khi
mức ánh sáng xung quanh vượt quá ngưỡng được thiết lập, đầu ra DO ở
mức thấp.
10 | 32
•
Đầu ra DO có thể được kết nối trực tiếp với vi điều khiển hoặc các module
khác (có thể là các mạch điều khiển ánh sáng).
•
Đầu ra AO có thể được kết nối với vi điều khiển thông qua chức năng
ADC, bạn có thể nhận được các giá trị cường độ ánh sáng xung quanh
chính xác hơn.
III.
CÁC GIAO TIẾP SỬ DỤNG
1. Hệ điều hành FREERTOS
RTOS là viết tắt của cụm từ Real-time operating system hay hệ điều hành thời gian
thực thường được nhúng trong các dòng vi điều khiển dùng để điều khiển thiết bị một
cách nhanh chóng và đa nhiệm (multi tasking). Để hiểu rõ ràng nó là gì trước hết hãy
làm rõ khái niệm về hệ điều hành đã.
Hệ điều hành (tiếng Anh: Operating System – viết tắt: OS) là một phần mềm dùng
để điều hành, quản lý toàn bộ tất cả thành phần (bao gồm cả phần cứng và phần
mềm) của thiết bị điện tử.
11 | 32
Hệ điều hành giống như hội đồng quản trị vậy. Họ có quyền quyết định ai làm gì
và thời gian như thế nào. Các nhân viên cũng như các ứng dụng, nhận lệnh của cấp
trên và thực thi các công việc theo đúng chức năng của mình.
Hệ điều hành thời gian thực (realtime): sinh ra cho các tác vụ cần sự phản hồi
nhanh của hệ thống, thường được nhúng trong các loại vi điều khiển và khơng có
giao diện (GUI) tương tác với người dùng. Chúng cần phản hồi nhanh bởi vì đa số
các tác vụ tương tác với thiết bị, máy móc khác chứ khơng phải con người. Các tài
nguyên bên trong rất hữu hạn nên chỉ một sự chậm trễ cũng có thể làm hệ thống làm
việc hồn tồn sai lệch.
Hệ điều hành thời gian thực cịn chia thành 2 loại:
Soft-realtime: Sử dụng cho các ứng dụng cruise control (điều khiển hành trình)
trong ơ tơ và các ứng dụng viễn thông
Hard-realtime: Sử dụng trong các ứng dụng điều khiển máy bay, động cơ điện
Khi nào bạn cần sử dụng RTOS ?
Các ứng dụng không cần dùng RTOS:
- Ứng dụng đơn (ứng dụng chỉ có 1 chức năng)
- Ứng dụng có vịng lặp đơn giản
- Ứng dụng <32kB
Các ứng dụng cần RTOS:
- Ứng dụng nhiều trạng thái máy (States Machine)
- Ứng dụng lớn
- Ứng dụng liên quan tới các tác vụ xử lý nhanh, xử lý ảnh, âm thanh.
Nếu ứng dụng của bạn mà kích thước chương trình lớn dần và độ phức tạp tăng lên
thì RTOS sẽ rất hữu dụng trong trường hợp này, lúc đó RTOS sẽ chia các ứng dụng
phức tạp thành các phần nhỏ hơn và dễ quản lý hơn.
12 | 32
RTOS được sử dụng rất nhiều khi lập trình ESP32, ESP8266, STM32 và các dòng
chip khác.
RTOS là một phân đoạn hoặc một phần của chương trình, trong đó nó giải quyết
việc điều phối các task, lập lịch và phân mức ưu tiên cho task, nắm bắt các thông điệp
gửi đi từ task.
RTOS khá phức tạp, nói một cách dễ hiểu hơn là nó thực hiện việc xử lý các trạng
thái máy (State Machine). Các bạn có thể tìm hiểu tại bài viết States Machine và lập
trình nhúng
Nhân Kernel sẽ điều phối sự hoạt động của các tác vụ (Task), mỗi task sẽ có một
mức ưu tiên (prioritize) và thực thi theo chu kì cố định. Nếu có sự tác động như ngắt,
tín hiệu hoặc tin nhắn giữa các Task, Kernel sẽ điều phối chuyển tới Task tương ứng
với Code đó.
Sự chuyển dịch giữa các Task rất linh động, độ trễ thấp mang lại độ tin cậy cao cho
chương trình.
Thay thì chạy từ trên xuống trong cùng một chương trình thì chúng sẽ được chạy
theo các Task khác nhau. Được chia nhỏ và chạy đồng thời
Kernel – Nhân
13 | 32
Kernel hay cịn gọi là Nhân có nhiệm vụ quản lý và điều phối các Task. Mọi sự
kiện (Even) như ngắt, Timer, data truyền tới… đều qua Kernel xử lý để quyết định
xem nên làm gì tiếp theo.
Thời gian xử lý của Kernel thường rất nhanh nên độ trễ rất thấp.
Task – Tác vụ
Task là một đoạn chương trình thực thi một hoặc nhiều vấn đề gì đó, được Kernel
quản lý.
Kernel sẽ quản lý việc chuyển đổi giữa các task, nó sẽ lưu lại ngữ cảnh của task
sắp bị hủy và khôi phục lại ngữ cảnh của task tiếp theo bằng cách:
Kiểm tra thời gian thực thi đã được định nghĩa trước (time slice được tạo ra bởi
ngắt systick)
Khi có các sự kiện unblocking một task có quyền cao hơn xảy ra (signal, queue,
semaphore,…)
Khi task gọi hàm Yield() để ép Kernel chuyển sang các task khác mà không phải
chờ cho hết time slice
Khi khởi động thì kernel sẽ tạo ra một task mặc định gọi là Idle Task.
14 | 32
Kết nối Inter-task & Chia sẻ tài nguyên
Các Task cần phải kết nối và trao đổi dữ liệu với nhau để có thể chia sẻ tài nguyên
Với Inter-task Communication:
Signal Events – Đồng bộ các task
Message queue – Trao đổi tin nhắn giữa các task trong hoạt động giống như FIFO
Mail queue – Trao đổi dữ liệu giữa các task sử dụng hằng đợi của khối bộ nhớ
Với Resource Sharing:
Semaphores – Truy xuất tài nguyên liên tục từ các task khác nhau
Mutex – Đồng bộ hóa truy cập tài nguyên sử dụng Mutual Exclusion
Signal event
Signal event được dùng để đồng bộ các task, ví dụ như bắt task phải thực thi tại
một sự kiện nào đó được định sẵn
Ví dụ: Một cái máy giặt có 2 task là Task A điều khiển động cơ, Task B đọc mức
nước từ cảm biến nước đầu vào
Task A cần phải chờ nước đầy trước khi khởi động động cơ. Việc này có thể thực
hiện được bằng cách sử dụng signal event
Task A phải chờ signal event từ Task B trước khi khởi động động cơ
Khi phát hiện nước đã đạt tới mức yêu cầu thì Task B sẽ gửi tín hiệu tới Task A
Với trường hợp này thì task sẽ đợi tín hiệu trước khi thực thi, nó sẽ nằm trong
trạng thái là WAITING cho đến khi signal được set. Ngồi ra ta có thể set 1 hoặc
nhiều signal trong bất kỳ các task nào khác.
Mỗi task có thể được gán tối đa là 32 signal event
15 | 32
Message queue – Hàng đợi tin nhắn
Message queue là cơ chế cho phép các task có thể kết nối với nhau, nó là một FIFO
( First In First Out) buffer được định nghĩa bởi độ dài (số phần tử mà buffer có thể
lưu trữ) và kích thước dữ liệu (kích thước của các thành phần trong buffer).
- Một ứng dụng tiêu biểu là buffer cho Serial I/O, buffer cho lệnh được gửi tới
task
- Task có thể ghi vào hằng đợi (queue)
- Task sẽ bị khóa (block) khi gửi dữ liệu tới một message queue đầy đủ
- Task sẽ hết bị khóa (unblock) khi bộ nhớ trong message queue trống
- Trường hợp nhiều task mà bị block thì task với mức ưu tiên cao nhất sẽ được
unblock trước
- Task có thể đọc từ hằng đợi (queue)
- Task sẽ bị block nếu message queue trống
- Task sẽ được unblock nếu có dữ liệu trong message queue.
- Tương tự ghi thì task được unblock dựa trên mức độ ưu tiên
2. Chuyển đổi ADC
ADC là từ viết tắt của Analog to Digital Converter hay bộ chuyển đổi analog sang
kỹ thuật số là một mạch chuyển đổi giá trị điện áp liên tục (analog) sang giá trị nhị
phân (kỹ thuật số) mà thiết bị kỹ thuật số có thể hiểu được sau đó có thể được sử
dụng để tính tốn kỹ thuật số. Mạch ADC này có thể là vi mạch ADC hoặc được
nhúng vào một bộ vi điều khiển.
16 | 32
Thiết bị điện tử ngày nay hoàn toàn là kỹ thuật số, khơng cịn là thời kỳ của máy
tính analog. Thật không may cho các hệ thống kỹ thuật số, thế giới chúng ta đang
sống vẫn là analog và đầy màu sắc, khơng chỉ đen và trắng.
Ví dụ, một cảm biến nhiệt độ như LM35 tạo ra điện áp phụ thuộc vào nhiệt độ,
trong trường hợp của thiết bị cụ thể nó sẽ tăng 10mV khi nhiệt độ tăng lên mỗi độ.
Nếu chúng ta kết nối trực tiếp thiết bị này với đầu vào kỹ thuật số, nó sẽ ghi là cao
hoặc thấp tùy thuộc vào các ngưỡng đầu vào, điều này là hồn tồn vơ dụng.
Thay vào đó, chúng ta sử dụng một bộ ADC để chuyển đổi đầu vào điện áp analog
thành một chuỗi các bit có thể được kết nối trực tiếp với bus dữ liệu của bộ vi xử lý
và được sử dụng để tính tốn.
ADC hoạt động như thế nào
Một cách rất hay để xem xét hoạt động của ADC là tưởng tượng nó như một bộ
chia tỷ lệ toán học. Tỷ lệ về cơ bản là ánh xạ các giá trị từ dải này sang dải khác, vì
vậy ADC ánh xạ một giá trị điện áp sang một số nhị phân.
Những gì chúng ta cần là một thứ có thể chuyển đổi điện áp thành một loạt các
mức logic, ví dụ như trong một thanh ghi. Tất nhiên, các thanh ghi chỉ có thể chấp
nhận các mức logic làm đầu vào, vì vậy nếu bạn kết nối tín hiệu trực tiếp với đầu vào
logic, kết quả sẽ khơng tốt. Vì vậy cần có một giao diện ở giữa logic và điện áp đầu
vào analog.
Điện áp tham chiếu
Tất nhiên, khơng có ADC nào là tuyệt đối, vì vậy điện áp được ánh xạ tới giá trị
nhị phân lớn nhất được gọi là điện áp tham chiếu. Ví dụ: trong bộ chuyển đổi 10 bit
với 5V làm điện áp tham chiếu, 1111111111 (tất cả các bit một, số nhị phân 10 bit
cao nhất có thể ) tương ứng với 5V và 0000000000 (số thấp nhất tương ứng với 0V).
Vì vậy, mỗi bước nhị phân lên đại diện cho khoảng 4,9mV, vì có thể có 1024 chữ số
trong 10 bit. Số đo điện áp trên mỗi bit này được gọi là độ phân giải của ADC.
17 | 32
Điều gì sẽ xảy ra nếu điện áp thay đổi dưới 4,9mV mỗi bước? Nó sẽ đặt ADC vào
vùng chết, do đó kết quả chuyển đổi ln có một lỗi nhỏ. Có ngăn chặn lỗi này bằng
cách sử dụng ADC có độ phân giải cao hơn ví dụ như bộ ADC lên đến 24 bit, mặc dù
tần số chuyển đổi thấp.
Tốc độ mẫu
Số lượng chuyển đổi từ analog sang kỹ thuật số mà bộ chuyển đổi có thể thực hiện
mỗi giây được gọi là tốc độ mẫu. Ví dụ: một bộ ADC thực sự tốt có thể có tốc độ
mẫu là 300Ms / s. Đơn vị này được đọc là megasamples trên giây, nghĩa là một triệu
mẫu mỗi giây. Lưu ý rằng tiền tố SI áp dụng ở đây.
Tốc độ lấy mẫu phụ thuộc hoàn toàn vào loại bộ chuyển đổi và độ chính xác cần
thiết. Nếu cần đọc rất chính xác, ADC thường dành nhiều thời gian hơn để xem xét
tín hiệu đầu vào (thường là lấy mẫu và giữ hoặc đầu vào tích hợp) và nếu khơng cần
độ chính xác cao thì nó có thể đọc rất nhanh.
Ngun tắc chung là tốc độ và độ chính xác tỷ lệ nghịch với nhau, điều quan trọng
là phải chọn ADC tùy thuộc vào ứng dụng.
3. Giao tiếp One Wire
OneWire là hệ thống bus giao tiếp được thiết kế bởi Dallas Semiconductor Corp.
Giống như tên gọi, hệ thống bus này chỉ sử dụng 1 dây để truyền nhận dữ liệu.
Chính vì chỉ sử dụng 1 dây nên giao tiếp này có tốc độ truyền thấp nhưng dữ liệu
lại truyền được khoảng cách xa hơn.
OneWire chủ yếu sử dụng để giao tiếp với các thiết bị nhỏ, thu thập và truyền
nhận dữ liệu thời tiết, nhiệt độ,… các công việc không yêu cầu tốc độ cao.
18 | 32
Giống như các chuẩn giao tiếp khác, 1-Wire cho phép truyền nhận dữ liệu với
nhiều Slave trên đường truyền. Tuy nhiên chỉ có thể có 1 Master ( điểm này giống với
SPI).
One Wire hoạt động như thế nào ?
So với các chuẩn giao tiếp cơ bản như UART, SPI, I2C mà chúng ta đã biết, cách
thức hoạt động của OneWire có hơi “ lạ “ 1 chút. Như chúng ta thấy ở hình trên,
đường dây ln được giữ ở mức cao (High).
Các thao tác hoạt động cơ bản của bus sẽ được quy định bởi thời gian kéo đường
truyền xuống mức thấp (Low) như hình vẽ dưới.
Có 4 thao tác cơ bản như sau:
19 | 32
Gửi bit 1: Khi muốn gửi đi bit 1, thiết bị Master sẽ kéo bus xuống mức 0 trong
một khoảng thời gian A (µs) và trở về mức 1 trong khoảng B (µs).
Gửi bit 0: Thiết bị Master kéo bus xuống mức 0 trong một khoảng thời gian C
(µs) và trở về mức 1 trong khoảng D (µs).
Đọc bit: Thiết bị Master kéo bus xuống 1 khoảng A (µs). Trong khoảng thời gian
E (µs) tiếp theo, thiết bị master sẽ tiến hành lấy mẫu. Có nghĩa trong E (µs) này, nếu
bus ở mức 1, thiết bị master sẽ đọc bit 1. Ngược lại, nếu bus ở mức 0 thì master sẽ
đọc được bit 0.
Reset: Thiết bị Master kéo bus xuống 1 khoảng thời gian H (µs) và sau đó về
mức 1. Khoảng thời gian này gọi là tín hiệu reset. Trong khoảng thời gian I (µs) tiếp
theo, thiết bị master tiến hành lấy mẫu. Nếu thiết bị slave gắn với bus gửi về tín hiệu
0, (tức bus ở mức 0), master sẽ hiểu rằng slave vẫn có mặt và quá trình trao đổi dữ
liệu lại tiếp tục. Ngược lại nếu slave gửi về tin hiệu 1 ( bus ở mức 1) thì master hiểu
rằng khơng có thiết bị slave nào tồn tại và dừng quá trình.
20 | 32
4. Giao tiếp UART
UART hay bộ thu-phát không đồng bộ đa năng là một trong những hình thức giao
tiếp kỹ thuật số giữa thiết bị với thiết bị đơn giản và lâu đời nhất. Bạn có thể tìm thấy
các thiết bị UART trong một phần của mạch tích hợp (IC) hoặc dưới dạng các thành
phần riêng lẻ. Các UART giao tiếp giữa hai nút riêng biệt bằng cách sử dụng một cặp
dẫn và một nối đất chung.
Chân Tx (truyền) của một chip kết nối trực tiếp với chân Rx (nhận) của chip kia
và ngược lại. Thơng thường, q trình truyền sẽ diễn ra ở 3.3V hoặc 5V. UART là
một giao thức một master, một slave, trong đó một thiết bị được thiết lập để giao tiếp
với duy nhất một thiết bị khác.
Dữ liệu truyền đến và đi từ UART song song với thiết bị điều khiển (ví dụ: CPU).
Khi gửi trên chân Tx, UART đầu tiên sẽ dịch thông tin song song này thành nối
tiếp và truyền đến thiết bị nhận.
UART thứ hai nhận dữ liệu này trên chân Rx của nó và biến đổi nó trở lại thành
song song để giao tiếp với thiết bị điều khiển của nó.
UART truyền dữ liệu nối tiếp, theo một trong ba chế độ:
- Full duplex: Giao tiếp đồng thời đến và đi từ mỗi master và slave
- Half duplex: Dữ liệu đi theo một hướng tại một thời điểm
21 | 32
- Simplex: Chỉ giao tiếp một chiều
Dữ liệu truyền qua UART được tổ chức thành các gói. Mỗi gói chứa 1 bit bắt đầu,
5 đến 9 bit dữ liệu (tùy thuộc vào UART), một bit chẵn lẻ tùy chọn và 1 hoặc 2 bit
dừng.
Bit bắt đầu:
Đường truyền dữ liệu UART thường được giữ ở mức điện áp cao khi không
truyền dữ liệu. Để bắt đầu truyền dữ liệu, UART truyền sẽ kéo đường truyền từ mức
cao xuống mức thấp trong một chu kỳ clock. Khi UART nhận phát hiện sự chuyển
đổi điện áp cao xuống thấp, nó bắt đầu đọc các bit trong khung dữ liệu ở tần số của
tốc độ truyền.
Khung dữ liệu:
Khung dữ liệu chứa dữ liệu thực tế được chuyển. Nó có thể dài từ 5 bit đến 8 bit
nếu sử dụng bit chẵn lẻ. Nếu không sử dụng bit chẵn lẻ, khung dữ liệu có thể dài 9
bit. Trong hầu hết các trường hợp, dữ liệu được gửi với bit ít quan trọng nhất trước
tiên.
Bit chẵn lẻ:
Bit chẵn lẻ là một cách để UART nhận cho biết liệu có bất kỳ dữ liệu nào đã thay
đổi trong q trình truyền hay khơng. Bit có thể bị thay đổi bởi bức xạ điện từ, tốc độ
truyền không khớp hoặc truyền dữ liệu khoảng cách xa. Sau khi UART nhận đọc
khung dữ liệu, nó sẽ đếm số bit có giá trị là 1 và kiểm tra xem tổng số là số chẵn hay
lẻ. Nếu bit chẵn lẻ là 0 (tính chẵn), thì tổng các bit 1 trong khung dữ liệu phải là một
số chẵn. Nếu bit chẵn lẻ là 1 (tính lẻ), các bit 1 trong khung dữ liệu sẽ tổng thành một
số lẻ. Khi bit chẵn lẻ khớp với dữ liệu, UART sẽ biết rằng quá trình truyền khơng có
lỗi. Nhưng nếu bit chẵn lẻ là 0 và tổng là số lẻ; hoặc bit chẵn lẻ là 1 và tổng số là
chẵn, UART sẽ biết rằng các bit trong khung dữ liệu đã thay đổi.
22 | 32
Bit dừng:
Để báo hiệu sự kết thúc của gói dữ liệu, UART gửi sẽ điều khiển đường truyền dữ
liệu từ điện áp thấp đến điện áp cao trong ít nhất khoảng 2 bit.
Có thể tóm tắt lại như sau. Quá trình truyền dữ liệu diễn ra dưới dạng các gói dữ
liệu, bắt đầu bằng một bit bắt đầu, đường mức cao được kéo xuống đất. Sau bit bắt
đầu, năm đến chín bit dữ liệu truyền trong khung dữ liệu của gói, theo sau là bit chẵn
lẻ tùy chọn để xác minh việc truyền dữ liệu thích hợp. Cuối cùng, một hoặc nhiều bit
dừng được truyền ở nơi đường đặt ở mức cao. Như vậy là kết thúc một gói.
UART là giao thức khơng đồng bộ, do đó khơng có đường clock nào điều chỉnh
tốc độ truyền dữ liệu. Người dùng phải đặt cả hai thiết bị để giao tiếp ở cùng tốc độ.
Tốc độ này được gọi là tốc độ truyền, được biểu thị bằng bit trên giây hoặc bps. Tốc
độ truyền thay đổi đáng kể, từ 9600 baud đến 115200 và hơn nữa. Tốc độ truyền giữa
UART truyền và nhận chỉ có thể chênh lệch khoảng 10% trước khi thời gian của các
bit bị lệch quá xa.
Mặc dù UART là giao thức cũ và chỉ có thể giao tiếp giữa một master và slave
duy nhất, nhưng nó dễ thiết lập và cực kỳ linh hoạt. Do đó, bạn có thể gặp nó khi làm
việc với các dự án vi điều khiển. UART có thể là một phần của hệ thống mà bạn sử
dụng hàng ngày, mà có thể bạn khơng nhận ra.
Ưu và nhược điểm của UART
Khơng có giao thức truyền thơng nào là hồn hảo, nhưng UART thực hiện khá tốt
cơng việc của nó. Dưới đây là một số ưu và nhược điểm để giúp bạn quyết định xem
nó có phù hợp với nhu cầu của bạn hay khơng.
- Ưu điểm
Chỉ sử dụng hai dây
Khơng cần tín hiệu clock
Có một bit chẵn lẻ để cho phép kiểm tra lỗi
Cấu trúc của gói dữ liệu có thể được thay đổi miễn là cả hai bên đều được thiết
lập cho nó
Phương pháp có nhiều tài liệu và được sử dụng rộng rãi
23 | 32
- Nhược điểm
Kích thước của khung dữ liệu được giới hạn tối đa là 9 bit
Không hỗ trợ nhiều hệ thống slave hoặc nhiều hệ thống master
Tốc độ truyền của mỗi UART phải nằm trong khoảng 10% của nhau
5. Giao tiếp MQTT
MQTT (Message Queueing Telemetry Transport) là một giao thức mạng như vậy,
MQTT được coi là một giao thức mạng kích thước nhỏ (lightweight). Giao thức
truyền thơng điệp/giao tiếp (message) của MQTT tn theo theo mơ hình
publish/subscribe (xuất bản – theo dõi), sử dụng băng thông thấp, độ tin cậy cao và có
khả năng hoạt động trong điều kiện đường truyền không ổn định
Kiến trúc giao thức MQTT
Kiến trúc mức cao nhất của MQTT gồm 2 thành phần chính là Broker và Clients.
Broker được coi là trung tâm, là điểm giao, là trục chính giao với tất cả các
Clients. Nhiệm vụ chính của broker là nhận các giao tiếp từ các thiết bị xuất bản hay
hiểu đơn giản là các thiết bị tạo giao tiếp, xếp các giao tiếp theo hàng đợi rồi chuyển
chúng tới một địa chỉ cụ thể. Nhiệm vụ phụ của Broker là nó có thể đảm nhận thêm
một vài tính năng liên quan tới q trình truyền thông như: bảo mật giao tiếp, lưu trữ
giao tiếp, ghi lại lịch sử giao tiếp, …
Client thì được chia thành 2 nhóm là xuất bản giao tiếp và theo dõi. Client hoạt
động tại thiết bị di dộng nên chúng được thiết kế để có thể hoạt động một cách linh
hoạt (lightweight). Client chỉ làm ít nhất một trong 2 việc là xuất bản các giao tiếp lên
một kênh cụ thể hoặc theo dõi một kênh nào đó để nhận các thơng điệp từ kênh này.
MQTT Clients tương thích với hầu hết các nền tảng hệ điều hành hiện có: MAC OS,
Windows, LInux, Androids, iOS…
24 | 32