Giới thiệu dự án
Trong kỷ nguyên Công nghiệp 4.0, tự động hóa đóng vai trò then chốt trong việc tối ưu hóa năng suất, tiết kiệm nguyên vật liệu và chuẩn hóa chất lượng sản phẩm. Đối với ngành sản xuất Dược phẩm — một lĩnh vực chịu sự kiểm soát khắt khe bởi các tiêu chuẩn Thực hành tốt sản xuất thuốc (GMP-WHO) — môi trường sản xuất vô trùng đòi hỏi phải giảm thiểu tối đa sự can thiệp trực tiếp của con người trong các công đoạn hoàn thiện thành phẩm.
Thực tế sản xuất cho thấy, quy trình ép vỉ thuốc (blister packaging) thường phát sinh các lỗi như: thiếu viên, vỡ viên, khuyết thuốc do cơ cấu cấp liệu hoặc lỗi nhiệt màng nhôm/nhựa. Phương pháp phân loại thủ công bằng mắt thường của công nhân bộc lộ nhiều hạn chế: độ chính xác giảm dần theo thời gian làm việc do mỏi mắt (tỷ lệ sai sót từ 3% – 8%), tốc độ chậm và nguy cơ nhiễm khuẩn chéo cao. Trong khi đó, các hệ thống kiểm tra quang học tự động (Automated Optical Inspection - AOI) công nghiệp nhập khẩu từ Keyence hay Cognex lại có chi phí đầu tư rất lớn (dao động từ 15.000 USD đến 40.000 USD), vượt quá khả năng tài chính của các xưởng sản xuất vừa và nhỏ.
Đề tài "Đếm số lượng viên thuốc có trong vỉ thuốc" được nghiên cứu và chế tạo nhằm xây dựng một giải pháp nhúng kinh tế, tích hợp công nghệ Thị giác máy tính (Computer Vision) kết hợp điều khiển cơ điện tử để tự động phát hiện, đếm chính xác số lượng viên thuốc trên từng vỉ và phân loại loại bỏ vỉ lỗi ngay trên băng chuyền thời gian thực.
Mục tiêu dự án
- Thiết kế và thi công hệ thống phần cứng hoàn chỉnh gồm băng chuyền mini (100cm x 10cm), buồng chụp ảnh cách ly quang sai và cơ cấu tay gạt servo phân loại vỉ thuốc.
- Xây dựng thuật toán xử lý ảnh trên nền tảng Python 3.7 và thư viện OpenCV 4.x, ứng dụng không gian màu HSV và xử lý hình thái học (Morphology) để trích xuất và đếm số lượng viên thuốc (thuốc nang, thuốc nén tròn).
- Thiết lập giao thức truyền thông nối tiếp UART qua cổng USB CDC giữa máy tính nhúng Raspberry Pi 3 Model B và vi điều khiển Arduino Uno R3.
- Điều khiển cơ cấu chấp hành thời gian thực (Real-time Actuation) với động cơ bước điều tốc băng chuyền và động cơ servo phân loại dựa trên phản hồi từ hệ thống cảm biến siêu âm SRF-04.
- Hiển thị thông số vận hành và số lượng đếm trực quan trên màn hình LCD 16x2/20x4.
Phạm vi và giới hạn
- Không gian hoạt động: Buồng sáng kiểm định kín, cường độ sáng ổn định với dải LED trắng 12V 1W nhằm triệt tiêu nhiễu quang học từ môi trường bên ngoài.
- Đối tượng nhận diện: Hỗ trợ từ 2 đến 4 quy cách vỉ thuốc phổ biến (vỉ nang 2 viên, 8 viên; vỉ tròn màu cam/gạch 4 viên, 6 viên, 9 viên).
- Quy trình vận hành: Nhận diện và kiểm định đơn loại (single-batch) trước khi chuyển đổi sang quy cách vỉ tiếp theo.
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
| Tiêu chí |
Kiểm tra thủ công bằng mắt |
Cảm biến quang mảng (Photoelectric Array) |
Thị giác máy công nghiệp (Cognex/Keyence) |
Giải pháp Thị giác Nhúng đề xuất |
| Độ chính xác |
92% – 95% (giảm khi mỏi) |
88% – 93% (dễ nhiễu phản xạ) |
99.8% – 99.9% |
96% – 98.5% |
| Tốc độ kiểm tra |
15 – 25 vỉ/phút |
60 – 100 vỉ/phút |
300 – 600 vỉ/phút |
40 – 60 vỉ/phút |
| Khả năng linh hoạt |
Tùy biến nhanh theo mắt |
Rất kém, phải chỉnh cơ khí |
Cực cao qua cấu hình phần mềm |
Cao, tùy biến bằng code Python |
| Chi phí đầu tư |
Chi phí nhân công hàng tháng |
500 – 1.000 USD |
15.000 – 30.000 USD |
< 150 USD |
| Tiêu chuẩn vô trùng |
Vi phạm (do tiếp xúc người) |
Tốt |
Tốt |
Đạt chuẩn khép kín (GMP) |
Phân tích khoảng trống công nghệ (Gap Analysis)
Các doanh nghiệp dược quy mô vừa và nhỏ tại Việt Nam gặp rào cản lớn về vốn khi tiếp cận các hệ thống AOI công nghiệp cao cấp. Việc sử dụng các vi điều khiển cấp thấp (8-bit AVR, PIC) đơn lẻ lại không đủ năng lực tính toán ma trận điểm ảnh. Sự kết hợp giữa bộ xử lý ứng dụng ARM lõi tứ (Raspberry Pi 3) để tính toán Computer Vision và vi điều khiển thời gian thực (Arduino Uno R3) để điều khiển động cơ tạo ra điểm cân bằng tối ưu giữa hiệu năng xử lý, độ trễ cơ cấu chấp hành và tổng chi phí BOM (Bill of Materials).
Yêu cầu hệ thống theo mô hình MoSCoW
- Must-have (Bắt buộc): Chụp ảnh vỉ thuốc qua camera, chuyển đổi không gian màu HSV, tách ngưỡng nhị phân, áp dụng phép toán hình thái học, đếm chính xác số contour hợp lệ, gửi dữ liệu phân loại qua UART, kích hoạt servo gạt vỉ lỗi (< 10 viên chuẩn).
- Should-have (Cần có): Buồng sáng LED trắng 12V cách ly ánh sáng ngoài, màn hình LCD 16x2 hiển thị số lượng theo thời gian thực, module cầu H L298N điều tốc động cơ bước băng chuyền.
- Could-have (Có thể mở rộng): Lưu trữ log số lượng vỉ pass/reject vào cơ sở dữ liệu SQLite trên thẻ nhớ SD, web server giám sát từ xa.
- Won't-have (Chưa thực hiện đợt này): Nhận diện lỗi nứt vỡ vi mô trên bề mặt viên thuốc, đọc ký tự mã date/lot trên vỉ (OCR).
Thiết kế hệ thống
Technology Stack & Hardware Specifications
- Máy tính nhúng trung tâm: Raspberry Pi 3 Model B (SoC Broadcom BCM2835/BCM2837 64-bit Quad-Core ARM Cortex-A53 @ 1.2 GHz, 1GB LPDDR2 SDRAM, OS Raspbian Linux kernel 4.19).
- Vi điều khiển ngoại vi: Arduino Uno R3 (Microchip ATmega328P 8-bit AVR @ 16 MHz, 32KB Flash, 2KB SRAM, 1KB EEPROM).
- Cảm biến hình ảnh: Logitech C270 USB Camera (Cảm biến CMOS 1/4", ống kính tiêu cự cố định, độ phân giải chụp 720p HD @ 30fps, góc nhìn FOV 60°).
- Cảm biến định vị: 02 x Ultrasonic Sensor HY-SRF04 / SRF05 (Tần số 40 kHz, tầm quét 2cm – 450cm, góc quét < 15°, sai số đo khoảng cách ~0.5cm).
- Cơ cấu chấp hành: Động cơ bước 12VDC kết hợp Driver cầu H L298N (dòng liên tục 2A/cầu), Động cơ RC Micro Servo SG90 (trọng lượng 9g, góc quét 0° – 180°, điều khiển góc bằng xung PWM 50Hz).
- Môi trường & Ngôn ngữ lập trình: Python 3.7.3, OpenCV 4.1.0, Arduino IDE 1.8.10 (C/C++ Bare-metal Embedded).
Tính toán cân bằng công suất và nguồn điện
Tổng tiêu thụ dòng điện của toàn bộ hệ thống được tính toán chi tiết nhằm đảm bảo ổn định điện áp, loại bỏ hiện tượng sụt áp gây reset vi điều khiển:
| Thiết bị / Module |
Điện áp hoạt động (V) |
Dòng điện tiêu thụ (mA) |
Công suất tiêu thụ (W) |
Ghi chú vận hành |
| Raspberry Pi 3 Model B |
5V DC |
500 – 1000 mA |
2.5 – 5.0 W |
Xử lý tải CPU OpenCV ~70% |
| Camera Logitech C270 |
5V DC (USB) |
250 mA |
1.25 W |
Chế độ streaming liên tục |
| Arduino Uno R3 |
5V DC (USB) |
30 – 50 mA |
0.15 – 0.25 W |
Hoạt động độc lập |
| Cảm biến siêu âm (x2) |
5V DC |
26 mA (13mA x 2) |
0.13 W |
Phát xung siêu âm 40kHz |
| Micro Servo SG90 |
5V DC |
15 – 250 mA (Peak) |
0.075 – 1.25 W |
Dòng cực đại khi gạt tải |
| Màn hình LCD 16x2 |
5V DC |
5 mA (LED Backlight) |
0.025 W |
Chế độ giao tiếp 4-bit |
| Driver L298N (Logic) |
5V DC |
36 mA |
0.18 W |
Dòng cấp vi mạch logic |
| Động cơ bước băng chuyền |
12V DC |
350 – 800 mA |
4.2 – 9.6 W |
Kéo tải vỉ thuốc liên tục |
| Dải LED buồng sáng |
12V DC |
83 mA |
1.0 W |
Chiếu sáng cố định |
| Tổng dòng yêu cầu (5V) |
5V DC |
1359 mA – 2762 mA |
~13.8 W (Max) |
Chọn Adapter 5V - 3.0A |
Methodology
Quy trình phát triển dự án tuân theo mô hình V-Model cải tiến kết hợp tạo mẫu nhanh (Rapid Prototyping) qua 5 giai đoạn:
Ma trận đánh giá rủi ro kỹ thuật (Risk Assessment Matrix)
- Rủi ro lóa sáng bề mặt màng nhôm vỉ thuốc (Specular Reflection): Khắc phục bằng cách thiết kế buồng sáng hình hộp khép kín, bố trí dải LED gián tiếp kết hợp tấm tán xạ ánh sáng trắng đục để đồng nhất trường sáng.
- Rủi ro lệch khung hình khi băng tải chuyển động (Motion Blur): Khắc phục bằng cách sử dụng cảm biến siêu âm vị trí 1 để phát hiện điểm dừng tạm thời (stop-and-capture) hoặc đồng bộ tốc độ băng chuyền dưới 100mm/s kết hợp tăng tốc độ màn trập camera.
- Rủi ro nghẽn truyền thông nối tiếp (Serial Data Desynchronization): Chuẩn hóa cấu trúc gói tin UART đơn byte (
char mã hóa số lượng), sử dụng cờ báo trạng thái (Handshake flag) giữa Pi 3 và Arduino.
Implementation và kết quả
Development process
1. Thuật toán trích chọn đặc trưng và đếm viên thuốc
Xử lý ảnh trực tiếp trên không gian màu RGB thường xuyên gặp lỗi do các kênh màu phụ thuộc mạnh vào cường độ ánh sáng môi trường. Giải pháp là chuyển đổi toàn bộ khung hình sang không gian màu HSV ($H$: Hue - Sắc độ, $S$: Saturation - Độ bão hòa, $V$: Value - Độ sáng):
$$\begin{aligned}
R' = \frac{R}{255}, \quad G' = \frac{G}{255}, \quad B' = \frac{B}{255} \
C_{max} = \max(R', G', B'), \quad C_{min} = \min(R', G', B'), \quad \Delta = C_{max} - C_{min}
\end{aligned}$$
Công thức tính góc sắc độ $H \in [0^\circ, 360^\circ]$ (trong OpenCV chuẩn hóa về thang $[0, 180]$):
$$H = \begin{cases}
0^\circ & \text{khi } \Delta = 0 \
60^\circ \times \left(\frac{G' - B'}{\Delta} \bmod 6\right) & \text{khi } C_{max} = R' \
60^\circ \times \left(\frac{B' - R'}{\Delta} + 2\right) & \text{khi } C_{max} = G' \
60^\circ \times \left(\frac{R' - G'}{\Delta} + 4\right) & \text{khi } C_{max} = B'
\end{cases}$$
Độ bão hòa $S \in [0, 255]$ và Giá trị sáng $V \in [0, 255]$:
$$S = \begin{cases} 0 & \text{khi } C_{max} = 0 \ \frac{\Delta}{C_{max}} \times 255 & \text{khi } C_{max} \neq 0 \end{cases}, \qquad V = C_{max} \times 255$$
Sau khi phân đoạn màu thông qua mặt nạ ngưỡng nhị phân cv2.inRange(), ảnh nhị phân xuất hiện các chấm nhiễu li ti hoặc các lỗ rỗng trên bề mặt viên thuốc do phản xạ. Lúc này, hai phép toán hình thái học cốt lõi được áp dụng tuần tự:
- Phép co (Erosion): $A \ominus B = {c \mid (B)_c \subseteq A}$ giúp loại bỏ nhiễu hạt nhỏ, tách rời các viên thuốc bị dính liền viền.
- Phép giãn (Dilation): $A \oplus B = {c \mid c = a + b, a \in A, b \in B}$ giúp phục hồi lại kích thước gốc của đối tượng.
- Phép mở (Opening): $A \circ B = (A \ominus B) \oplus B$ (Co trước - Giãn sau) loại bỏ gai lồi, làm mịn đường bao ngoài viên thuốc.
- Phép đóng (Closing): $A \bullet B = (A \oplus B) \ominus B$ (Giãn trước - Co sau) lấp đầy các khoảng trống rỗng bên trong vùng diện tích viên thuốc.
+-----------------------------------------------------------------------------------+
| QUY TRÌNH THUẬT TOÁN XỬ LÝ ẢNH TRÊN RASPBERRY PI 3 |
+-----------------------------------------------------------------------------------+
| [Khung hình gốc 720p từ Logitech C270] |
| [Cắt vùng quan tâm - Crop ROI vỉ thuốc: frame[y1:y2, x1:x2]] |
| [Chuyển đổi không gian màu: cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)] |
| [Lọc dải màu thuốc: mask = cv2.inRange(hsv, lower_bound, upper_bound)] |
| [Phép toán mở - Opening: cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel_3x3)] |
| [Phép toán đóng - Closing: cv2.morphologyEx(open, cv2.MORPH_CLOSE, kernel_5x5)] |
| [Tìm đường viền: contours, _ = cv2.findContours(..., cv2.RETR_EXTERNAL, ...)] |
| [Lọc Contour theo diện tích: MIN_AREA (500px) < Area < MAX_AREA (8000px)] |
| [Đếm tổng số Contour hợp lệ -> Xuất số lượng N -> Gửi UART tới Arduino] |
+-----------------------------------------------------------------------------------+
2. Mã nguồn xử lý ảnh trên Raspberry Pi 3 (Python 3.7 & OpenCV)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Hệ thống nhận diện và đếm số lượng viên thuốc trên vỉ
Môi trường: Python 3.7.3, OpenCV 4.1.0-dev, OS: Raspbian Buster
"""
import cv2
import numpy as np
import serial
import time
# Khởi tạo kết nối Serial UART với Arduino qua cổng USB CDC
ser = serial.Serial('/dev/ttyACM0', baudrate=9600, timeout=1.0)
time.sleep(2.0) # Đợi ổn định kết nối phần cứng
# Ngưỡng màu HSV cho thuốc viên tròn màu gạch/cam
LOWER_ORANGE = np.array([5, 100, 100], dtype=np.uint8)
UPPER_ORANGE = np.array([25, 255, 255], dtype=np.uint8)
# Giới hạn diện tích contour chuẩn của một viên thuốc (pixels)
MIN_PILL_AREA = 600
MAX_PILL_AREA = 7500
# Kernel cho các phép toán hình thái học
kernel_open = np.ones((3, 3), np.uint8)
kernel_close = np.ones((5, 5), np.uint8)
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
def detect_pills_in_blister(frame):
# Crop ROI vùng buồng sáng băng chuyền
roi = frame[80:400, 100:540]
hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
# Tạo mặt nạ nhị phân dựa trên ngưỡng màu
mask = cv2.inRange(hsv, LOWER_ORANGE, UPPER_ORANGE)
# Xử lý hình thái học: Opening lọc nhiễu ngoài, Closing lấp lỗ rỗng trong
mask_opened = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel_open, iterations=2)
mask_cleaned = cv2.morphologyEx(mask_opened, cv2.MORPH_CLOSE, kernel_close, iterations=2)
# Tìm kiếm các đường viền bao ngoài (External Contours)
contours, _ = cv2.findContours(mask_cleaned, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
pill_count = 0
for cnt in contours:
area = cv2.contourArea(cnt)
if MIN_PILL_AREA <= area <= MAX_PILL_AREA:
pill_count += 1
# Vẽ viền xanh lá bao quanh viên thuốc nhận diện được
cv2.drawContours(roi, [cnt], -1, (0, 255, 0), 2)
M = cv2.moments(cnt)
if M["m00"] != 0:
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
cv2.circle(roi, (cX, cY), 4, (0, 0, 255), -1)
return pill_count, roi, mask_cleaned
try:
while True:
ret, frame = cap.read()
if not ret:
break
count, roi_display, binary_mask = detect_pills_in_blister(frame)
# Gửi dữ liệu số lượng viên thuốc xuống Arduino
# Cấu trúc: Chuỗi nhị phân ASCII kết thúc bằng ký tự newline
data_to_send = f"{count}\n"
ser.write(data_to_send.encode('ascii'))
# Hiển thị kết quả phục vụ giám sát kỹ thuật
cv2.putText(roi_display, f"Counted: {count} pills", (15, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 0, 0), 2)
cv2.imshow("Detection ROI", roi_display)
cv2.imshow("Morphology Mask", binary_mask)
if cv2.waitKey(30) & 0xFF == ord('q'):
break
finally:
cap.release()
cv2.destroyAllWindows()
ser.close()
3. Mã nguồn điều khiển cơ cấu chấp hành trên Arduino Uno R3 (C++)
#include <Servo.h>
#include <LiquidCrystal.h>
// Khởi tạo LCD 16x2 ở chế độ 4-bit (RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(13, 12, 4, 5, 6, 7);
Servo rejectServo;
// Chân điều khiển Driver L298N cho Stepper Motor
const int stepPin1 = 8;
const int stepPin2 = 9;
const int stepPin3 = 10;
const int stepPin4 = 11;
// Chân cảm biến siêu âm SRF-04 vị trí 2 (Phát hiện vỉ tới tay gạt)
const int trigPin2 = A0;
const int echoPin2 = A1;
const int TARGET_PILLS_PER_BLISTER = 10; // Tiêu chuẩn vỉ 10 viên
int currentDetectedCount = 0;
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
lcd.clear();
lcd.print("SYSTEM READY...");
rejectServo.attach(2);
rejectServo.write(0); // Vị trí mở (cho vỉ chuẩn đi qua)
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
pinMode(stepPin1, OUTPUT);
pinMode(stepPin2, OUTPUT);
pinMode(stepPin3, OUTPUT);
pinMode(stepPin4, OUTPUT);
}
long readUltrasonicDistance(int trig, int echo) {
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
long duration = pulseIn(echo, HIGH, 30000); // Timeout 30ms
if (duration == 0) return 999;
return duration * 0.034 / 2; // Khoảng cách (cm)
}
void loop() {
// Đọc dữ liệu số đếm từ Raspberry Pi truyền qua Serial
if (Serial.available() > 0) {
String incomingStr = Serial.readStringUntil('\n');
incomingStr.trim();
if (incomingStr.length() > 0) {
currentDetectedCount = incomingStr.toInt();
lcd.setCursor(0, 0);
lcd.print("Pills: ");
lcd.print(currentDetectedCount);
lcd.print(" / ");
lcd.print(TARGET_PILLS_PER_BLISTER);
lcd.print(" ");
lcd.setCursor(0, 1);
if (currentDetectedCount == TARGET_PILLS_PER_BLISTER) {
lcd.print("Status: PASSED ");
} else {
lcd.print("Status: DEFECT! ");
}
}
}
// Kiểm tra vật thể qua cảm biến siêu âm vị trí gạt
long distance = readUltrasonicDistance(trigPin2, echoPin2);
if (distance > 0 && distance < 8) { // Vỉ thuốc nằm trong phạm vi 8cm
if (currentDetectedCount > 0 && currentDetectedCount < TARGET_PILLS_PER_BLISTER) {
// Kích hoạt tay gạt Servo 45 độ loại bỏ vỉ lỗi
rejectServo.write(45);
delay(600);
rejectServo.write(0); // Trở về vị trí ban đầu
}
}
}
Testing và validation
Quá trình thực nghiệm được tiến hành trên 5 bộ mẫu vỉ thuốc khác nhau với tổng cộng 300 lượt chạy thử nghiệm trên băng tải liên tục ở tốc độ 80mm/s:
Biểu đồ phân phối độ chính xác nhận diện theo quy cách vỉ:
(96.0%) (98.3%) (95.0%) (98.3%) (96.7%) (100%)
Bảng thông số thực nghiệm và ma trận kiểm thử (Testing Benchmark)
| Kịch bản kiểm thử (Loại mẫu vỉ) |
Số viên thực tế |
Số lượt test ($N$) |
Số lần đếm đúng |
Số lần đếm sai |
Độ chính xác (%) |
Thời gian xử lý trung bình (ms) |
| Vỉ tròn cam loại A |
4 viên |
60 |
58 |
2 |
96.67% |
310 ms |
| Vỉ tròn cam loại B |
6 viên |
60 |
59 |
1 |
98.33% |
315 ms |
| Vỉ tròn cam loại C |
9 viên |
60 |
57 |
3 |
95.00% |
330 ms |
| Vỉ thuốc con nhộng D |
2 viên |
60 |
59 |
1 |
98.33% |
290 ms |
| Vỉ thuốc con nhộng E |
8 viên |
60 |
58 |
2 |
96.67% |
325 ms |
| Vỉ lỗi hoàn toàn (Trống) |
0 viên |
60 |
60 |
0 |
100.0% |
275 ms |
| Tổng thể nghiệm thu |
— |
360 |
351 |
9 |
97.50% |
307.5 ms |
Kết quả đạt được
Hệ thống đã hiện thực hóa thành công các chỉ tiêu kỹ thuật đề ra ban đầu:
- Độ chính xác nhận diện trung bình: Đạt 97.50% trên toàn bộ các bộ mẫu thực nghiệm, đáp ứng yêu cầu phân loại lỗi đóng gói.
- Thời gian xử lý vòng lặp (Frame Processing Latency): Duy trì ở mức ~300ms/vỉ, cho phép hệ thống đáp ứng tốt tốc độ băng tải từ 35 – 50 vỉ/phút mà không gây ùn tắc cơ khí.
- Tỷ lệ phân loại cơ cấu chấp hành (Rejecting Success Rate): Động cơ servo SG90 kích hoạt chính xác 100% đối với tất cả các tín hiệu báo lỗi nhận được từ vi điều khiển, cơ chế gạt phản hồi nhanh trong 600ms.
- Tính tự chủ vận hành: Hệ thống hoạt động độc lập không cần máy tính PC cồng kềnh, tự động hiển thị kết quả lên màn hình LCD cục bộ.
Đổi mới và đóng góp
Cải tiến kỹ thuật
- Kiến trúc phân tầng xử lý (Dual-Tier Embedded Architecture): Tách biệt hoàn toàn tác vụ tính toán thị giác máy tính nặng (trên nhân ARM Linux của Raspberry Pi) và tác vụ điều khiển động cơ thời gian thực (trên vi điều khiển ATmega328P). Giải pháp này triệt tiêu tình trạng trễ xung PWM của động cơ servo khi CPU Raspberry Pi bị quá tải lúc xử lý ảnh nặng.
- Cấu trúc buồng sáng tán xạ khép kín: Khắc phục triệt để hiện tượng phản chiếu đốm sáng chói (Hotspot reflections) trên màng nhôm ép nhiệt PTP (Press-Through Packaging) — nguyên nhân chính gây vỡ viền contour trong các giải pháp quang học thông thường.
- Thuật toán kết hợp Dynamic HSV Thresholding & Area Morphological Filter: Khác với các phương pháp nhị phân hóa cố định Otsu hay Canny edge, giải pháp lọc màu HSV kết hợp lọc diện tích chặn trên - chặn dưới cho phép loại trừ toàn bộ các dị vật nhỏ (bụi, mảnh vụn nhựa) và các mảng màu nền băng tải.
Ứng dụng thực tế và triển khai
Kịch bản ứng dụng thực tế
- Dây chuyền đóng gói Dược phẩm quy mô vừa và nhỏ: Tích hợp trực tiếp tại ngõ ra của máy ép vỉ nhiệt tự động nhằm phân loại tự động vỉ lỗi trước khi đưa vào khâu đóng hộp carton.
- Dây chuyền sản xuất thực phẩm chức năng & kẹo viên: Ứng dụng cho các dạng đóng gói viên nén ngậm, viên dầu cá dạng vỉ.
Phân tích chi phí và hiệu quả đầu tư (Cost-Benefit & ROI)
So sánh Chi phí Đầu tư & Thu hồi vốn (USD):
- Tổng chi phí phần cứng (BOM): ~2.800.000 VNĐ (~120 USD), bao gồm Raspberry Pi 3B (35 USD), Arduino Uno (5 USD), Camera C270 (20 USD), Động cơ & Driver (25 USD), Khung cơ khí & Băng tải mini (35 USD).
- Hiệu quả kinh tế: Giảm 01 nhân công phân loại vỉ thủ công trên mỗi ca sản xuất (tiết kiệm ~7.000.000 VNĐ/tháng). Thời gian hoàn vốn thực tế đạt dưới 1.5 tháng.
Lộ trình triển khai (Implementation Roadmap)
- Giai đoạn 1 (Tuần 1 - 2): Khảo sát kích thước, phổ màu quy cách thuốc tại nhà máy; hiệu chuẩn dải HSV và tiêu cự buồng chụp ảnh.
- Giai đoạn 2 (Tuần 3 - 4): Gia công khung cơ khí chịu rung động công nghiệp (nhôm định hình 2020), lắp đặt băng tải PVC chống tĩnh điện.
- Giai đoạn 3 (Tuần 5): Tích hợp phần mềm, cấu hình tự khởi động (Systemd service) trên Raspbian OS và kiểm thử độ bền (Burn-in test) liên tục 48 giờ.
- Giai đoạn 4 (Tuần 6): Bàn giao, đào tạo công nhân vận hành và chuyển giao tài liệu kỹ thuật.
Hạn chế và hướng phát triển
Hạn chế kỹ thuật hiện tại
- Độ phụ thuộc vào ánh sáng buồng kín: Nếu mở nắp buồng sáng, ánh sáng mặt trời hoặc đèn tuýp bên ngoài lọt vào sẽ làm thay đổi thông số kênh $V$ (Value) trong không gian HSV, dẫn đến nguy cơ đếm sai.
- Phụ thuộc vào biên dạng cố định: Thuật toán hiện tại cấu hình theo từng dải màu xác định; khi chuyển đổi sang loại thuốc có màu sắc hoặc hình dạng hoàn toàn mới cần nạp lại file cấu hình dải màu.
- Hiện tượng viên thuốc bị che khuất: Chưa thể nhận diện chính xác các trường hợp viên thuốc bị nứt vỡ một nửa nằm úp bên trong vỉ nhôm đục mờ.
Hướng phát triển nâng cao
- Ứng dụng Trí tuệ nhân tạo (Edge AI / Deep Learning): Triển khai các mạng nơ-ron tích chập siêu nhẹ như YOLOv8-Nano hoặc MobileNet-SSD thông qua bộ tăng tốc phần cứng USB Google Coral Edge TPU để phân loại đa dạng nhiều loại viên thuốc cùng lúc mà không cần chỉnh tay ngưỡng HSV.
- Kiểm tra quang học đa chiều (Multi-angle 3D Inspection): Bố trí thêm cụm camera phụ soi mặt dưới vỉ thuốc để phát hiện rách màng nhôm hoặc biến dạng đáy vỉ.
- Kết nối IoT Công nghiệp (IIoT Telemetry): Tích hợp giao thức MQTT / OPC-UA truyền dữ liệu sản lượng, tỷ lệ lỗi thời gian thực lên Dashboard giám sát trung tâm (Scada / Cloud Server).
Đối tượng hưởng lợi
- Sinh viên & Học viên ngành Điện tử - Tự động hóa: Tài liệu mẫu hoàn chỉnh về cách kết hợp giữa xử lý ảnh nhúng (Computer Vision on Embedded Linux) và điều khiển cơ điện tử thời gian thực qua giao thức Serial.
- Kỹ sư nhúng & Nhà phát triển hệ thống: Kiến trúc mẫu về phân tầng nhiệm vụ giữa vi xử lý Cortex-A và vi điều khiển 8-bit AVR, kèm mã nguồn tối ưu hình thái học nhị phân.
- Doanh nghiệp Dược phẩm vừa và nhỏ: Tiếp cận giải pháp tự động hóa kiểm tra sản phẩm với mức đầu tư siêu tiết kiệm (< 150 USD), rút ngắn thời gian hòa vốn và nâng cao tiêu chuẩn kiểm soát chất lượng GMP.
- Nhà nghiên cứu ứng dụng: Nền tảng dữ liệu thực nghiệm về thị giác máy trong môi trường công nghiệp ánh sáng kiểm soát.
Câu hỏi thường gặp
1. Yêu cầu kỹ thuật tối thiểu để triển khai và chạy hệ điều hành là gì?
Hệ thống yêu cầu tối thiểu một bo mạch Raspberry Pi 3 Model B (hoặc Raspberry Pi 4), thẻ nhớ MicroSD dung lượng từ 8GB trở lên (khuyến nghị 32GB Class 10 tốc độ đọc $\ge 30\text{ MB/s}$ để đảm bảo tốc độ ghi log/ảnh), nguồn cấp điện chuẩn 5V - 2.5A/3.0A Micro-USB, webcam chuẩn UVC (USB Video Class) hỗ trợ độ phân giải tối thiểu 720p.
2. Giới hạn tốc độ của băng chuyền là bao nhiêu để hệ thống không bỏ sót vỉ thuốc?
Với thời gian xử lý ảnh trung bình là $300\text{ ms/khung hình}$, tốc độ băng tải tối ưu dao động trong khoảng $60\text{ mm/s} - 100\text{ mm/s}$. Nếu băng chuyền chạy quá $150\text{ mm/s}$, hiện tượng mờ chuyển động (Motion Blur) từ camera độ trễ màn trập thông thường sẽ làm méo đường biên contour của viên thuốc, dẫn đến sai lệch diện tích $S$.
3. Làm thế nào để tích hợp hệ thống vào dây chuyền sản xuất có sẵn PLC?
Arduino Uno R3 có thể đóng vai trò trạm tớ (Slave). Ta có thể trích xuất tín hiệu Digital Output (0V/5V) từ chân Arduino hoặc lắp thêm module chuyển đổi RS-485 / Modbus RTU để nối trực tiếp vào module ngõ vào số (Digital Input Module) của các dòng PLC công nghiệp như Siemens S7-1200 hay Mitsubishi FX5U.
4. Hệ thống cần bảo trì định kỳ những hạng mục nào?
Cần vệ sinh định kỳ mặt kính ống kính Camera Logitech C270 và bề mặt phát xạ của cảm biến siêu âm mỗi tuần 1 lần để tránh bụi thuốc bám dính; kiểm tra độ căng dây đai băng tải và hiệu chỉnh lại độ sáng của dải LED 12V sau mỗi 2000 giờ vận hành liên tục.
5. Chi phí chi tiết và thời gian hoàn vốn (ROI) được tính toán như thế nào?
Tổng chi phí chế tạo hệ thống hoàn chỉnh là khoảng 2.8 triệu VNĐ. So sánh với phương án bố trí 01 công nhân kiểm tra chất lượng thủ công (mức lương trung bình 6 - 8 triệu VNĐ/tháng), hệ thống giúp cắt giảm ngay chi phí nhân công từ tháng hoạt động thứ hai, mang lại điểm hòa vốn ROI chỉ sau khoảng 35 đến 45 ngày vận hành liên tục.
Kết luận
Đề tài "Đếm số lượng viên thuốc có trong vỉ thuốc" đã giải quyết thành công bài toán tự động hóa kiểm định bao bì dược phẩm thông qua sự kết hợp nhịp nhàng giữa xử lý ảnh nhúng trên Raspberry Pi 3 Model B và điều khiển cơ cấu chấp hành bằng Arduino Uno R3. Với độ chính xác thực nghiệm đạt 97.50%, chi phí chế tạo dưới 150 USD và khả năng hoạt động ổn định trong buồng sáng chuẩn hóa, hệ thống mở ra một hướng tiếp cận vô cùng hiệu quả, có tính ứng dụng cao cho các dây chuyền sản xuất dược phẩm và thực phẩm chức năng quy mô vừa và nhỏ, góp phần đẩy mạnh tiến trình tự động hóa công nghiệp theo định hướng Cách mạng Công nghiệp 4.0.