ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA BÀI TẬP LỚN MÔN ĐO LƯỜNG VÀ ĐIỀU KHIỂN MÁY TÍNH ĐIỀU KHIỂN ĐỘNG CƠ SỬ DỤNG CÁC GIAO TIẾP NỐI TIẾP VÀ GIAO TIẾP USB BẰNG QT C++ LỚP L01 HK 212 G.
Trang 1ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA
BÀI TẬP LỚN MÔN ĐO LƯỜNG VÀ ĐIỀU KHIỂN MÁY TÍNH
ĐIỀU KHIỂN ĐỘNG CƠ SỬ DỤNG CÁC GIAO TIẾP NỐI TIẾP VÀ GIAO
TIẾP USB BẰNG QT C++
LỚP L01 - HK 212 Giảng viên hướng dẫn: Ts Nguyễn Hoàng Giáp Sinh viên thực hiện: Châu Trí Viễn MSSV: 1912434
Đánh giá mức độ hoàn thành:
BTL Mức độ
hoàn thành Link GitHub BTL1: Giao
tiếp Serial
Port
100% https://github.com/Vienchau/SerialPort_GUI_study
BTL2: Giao
tiếp Serial
Port điều
khiển động
cơ
100% https://github.com/Vienchau/MOTOR_CONTROL
BTL3: Giao
tiếp USB
điều khiển
động cơ
70%
https://github.com/Vienchau/USB-COMMUNICATION-QT
Thành phố Hồ Chí Minh – 2022
Trang 2BTL1: Giao tiếp Serial Port với board STM32
1 Mô tả tổng quan phần cứng
Ở bài tập lớn 1, phần cứng bao gồm các module: USB UART CP2102, board STM32F103 Các Module được kết nối với nhau để giao tiếp Serial Port
Về Firmware, code được gen trên CUBEMX và lập trình trên IDE KeilC, có tham khảo nhiều từ, chủ yếu là kiến thức từ giảng viên bộ môn
Hình 1 Generate code bằng CUBEMX
Về Software, giao diện người dùng (GUI) được viết trên nền tảng QT C++ hệ điều hành Windows Giao diện này có frame truyền dựa trên một phần của firmware tham khảo của giảng viên bộ môn
Trang 3Hình 2 Giao diện cơ bản của phầm mềm QT
2 Phần mềm trên QT C++
Thiết kế GUI được hỗ trợ mạnh trên Qt Designer, giao diện GUI cơ bản như sau:
Hình 3 Giao diện thiết kế kéo thả của QT Designer
Giao diện bao gồm các Label biểu thị chữ, các QcomboBox để chọn thông số Serial Port, các QpushButton để giao tiếp, gửi nhận Ngoài ra còn có QradioBox để chọn cấu hình led
Về phần code, ta thêm thử viện serialport vào file pro để tích hợp thư viện của QT hỗ trợ SerialPort
Trang 4Hình 4 Thêm thư viện serialport của QT
Ở phần code của mainwindow.cpp, ta connect signal của serialport để giao tiếp serial port như sau:
Hình 5 Hàm connect để tại signal từ cổng serialport, khi có signal từ port, sẽ gọi
hàm serial_read()
Hàm serial_read():
Hình 6 Sử dụng readAll() từ class để đọc tín hiệu từ SerialPort
Ngoài ra còn có các hàm để gửi data đến port từ máy tính như hàm Writes(), các khâu xử lý nhận gửi có thể tham khảo trong src đính kèm hoặc Github
Kết quả, giao diện sau khi hoàn thành có thể giao tiếp serial port với phần cứng, video demo được đính kèm trong thư mục nộp bài (BTL1.mp4):
Trang 5Hình 7 Giao diện sau khi hoàn thành
Trang 6BTL2: Giao tiếp Serial Port với board STM32F407 điều khiển động cơ
1 Mô tả tổng quan phần cứng
Ở bài tập lớn này, Firmware được viết trên CubeIDE và Sofware đươc viết trên Qt 5.15 C++ Thực hiện trên hệ điều hành Ubuntu (Linux)
Tương tự như bài trước, về mặt Firmware có tham khảo từ giảng viên bộ môn Phần Software do sinh viên tự viết, framework dựa trên phần Firmware để phát triển
Hình 8 Giao diện CubeIDE trên nền tảng Ubuntu
Hình 9 Phần cứng sử dụng trong BTL2
Phần cứng sử dụng trong bài này là STM32F407, động cơ Encoder GM37, L298N và USB UART CP2102
2 Phần mềm trên QT C++
Trang 7Software của bài này của tương tự như bài trước, cùng với thư viện serialport trong file pro, ta sử dụng thêm thư viện printsupport để dùng qcustomplot vẽ đồ thị QcustomPlot là thư viện mã nguồn mở hỗ trợ Qt Framework mạnh mẹ (từ bản 6.0 trở xuống) Chi tiết có thể truy cập tại https://www.qcustomplot.com/
Hình 10 Giới thiệu QCustomPlot
Cũng tương tự BTL1, ta tạo UI bằng QT Designer:
Hình 11 Giao diện kéo thả tạo bằng QT Designer
Trang 8Giao tiếp serialport tương tự BTL1, bên cạnh đó, ta cần vẽ đề thị bằng qcustomplot, một số hàm set up và init như sau:
Hình 12 Hàm plotSetting() để chỉnh sửa một số thông số đồ thị
Hình 13 Hàm plotConfig() dể init các 4 đồ thị, trong hình là init PID plot Các đồ
thị còn lại tương tự
Kết quả, giao diện cho ra có khả năng giao tiếp serial port để điều khiển động
cơ cũng như thu thập số liệu để vẽ các đồ thị PID, position, velocity và accelerometer Video demo và src code có đính kèm với thư mục nộp bài và có link github của sinh viên bao gồm src code đính kèm
Trang 9Hình 14 Giao diện sau khi thiết kế và hoàn thiện về code
Trang 10BTL3: Giao tiếp USB với board STM32F407 điều khiển động cơ
1 Mô tả tổng quan phần cứng
BTL3 bao gồm các phần cứng của BTL2, ngoài ra có thêm cáp USB giao tiếp với STM32F407 Về mặt phần mềm SW, ta có các thay đổi về thư viện để đọc các VendorID… Còn Firmware từ BTL2, ta thêm các setup về USB như sau:
Hình 15 Chỉnh sửa config lại CUBEMX để giao tiếp USB
Ngoài ra, ta còn thay đổi src code một phần trong firmware như sau để giao tiếp USB:
Hình 16 Thay đổi firmware, xóa đi các func không cần thiết của uart
2 Phần mềm trên QT C++
Trang 11Phần mềm thêm một group để đọc các thông số như sau:
Hình 17 Một phần thêm vào được thiết kế trên giao diện QT Designer
Về phần mềm SW, BTL sinh viên chỉ thực hiện 70% vì có trục trặc về Encoder của Động cơ Bên cạnh đó, sinh viên cũng dùng thêm một số Class như QserialPortInfo để đọc các VendorID…
Hình 18 Đoạn code sử dụng Class QSerialPortInfo để đọc các thông số
VendorID…
Kết quả với video demo BTL3.mp4, SW này vẫn kết nối và gửi thông số tới STM32F407 qua USB được, ngoài ra vẫn nhận các thống số như VendorID được
Vì lí do trục trặc về phần cứng, hiện tại sinh viên vẫn chưa debug và chỉnh sửa thêm được
Trang 12Hình 19 Giao diện nhận và gửi PID thành công
Hình 20 Thông tin port hiển thị trên GUI