Để giúp cho việc viết mã nguồn sử dụng ngôn ngữ Python cho Raspberry Pi được đơn giản và nhanh chóng, thì trong phạm vi các bài thực hành sau đây chúng ta sẽ nhận sự hỗ trợ từ một số thư viện được cài đặt mặc định trong hệ điều hành hoặc phải cài đặt bổ sung vào thêm trong quá trình sử dụng Raspberry Pi. Chẳng hạn như: thư viện GPIOZero (thư viện mặc định có sẵn), các thư viện hỗ trợ riêng cho từng loại cảm biến (thư viện phải cài đặt bổ sung).
Những phần cứng cần phải chuẩn bị cho các bài thí nghiệm dưới đây:
Bảng 3.1 Liệt kê các phần cứng cần sử dụng trong bài thí nghiệm.
Raspberry Pi 4B
USB-TTL
Test board
Thẻ nhớ
Điện trở 470, 330
Nút nhấn
LED
Cảm biến HC-SR04
Cảm biến DHT22
Mô-đun 4 relay
Yêu cầu thí nghiệm:
Trong bài thí nghiệm này chúng ta sẽ tìm hiểu cách thức mà Raspberry Pi truyền thông UART với các thiết bị ngoại vi thông qua chân GPIO (có tính năng đặc biệt UART).
Thực hiện truyền thông UART giữa máy tính PC với Raspberry Pi. Trên máy tính PC sử dụng phần mềm Terminal để thực hiện nhập dữ liệu cần gửi và hiển thị dữ liệu nhận được. Kết nối giữa máy tính PC và Raspberry Pi sẽ được thực hiện qua một bộ chuyển đổi USB-TTL.
Cấu hình chân UART
Raspberry Pi 4 đã được nhà sản xuất tích hợp sẵn bên trong khối UART, khối này sẽ giao tiếp ra bên ngoài thông qua chân hai GPIO14/Pin-8 (TxD) và chân GPIO15/Pin-10 (RxD). Như đã trình bày ở trên, muốn có thể sử dụng được các tính năng đặc biệt thì người sử dụng cần phải tiến hành thiết lập cấu hình trong hệ thống.
Một điểm rất quan trọng mà người sử dụng Raspberry Pi cần phải lưu ý là các tính năng đặc biệt đã nêu ra trên đây mặc định ban đầu sẽ chưa được phép sử dụng. Để cho phép hoặc không cho phép sử dụng các tính năng đặc biệt này thì người sử dụng cần phải tiến hành thiết lập cấu hình trong hệ thống. Giả sử để thiết lập sử dụng tính năng UART trên Raspberry Pi, tại Terminal nhập lệnh như sau:
~$ sudo raspi-config
Trong hộp thoại “Raspberry Pi Software Configuration Tool (raspi-config)” ta chọn mục “Interfacing Options“.
Tiếp theo ta chọn vào mục “Serial” để thiết lập sử dụng tính năng UART.
Tiếp theo ta chọn “No” để không sử dụng tính năng này cho việc đăng nhập hệ thống khi khởi động.
Tiếp theo ta chọn “Yes” để đồng ý sử dụng tính năng UART.
Tiếp theo xác nhận tính năng UART đã được kích hoạt bằng cách chọn “OK“.
Cuối cùng hoàn tất việc thiết lập bằng cách chọn “Finish“.
Để thiết lập sử dụng các tính năng đặc biệt khác, ta cũng thực hiện các bước tương tự như trên
Sơ đồ kết nối
Thực hiện kết nối bộ chuyển đổi USB-TTL với Raspberry Pi thông qua giao tiếp UART theo sơ đồ như sau:
Hình 3.13. Sơ đồ kết nối UART bộ chuyển đổi USB-TTL với Raspberry Pi.
Chân VCC/Pin-1 của bộ chuyển đổi USB-TTL được nối với chân 5V/Pin-2 của Raspberry Pi, chân GND/Pin-2 của bộ chuyển đổi USB-TTL được nối với chân GND/Pin-6 của Raspberry Pi, chân RXD/Pin-3 của bộ chuyển đổi USB-TTL được nối với chân TXD/Pin-8 của Raspberry Pi, chân TXD/Pin-4 của bộ chuyển đổi USB-TTL được nối với chân RXD/Pin-10 của Raspberry Pi. Đầu USB của bộ chuyển đổi USB-TTL sẽ được dùng để kết nối với máy tính PC. Chi tiết được minh họa trong Hình 3.13.
Lưu đồ giải thuật
Giải thuật điều khiển như sau:
Hình 3.14. Lưu đồ giải thuật của bài thí nghiệm 7.
Mã nguồn
Dựa vào lưu đồ giải thuật để viết chương trình điều khiển bằng ngôn ngữ Python như sau:
import serial # Khai bao su dung ham trong thu vien
from time import sleep
ser = serial.Serial (“/dev/ttyS0”, 9600) # Mo cong voi toc do 9600
whileTrue:
received_data = ser.read() # Doc du lieu tu Port noi tiep
sleep(0.03)
data_left = ser.inWaiting() # Kiem tra so byte du lieu con lai trong bo dem
received_data += ser.read(data_left) # Doc tung byte du lieu va ghep thanh 1 chuoi
print (received_data) # Hien thi du lieu nhan duoc
ser.write(received_data) # Gui du lieu vua nhan qua Port noi tiep
Để thiết lập các thuộc tính khác của UART ta có thể làm như sau:
ser = serial.Serial(port=’/dev/ttyS0′, baudrate = 9600, parity = serial.PARITY_NONE,
Lưu ý rằng đối với Raspberry Pi 4 thì khối UART sẽ có tên là “ttyS0” và các phiên bản trước đó thì khối UART có tên là “ttyAMA0”.
Để hiểu rõ hơn về truyền thông UART giữa máy tính PC với Raspberry Pi ta thực hiện thêm một số ví dụ khác. Trong ví dụ này, Raspberry Pi liên tục gửi dữ liệu thông qua chân TXD/Pin-8 của mô-đun, chương trình điều khiển bằng ngôn ngữ Python như sau:
from time import sleep # Khai bao su dung ham trong thu vien
import serial
# Khai bao chi tiet cac thuoc tinh cua Port noi tiep