lOMoARcPSD| 46342576
BẬT TẮT LED TRÊN ARDUINO THÔNG QUA CỬ CHỈ TAY
TURN ON AND OFF LED ON ARDUINO THROUGH HAND GESTURES
SVTH: Nguyễn Thế Anh
ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT
KHOA ĐIỆN – ĐIỆN TỬ
BÁO
CÁO
LẬP
TRÌNH
Giảng viên hướng dẫn :
Sinh viên thực hiện :
Lớp học phần :
Ths. Hoàng Bá Đại Nghĩa
Nguyễn Thế Anh
124
LTUD
01
Đà Nẵng , Tháng 10 Năm 2024
lOMoARcPSD| 46342576
Lớp 22D3, Khoa Điện- Điện tử
2 2 11505 1222302 @sv.ute.udn.vn
GVHD: ThS. Hoàng Bá Đại Nghĩa
Khoa Điện- Điện tử , Trường Đại học Sư phạm Kỹ thuật- Đại học Đà Nẵng
Tóm tắt: Với sự phát triển nhanh chóng của công nghệ nhận dạng hình ảnh cảm biến, việc tạo ra các hệ thống
tương tác thông minh ngày càng trở nên khả thi và phổ biến. Dự án này nhằm mục tiêu xây dựng một hệ thống điều
khiển LED thông qua cử chỉ bàn tay, cho phép người dùng tương tác một cách trực quan và tự nhiên với các thiết
bị điện tử. Hệ thống này có thể ứng dụng vào nhiều lĩnh vực khác nhau như tđộng hóa nhà thông minh, thiết bị
giải trí, và giáo dục.
Từ khóa thư viện: Python , Opencv , pyFirmata, HandDetector , Cvzone , Controller ,...
Abstract: With the rapid development of image recognition and sensor technology, the creation of intelligent
interactive systems is becoming increasingly feasible and popular. This project aims to build a hand-only LED
notification panel system that allows users to directly and automatically interact with electronic devices. This system
can be applied to many different fields such as smart home automation, entertainment and educational devices.
Key words Library: Python, Opencv , pyFirmata, HandDetector Cvzone , Controller ,...
1. Đặt vấn đề
Hiện nay, công nghệ 4.0 đánh dấu sự ra đời của một loạt các công nghệ mới, kết hợp tất cả các kiến thức trong
lĩnh vực vật lý, kỹ thuật số, sinh học và ảnh hưởng đến nền kinh tế cũng như các ngành công nghiệp.Trong đó tập
trung vào các từ khóa chính như tính kết nối, khả năng tự động hóa, trí tuệ nhân tạo, học máy, internet vạn vật, dữ
liệu lớn, thu thập dữ liệu theo thời gian thực và nhằm tạo ra một hệ sinh thái kết nối toàn diện giúp c doanh nghiệp
quản lý quy trình làm việc, quy trình sản xuất và quản lý chuỗi cung ứng tốt hơn,…Có lẽ trong lĩnh vực kinh doanh
thì việc theo dõi mọi người ra vào các cửa hàng,… thường khá tốn thời gian cũng như công sức(con người) số
lượng người ra vào thường rất lớn. Cho nên nhờ công nghệ phát triển nên đã các ứng dụng, các biện pháp mới
được áp dụng. Và được kể đến đó là đếm lượng người trong video và cũng có thể đếm người ra hoặc vào. Giúp sau
này thể áp dụng vào một số đề tài tốt nghiệp như nhận dạng người sử dụng python đưa ra cảnh báo khi
người lạ, điểm danh bằng khi ra vào,…
2. Tổng quan
2.1 Vấn đề nhận dạng
Công nghệ nhận dạng hình ảnh đã đạt được những tiến bộ đáng kể trong những năm gần đây, nhưng vẫn tồn tại
một số thách thức lớn cần được giải quyết khi áp dụng vào hệ thống điều khiển LED bằng cử chỉ bàn tay. Những
vấn đề này không chỉ ảnh hưởng đến hiệu suất của hệ thống còn đến trải nghiệm của người dùng. Vấn đề
nhận dạng trong dự án này không chỉ việc phát hiện phân tích các cử chỉ tay còn đảm bảo rằng hệ
thống có thể hoạt động hiệu quả trong nhiều điều kiện khác nhau. Sự thành công của dự án phụ thuộc vào khả
năng nhận diện chính xác và nhanh chóng các cử chỉ tay của người dùng.
2.2 Mục đích
2
Làm quen với ngôn ngữ python và cài môi trường, thư viện.
Tích hợp các thiệt bị thông minh,nâng cao độ chính xác trong nhận dạng cử chỉ.
Khám phá công nghệ nhận diện cử chỉ tay.
lOMoARcPSD| 46342576
Phát triển kỹ năng lập trình và xử lý hình ảnh.
Ứng dụng vào các lĩnh vực khác:giải trí,giáo
dục… Tìm hiểu về các thư viện OpenCV,
pyFirmata,….
Tạo ra được ứng dụng đếm led cơ bản.
Thực nghiệm và cải tiến liên tục: nâng cao độ chính xác và độ tin cậy trong việc phát hiện cử chỉ tay.
2.3 Phương pháp
a) Đối tượng
Dữ liệu thu từ camera hoặc các video.
Các phương pháp huấn luyện học máy
Các phương pháp nhận dạng bàn tay
b) Phạm vi nghiên cứu
Cấu trúc các câu lệnh ngôn ngữ lập trình python
Nghiên cứu phân tích dữ liệu từ camera hoặc từ dữ liệu trực tiếp, phát hiện bàn tay và đếm led.
2.4 Tổng quan hệ thống
Một hệ thống đếm người gồm các bước xử lý sau:
1. Mở Camera
2. Nhận diện bàn tay
3. Theo dõi hiệu ứng bàn tay dựa trên toạ độ
4. Đếm Led dựa trên hiệu ứng bàn tay
2.5 Các công cụ và thư viện
2.5.1 Pycharm community 2023.2.5
Pycharm là một nền tảng kết kết hợp được JetBrains phát triển như một IDE (Môi trường phát triển tích hợp) để
ph át triển các ứng dụng cho lập trình trong Python. Một số ứng dụng lớn như Tweeter, Facebook, Amazon và
Pinteres t sử dụng Pycharm để làm IDE Python.
2.5.2 Python và thư viện
Python một ngôn ngữ lập trình bậc cao cho các mục đích lập trình đa năng, được thiết
kế với ưu điểm mạnh dễ đọc, dễ học dễ nhớ. Python ngôn ngữ hình thức rất
sáng sủa, cấu trúc rõ ràng, thuận tiện cho người mới học lập trình là ngôn ngữ lập trình
dễ học; được dùng rộng rãi trong phát triển trí tuệ nhân tạo.
- Bộ thư viện chuẩn rộng lớn của Python một trong những điểm mạnh lớn nhất của Pythoncung cấp các công
cụphù hợp cho nhiều công việc khác nhau.
- Bộ thư viện hỗ trợ:
OpenCV
Thư viện pyFirmata
HandDetector
Cvzone
Controller
3. Triển khai chương trình
3.1 Phân tích
Mô tả:
lOMoARcPSD| 46342576
Dữ liệu đầu vào: Khung hình camera thu nhập dữ liệu qua cử chỉ bàn tay mà con người tương tác.
Xử ảnh: Sử dụng thư viện pyFirmata để giao tiếp Arduino thông qua đối tượng HandDetector để phát hiện
bàn tay trong từng khung hình.
Theo dõi đối tượng: Khi đã nhận diện được đối tượng,và toạ độ bàn tay để phát hiện tươngc qua camera nhận
biết khi chạm tay vào ô Led để bật/tắt tương ứng.
Cập nhật trạng thái LED dựa trên cử chỉ và vị trí ngón tay: Khi heart’ Dựa vào các cử chỉ tay theo dõi được,
chương trình sẽ thay đổi trạng thái của từng LED. Nếu người dùng chạm vào một ô điều khiển, trạng thái LED
sẽ thay đổi (bật nếu đang tắt, hoặc tắt nếu đang bật). Đồng thời, khi người dùng giơ cả 5 ngón tay, chương trình
sẽ kích hoạt hiệu ứng LED chạy. Hiển thị số lượng led được bật/tắt.
3.2 Triển khai
- Khai báo các thư viện cần thiết:
Cv2: Thư viện OpenCV để xử lý ảnh và video.
pyFirmata: Thư viện dùng để giao tiếp với Arduino qua giao thức Firmata.
Cvzone.HandTrackingModule: Thư viện để phát hiện bàn tay và các ngón tay.
Time: Thư viện để thao tác với thời gian (chẳng hạn như delay). Threading: Thư viện để tạo và
quản lý các luồng (threads)
- Khởi tạo kết nối với Arduino thông qua cổng COMP
Broard ở đây là bo Arduino thông qua thư viện pyfirmata để kết nối với bo và truyền dữ liệu thông
qua cổng COMP10 trong hệ thống
- Định Nghĩa Pin LED: Chân 8: LED 1
Chân 9: LED 2
Chân 10: LED 3
Chân 11: LED 4
Chân 12: LED 5
Chân 13: LED 6
Leds là một kiểu biến danh sách chứa các đối tượng chân mà có thể sử dụng để điều khiển
led,phần “broad.get_pin(…)” là đối tượng broad(bo) được tạo từ thư viện pyFirmata để lấy
thông tin cụ thể chân Arduino,”d” ở đây được hiểu là số chân mà chân mà bạn đang làm
4
việc,{} cho phép bạn tạo ra các chuỗi động, trong đó giá trị cụ thể được chèn vào trong chuỗi
tại vị trí bạn xác định; ”:o” điều này chỉ ra rằng chân sẽ được sử dụng ở chế độ đầu ra;” for
pin in led_pins” là một vòng lặp nó sẽ lặp qua từng phần tử trong led_pins.
- Khởi Tạo Bộ Dò Bàn Tay và Mở Camera
lOMoARcPSD| 46342576
Detector một biến để lưu trữ đối tượng của lớp HandDetector để phát hiện bàn tay trong video từ
camera,”HandDetectormột phần trong Cvzone được thiết kế để phát hiện theo dõi bàn tay
trong video,để xác định vị trí các ngón tay và số lượng ngón tay mà người dùng đưa lên với độ tin cậy
0.5% và tối đa 1 bàn tay.”Videolà một biến được sử dụng để lưu trữ đối tượng VideoCapture đại diện
cho camera chính bạn sử dụng để thu video,”0tham số camera đầu tiên được phát hiện
thường sẽ là camera mặc định,nếu có nhiều cam thì có thể thay 1,2…
- Trạng Thái LED và Thao Tác
led_status = [False] * 6là một danh sách có 6 phần tử tương đương 6 led và đều là giá tFalse,theo
dõi trạng thái bật/tắt led,False nghĩa led tắt trạng thái ban đầu,”True nghĩa led bật.”
touch_flags = [False] * 66 phần tử trạng thái chạm đầu tiên mang trạng thái False,sử dụng theo
dõi việc chạm vào các ô led tương ứng.” led_toggle_count = [0] * 6đếm số lần bật/tắt của từng
LED,”0” là led chưa bật lần nào và cứ thế tăng lên sau mỗi lần chạm.
vào các ô led tương ứng.” led_toggle_count = [0] * 6đếm số lần bật/tắt của từng LED,”0là led
chưa bật lần nào và cứ thế tăng lên sau mỗi lần chạm
- Vị Trí và Kích Thước Ô LED
num_switches = 6” là số lượng ô led được hiện thị trên màn hình và có thể tương tác,” switch_width
= 80 khoảng cách chiều rộng mỗi ô sẽ 80pixel,” padding = 20 khoảng cách giữa các ô,
total_width = num_switches * switch_width + (num_switches - 1) * paddingdùng tính toán chiều
rộng tổng cộng của tất cả các ô LED cùng với khoảng cách giữa chúng, start_x = (640 total_width)
// 2” giả định rằng chiều rộng của khung hình là 640 pixel, start_x sẽ được tính để đảm bảo rằng tất c
các ô LED được căn giữa trong không gian 640 pixel.” switch_positions = [(start_x + i *
(switch_width + padding), 100) for i in range(num_switches)]một danh sách switch_positions
chứa tọa độ của 6 ô LED, có thể vẽ các ô LED trên khung hình video.
lOMoARcPSD| 46342576
6
- Hàm Cập Nhật Trạng Thái Led Hiển Thị Trên Terminal Pycharm
Hàm update_leds()nhiệm vụ cập nhật trạng thái của các đèn LED dựa trên mảng trạng thái
led_statussau đó lệnh Print in ra trên Terminal các số lần trạng thái led của led.” for idx in
range(num_switches):” ở đây idx được xem như là biến lặp trong vòng lặp for hoạt động phạm vị của
các nút nhấn(num_swithches) ở đây là 6 nút nhấn, Giá trị của idx sẽ thay đổi trong từng vòng lặp, từ 0
vòng đầu tiên đến num_switches - 1 vòng cuối cùng.”leds[idx].write(1 if led_status[idx] else 0)
leds một danh sách chứa c đối tưng LED tương ứng với các chân (pin) trên Arduino đèn LED
được kết nối, biến idxvòng lặp for lặp lại quá trình xác định LED nào đang được cập nhật.”write()
phương thức dùng để ghi giá trị vào chân Arduino LED được nối đọc giá trị như sau:
led_status[idx] là True, write(1) sẽ bật đèn LED hoặc led_status[idx] False, write(0) sẽ tắt đèn
LED.Và sẽ tăng số lần đếm số lần bật của LED tại idx lên 1. Sau khi cập nhật số lần bật của LED, câu
lệnh này sẽ in ra dòng thông báo với thông tin số lần LED được bật.”idx + 1 hiển thị thứ tự của LED
từ 1 đến LED 6.
- Hàm Hiệu Ứng LED Chạy
Khai báo biến cục bộ stop_running_effect” là một biến toàn cục được khai báo để có thể sử dụng trong hàm
này, Biến này đóng vai trò như một công tắc để bắt đầu hoặc dừng hiệu ứng led.Vòng lặp While kiểm tra xem
stop_running_effect giữa 2 trạng thái False True nếu True vòng lặp sẽ dừng lại nếu
stop_running_effect” là False vòng lặp sẽ tiếp tục chạy.Vòng lặp “for i in range(6):” lặp qua 6 led, một LED
được bật rồi tắt để tạo hiệu ứng chạy sáng.Kiểm tra biến “stop_running_effecttrước khi bật điều này cho phép
dừng hiệu ứng ngay lập tức khi stop_running_effect trở thành True.” leds[i].write(1)hoặc leds[i].write(0)
bật/tắt led hiện tại và hàm “time.sleep(speed)” giữ sáng led trong khoảng thời gian bao nhiêu đó ở đây là 0.02s.
- Khởi Động Luồng Hiệu Ứng LED
Hàm này tạo khởi động một luồng đuổi led để chạy hiệu ứng LED mà không làm dừng chương
trình chính.
lOMoARcPSD| 46342576
- Vòng Lặp Chính
Vòng lặp While True chạy vô hạn cho đến khi bạn thoát khỏi chương trình(thường gán cho một phím
nào đó).Nó cho phép chương trình liên tục xử lý video từ camera.”ret, frame = video.read()” hàmy
đọc một khung hình từ camera,”retbiến một giá trị cho biết việc đọc khung hình thành công hay
không,”frame” biến chứa dữ liệu hình ảnh của khung hình được đọc.” frame = cv2.flip(frame, 1)
hàm lật(flip) khung hình camera frame,tham số 1 chỉ định rằng lật theo chiều ngang giúp cho người
dùng tương tác dễ dàng với giao diện camera.” hands, img = detector.findHands(frame)hàm dò
bàn tay từ khung hình camera framethông qua thư viện HandDector,biến hands” chứa thông tin
về bàn tay được phát hiện,biến imgchứa hình ảnh khung nh cho phép hiển thị hình ảnh này lên
màn hình để thấy các vị trí bàn tay được phát hiện để điều khiển LED thông qua cử chỉ tay.
- Vẽ Các Ô LED Hiển Thị Trên Khung Hình Camera
for idx, pos in enumerate(switch_positions):vòng lặp với “switch_positionsdanh sách chứa các toạ độ
(x,y) của các ô led,biến idx/pos giúp xác định vị trí của các ô LED hiện tại trong danh sách của
switch_positions”.”color = (0, 255, 0) if led_status[idx] else (0, 0, 255)” Color là biến lưu màu sắc của từng ô
led,nếu led tại chỉ số idx(trạng thái led) đang bật/sáng (led_status[idx] là True) thì màu hiển thị sẽ là màu xanh lá
cây với “color = (0, 255, 0)”,“0, 255, 0” cường độ màu sắc tối đa cho mỗi thành phần màu. Nó giúp xác định màu
sắc cụ thể khi hiển thị đồ họa trên màn hình.Và khi trạng thái led tắt thì led_status[idx] là Falsekhi đó ô led sẽ
có màu đỏ tương ứng với màu sắc (0, 0, 255)”.Hàm cv2.rectangle(...)” vẽ hình chữ nhật đối với các ô led hiển thị
trên khung hình frame,”pos” là toạ độ góc,” (pos[0] + switch_width, pos[1] + switch_width)” Tọa độ góc dưới bên
phải của hình chữ nhật, được nh bằng cách thêm chiều rộng của ô LED (switch_width) vào tọa độ ban đầu.”Color
biến màu sắc hình chữ nhật đã xác nhật bước trên,” cv2.FILLED” đối số này cho biết hình chữ nhật sẽ được
đầy màu sắc theo trạng thái bật/tắt.Và hàm cv2.putText(...)dùng để thêm văn bản lên khung hình Camera(frame),”
f'LED {idx + 1}'” văn bản sẽ được ghi tên LED(như LED1;LED2) và sử dụng “idx+1” cho phép hiển thị thứ tự từ
1 đến 6.” (pos[0] + 10, pos[1] + 50)” toạ độ pos[0] đại diện cho toạ độ x(hàng ngang) của ô led pos[1] đại
diện toạ độ y(hàng dọc) của ô led,” pos[0] + 10di chuyển vị trí hiển thị văn bản về phía bên phải một chút (10
pixel) so với cạnh trái của ô LED,” pos[1] + 50” di chuyển vị trí hiển thị văn bản xuống dưi một chút (50 pixel) so
với cạnh trên của ô LED tránh không bị đè lên nhau.” cv2.FONT_HERSHEY_COMPLEX, 0.5kiểu font chữ và
kích thước và “(255, 255, 255)” màu sắc văn bản(trắng) và “1” độ dày của nét chữ.
lOMoARcPSD| 46342576
8
lOMoARcPSD| 46342576
- Kiểm Tra Cử Chỉ Tay
if hands:câu lệnh này kiểm tra bàn tay nào được phát hiện trong khung hình hay không,biến
hands” là danh sách chứa thông tin về các bàn tay đã được phát hiện,nếu phát hiện bàn tay hàm lệnh
sẽ được thực thi.”lmList = hands[0]['lmList']” nếu có ít nhất một bàn tay, dòng này sẽ lấy danh sách
các điểm cột mốc (landmarks) của bàn tay đầu tiên,biến “hands[0]” chỉ đến bàn tay đầu tiên,”lmList
danh sách chứa toạ độ (x;y) từng điểm cột mốc trên tay.”x, y = lmList[8][0], lmList[8][1]toạ độ
ngón tay trỏ(điểm cột mốc số 8) từ ImList.”lmList[8][0]/lmList[8][1]” đại diện toạ độ x;y.” fingers =
detector.fingersUp(hands[0])lệnh này sử dụng phương thức finggersUp từ detector để kiểm tra trạng
thái các ngón tay trên bàn tay đầu tiên.Phương thức này sẽ trả về một danh sách (hoặc tuple) với 5
phần tử (một cho mỗi ngón tay), mỗi phần tử có giá trị 1 (nâng) hoặc 0 (không nâng). Ví dụ, nếu ngó
n tay trỏ và ngón giữa được nâng lên, danh sách có thể là [0, 1, 1, 0, 0].
lOMoARcPSD| 46342576
10
- Kích Hoạt/Ngừng Hiệu Ứng LED
if fingers == [1, 1, 1, 1, 1]biểu thức này kiểm tra xem tất cả năm ngón tay đều được lên. rong
danh sách fingers, mỗi phần ttương ứng với trạng thái của một ngón tay: 1 có nghĩa là ngón tay được
lên 0 nghĩa ngón tay không được lên. vậy, [1, 1, 1, 1, 1] cho biết rằng tất cả năm
ngón tay đều được dơ lên.” and stop_running_effect” điều này cho biết hàm này gán với giá trị True
nghĩa là led chưa được kích hoạt trước đó. Nếu hiệu ứng LED đang chạy (tức là stop_running_effect
là False), thì đoạn mã này không đưc thực thi.stop_running_effect = False” nếu điều kiện ban đầu
thoã mãn “stop_running_effect = True”(là hiệu ứng tắt) nó sẽ đặt biến
stop_running_effect = False nghĩa hiệu ứng sẽ được thực
thi.”start_led_effect_thread(speed=0.02)hàm này được gọi để bắt đầu một luồng (thread) mới cho
hiệu ứng LED chạy, với tốc độ là 0.02 giây cho mỗi LED.
fingers == [0, 1, 1, 0, 0]5 số tương ứng với 5 ngón tay trên một bàn tay với mức 1 là ngón tay được
lên và mức 0 ngón tay không lên,đoạn kiểm tra xem hai ngón tay được lên (ngón
tay giữa ngón tay áp út), trong khi ba ngón tay còn lại không được lên. Điều này chỉ ra rằng
người dùng đã thực hiện cử chỉ để dừng hiệu ứng LED.” stop_running_effect = Truenếu điều kiện
ngón tay thoã mãn thì biến stop_running_effect sẽ được đặt thành True điều này báo hiệu cho
chương trình dừng hiệu ứng led đang chạy.
- Kiểm Tra Chạm vào Ô LED
for idx, pos in enumerate(switch_positions):enumerate(switch_positions): Hàm enumerate
cho phép bạn lặp qua danh sách switch_positions, trong đó idxchỉ số (index) của ô và pos là tọa
độ của ô đó (mỗi ô được biểu diễn bằng một tuple chứa tọa độ x và y).Kiểm tra toạ độ x của ngón
tay pos[0] < x < pos[0] + switch_widthpos[0]”: Tọa độ x của góc trên bên trái của ô LED,”pos[0]
+ switch_width”:Tọa độ x của góc dưới bên phải của ô LED (tính bằng cách cộng chiều rộng vào
tọa độ x của góc trên bên trái) => Điều kiện này sẽ đúng nếu tọa độ x của ngón tay (x) nằm giữa
tọa độ x của góc trái và tọa độ x của góc phải của ô LED. Nói cách khác, ngón tay đang nằm trong
chiều ngang của ô LED.
Kiểm tra toạ độ y pos[1] < y < pos[1] + switch_widthpos[1]: Tọa độ y của góc trên bên trái của
ô LED,pos[1] + switch_width: Tọa độ y của góc dưới bên phải của ô LED (tương tự như phần
trên, tính bằng cách cộng chiều cao vào tọa độ y),”y”: Tọa độ y của ngón tay => Tọa độ y của ngón
tay (y) nằm giữa tọa độ y của góc trên và tọa độ y của góc dưới của ô LED. Tức là, ngón tay đang
nằm trong chiều dọc của ô LED.
Thay đổi trạng thái LED if not touch_flags[idx], “touch_flagslà một danh sách chứa các cờ
(flags) để theo dõi xem mỗi ô LED đã được chạm vào hay chưa. Nếu một ô LED đã được chạm
vào, giá trị tương ứng trong touch_flags sẽ là True. Nếu chưa chạm vào, giá trị sẽ False,” idx
chỉ số của vòng lặp, tương ứng với vị trí của ô LED hiện tại người dùng đang tương tác.Kiểm
tra điều kiện “led_status[idx] = not led_status[idx]” hàm led_status[idx] đây là trạng thái hiện tại
của LED tại chỉ số idx (bật hoặc tắt).”not led_status[idx]”:Phép toán not sẽ đảo ngược giá trị hiện
tại của led_status[idx]. Nếu LED đang bật (True), sẽ chuyển thành tắt (False), ngược lại.
Điều này cho phép LED thay đổi trạng thái khi ngưi dùng chạm vào ô tương ứng.
lOMoARcPSD| 46342576
Cập nhật trạng thái LED: update_leds()cập nhật trạng thái của tất cả các LED dựa trên giá trị
trong danh sách led_status. Nếu một LED được bật, nó sẽ sáng, và nếu nó tắt, nó sẽ tắt. Hàm này
cũng có thể thực hiện việc đếm số lần LED được bật.
Đánh dấu ô được chạm vào: touch_flags[idx] = True điều này thiết lập giá trị của
touch_flags[idx] thành True, nghĩa ô LED hiện tại đã được chạm vào,còn False ngược
lại.Việc này ngăn không cho đoạn trong vòng lặp kiểm tra lại ô LED đó cho đến khi người
dùng không còn chạm vào nó nữa.
Sau khi LED được cập nhật, nó sẽ sáng hoặc tắt dựa trên trạng thái mới, và ô LED sẽ được đánh
dấu là đã đưc chạm vào để tránh sự thay đổi không cần thiết cho đến khi người dùng rời tay khỏi
ô đó.
- Hiển Thị Khung Hình và Thoát Khung Hình và Giải Phóng Tài Nguyên
cv2.imshow("frame", frame)trong đó frametên của cửa sổ hiển thị, thể đặt tùy ý. Trong trường
hợp này, tên cửa sổ là "frame". frame là đối tượng hình ảnh (khung hình) chứa dữ liệu đã đưc xử lý từ
camera,bao gồm các hình chữ nhật màu (ô bật/tắt) và các nhãn tên của LED đã được vẽ. cv2.imshow
sẽ tạo hiển thị một cửa sổ mới tên "frame" để người dùng thể tương tác trực tiếp với các ô
bật/tắt trên khung hình được cập nhật theo thời gian thực.
k = cv2.waitKey(1)” đợi một phím bấm từ người dùng trong 1 millisecond. Nếu có phím được nhấn, nó
sẽ trả về ASCII của phím đó và lưu vào biến k, đặt thời gian đợi là 1 giúp tạo cảm giác hiển thị video
mượt mà, gần với thời gian thực.” if k == ord("q")ord("q") trả về mã ASCII của ký tự "q",nếu k trùng
với mã ASCII của "q", điều kiện được thỏa mãn chương trình sẽ thoát khỏi vòng lặp. breaklệnh
này giúp kết thúc vòng lặp while True, dừng luồng xử hình ảnh từ camera và thoát chương trình khi
phím "q" được nhấn.
Đoạn mã này cho phép người dùng nhấn phím "q" để kết thúc việc xử lý và đóng các cửa sổ hiển thị t
cv2.imshow().
video.release() cv2.destroyAllWindows() board.exit()
Giải phóng tài nguyên camera, đóng cửa sổ OpenCV và ngắt kết nối Arduin
4. Các Bước Chạy và Kết quả
- B1: Nạp chương trình (firmware) được tải vào vi điều khiển Arduino, giúp thiết lập giao tiếp giữa Arduino
và các phần mềm bên ngoài như Python..
lOMoARcPSD| 46342576
12
- B2: Cài đặt đúng cổng giao tiếp với bo Arduino và lắp Sơ Đồ Led.
- B3: Tiến hành chạy code.
LED bật/tắt theo số lần chạm vào ô
lOMoARcPSD| 46342576
Dơ 5 ngón thì led chạy.
lOMoARcPSD| 46342576
14
- Dơ 2 ngón led kết thúc quá trình chạy.
lOMoARcPSD| 46342576
5. Hướng phát triển
Tích hợp vi thực tế ảo (VR) và thực tế tăng cường (AR)
Tích hợp Internet of Things (IoT)
Giao diện điều khiển đa phương tiện
Ứng dụng trong chăm sóc sức khỏe
Tích hợp AI và Machine Learning

