Yêu cầu chức năng của giao diện: Khả năng kết nối: Giao diện phải hỗ trợ kết nối qua UART, giao tiếp với bo mạch Arduino thông qua cổng COM và tốc độ Baud... Tính năng điều khiển: G
Trang 1ĐIỆN-ĐIỆN TỬ VÀ CÔNG NGHỆ VẬT LIỆU
-o0o -BÁO CÁO THỰC HÀNH GHÉP NỐI MÁY
TÍNH VÀ ĐIỀU KHIỂN TỰ ĐỘNG
THỰC HÀNH GHÉP NỐI MÁY TÍNH VÀ ĐIỀU KHIỂN TỰ ĐỘNG - NHÓM 3
2024-2025.1.DTV4242.002
Giảng viên hướng dẫn : PHAN HẢI PHONG
Sinh viên thực hiện : phan duy minh thông
Nguyễn thị thùy linh
Mã sinh viên : 22T1050010
HUẾ, THÁNG 12 NĂM 2024
Trang 2I TỔNG QUAN LÝ THUYẾT
1 GIAO DIỆN LẬP TRÌNH CHO BO MẠCH
Trong bo mạch, vi điều khiển Arduino Uno là một vi điều khiển
mạnh mẽ và dễ lập trình Việc lập trình Arduino Uno được thực hiện
thông qua phần mềm Arduino IDE với các tính năng:
Ngôn ngữ lập trình Arduino: Ngôn ngữ tương tự C/C++.
Môi trường phát triển tích hợp (IDE): Hỗ trợ biên dịch mã, tải
mã lên bo mạch, và theo dõi trạng thái hoạt động của bo qua Serial Monitor
Thư viện mở rộng: Hỗ trợ các linh kiện như LCD, Motor, Servo,
cảm biến nhiệt độ và độ ẩm
Giao diện lập trình cho bo mạch với Arduino IDE.
Các bước lập trình trên Arduino IDE:
B1: Cài đặt IDE và cấu hình môi trường: Tải và cài đặt Arduino
IDE, chọn cổng COM và loại bo mạch (Arduino Uno)
B2: Viết chương trình: Sử dụng các hàm cơ bản như setup() và loop() để cấu hình và điều khiển thiết bị.
B3: Nạp chương trình lên bo: Kết nối bo mạch với máy tính qua
cáp USB, biên dịch chương trình và tải mã lên bo
Trang 3B4: Theo dõi hoạt động: Sử dụng Serial Monitor để kiểm tra tín
hiệu hoặc debug chương trình
2 LẬP TRÌNH THIẾT KẾ GIAO DIỆN ĐIỀU KHIỂN
Giao diện điều khiển được thiết kế bằng Visual Studio Community với ngôn ngữ lập trình C#, giúp người dùng thông quab nó giao tiếp
với bo mạch Arduino
Thiết kế giao diện điều khiển là bước quan trọng giúp người dùng tương tác trực quan với bo mạch và linh kiện phần cứng
Giao diện thiết kế trên Visual Studio Community.
Mục tiêu thiết kế giao diện:
Tạo môi trường giao tiếp đơn giản, hỗ trợ điều khiển và giám sát trạng thái của bo mạch Arduino và các linh kiện liên quan
Đảm bảo giao diện dễ cài đặt, dễ sử dụng, phù hợp với người dùng không chuyên về kỹ thuật
Yêu cầu chức năng của giao diện:
Khả năng kết nối: Giao diện phải hỗ trợ kết nối qua UART, giao
tiếp với bo mạch Arduino thông qua cổng COM và tốc độ Baud
Trang 4 Tính năng điều khiển: Giao diện cần cung cấp các công cụ để
gửi lệnh và nhận dữ liệu từ bo mạch, cụ thể:
Điều chỉnh các linh kiện như LCD, Motor, Servo
Đọc và hiển thị giá trị từ cảm biến
Trực quan và thân thiện: Giao diện cần chia thành các tab chức
năng, có thanh trạng thái thông báo rõ ràng, và hiển thị thông tin theo thời gian thực
Công cụ và kỹ thuật sử dụng:
Ngôn Ngữ lập trình: C#: là ngôn ngữ lập trình mạnh mẽ trong
việc tạo ứng dụng giao diện đồ họa (GUI)
Windows Forms: Tạo giao diện đồ họa (GUI) với các thành phần
như ComboBox, TrackBar, Button, và TextBox để hỗ trợ điều
khiển và nhập dữ liệu
Thư viện SerialPort: Quản lý giao tiếp UART giữa máy tính và
Arduino
Xử lý sự kiện: Sử dụng các event handlers như Button_Click
hoặc ComboBox_SelectedIndexChanged để xử lý các thao tác
người dùng Giao diện cần xử lý các sự kiện khi người dùng
nhấn nút hoặc thay đổi trạng thái
Giao diện lập trình cho từng thành phần.
Trang 5 Quy trình lập trình giao diện:
Thiết kế giao diện cơ bản: Sắp xếp các thành phần đồ họa,
thêm các tab như COM Setting, Display LCD,
Kết nối UART: Giao diện cần đảm bảo người dùng có thể chọn
đúng cổng COM và tốc độ Baud
Tích hợp các chức năng điều khiển: Mỗi linh kiện như Motor,
LCD, Servo được gán một tập lệnh điều khiển tương ứng
Thử nghiệm và hoàn thiện: Kiểm tra các chức năng giao diện
bằng cách gửi và nhận dữ liệu, đảm bảo hoạt động chính xác
3 GIAO TIẾP UART
Tổng quan về giao tiếp UART
Giao tiếp UART (Universal Asynchronous Receiver-Transmitter) là một trong những giao thức giao tiếp nối tiếp đơn giản và phổ biến
nhất để trao đổi dữ liệu giữa hai thiết bị UART hoạt động theo
nguyên lý truyền dữ liệu dưới dạng chuỗi bit nối tiếp (serial) thông qua hai dây truyền và nhận (TX và RX)
Giao tiếp giữa máy tính và Arduino.
Đặc điểm chính của UART:
Trang 6 Không đồng bộ: Không cần tín hiệu xung nhịp (clock), chỉ yêu
cầu cấu hình tốc độ Baud giống nhau giữa hai thiết bị
Truyền nối tiếp: Dữ liệu được gửi đi từng bit, từ LSB (Least
Significant Bit) đến MSB (Most Significant Bit)
Cấu trúc khung dữ liệu: Bao gồm bit start, các bit dữ liệu, bit
parity (nếu có), và bit stop
Cách hoạt động của giao tiếp UART trong dự án
Trong hệ thống, giao tiếp UART được sử dụng để kết nối giữa bo mạch Arduino Uno và giao diện điều khiển trên Visual Studio Giao tiếp này cho phép:
Gửi lệnh từ giao diện để điều khiển các linh kiện trên bo mạch
Nhận dữ liệu phản hồi từ bo mạch, như thông số nhiệt độ, độ
ẩm từ cảm biến DHT11
Cách giao diện gửi dữ liệu đến bo mạch:
Cấu hình kết nối UART trên giao diện:
Người dùng chọn cổng COM và tốc độ Baud đúng với bo mạch
Arduino đã cấu hình
Quá trình gửi dữ liệu từ giao diện:
Khi người dùng thực hiện một thao tác (ví dụ: nhấn nút điều khiển Motor), giao diện sẽ chuyển lệnh thành một chuỗi dữ liệu
Chuỗi dữ liệu được định dạng theo quy ước, ví dụ:
“mtr 50”: Điều khiển Motor quay cùng chiều kim đồng hồ với
tốc độ 50
“ln1 Hello”: Hiển thị chuỗi "Hello" lên dòng 1 của LCD.
Giao diện sử dụng thư viện SerialPort trong C# để truyền
chuỗi này qua UART
Trang 7Ví dụ mã lệnh trong giao diện C#.
Quá trình nhận dữ liệu từ bo mạch:
Arduino nhận chuỗi dữ liệu thông qua hàm Serial.read() hoặc
Serial.readString().
Dữ liệu được xử lý theo quy tắc: tách các phần trong chuỗi để xác định lệnh và tham số điều khiển
Bo mạch thực hiện hành động điều khiển linh kiện tương ứng
và có thể gửi phản hồi lại giao diện
Ưu điểm của giao tiếp UART:
Giao tiếp UART đơn giản, dễ cấu hình và phù hợp với các ứng dụng điều khiển nhỏ
Truyền nhận dữ liệu linh hoạt, hỗ trợ gửi các chuỗi lệnh phức tạp để điều khiển nhiều linh kiện cùng lúc
Khả năng mở rộng, cho phép giao diện không chỉ gửi lệnh mà còn nhận dữ liệu từ bo mạch để hiển thị trạng thái hoạt động
Nhược điểm của giao tiếp UART:
Độ trễ khi truyền dữ liệu: Tốc độ truyền phụ thuộc vào cấu hình
tốc độ Baud, có thể gây chậm trễ trong quá trình điều khiển
Xung đột dữ liệu: Khi hai thiết bị cùng gửi dữ liệu đồng thời, có
thể xảy ra xung đột làm gián đoạn truyền thông
Trang 8II LẬP TRÌNH GIAO TIẾP GIỮA GIAO DIỆN ĐIỀU KHIỂN
VÀ BO MẠCH
1 LẬP TRÌNH CHO BO MẠCH ĐIỀU KHIỂN TỰ ĐỘNG
a) TỔNG QUAN VỀ BO MẠCH
Bo mạch thực hành ghép nối máy tính và điều khiển tự động như hình dưới đây
Bo mạch thực hành.
Bo mạch bao gồm:
1 vi điều khiển Arduino Uno có thể lập trình được
1 màn hình LCD 16x2 để hiển thị thông tin
1 Motor, 1 Servo được điều khiển bởi 1 Arduino Motor Shield L293D
1 cảm biến nhiệt độ và độ ẩm DHT11
Trang 9b) LẬP TRÌNH CHO BO MẠCH
Thư viện và khai báo
#include <Adafruit_Sensor.h>, #include <DHT.h>, #include
<DHT_U.h>: Các thư viện dùng để làm việc với cảm biến DHT (đo nhiệt độ và độ ẩm)
#include <Wire.h>: Thư viện hỗ trợ giao tiếp I2C cho các thiết bị như màn hình LCD
#include <Servo.h>: Thư viện điều khiển servo motor
#include <LiquidCrystal_I2C.h>: Thư viện điều khiển màn hình LCD qua giao tiếp I2C
#include <AFMotor.h>: Thư viện điều khiển motor DC (đặc biệt
là với các module động cơ AFMotor)
Khai báo các biến và đối tượng
#define DHTPIN 2: Khai báo chân kết nối với cảm biến DHT11 là chân số 2
AF_DCMotor motor4(12): Khai báo đối tượng motor4 đại diện cho motor DC, kết nối với chân 12
DHT dht(DHTPIN, DHTTYPE): Khai báo đối tượng cảm biến DHT,
sử dụng chân 2 và cảm biến DHT11
LiquidCrystal_I2C lcd(0x27, 16, 2): Khai báo đối tượng LCD sử dụng giao tiếp I2C với địa chỉ 0x27, kích thước màn hình 16x2
Servo myservo: Khai báo đối tượng điều khiển servo motor
Các hàm chính
controlServo(): Hàm này có thể được dùng để điều khiển servo
motor
readSensor_DisplayLCD(): Hàm này đọc dữ liệu từ cảm biến
DHT (nhiệt độ và độ ẩm), sau đó hiển thị trên màn hình LCD và gửi dữ liệu qua Serial
processString(String xau): Hàm xử lý chuỗi nhận được từ giao
tiếp Serial Tùy thuộc vào nội dung của chuỗi, chương trình sẽ thực hiện các hành động khác nhau
Trang 10 display_lcd(String chuoi): Hàm này dùng để hiển thị chuỗi lên
màn hình LCD,
Chức năng của setup()
myservo.attach(9): Gắn servo vào chân số 9 của Arduino
Serial.begin(9600): Khởi động giao tiếp Serial với tốc độ 9600 bps
pinMode(2, OUTPUT): Đặt chân 2 (cảm biến DHT) là chân xuất (mặc dù trong thực tế, chân này là đầu vào)
motor4.setSpeed(150): Đặt tốc độ motor DC ban đầu là 150 (từ
0 đến 255)
lcd.init() và lcd.backlight(): Khởi động màn hình LCD và bật đèn nền
dht.begin(): Khởi động cảm biến DHT11
Sau khi cấu hình, chương trình in ra một số hướng dẫn trên
Serial và gọi hàm readSensor_DisplayLCD() để hiển thị thông tin cảm biến ban đầu
Chức năng của loop()
if (Serial.available() > 0): Kiểm tra xem có dữ liệu nào đến từ
giao tiếp Serial không
String xau = Serial.readString(): Đọc chuỗi ký tự từ Serial
processString(xau): Gọi hàm processString() để xử lý chuỗi vừa nhận và thực hiện hành động tương ứng
Chức năng của processString()
Hàm này xử lý chuỗi ký tự nhận được từ Serial và thực hiện các tác vụ sau:
lcd: Nếu chuỗi bắt đầu bằng "lcd", chương trình sẽ hiển thị
chuỗi còn lại (sau "lcd") lên màn hình LCD
ser: Nếu chuỗi bắt đầu bằng "ser", chương trình sẽ đọc giá trị số
sau "ser", chuyển đổi nó thành giá trị nguyên và điều khiển vị trí servo motor theo giá trị này
mtr: Nếu chuỗi bắt đầu bằng "mtr", chương trình sẽ điều khiển
Trang 11 dht: Nếu chuỗi bắt đầu bằng "dht", chương trình sẽ gọi hàm
readSensor_DisplayLCD() để đọc dữ liệu từ cảm biến DHT11 và hiển thị thông tin nhiệt độ và độ ẩm lên màn hình LCD
Chức năng của readSensor_DisplayLCD()
Hàm này thực hiện các bước sau:
Đọc dữ liệu từ cảm biến DHT11 (nhiệt độ và độ ẩm)
Kiểm tra xem dữ liệu có hợp lệ không (isnan(humidity) ||
isnan(temperature))
Nếu dữ liệu hợp lệ, gửi thông tin nhiệt độ và độ ẩm qua Serial
và hiển thị chúng lên màn hình LCD
Nếu có lỗi khi đọc cảm biến, chương trình sẽ hiển thị thông báo
"Sensor Error" trên màn hình LCD
Hoạt động tổng quan
Khi chương trình chạy:
Người dùng có thể gửi các lệnh qua Serial Monitor của Arduino IDE để điều khiển các thiết bị:
o "lcd": Hiển thị thông tin trên LCD.
o "ser": Điều khiển vị trí của servo motor (sử dụng giá trị số
sau "ser")
o "mtr": Điều khiển tốc độ motor DC (sử dụng giá trị số sau
"mtr")
o "dht": Đọc và hiển thị thông tin từ cảm biến DHT11 (nhiệt
độ và độ ẩm)
2 LẬP TRÌNH GIAO DIỆN ĐIỀU KHIỂN CHO BO MẠCH
a) YÊU CẦU ĐỂ THIẾT KẾ
Về mặt kết nối, giao diện cần có chức năng kết nối với vi điều
khiển trên bo mạch qua giao tiếp UART bằng cổng nối tiếp với 2
thông số là tên cổng COM và tốc độ Baud Mỗi vi điều khiển có 1 tên
Trang 12cổng COM riêng, tốc độ baud được cấu hình ngay trong quá trình lập trình cho bo mạch Vì vậy cần đảm bảo giao diện kết nối gọi đúng tên các thông số để có thể kết nối thành công với bo mạch
Về mặt giao diện, 1 cửa số chính gồm nhiều Tab phụ:
COM Setting → kết nối với bo mạch
Display LCD → điều khiển hiển thị LCD
DHT11 Sensor → đọc giá trị nhiệt độ, độ ẩm từ cảm biến và vẽ
đồ thị
Motor Control → điều khiển Servo, Motor
Fan Mode -> Chế độ hoàn chỉnh cho ứng dụng quạt thông minh
1 thanh trạng thái để thông báo trạng thái kết nối cũng như
hành động điều khiển
b)THIẾT KẾ GIAO DIỆN KẾT NỐI
Giao diện kết nối với bo mạch.
Hình là giao diện kết nối cho bo mạch, gồm 2 comboBox để hiện 1 danh sách các cổng COM có thể kết nối, các tốc độ Baud thường
dùng
Trang 132 nút nhấn Connect và Disconnect để kết nối và ngắt kết nối với
bo mạch
c) THỬ NGHIỆM ĐIỀU KHIỂN CHO TỪNG LINH KIỆN
Các bước thử nghiệm linh kiện trên bo mạch:
LCD:
Gửi chuỗi lệnh hiển thị, như ln1 Hello để in dòng chữ "Hello"
lên dòng 1
Thử nghiệm lệnh xóa nội dung bằng lcd clear.
Motor và Servo:
Sử dụng giao diện để điều chỉnh tốc độ Motor với các mức khác nhau
Kiểm tra chế độ quay của Servo bằng cách gửi các góc quay cụ
thể, ví dụ: ser 45 để quay Servo đến góc 45 độ.
Cảm biến DHT11:
Kích hoạt đọc dữ liệu từ cảm biến, hiển thị giá trị lên giao diện
và vẽ biểu đồ theo thời gian thực
ĐIỀU KHIỂN HIỂN THỊ CHUỖI LÊN LCD
Giao diện để nhập 1 chuỗi hiển thị lên LCD như sau:
Trang 14Giao diện để nhập chuỗi lên LCD.
Giao diện cho phép hiển thị chuỗi lên dòng 1, dòng 2 hoặc đồng thời hiển thị trên cả 2 dòng của LCD bằng cách chọn Line 1, Line 2
ĐỌC DỮ LIỆU TỪ CẢM BIẾN
Giao diện để đọc giá trị từ cảm biến DHT11 như sau:
Giao diện để đọc giá trị từ cảm biến.
Gồm 2 khối đọc giá trị từ cảm biến, giá trị sau khi đọc được sẽ
được hiển thị ra
ĐIỀU KHIỂN SERVO VÀ MOTOR
Giao diện điều khiển Servo và Motor như sau:
Trang 15Giao diện điều khiển Servo và Motor.
2 nhóm riêng biệt để điều khiển cho Servo, Motor Đối với Motor
có thể điều khiển quay cùng chiều hoặc ngược chiều kim đồng hồ Có
2 thanh TrackBar để chọn góc và tốc độ cho từng nhóm
III KẾT QUẢ ĐẠT ĐƯỢC
Đối với bo mạch điều khiển:
Bo mạch Arduino Uno nhận và xử lý chuỗi dữ liệu qua giao tiếp UART thành công
Các linh kiện trên bo mạch như LCD, Motor, Servo và cảm biến DHT11 hoạt động ổn định, đúng với mục tiêu thiết kế ban đầu
Cảm biến DHT11 đo nhiệt độ và độ ẩm cho kết quả chính xác, có thể hiển thị qua màn hình LCD 16x2 hoặc gửi dữ liệu lên giao diện điều khiển
Motor và Servo điều chỉnh linh hoạt các chế độ quay và góc
quay dựa trên lệnh từ giao diện
Đối với giao diện điều khiển trên máy tính:
Kết nối bo mạch qua UART ổn định, hỗ trợ các tốc độ
Baud
Trang 16
Trang 17KẾT LUẬN
Dự án Thực hành ghép nối máy tính và điều khiển tự động đã được thực hiện
thành công, đáp ứng các yêu cầu đề ra Thông qua việc lập trình giao tiếp giữa bo
mạch Arduino Uno và giao diện điều khiển trên Visual Studio, nhóm đã hoàn thiện một mô hình quạt thông minh (Fan Mode) với các chức năng: điều chỉnh tốc độ, chế
độ xoay, hiển thị nhiệt độ và độ ẩm, cùng khả năng hẹn giờ bật/tắt.
Kết quả đạt được thể hiện rõ ràng qua:
Sự đồng bộ và ổn định giữa các thành phần phần cứng và phần mềm.
Giao diện điều khiển trực quan, dễ sử dụng, tích hợp đầy đủ các tính năng Chức năng Fan Mode cho phép ứng dụng thực tế cao, đặc biệt trong việc mô phỏng các thiết
bị gia dụng thông minh.
Tuy nhiên, dự án vẫn còn một số hạn chế như độ trễ trong xử lý dữ liệu và phạm vi
sử dụng giới hạn trong nền tảng Windows Đây là những điểm nhóm sẽ cải tiến trong các dự án tiếp theo.
Nhìn chung, quá trình thực hiện dự án không chỉ giúp nhóm hiểu sâu hơn về giao tiếp giữa máy tính và vi điều khiển mà còn rèn luyện các kỹ năng lập trình, thiết kế giao diện, và xử lý dữ liệu thời gian thực Đây là tiền đề quan trọng để phát triển các ứng dụng IoT phức tạp hơn trong tương lai.