a. Phân loại theo hình dạng
Các bước phân loại phôi theo hình dạng:
• Bước 1: Từ hình ảnh nhị phân tìm đường bao của các vật thể đã được nhận diện thông qua lệnh ‘findContours’.
contours,_ =
65
• Bước 2: Với mỗi đường bao đã được xác định, ta có thể xác định gần đúng hình dạng của các đa giác có trong hình ảnh qua phép tính xấp xỉ với lệnh ‘approxPolyDP’.
approx = cv2.approxPolyDP(contour,0.025 * cv2.arcLength(contour,True),True)
Tỷ số 0.025 có thể thay đổi tuỳ thuộc yêu cầu đề bài, trong đề tài phân loại dựa trên hình dạng, tỷ số này không nên quá nhỏ.
• Bước 3: Sau đó, hình dạng xác định của các đường bao được vẽ trên hình ảnh và hiển thị dưới dạng đầu ra của chương trình.
Sử dụng câu lệnh ‘drawContours’ vẽ đường viền màu đen với mã màu (0, 0, 0) (đây là mã màu RGB, thông số có thể thay đổi tùy màu đường viền mong muốn) và độ dày viền là 2.
cv2.drawContours(color,[approx],0,(0,0,0),2) Hình ảnh hiển thị:
Hình 3.34. Xác định đường bao sản phẩm
• Bước 4: Từ phép tính xấp xỉ, tìm số đỉnh của đường bao sản phẩm, phân loại sản phẩm theo số đỉnh nhận được. Tương ứng với số đỉnh ta có thể xác định chính xác loại hình dạng của phôi: 3 đỉnh – hình tam giác, 4 ÷ 6 đỉnh – hình vuông, 7 ÷ 10 đỉnh – hình chữ nhật. if len(approx) == 3: print("Triangle") elif 4 <= len(approx) <= 6: print("Rectangle") elif 7 < len(approx) < 10: print("Circle") Hình ảnh hiển thị:
66
Hình 3.35. Nhận diện hình dạng tam giác
Hình 3.36. Nhận diện hình dạng chữ nhật
b. Phân loại theo chiều cao
Đặt khoảng cách từ cảm biến hồng ngoại đến mặt băng tải là S1, khoảng cách của sản phẩm đo được thông qua cảm biến là S2, nên ta có chiều cao phôi:
H = S1 – S2 (3.30)
Các bước phân loại phôi theo chiều cao:
• Bước 1: Tạo 1 luồng video hiển thị độ sâu trong khung hình đo được từ cảm biến hồng ngoại.
Lệnh create_depth_stream() được thực hiện cho phép máy tính truy cập và lấy dữ liệu từ cảm biến hồng ngoại trên Kinect.
Dữ liệu độ sâu được cung cấp dưới dạng một mảng gồm các phần tử 16 bit, vậy nên cần chuyển đổi các phần tử này sang 8 bit giống với Kinect khi cung cấp dữ liệu hình ảnh giúp cho việc xử lý dữ liệu dễ dàng hơn thông qua lệnhconvertScaleAbs(). depth_stream = dev.create_depth_stream() depth_stream.start() depth_scale_factor = 255.0 / depth_stream.get_max_pixel_value() depth_frame = depth_stream.read_frame() h,w = depth_frame.height,depth_frame.width
67 depth = numpy.ctypeslib.as_array(depth_frame.get_buffer_as_uint16()). reshape(h,w) depth_uint8 = cv2.convertScaleAbs(depth,alpha=depth_scale_factor)
• Bước 2: Khoảng cách được đo trong giới hạn khung hình
Khung hình được giới hạn trong không gian ảnh nhị phân đủ diện tích và thời gian để có thể xác định được 1 phôi
cv2.rectangle(mask, (0, 0), (280, 480), (0, 0, 0), thickness=-1) cv2.rectangle(mask, (350, 0), (640, 480), (0, 0, 0), thickness=-1) cv2.rectangle(mask, (0, 0), (640, 173), (0, 0, 0), thickness=-1) cv2.rectangle(mask, (0, 307), (640, 480), (0, 0, 0), thickness=-1)
Với x, y là tâm tiết diện đã được nhận diện của phôi, do sự chênh lệch giữa khung hình đo độ sâu và khung hình nhận diện phôi nên tọa độ tâm phôi trong khung đo độ sâu được tính bằng: (x – 25) và (y – 20).
Distance = depth[(y-20), (x-25)] Distance = Distance / 10
• Bước 3: Tính toán chiều cao phôi từ các giá trị khoảng cách đo được. Hình ảnh hiển thị:
Hình 3.37. Đo chiều cao sản phẩm
68
CHƯƠNG 4. THI CÔNG, TÍCH HỢP HỆ THỐNG 4.1. Thi công hệ thống cơ khí
4.1.1. Gối đỡ quả lô
Gối đỡ được làm bằng cách in 3D với vật liệu là nhựa PLA. Gối đỡ có tác dụng là đỡ 2 quả lô chủ động và bị động hạn chế 5 bậc tự do của quả lô (quả lô chỉ xoay quanh trục y).
Gối đỡ được cố định vào nhôm định hình bằng 2 con ốc M5x8 để hạn chế việc quả lô bị xoay theo trục y khi hệ thống hoạt động. Thêm vào đó để chắc chắc việc gối đỡ không bị xoay khi hệ thống làm việc nhóm đã thiết kế thêm một rãnh để ôm chắc vào nhôm định hình khi lắp ráp tránh hiện tượng lắp ráp sai cách.
Hình 4.1. Gối đỡ
4.1.2. Ổ bi
Ngoài ra gối đỡ còn lắp thêm vòng bi để tăng khả năng hiệu quả khi quay theo trục y của quả lô. Vòng bi giúp giảm ma sát giữa trục tang và gối đỡ, làm giảm việc hỏng hóc do ma sát lâu ngày.
Vòng bi nhóm chọn là vòng bi NSK608-RS là sản phẩm của công ty NSK Automation, là công ty sản xuất vòng bi lớn trên toàn cầu và lớn nhất tại Nhật Bản. Với kích thước nhỏ gọn đường kính ngoài 22mm, đường kính trong 8mm và dày 7mm rất phù hợp để sử dụng trong mô hình hệ thống của nhóm.
Vòng ngoài của vòng bi được lắp với mặt trong của trụ tròn được gia công trên quả lô còn vòng trong sẽ được lắp với trục tang, ở mỗi vị trí tiếp xúc sẽ được bôi mỡ thường xuyên để giảm ma sát và tăng tuổi thọ của vật liệu.
69
Kết hợp với việc bảo dưỡng thường xuyên thì sẽ làm tăng tuổi thọ, độ ổn định của hệ thống cũng như tính chính xác của hệ thống khi làm việc.
Hình 4.2. Vòng bi NSK608-RS khi lắp vào gối đỡ
4.1.3. Ru lô băng tải
Ru lô là bộ phận trung gian kết nối chuyển động giữa động cơ và dây băng tải. Băng tải của nhóm có 2 quả ru lô là ru lô chủ động và ru lô bị động. Ru lô chủ động được lắp hai vòng bi hai đầu được lắp cố định vào gối đỡ. Ru lô bị động cũng được lắp vòng bi hai đầu và đươc lắp vào gối đỡ sau đó được cố định vào hai thành khung băng tải bằng bu lông, đai ốc, giúp cho việc tháo lắp thay băng tải, căn chỉnh băng tải dễ dàng và thuận tiện hơn.
Ru lô của nhóm được làm bằng cách in 3D bằng vật liệu nhựa PLA với trục là thanh inox tròn đặc đường kính 8mm. Đối với quả lô chủ động sẽ được truyền chuyển động từ động cơ bằng bộ truyền đai răng.
70
4.1.4. Gá động cơ
Gá động cơ được làm bằng cách in 3D với vật liệu là nhựa PLA. Động cơ được gắn vào gá bằng 4 con bu lông M4x20 và 4 lỗ ren ở trên hộp giảm tốc của động cơ.
Vì là bộ phận phát động truyền động của cả hệ thống nên động cơ cần được cố định một cách chắc chắn, nên nhóm đã quyết định cố định động cơ vào khung của băng tải bằng bu lông và đai ốc M5. Để thêm chắc chắn thì nhóm đã thiết kế thêm một rãnh để bám vào nhôm định hình tăng độ bám của gá và tăng độ cứng vững cho động cơ để hệ thống hoạt động ổn định hơn.
Hình 4.4. Gá động cơ khi lắp vào khung
Hình ảnh sau khi động cơ đã gắn gắn vào gá động cơ
71 Mặt trước của gá động cơ:
Hình 4.6. Gá động cơ
4.1.5. Dây đai băng tải
Dây đai băng tải PVC (phần màu xanh trong hình 4.7) là loại dây chuyên dùng trong công nghiệp được làm từ chất liệu nhựa dẻo tổng hợp Poly Vinyl Clorua, có tính đàn hồi cao. Dây đai băng tải trong quá trình sử dụng sẽ tiếp xúc trực tiếp với sản phẩm tải, chịu trách nhiệm là phương tiện chở sản phẩm đến vị trí cần.
Dây đai băng tải là sản phẩm thích hợp dùng cho truyền tải các vật liệu có tính mật độ tách rời cao, chịu mài mòn nhiều, lực xung kích lớn, đặc biệt thích hợp làm việc trong môi trường làm việc có tính ổn định cao có độ nghiêng thấp hoặc tải thẳng. Phần dưới của dây đai băng tải được thiết kế các lớp bố để tăng ma sát bám vào ru lô nhằm không xảy ra hiện tượng trượt đai khi dây đai băng tải hoạt động lâu.
Dây đai băng tải hoạt động lâu thường xảy ra hiện tượng giãn đai, khi đó thì ta cần căng lại đai cho băng tải hoặc tùy vào điều kiện vận hành và chất lượng của đai băng tải có thể thay mới đai băng tải để hệ thống hoạt động ổn định nhất
72
4.2. Thi công hệ thống điều khiển 4.2.1. Nguồn điện 4.2.1. Nguồn điện
Với các thành phần linh kiện đã chọn, nhóm sử dụng 3 mức điện áp đảm bảo cho hệ thống hoạt động bình thường, bao gồm:
• Nguồn động cơ băng tải có sử dụng module L298: 24V
• Nguồn hỗ trợ Arduino nuôi cảm biến, động cơ servo: 5V
• Nguồn Adapter cho camera Kinect: 12V
(*Chú ý: Nguồn cấp tiêu chuẩn cho L298 là 12V, khi muốn sử dụng động cơ với mức điện áp 24V cần ngắt kết nối nguồn 24V với IC hạ áp trong module L298 (tháo Jump) tránh hỏng linh kiện.)
4.2.2. Cảm biến và động cơ tay gạt
Hệ thống có 4 cảm biến tiệm cận và 3 động cơ servo nên chân GND và VCC sẽ được nối chung sử dụng nguồn ngoài 5V và chân GND cần được nối chung với Arduino. Các dây tín hiệu còn lại được nối tới arduino như mô hình thiết kế chương 3.
Hình 4.8. Cảm biến và động cơ tay gạt
Do thời gian thực hiện giới hạn, nên nhóm chưa có phần thiết kế và thi công bo mạch mà chỉ chỉ sử dụng dây cắm trực tiếp trên các module.
4.2.3. Hiển thị và điều khiển
Màn hình LCD hiển thị số lượng phôi đã được phân loại: tròn cao, vuông cao, tam giác cao, thấp. Nút bấm Start dùng để ngắt động cơ băng tải
73
Bảng 4.1. Đấu nối nút bấm
Nút bấm Cách đấu nối Chức năng
START 1 chân nút bấm nối đến 1 trong 2 cực của động cơ, chân còn lại nối đến cổng OUT2 của module L298
Bật động cơ băng tải, khởi động hệ thống. STOP 1 chân nối đến GND, chân còn lại nối đến
chân 8 trên Arduino
Dừng hệ thống khi đã chạy hết chu trình.
RESET 1 chân nối đến GND, chân còn lại nối đến chân 12 trên Arduino
Đặt lại các giá trị về giá trị ban đầu.
Hình 4.9. Mặt trên hộp điện
4.3. Xây dựng chương trình, kết nối hệ thống
Chương trình phân loại phôi đươc viết trên phần mềm Pycharm sử dụng ngôn ngữ Python trên phiên bản 3.7. Chương trình điều khiển được viết trên phần mềm Arduino IDE sử dụng ngôn ngữ C.
74
Hình 4.10. Hệ thống sau khi đã hoàn thiện
• Cài đặt Pycharm và Arduino IDE:
Hình 4.11. Cài đặt Pycharm và Arduino IDE
Dữ liệu từ camera Kinect được khai thác và sử dụng bằng máy tính cá nhân thông qua phần mềm Pycharm các dữ liệu được xử lý và được gửi vào Arduino thông qua giao tiếp Serial.
Cài đặt các thư viện sử dụng trên Pycharm bao gồm:
• SerialDevice: Truyền thông tin giữa thiết bị xử lý dữ liệu và thiết ngoại vi.
• Opencv-python: xử lý dữ liệu hình ảnh, thị giác máy tính.
• Openni: Thao tác với dữ liệu trên Kinect.
• Numpy: một thư viện toán học cho phép làm việc hiệu quả với ma trận và mảng với tốc độ xử lý nhanh hơn “Core Python” đơn thuần.
75
• Cvzone: Giao tiếp, truyền nhận dữ liệu với Arduino thông qua Serial Port.
Hình 4.12. Kết nối hệ thống thực hiện phân loại
Cùng kết nối camera và Arduino tới máy tính, trong Pycharm thiết lập truyền thống nối tiếp với Arduino:
Hình 4.13. Thiết lập truyền thống nối tiếp với Arduino
Hộp thoại Run thông báo Arduino Uno đã được kết nối thông qua cổng COM3
• Lập trình:
o Arduino:
Thư viện cvzone cũng được cài đặt trên Arduino, dữ liệu từ máy tính truyền qua Arduino thông qua Serial Port được lưu trong bộ nhớ đệm. Sử dụng hàm
76
Serial.parseInt() để lấy từng kí tự số nguyên trong bộ đệm sử dụng cho thao tác điều khiển phân loại.
▪ Serial.available() > 0: đã có dữ liệu trong bộ đệm
▪ Serial.parseInt(): lấy kí tự nguyên đầu tiên trong bộ đệm
Lần lượt các tín hiệu được lấy từ bộ đệm nếu đúng điều kiện các câu lệnh tiếp theo sẽ được thực hiện.
o Pycharm:
Các kí tự số nguyên tương ứng với loại phôi được gửi lần lượt qua Arduino. Khai báo Arduino:
Arduino = SerialObject('COM3', 9600, 1) ▪ Serial Port: COM3
▪ Tốc độ Baud: 9600
▪ Digit: 1 - số kí tự trên 1 giá trị được gửi đi (ví dụ: 5 – 1digit, 55 – 2digits) Gửi dữ liệu đã xử lý sang Arduino:
Arduino.sendData(wpTypeArr)
wpTypeArr: loại phôi đã được phân loại là các phần tử số nguyên 1, 2, 3, 4 tương
ứng với loại phôi.
• Hướng dẫn sử dụng phần cứng
Sau khi kết nối Arduino và camera với máy tính, tiến hành bật nguồn cho hệ thống, băng tải sẽ chạy sau khi nhấn nút Start, đặt phôi lên băng tải tiến hành phân loại. Trong qua trình phân loại nếu xảy ra lỗi (ví dụ như phân loại sai loại phôi) có
77
thể ấn nút Stop hệ thống sẽ dừng sau khi phân loại xong phôi đang chạy. Sau đó, ấn nút Reset để đặt lại các giá trị như ban đầu.
Camera Kinect cùng Arduino sẽ được kết nối trực tiếp tới máy tính, máy tính sẽ xử lý dữ liệu thu được từ Kinect sau đó tín hiệu 1, 2, 3, 4 sẽ được gửi sang Arduino thông qua giao tiếp Serial tương ứng 1 – Tròn cao, 2 – Vuông cao, 3 – Tam giác cao, 4 – Phôi lỗi.
Kết quả hiển thị đếm sản phẩm:
78
CHƯƠNG 5. KẾT LUẬN VÀ ĐỊNH HƯỚNG PHÁT TRIỂN 5.1. Kết quả
5.1.1. Tính chính xác a. Kết quả phân loại a. Kết quả phân loại
Kết quả phân loại sẽ hiển thị trên màn hình máy tính với các thông số bao gồm: khoảng cách từ cảm biến tới mặt băng tải (Distance), hình dạng của phôi (Shape), chiều cao phôi (Height), và trạng thái của phôi (NG hoặc OK). Với số phôi phân loại là 160 (40 phôi cho mỗi loại), nhóm thu được kết quả:
• Phôi tròn cao
Hình dưới đây mô tả quá trình phân loại phôi tam giác:
Hình 5.1. Kết quả phân loại phôi tròn cao
Hình 5.1a: Phôi được đặt vào băng tải chuẩn bị tới vị trí phân loại. Khoảng cách “Distance” được đo tại điểm trắng trên khung hình hiển thị là 65,9cm.
Hình 5.1b: Phôi được đưa tới vị trí nhận diện, chiều cao phôi được tính toán như công thức ở chương 3, hình dạng phôi được nhận diện đúng (tròn – Circle), chiều cao đạt (7,7cm). → trạng thái của phôi: OK.
79
Hình 5.1c: Băng tải đưa phôi tới vị trí cảm biến 1, cảm biến phát hiện phôi, tay gạt gạt phôi xuống máng phân loại.
Hình 5.1d: Biến đếm phôi tròn tăng lên 1 (TR:1). Kết quả sau khi phân loại 40 phôi tròn:
Hình 5.2. Kết quả sau khi phân loại 40 phôi tròn cao
Sau khi phân loại 40 phôi tròn số phôi được phân loại chính xác là 37 phôi hiển trị trên màn hình LCD, 3 phôi lỗi xảy ra trong trường hợp sau:
Lỗi phôi không được gạt dù cảm biến đã phát hiện
Hình 5.3. Lỗi không gạt phôi tròn
• Phôi tam giác cao
80
Hình 5.4. Kết quả phân loại phôi tam giác cao
Hình 5.4a: Phôi tam giác được đặt vào băng tải chuẩn bị tới vị trí phân loại. Khoảng cách “Distance” được đo tại điểm trắng trên khung hình hiển thị là 65,8cm.
Hình 5.4b: Phôi được đưa tới vị trí nhận diện, chiều cao phôi được tính toán như công thức ở chương 3, hình dạng phôi được nhận diện đúng (tam giác – Triangle), chiều cao đạt (7,8cm). → trạng thái của phôi: OK.
Hình 5.4c: Băng tải đưa phôi tới vị trí cảm biến 3, cảm biến phát hiện phôi, tay gạt gạt phôi xuống máng phân loại.
Hình 5.4d: Biến đếm phôi tròn tăng lên 1 (T.G:1). Kết quả sau khi phân loại 40 phôi tam giác cao:
81
Hình 5.5. Kết quả sau khi phân loại 40 phôi tam giác cao
Số lượng phôi được phân loại đúng hiển thị trên màn hình LCD là 34, 6 phôi lỗi xảy ra trong 2 trường hợp sau:
• Lỗi phân loại phôi tam giác thành phôi vuông xảy ra với số lượng là 4 trên 10 phôi đầu tiên.
Hình 5.6. Lỗi nhận diện sai loại phôi
Nguyên nhân: do hệ số tính xấp xỉ đa giác nhỏ (0,01), thay thế bằng 0,025 thì hệ thống đã nhận diện đúng.
• Lỗi phân loại phôi tam giác, phôi không được gạt khi có tín hiệu cảm biến, số lượng phôi không được phân loại: 2
82
Hình 5.7. Lỗi không gạt phôi tam giác
• Phôi vuông cao:
• Hình dưới đây mô tả quá trình phân loại phôi vuông cao:
83
Hình 5.8a: Phôi vuông được đặt vào băng tải chuẩn bị tới vị trí phân loại.