Preview text:

lOMoAR cPSD| 46342576
ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT
KHOA ĐIỆN – ĐIỆN TỬ BÁO CÁO LẬP TRÌNH ỨNG DỤNG
Giảng viên hướng dẫn :
Ths. Hoàng Bá Đại Nghĩa
Sinh viên thực hiện : Nguyễn Thế Anh Lớp học phần :
124 LTUD 01
Đà Nẵng , Tháng 10 Năm 2024
BẬT TẮT LED TRÊN ARDUINO THÔNG QUA CỬ CHỈ TAY
TURN ON AND OFF LED ON ARDUINO THROUGH HAND GESTURES
SVTH: Nguyễn Thế Anh lOMoAR cPSD| 46342576
Lớp 22D3, Khoa Điện- Điện tử
2 2 11505 1222302 @sv.ute.udn.vn
GVHD: ThS. Hoàng Bá Đại Nghĩa
Khoa Điện- Điện tử , Trường Đại học Sư phạm Kỹ thuật- Đại học Đà Nẵng
Tóm tắt: Với sự phát triển nhanh chóng của công nghệ nhận dạng hình ảnh và cảm biến, việc tạo ra các hệ thống
tương tác thông minh ngày càng trở nên khả thi và phổ biến. Dự án này nhằm mục tiêu xây dựng một hệ thống điều
khiển LED thông qua cử chỉ bàn tay, cho phép người dùng tương tác một cách trực quan và tự nhiên với các thiết
bị điện tử. Hệ thống này có thể ứng dụng vào nhiều lĩnh vực khác nhau như tự động hóa nhà thông minh, thiết bị giải trí, và giáo dục.
Từ khóa thư viện: Python , Opencv , pyFirmata, HandDetector , Cvzone , Controller ,...
Abstract: With the rapid development of image recognition and sensor technology, the creation of intelligent
interactive systems is becoming increasingly feasible and popular. This project aims to build a hand-only LED
notification panel system that allows users to directly and automatically interact with electronic devices. This system
can be applied to many different fields such as smart home automation, entertainment and educational devices.
Key words Library: Python, Opencv , pyFirmata, HandDetector Cvzone , Controller ,... 1. Đặt vấn đề
Hiện nay, công nghệ 4.0 đánh dấu sự ra đời của một loạt các công nghệ mới, kết hợp tất cả các kiến thức trong
lĩnh vực vật lý, kỹ thuật số, sinh học và ảnh hưởng đến nền kinh tế cũng như các ngành công nghiệp.Trong đó tập
trung vào các từ khóa chính như tính kết nối, khả năng tự động hóa, trí tuệ nhân tạo, học máy, internet vạn vật, dữ
liệu lớn, thu thập dữ liệu theo thời gian thực và nhằm tạo ra một hệ sinh thái kết nối toàn diện giúp các doanh nghiệp
quản lý quy trình làm việc, quy trình sản xuất và quản lý chuỗi cung ứng tốt hơn,…Có lẽ trong lĩnh vực kinh doanh
thì việc theo dõi mọi người ra vào các cửa hàng,… thường khá tốn thời gian cũng như công sức(con người) vì số
lượng người ra vào thường rất lớn. Cho nên nhờ công nghệ phát triển nên đã có các ứng dụng, các biện pháp mới
được áp dụng. Và được kể đến đó là đếm lượng người trong video và cũng có thể đếm người ra hoặc vào. Giúp sau
này có thể áp dụng vào một số đề tài tốt nghiệp như nhận dạng người sử dụng python và đưa ra cảnh báo khi có
người lạ, điểm danh bằng khi ra vào,… 2. Tổng quan
2.1 Vấn đề nhận dạng
Công nghệ nhận dạng hình ảnh đã đạt được những tiến bộ đáng kể trong những năm gần đây, nhưng vẫn tồn tại
một số thách thức lớn cần được giải quyết khi áp dụng vào hệ thống điều khiển LED bằng cử chỉ bàn tay. Những
vấn đề này không chỉ ảnh hưởng đến hiệu suất của hệ thống mà còn đến trải nghiệm của người dùng. Vấn đề
nhận dạng trong dự án này không chỉ là việc phát hiện và phân tích các cử chỉ tay mà còn đảm bảo rằng hệ
thống có thể hoạt động hiệu quả trong nhiều điều kiện khác nhau. Sự thành công của dự án phụ thuộc vào khả
năng nhận diện chính xác và nhanh chóng các cử chỉ tay của người dùng. 2.2 Mục đích 2
Làm quen với ngôn ngữ python và cài môi trường, thư viện.
Tích hợp các thiệt bị thông minh,nâng cao độ chính xác trong nhận dạng cử chỉ.
Khám phá công nghệ nhận diện cử chỉ tay. lOMoAR cPSD| 46342576
Phát triển kỹ năng lập trình và xử lý hình ảnh.
Ứng dụng vào các lĩnh vực khác:giải trí,giáo
dục… Tìm hiểu về các thư viện OpenCV, pyFirmata,….
Tạo ra được ứng dụng đếm led cơ bản.
Thực nghiệm và cải tiến liên tục: nâng cao độ chính xác và độ tin cậy trong việc phát hiện cử chỉ tay. 2.3 Phương pháp a) Đối tượng
• Dữ liệu thu từ camera hoặc các video.
• Các phương pháp huấn luyện học máy
• Các phương pháp nhận dạng bàn tay b) Phạm vi nghiên cứu
• Cấu trúc các câu lệnh ngôn ngữ lập trình python
• Nghiên cứu phân tích dữ liệu từ camera hoặc từ dữ liệu trực tiếp, phát hiện bàn tay và đếm led.
2.4 Tổng quan hệ thống
Một hệ thống đếm người gồm các bước xử lý sau: 1. Mở Camera 2. Nhận diện bàn tay 3.
Theo dõi hiệu ứng bàn tay dựa trên toạ độ 4.
Đếm Led dựa trên hiệu ứng bàn tay
2.5 Các công cụ và thư viện
2.5.1 Pycharm community 2023.2.5
Pycharm là một nền tảng kết kết hợp được JetBrains phát triển như một IDE (Môi trường phát triển tích hợp) để
ph át triển các ứng dụng cho lập trình trong Python. Một số ứng dụng lớn như Tweeter, Facebook, Amazon và
Pinteres t sử dụng Pycharm để làm IDE Python. 2.5.2 Python và thư viện
Python là một ngôn ngữ lập trình bậc cao cho các mục đích lập trình đa năng, được thiết
kế với ưu điểm mạnh là dễ đọc, dễ học và dễ nhớ. Python là ngôn ngữ có hình thức rất
sáng sủa, cấu trúc rõ ràng, thuận tiện cho người mới học lập trình và là ngôn ngữ lập trình
dễ học; được dùng rộng rãi trong phát triển trí tuệ nhân tạo.
- Bộ thư viện chuẩn rộng lớn của Python – một trong những điểm mạnh lớn nhất của Python– cung cấp các công
cụphù hợp cho nhiều công việc khác nhau.
- Bộ thư viện hỗ trợ: • OpenCV • Thư viện pyFirmata • HandDetector • Cvzone • Controller
3. Triển khai chương trình 3.1 Phân tích Mô tả: lOMoAR cPSD| 46342576
Dữ liệu đầu vào: Khung hình camera thu nhập dữ liệu qua cử chỉ bàn tay mà con người tương tác.
Xử lí ảnh: Sử dụng thư viện pyFirmata để giao tiếp Arduino thông qua đối tượng HandDetector để phát hiện
bàn tay trong từng khung hình.
Theo dõi đối tượng: Khi đã nhận diện được đối tượng,và toạ độ bàn tay để phát hiện tương tác qua camera nhận
biết khi chạm tay vào ô Led để bật/tắt tương ứng.
Cập nhật trạng thái LED dựa trên cử chỉ và vị trí ngón tay: Khi ‘heart’ Dựa vào các cử chỉ tay theo dõi được,
chương trình sẽ thay đổi trạng thái của từng LED. Nếu người dùng chạm vào một ô điều khiển, trạng thái LED
sẽ thay đổi (bật nếu đang tắt, hoặc tắt nếu đang bật). Đồng thời, khi người dùng giơ cả 5 ngón tay, chương trình
sẽ kích hoạt hiệu ứng LED chạy. Hiển thị số lượng led được bật/tắt. 3.2 Triển khai
- Khai báo các thư viện cần thiết:
Cv2: Thư viện OpenCV để xử lý ảnh và video.
pyFirmata: Thư viện dùng để giao tiếp với Arduino qua giao thức Firmata.
Cvzone.HandTrackingModule: Thư viện để phát hiện bàn tay và các ngón tay.
Time: Thư viện để thao tác với thời gian (chẳng hạn như delay). Threading: Thư viện để tạo và
quản lý các luồng (threads)
- Khởi tạo kết nối với Arduino thông qua cổng COMP
Broard ở đây là bo Arduino thông qua thư viện pyfirmata để kết nối với bo và truyền dữ liệu thông
qua cổng COMP10 ở trong hệ thống
- Định Nghĩa Pin LED:  Chân 8: LED 1 • Chân 9: LED 2 • Chân 10: LED 3 • Chân 11: LED 4 • Chân 12: LED 5 • Chân 13: LED 6
Leds là một kiểu biến danh sách chứa các đối tượng chân mà có thể sử dụng để điều khiển
led,phần “broad.get_pin(…)” là đối tượng broad(bo) được tạo từ thư viện pyFirmata để lấy
thông tin cụ thể chân Arduino,”d” ở đây được hiểu là số chân mà chân mà bạn đang làm 4
việc,{} cho phép bạn tạo ra các chuỗi động, trong đó giá trị cụ thể được chèn vào trong chuỗi
tại vị trí bạn xác định; ”:o” điều này chỉ ra rằng chân sẽ được sử dụng ở chế độ đầu ra;” for
pin in led_pins
” là một vòng lặp nó sẽ lặp qua từng phần tử trong led_pins.
- Khởi Tạo Bộ Dò Bàn Tay và Mở Camera lOMoAR cPSD| 46342576
Detector là một biến để lưu trữ đối tượng của lớp HandDetector để phát hiện bàn tay trong video từ
camera,”HandDetector” là một phần trong Cvzone được thiết kế để phát hiện và theo dõi bàn tay
trong video,để xác định vị trí các ngón tay và số lượng ngón tay mà người dùng đưa lên với độ tin cậy
0.5% và tối đa 1 bàn tay.”Video” là một biến được sử dụng để lưu trữ đối tượng VideoCapture đại diện
cho camera chính mà bạn sử dụng để thu video,”0” là tham số camera đầu tiên được phát hiện và
thường sẽ là camera mặc định,nếu có nhiều cam thì có thể thay 1,2…
- Trạng Thái LED và Thao Tác
• “led_status = [False] * 6” là một danh sách có 6 phần tử tương đương 6 led và đều là giá trí False,theo
dõi trạng thái bật/tắt led,”False” nghĩa là led tắt trạng thái ban đầu,”True” nghĩa là led bật.”
touch_flags = [False] * 6” 6 phần tử ở trạng thái chạm đầu tiên mang trạng thái False,sử dụng theo
dõi việc chạm vào các ô led tương ứng.” led_toggle_count = [0] * 6” đếm số lần bật/tắt của từng
LED,”0” là led chưa bật lần nào và cứ thế tăng lên sau mỗi lần chạm.
• vào các ô led tương ứng.” led_toggle_count = [0] * 6” đếm số lần bật/tắt của từng LED,”0” là led
chưa bật lần nào và cứ thế tăng lên sau mỗi lần chạm
- Vị Trí và Kích Thước Ô LED
• “num_switches = 6” là số lượng ô led được hiện thị trên màn hình và có thể tương tác,” switch_width
= 80” khoảng cách chiều rộng mỗi ô sẽ là 80pixel,” padding = 20” khoảng cách giữa các ô,”
total_width = num_switches * switch_width + (num_switches - 1) * padding” dùng tính toán chiều
rộng tổng cộng của tất cả các ô LED cùng với khoảng cách giữa chúng,” start_x = (640 total_width)
// 2
” giả định rằng chiều rộng của khung hình là 640 pixel, start_x sẽ được tính để đảm bảo rằng tất cả
các ô LED được căn giữa trong không gian 640 pixel.” switch_positions = [(start_x + i *
(switch_width + padding), 100) for i in range(num_switches)]
” một danh sách switch_positions
chứa tọa độ của 6 ô LED, có thể vẽ các ô LED trên khung hình video. lOMoAR cPSD| 46342576
- Hàm Cập Nhật Trạng Thái Led Hiển Thị Trên Terminal Pycharm
Hàm “update_leds()” là có nhiệm vụ cập nhật trạng thái của các đèn LED dựa trên mảng trạng thái
led_status” sau đó lệnh Print in ra trên Terminal các số lần và trạng thái led của led.” for idx in
range(num_switches):
” ở đây idx được xem như là biến lặp trong vòng lặp for hoạt động phạm vị của
các nút nhấn(num_swithches) ở đây là 6 nút nhấn, Giá trị của idx sẽ thay đổi trong từng vòng lặp, từ 0
ở vòng đầu tiên đến num_switches - 1 ở vòng cuối cùng.”leds[idx].write(1 if led_status[idx] else 0)
leds là một danh sách chứa các đối tượng LED tương ứng với các chân (pin) trên Arduino mà đèn LED
được kết nối, biến “idx” ở vòng lặp for lặp lại quá trình xác định LED nào đang được cập nhật.”write()
là phương thức dùng để ghi giá trị vào chân Arduino mà LED được nối và đọc giá trị như sau:
led_status[idx]True, write(1) sẽ bật đèn LED hoặc led_status[idx]False, write(0) sẽ tắt đèn
LED.Và sẽ tăng số lần đếm số lần bật của LED tại idx lên 1. Sau khi cập nhật số lần bật của LED, câu
lệnh này sẽ in ra dòng thông báo với thông tin số lần LED được bật.”idx + 1” hiển thị thứ tự của LED từ 1 đến LED 6.
- Hàm Hiệu Ứng LED Chạy
Khai báo biến cục bộ “stop_running_effect” là một biến toàn cục được khai báo để có thể sử dụng trong hàm
này, Biến này đóng vai trò như một công tắc để bắt đầu hoặc dừng hiệu ứng led.Vòng lặp While kiểm tra xem
stop_running_effect” giữa 2 trạng thái là False và True nếu là True là vòng lặp sẽ dừng lại và nếu
stop_running_effect” là False vòng lặp sẽ tiếp tục chạy.Vòng lặp “for i in range(6):” lặp qua 6 led, một LED
được bật rồi tắt để tạo hiệu ứng chạy sáng.Kiểm tra biến “stop_running_effect” trước khi bật điều này cho phép
dừng hiệu ứng ngay lập tức khi stop_running_effect trở thành True.” leds[i].write(1)” hoặc “leds[i].write(0)
bật/tắt led hiện tại và hàm “time.sleep(speed)” giữ sáng led trong khoảng thời gian bao nhiêu đó ở đây là 0.02s.
- Khởi Động Luồng Hiệu Ứng LED
• Hàm này tạo và khởi động một luồng đuổi led để chạy hiệu ứng LED mà không làm dừng chương trình chính. 6 lOMoAR cPSD| 46342576 - Vòng Lặp Chính
• Vòng lặp While True chạy vô hạn cho đến khi bạn thoát khỏi chương trình(thường gán cho một phím
nào đó).Nó cho phép chương trình liên tục xử lý video từ camera.”ret, frame = video.read()” hàm này
đọc một khung hình từ camera,”ret” biến là một giá trị cho biết việc đọc khung hình có thành công hay
không,”frame” biến chứa dữ liệu hình ảnh của khung hình được đọc.” frame = cv2.flip(frame, 1)” là
hàm lật(flip) khung hình camera frame,tham số 1 chỉ định rằng lật theo chiều ngang giúp cho người
dùng tương tác dễ dàng với giao diện camera.” hands, img = detector.findHands(frame)” là hàm dò
bàn tay từ khung hình camera “frame” thông qua thư viện HandDector,biến “hands” chứa thông tin
về bàn tay được phát hiện,biến “img” chứa hình ảnh khung hình cho phép hiển thị hình ảnh này lên
màn hình để thấy các vị trí bàn tay được phát hiện để điều khiển LED thông qua cử chỉ tay.
- Vẽ Các Ô LED Hiển Thị Trên Khung Hình Camera
for idx, pos in enumerate(switch_positions):” là vòng lặp với “switch_positions” là danh sách chứa các toạ độ
(x,y) của các ô led,biến “idx/pos” giúp xác định vị trí của các ô LED hiện tại trong danh sách của
switch_positions”.”color = (0, 255, 0) if led_status[idx] else (0, 0, 255)” Color là biến lưu màu sắc của từng ô
led,nếu led tại chỉ số idx(trạng thái led) đang bật/sáng (led_status[idx] là True) thì màu hiển thị sẽ là màu xanh lá
cây với “color = (0, 255, 0)”,“0, 255, 0” cường độ màu sắc tối đa cho mỗi thành phần màu. Nó giúp xác định màu
sắc cụ thể khi hiển thị đồ họa trên màn hình.Và khi trạng thái led tắt thì “led_status[idx] là False” khi đó ô led sẽ
có màu đỏ tương ứng với màu sắc (0, 0, 255)”.Hàm “cv2.rectangle(...)” vẽ hình chữ nhật đối với các ô led hiển thị
trên khung hình frame,”pos” là toạ độ góc,” (pos[0] + switch_width, pos[1] + switch_width)” Tọa độ góc dưới bên
phải của hình chữ nhật, được tính bằng cách thêm chiều rộng của ô LED (switch_width) vào tọa độ ban đầu.”Color
là biến màu sắc hình chữ nhật đã xác nhật bước trên,” cv2.FILLED” đối số này cho biết hình chữ nhật sẽ được tô
đầy màu sắc theo trạng thái bật/tắt.Và hàm “cv2.putText(...)” dùng để thêm văn bản lên khung hình Camera(frame),”
f'LED {idx + 1}'” văn bản sẽ được ghi tên LED(như LED1;LED2) và sử dụng “idx+1” cho phép hiển thị thứ tự từ
1 đến 6.” (pos[0] + 10, pos[1] + 50)” toạ độ pos[0] đại diện cho toạ độ x(hàng ngang) của ô led và pos[1] là đại
diện toạ độ y(hàng dọc) của ô led,” pos[0] + 10” di chuyển vị trí hiển thị văn bản về phía bên phải một chút (10
pixel) so với cạnh trái của ô LED,” pos[1] + 50” di chuyển vị trí hiển thị văn bản xuống dưới một chút (50 pixel) so
với cạnh trên của ô LED tránh không bị đè lên nhau.” cv2.FONT_HERSHEY_COMPLEX, 0.5” kiểu font chữ và
kích thước và “(255, 255, 255)” màu sắc văn bản(trắng) và “1” độ dày của nét chữ. lOMoAR cPSD| 46342576 8 lOMoAR cPSD| 46342576 - Kiểm Tra Cử Chỉ Tay
• “if hands:” câu lệnh này kiểm tra có bàn tay nào được phát hiện trong khung hình hay không,biến
hands” là danh sách chứa thông tin về các bàn tay đã được phát hiện,nếu phát hiện bàn tay hàm lệnh
sẽ được thực thi.”lmList = hands[0]['lmList']” nếu có ít nhất một bàn tay, dòng này sẽ lấy danh sách
các điểm cột mốc (landmarks) của bàn tay đầu tiên,biến “hands[0]” chỉ đến bàn tay đầu tiên,”lmList
là danh sách chứa toạ độ (x;y) từng điểm cột mốc trên tay.”x, y = lmList[8][0], lmList[8][1]” toạ độ
ngón tay trỏ(điểm cột mốc số 8) từ ImList.”lmList[8][0]/lmList[8][1]” đại diện toạ độ x;y.” fingers =
detector.fingersUp(hands[0])
” lệnh này sử dụng phương thức finggersUp từ detector để kiểm tra trạng
thái các ngón tay trên bàn tay đầu tiên.Phương thức này sẽ trả về một danh sách (hoặc tuple) với 5
phần tử (một cho mỗi ngón tay), mỗi phần tử có giá trị 1 (nâng) hoặc 0 (không nâng). Ví dụ, nếu ngó
n tay trỏ và ngón giữa được nâng lên, danh sách có thể là [0, 1, 1, 0, 0]. lOMoAR cPSD| 46342576
- Kích Hoạt/Ngừng Hiệu Ứng LED
• “if fingers == [1, 1, 1, 1, 1]” biểu thức này kiểm tra xem tất cả năm ngón tay đều được dơ lên. rong
danh sách fingers, mỗi phần tử tương ứng với trạng thái của một ngón tay: 1 có nghĩa là ngón tay được
dơ lên và 0 có nghĩa là ngón tay không được dơ lên. Vì vậy, [1, 1, 1, 1, 1] cho biết rằng tất cả năm
ngón tay đều được dơ lên.” and stop_running_effect” điều này cho biết hàm này gán với giá trị True
nghĩa là led chưa được kích hoạt trước đó. Nếu hiệu ứng LED đang chạy (tức là stop_running_effect
là False
), thì đoạn mã này không được thực thi.”stop_running_effect = False” nếu điều kiện ban đầu
thoã mãn “stop_running_effect = True”(là hiệu ứng tắt) nó sẽ đặt biến
stop_running_effect = False” nghĩa là hiệu ứng sẽ được thực
thi.”start_led_effect_thread(speed=0.02)” hàm này được gọi để bắt đầu một luồng (thread) mới cho
hiệu ứng LED chạy, với tốc độ là 0.02 giây cho mỗi LED.
• “fingers == [0, 1, 1, 0, 0]” 5 số tương ứng với 5 ngón tay trên một bàn tay với mức 1 là ngón tay được
dơ lên và mức 0 là ngón tay không dơ lên,đoạn mã kiểm tra xem có hai ngón tay được dơ lên (ngón
tay giữa và ngón tay áp út), trong khi ba ngón tay còn lại không được dơ lên. Điều này chỉ ra rằng
người dùng đã thực hiện cử chỉ để dừng hiệu ứng LED.” stop_running_effect = True” nếu điều kiện
ngón tay thoã mãn thì biến ”stop_running_effect” sẽ được đặt thành True điều này báo hiệu cho
chương trình dừng hiệu ứng led đang chạy.
- Kiểm Tra Chạm vào Ô LED
• “for idx, pos in enumerate(switch_positions):enumerate(switch_positions): Hàm enumerate
cho phép bạn lặp qua danh sách switch_positions, trong đó idx là chỉ số (index) của ô và pos là tọa
độ của ô đó (mỗi ô được biểu diễn bằng một tuple chứa tọa độ x và y).Kiểm tra toạ độ x của ngón
tay “pos[0] < x < pos[0] + switch_width” pos[0]”: Tọa độ x của góc trên bên trái của ô LED,”pos[0]
+ switch_width
”:Tọa độ x của góc dưới bên phải của ô LED (tính bằng cách cộng chiều rộng vào
tọa độ x của góc trên bên trái) => Điều kiện này sẽ đúng nếu tọa độ x của ngón tay (x) nằm giữa
tọa độ x của góc trái và tọa độ x của góc phải của ô LED. Nói cách khác, ngón tay đang nằm trong chiều ngang của ô LED.
• Kiểm tra toạ độ y “pos[1] < y < pos[1] + switch_widthpos[1]: Tọa độ y của góc trên bên trái của
ô LED,pos[1] + switch_width: Tọa độ y của góc dưới bên phải của ô LED (tương tự như phần
trên, tính bằng cách cộng chiều cao vào tọa độ y),”y”: Tọa độ y của ngón tay => Tọa độ y của ngón
tay (y) nằm giữa tọa độ y của góc trên và tọa độ y của góc dưới của ô LED. Tức là, ngón tay đang
nằm trong chiều dọc của ô LED.
• Thay đổi trạng thái LED “if not touch_flags[idx]” , “touch_flags” là một danh sách chứa các cờ
(flags) để theo dõi xem mỗi ô LED đã được chạm vào hay chưa. Nếu một ô LED đã được chạm
vào, giá trị tương ứng trong touch_flags sẽ là True. Nếu chưa chạm vào, giá trị sẽ là False,” idx
Là chỉ số của vòng lặp, tương ứng với vị trí của ô LED hiện tại mà người dùng đang tương tác.Kiểm
tra điều kiện “led_status[idx] = not led_status[idx]” hàm led_status[idx] đây là trạng thái hiện tại
của LED tại chỉ số idx (bật hoặc tắt).”not led_status[idx]”:Phép toán not sẽ đảo ngược giá trị hiện
tại của led_status[idx]. Nếu LED đang bật (True), nó sẽ chuyển thành tắt (False), và ngược lại.
Điều này cho phép LED thay đổi trạng thái khi người dùng chạm vào ô tương ứng. 10 lOMoAR cPSD| 46342576
• Cập nhật trạng thái LED: “update_leds()” cập nhật trạng thái của tất cả các LED dựa trên giá trị
trong danh sách led_status. Nếu một LED được bật, nó sẽ sáng, và nếu nó tắt, nó sẽ tắt. Hàm này
cũng có thể thực hiện việc đếm số lần LED được bật.
• Đánh dấu ô được chạm vào: “touch_flags[idx] = True” điều này thiết lập giá trị của
touch_flags[idx] thành True, có nghĩa là ô LED hiện tại đã được chạm vào,còn False là ngược
lại.Việc này ngăn không cho đoạn mã trong vòng lặp kiểm tra lại ô LED đó cho đến khi người
dùng không còn chạm vào nó nữa.
Sau khi LED được cập nhật, nó sẽ sáng hoặc tắt dựa trên trạng thái mới, và ô LED sẽ được đánh
dấu là đã được chạm vào để tránh sự thay đổi không cần thiết cho đến khi người dùng rời tay khỏi ô đó.
- Hiển Thị Khung Hình và Thoát Khung Hình và Giải Phóng Tài Nguyên
• ” cv2.imshow("frame", frame)” trong đó “frame” tên của cửa sổ hiển thị, có thể đặt tùy ý. Trong trường
hợp này, tên cửa sổ là "frame". frame là đối tượng hình ảnh (khung hình) chứa dữ liệu đã được xử lý từ
camera,bao gồm các hình chữ nhật màu (ô bật/tắt) và các nhãn tên của LED đã được vẽ. ”cv2.imshow
sẽ tạo và hiển thị một cửa sổ mới có tên "frame" để người dùng có thể tương tác trực tiếp với các ô
bật/tắt trên khung hình được cập nhật theo thời gian thực.
• “k = cv2.waitKey(1)” đợi một phím bấm từ người dùng trong 1 millisecond. Nếu có phím được nhấn, nó
sẽ trả về mã ASCII của phím đó và lưu vào biến k, đặt thời gian đợi là 1 giúp tạo cảm giác hiển thị video
mượt mà, gần với thời gian thực.” if k == ord("q")ord("q") trả về mã ASCII của ký tự "q",nếu k trùng
với mã ASCII của "q", điều kiện được thỏa mãn và chương trình sẽ thoát khỏi vòng lặp. ”break” lệnh
này giúp kết thúc vòng lặp while True, dừng luồng xử lý hình ảnh từ camera và thoát chương trình khi
phím "q" được nhấn.
Đoạn mã này cho phép người dùng nhấn phím "q" để kết thúc việc xử lý và đóng các cửa sổ hiển thị từ cv2.imshow().
• “video.release() cv2.destroyAllWindows() board.exit()
Giải phóng tài nguyên camera, đóng cửa sổ OpenCV và ngắt kết nối Arduin
4. Các Bước Chạy và Kết quả
- B1: Nạp chương trình (firmware) được tải vào vi điều khiển Arduino, giúp thiết lập giao tiếp giữa Arduino
và các phần mềm bên ngoài như Python.. lOMoAR cPSD| 46342576
- B2: Cài đặt đúng cổng giao tiếp với bo Arduino và lắp Sơ Đồ Led.
- B3: Tiến hành chạy code.
• LED bật/tắt theo số lần chạm vào ô 12 lOMoAR cPSD| 46342576
• Dơ 5 ngón thì led chạy. lOMoAR cPSD| 46342576
- Dơ 2 ngón led kết thúc quá trình chạy. 14 lOMoAR cPSD| 46342576
5. Hướng phát triển
• Tích hợp với thực tế ảo (VR) và thực tế tăng cường (AR)
• Tích hợp Internet of Things (IoT)
• Giao diện điều khiển đa phương tiện
• Ứng dụng trong chăm sóc sức khỏe
• Tích hợp AI và Machine Learning