3.2.1. Thiết kế sơ đồ khối hệ thống
Sơ đồ khối bao gồm: bộ điều khiển trung tâm là Arduino, khối thu và xử lý tín hiệu camera, khối cảm biến, sau đó điều khiển động cơ servo và hiển thị kết quả ra màn hình LCD.
Hình 3.5. Sơ đồ khối
Chức năng các khối:
• Khối xử lý trung tâm: là bộ xử lý chính, nhận dữ liệu từ khối cảm biến và khối xử lý tín hiệu hình ảnh, sau đó xử lý và phân tích điều khiển khối động cơ servo và hiển thị kết quả. Sử dụng vi xử lý Arduino Uno
• Khối thu và xử lý tín hiệu hình ảnh: thu thập tín hiệu hình ảnh thực tế từ camera xử lý và chuyển về tín hiệu điện và gửi dữ liệu cho khối xử lý trung tâm. Ở đây dùng camera Kinect để làm khối thu tín hiệu hình ảnh thực tế.
• Khối cảm biến: có chức năng gửi tín hiệu điện cho khối điều khiển khi có vật cản đi qua. Sử dụng cảm biến hồng ngoại LM393.
• Khối nguồn: cung cấp nguồn điện cho toàn bộ hệ thống
• Khối hiển thị: hiển thị kết quả nhận được từ bộ xử lý trung tâm. Sử dụng màn hình LCD16x2.
• Khối động cơ: được vận hành bởi khối điều khiển. Sử dụng động cơ motor và servo SG90.
43
3.2.2. Sơ đồ khối hệ thống a. Khối xử lý trung tâm a. Khối xử lý trung tâm
Giới thiệu vi điều khiển Arduino Uno
Arduino Uno là một bảng mạch vi điều khiển nguồn mở dựa trên vi điều khiển Microchip ATmega328 được phát triển bởi Arduino.cc. Bảng mạch được trăng bị các bộ chân đầu vào/ đầu ra Digital và Analog có thể giao tiếp với các bảng mạch mở rộng khác nhau. Mạch Arduino Uno thích hợp cho những bạn mới tiếp cận và đam mê về điện tử, lập trình, … Dựa trên nền tảng mở do Arduino.cc cung cấp các bạn dễ dàng xây dựng cho mình một dự án nhanh nhất (lập trình Robot, xe tự hành, điều khiển bật tắt led, …).
Hình 3.6. Mạch Arduino Uno
- Một số tính năng của Aruino Uno
• Arduino Uno đi kèm với giao diện USB tức là cổng USB được thêm vào bo mạch Arduino để phát triển giao tiếp nối tiếp với máy tính.
• Arduino đi kèm với một tính năng điều chỉnh tích hợp giúp giữ điện áp trong tầm kiểm soát khi thiết bị được kết nối với thiết bị bên ngoài.
• Chân reset trên Arduino để thiết lập lại toàn bộ và đưa chương trình đang chạy trở về ban đầu. Chân reset này hữu ích khi Arduino bị treo khi đang chạy chương trình.
• Có 14 chân I/O digital và 6 chân analog được tích hợp trên Arduino cho phép kết nối bên ngoài với bất kỳ mạch nào với Arduino. Các chân này cung cấp sự linh hoạt và dễ sử dụng cho các thiết bị bên ngoài có thể được kết nối thông qua các chân này.
44
• Có 6 chân analog được đánh dấu là A0 đến A5 và có độ phân giải 10 bit. Các chân này đo từ 0 đến 5V, tuy nhiên, chúng có thể được cấu hình ở phạm vi cao bằng cách sử dụng chức năng analogReference() và chân ISF.
Thông số cơ bản:
Bảng 3.4. Thông số cơ bản Arduino Uno
Thông số Đặc trưng
Chip điều khiển ATmega328P
Điện áp hoạt động 5V
Điện áp đầu vào (khuyên dùng) 7-12V Điện áp đầu vào (giới hạn) 6-20V
Số chân Digital 14 (trong đó 6 chân đầu ra PWM)
Số chân PWM Digital 6
Số chân Analog 6
Dòng điện DC trên mỗi chân I/O 20 mA Dòng điện DC trên chân 3.3V 50 mA
Flash Memory 32 KB (ATmega328P)
SRAM 2 KB (ATmega328P)
EEPROM 1 KB (ATmega328P)
Tốc độ thạch anh 16 MHz
LED_BUILTIN 13
Ưu điểm của Arduino Uno:
Có rất nhiều dòng Vi Điều Khiển trên thị trường để sử dụng cho dự án. Nhưng để sử dụng và thực hiện được cần đòi hỏi người thực hiện có kiến thức và kinh nghiệm. Và hầu hết các dòng vi điều khiển được giới hạn sử dụng trong windows là chủ yếu.
• Với Arduino, phần mềm hỗ trợ đa nền tảng, có thể chạy trên các hệ điều hành Windows, Macintosh OSX và Linux.
• Chi phí Arduino thấp.
• Phần mềm lập trình IDE dễ sử dụng, kể cả cho người mới bắt đầu.
• Phần mềm Arduino được xuất bản dưới dạng các công cụ mã nguồn mở, ngôn ngữ có thể được mở rộng thêm bởi các chuyên gia lập trình viên có kinh nghiệm thông qua các thư viện ngôn ngữ C++.
• Hỗ trợ kết nối các thiết bị ngoại vi đa dạng thông qua các module.
45
• Sử dụng, biên dịch và nạp chương trình thông qua máy tính dễ dàng.
b. Khối thu và xử lý tín hiệu hình ảnh
• Khối thu hình ảnh
Hình 3.7. Thiết bị Kinect
Kinect là sản phẩm của Microsoft dựa trên công nghệ camera được phát triển bởi PrimeSense. Khả năng hiểu được cử chỉ con người của Kinect dựa trên hai đặc tính chính sau: thông tin về độ sâu ảnh (depth map), khả năng phát hiện và bám theo đặc tính cơ thể người (body skeleton tracking).
Hình 3.8. Bên trong thiết bị Kinect
Kinect gồm có: RGB camera, cảm biến độ sâu (3D Depth Sensors), dãy microphone (Multi-array Mic) và động cơ điều khiển góc ngẩng (Motorized Tilt).
Tại sao chọn Kinect?
o Một trong những đặc tính quan trọng nhất của Kinect đó là thu về giá trị độ sâu hay giá trị khoảng cách tới vật thể trong thế giới thực.
o Kinect là giá cả khá rẻ (khoảng 140$ trên 1 sản phẩm) cho thiết bị có khả năng cung cấp các thông tin 3D với chất lượng chấp nhận được.
46
Vì vấn đề xử lý ảnh cần nhiều tài nguyên và tốc độ xử lý cao, nên ta không sử dụng vi điều khiển thông thường để xử lý. Chính vì vậy, nhóm đã sử dụng laptop làm khối xử lý trung tâm.
Máy tính của nhóm có CPU Intel core i7 tộc độ xử lý lên tới 2.8 GHz chính vì vậy việc sử dụng vào mô hình là hợp lý. Máy tính hỗ trợ rất tốt việc giao tiếp các thiết bị ngoại vi và model từ bên ngoài.
Hình 3.9. Laptop CPU Intel
c. Khối cảm biến
• Cảm biến hồng ngoại LM393
Hình 3.10. Cảm biến hồng ngoại LM393
Thông tin về cảm biến tiệm cận:
Ánh sáng module cảm biến là khả năng thích nghi với môi trường, có một cặp truyền và nhận tia hồng ngoại.
Ứng dụng:
o Nó có thể được sử dụng rộng rãi trong robot tránh chướng ngại vật, tránh chướng ngại vật xe, số dòng, và như vậy nhiều lần.
47
o Được sử dụng trong các thiết bị trống trộm
o Tia hồng ngoại được dùng trong thiết bị cửa tự động, nhận diện chuyển động trong một vùng điểm nhất định do da người có thể hấp thụ tốt năng lượng của tia hồng ngoại.
o Và một số kỹ thuật đo nhiệt độ bằng hồng ngoại được dùng chủ yếu trong quan sự, và ứng dụng công nghiệp. Kỹ thuật này hiện cũng đang được ứng dụng và dần quen thuộc với thị trường dân sự như: máy ảnh trên xe hơi hay cảm biến cho cửa tự động
Thông số kỹ thuật:
o Bộ so sánh sử dụng LM393, làm việc ổn định
o Khoảng cách làm việc hiệu quả 2 ~ 5cm, điện áp làm việc là 3,3 V đến 5V. Độ nhạy sáng của cảm biến được điều chỉnh bằng chiết áp.
o Các module đã được so sánh điện áp ngưỡng thông qua chiết áp, nếu sử dụng ở chế độ thông thường, xin vui lòng không tự ý điều chỉnh chiết áp.
Hình 3.11. Kết nối giữa Arduino và cảm biến LM393
d. Khối nguồn
48
Bảng 3.5. Chọn nguồn
Loại nguồn Hình ảnh Thông số
5V 2A Điện áp đầu vào: 220VAC
Điện áp đầu ra: 5VDC Dòng ra max: 2A Jack cắm: 5.5×2.1 Nguồn Kinect
12V 2A
Điện áp đầu vào: 100÷240VAC Điện áp đầu ra: 12VDC
Dòng ra max: 1,08A Jack cắm: USB
24V 3A Điện áp đầu vào: 220VAC
Điện áp đầu ra: 24VDC Dòng ra max: 3A Jack cắm: 5.5×2.1
e. Khối hiển thị
• Giới thiệu LCD 16x2
Ngày nay, thiết bị hiển thị LCD (Liquid Crystal Display) được sử dụng trong rất nhiều các ứng dụng của vi điều khiển. LCD có rất nhiều ưu điểm so với các dạng hiển thị khác: nó có khả năng hiển thị kí tự đa dạng, trực quan (chữ, số và kí tự đồ họa), dễ dàng đưa vào mạch ứng dụng theo nhiều giao thức giao tiếp khác nhau, tốn rất ít tài nguyên hệ thống và giá thành rẻ,.…
Hình 3.12. Màn hình LCD 16x2
Thông số kỹ thuật LCD 16×2
49
o LCD 16×2 có 16 chân trong đó 8 chân dữ liệu (D0 – D7) và 3 chân điều khiển (RS, RW, EN), 5 chân còn lại dùng để cấp nguồn và đèn nền cho LCD 16×2.
o Các chân điều khiển giúp ta dễ dàng cấu hình LCD ở chế độ lệnh hoặc chế độ dữ liệu.
o Chúng còn giúp ta cấu hình ở chế độ đọc hoặc ghi.
• Module I2C Arduino
Hình 3.13. Module I2C
LCD có quá nhiều nhiều chân gây khó khăn trong quá trình đấu nối và chiếm dụng nhiều chân trên vi điều khiển.
Module I2C LCD ra đời và giải quyết vấn để này cho bạn.
Thay vì phải mất 6 chân vi điều khiển để kết nối với LCD 16×2 (RS, EN, D7, D6, D5 và D4) thì module IC2 bạn chỉ cần tốn 2 chân (SCL, SDA) để kết nối.
Module I2C hỗ trợ các loại LCD sử dụng driver HD44780(LCD 16×2, LCD 20×4,…) và tương thích với hầu hết các vi điều khiển hiện nay.
Ưu điểm
o Tiết kiệm chân cho vi điều khiển.
o Dễ dàng kết nối với LCD.
Thông số kĩ thuật
o Điện áp hoạt động: 2.5-6V DC.
o Hỗ trợ màn hình: LCD1602, 1604, 2004 (driver HD44780).
o Giao tiếp: I2C.
o Địa chỉ mặc định: 0X27 (có thể điều chỉnh bằng ngắn mạch chân A0/A1/A2).
50
o Tích hợp biến trở xoay điều chỉnh độ tương phản cho LCD.
Hình 3.14. Giao tiếp giữa Arduino Uno và LCD16x2
f. Khối động cơ
• Động cơ motor
Động cơ một chiều DC (DC là viết tắt của “Direct Current Motors”) là động cơ điều khiển bằng dòng có hướng xác định xác định hay nói dễ hiểu hơn thì đây là loại động cơ chạy bằng nguồn điện áp DC – điện áp 1 chiều (khác với điện áp AC xoay chiều). Đầu dây ra của động cơ thường gồm có hai dây (dây nguồn – VCC và dây tiếp đất - GND). Động cơ DC là một động cơ một chiều với cơ năng quay liên tục.
Hình 3.15. Takanawa 555 Metal Gear Motor
Thông số kỹ thuật:
o Tốc độ 40-80 vòng/phút
o Model: động cơ DC RS-555
51
o Điện áp định mức: DC12V
o Tốc độ không tải: 3000-3500 r/min
o Điện áp định mức: DC24V
o Tốc độ không tải: 7000-8000 r/min
o Chiều dài trục: 16mm
o Trọng lượng: 500g
Hình 3.16. Kết nối Arduino Uno và động cơ DC
• Động cơ Servo SG90
Hình 3.17. Động cơ Servo SG90
Động cơ servo SG90 (Góc Quay 180) là servo phổ biến dùng trong các mô hình điều khiển nhỏ và đơn giản như cánh tay robot. Động cơ có tốc độ phản ứng nhanh, được tích hợp sẵn driver điều khiển động cơ, dễ dàng điều khiển góc quay bằng phương pháp điều độ rộng xung PWM.
Công dụng chính của động cơ servo là đạt được góc quay chính xác trong khoảng từ 90o – 180o. Việc điều khiển này có thể ứng dụng để lái robot, di chuyển các tay máy lên xuống, quay một cảm biến để quét khắp phòng…
52
Thông số kỹ thuật:
o Khối lượng: 9g
o Kích thước: 22,2x11,8x32 mm
o Momen xoắn: 1,8kg/cm
o Tốc độ hoạt động: 60 độ trong 0,1 giây
o Điện áp hoạt động: 4,8V(~5V)
o Nhiệt độ hoạt động: 0 ºC – 55 ºC
o Kết nối dây màu đỏ với 5V, dây màu đen với GND, dây màu vàng với chân phát xung của vi điều khiển. Ở chân xung cấp một xung từ 1ms-2ms theo để điều khiển góc quay theo ý muốn.
Hình 3.18. Kết nối Arduino Uno và động cơ servo
• Module điều khiển động cơ L298
Module điều khiển động cơ L298 (mạch cầu H L298N) dùng để điều khiển các loại động cơ DC, động cơ bước và động cơ servo.
Module L298 có thể điều khiển 2 động cơ DC hoặc 1 động cơ bước, có 4 lỗ nằm ở 4 góc thuận tiện cho người sử dụng cố định vị trí của module.
Có gắn tản nhiệt chống nóng cho IC, giúp IC có thể điều khiển với dòng đỉnh đạt 2A. IC L298N được gắn với các đi ốt trên board giúp bảo vệ vi xử lý chống lại các dòng điện cảm ứng từ việc khởi động/ tắt động cơ.
53
Hình 3.19. Mô đun L298
Thông số kỹ thuật:
o IC chính: L298-Dual Full Bridge Driver
o Điện áp đầu vào: 5~39VDC
o Công suất tối đa: 25W 1 cầu
o Dòng tối đa cho mỗi cầu H: 2A
o Mức điện áp logic: Low-0.3V~1.5V, High:2.3V~Vss
o Kích thước: 43x43x27mm
Chức năng các chân của L298:
Bốn chân INPUT: IN1, IN2, IN3, IN4 được nối lần lượt với các chân 5, 7, 10, 12 của L298. Đây là các chân nhận tín hiệu điều khiển.
Bốn chân OUTUT: OUT1, OUT2, OUT3, OUT4 (tương ứng với các chân INPUT) được nối với các chân 2, 3, 13, 14 của L298. Các chân này sẽ được nối với động cơ.
Hai chân ENA và ENB dùng để điều khiển mạch cầu H trong L298. Nếu ở mức logic “1” (nối với nguồn 5V) cho phép mạch cầu H hoạt động, nếu ở mức logic “0” thì mạch cầu H không hoạt động.
Một chân cấp nguồn cho mạch điều khiển (Vss) và chân GND.
54
Hình 3.20. Kết nối Kinect với Laptop
55
3.2.3. Sơ đồ giải thuật
56
57
58
3.3. Tính toán nhận diện, phân loại sản phẩm
3.3.1. Cấu hình Camera Kinect trên thiết bị Windows
Kinect hỗ trợ tiếp nhận điều khiển từ người dùng mà không cần chạm vào thiết bị nhưng thiết bị này chỉ được thiết kế để sử dụng tốt nên thiết bị Xbox cho nhu cầu giải trí để sử dụng và việc lập trình với Kinect trên phần cứng khác thì không dễ dàng, cụ thể là với hệ điều hành Windows. Để giải quyết vấn đề này ta cần cài đặt Driver Kinect thông qua bộ cài Microsoft Kinect SDK do tập đoàn Microsoft phát triển, và sử dụng thư viện mã nguồn mở OpenNI để khai thác dữ liệu từ cảm biến Kinect.
Cài đặt KinectSDK v2.0 và bộ Deverloptoolkit:
Hình 3.25. Cài đặt KinectSDK và bộ DeverlopToolkit
Driver Kinect for Windows:
Hình 3.26. Driver Kinect for Windows
Sử dụng công cụ Depth Basics-D2D trong bộ Developer Toolkit (một ví dụ về ứng dụng của Kinect trong việc đo khoảng cách – độ sâu trong 1 khung hình)
59
Hình 3.27. Công cụ Depth Basics-D2D
Hình 3.28. Biểu diễn độ sâu trong 1 khung hình
Hình ảnh biểu diễn độ sâu trong 1 khung hình mà Camera đang quét, độ sâu sẽ ngày càng lớn khi các vật thể ở xa dần tương ứng với màu sáng hơn và ngược lại.
3.3.2. Xử lý dữ liệu trên Kinect
a. Xử lý dữ liệu hình ảnh được truy cập từ camera RGB
Kinect SDK cung cấp dữ liệu hình ảnh dưới dạng mảng lớn gồm các phần tử 8 bit, trong đó mỗi pixel của hình ảnh được ánh xạ thành 4 vị trí (3 kênh màu và 1 kênh trống (Alpha)) của mảng này; ánh xạ được xảy ra theo thứ tự liên tiếp từ kênh xanh dương sang kênh đỏ (B, G, R, rỗng). Công thức tính độ dài mảng: [8]
Length.arr = image.height × image.width × 4 (3.16)
Trong đó:
60
• image.height: chiều cao của ảnh (chiều dọc, đơn vị: pixel)
• image.width: chiều rộng của ảnh (chiều ngang, đơn vị: pixel)
• Hệ số ánh xạ 4: đại diện cho 4 kênh màu (R (Red) – đỏ, G (Green) – xanh lá cây, B (Blue)– xanh dương, A (Alpha) – rỗng).
Hình 3.29. Mảng dữ liệu hình ảnh truy cập từ camera RGB
Mối quan hệ giữa các cấu trúc (mảng và ma trận) có thể được mô tả bởi các phương trình dưới đây, thông qua giá trị tại một vị trí cho trước trong mảng (index), ta tìm được vị trí của một pixel tương ứng: [8]
pixel.y=floor(index/(image.width × 4)) (3.17)
pixel.x=floor(index/4-(pixel.y × image.width)) (3.18)
Và phép toán nghịch đảo (tìm một vị trí trên mảng khi cho một vị trí pixel x, y):
index=(pixel.y*image.width+pixel.x) × 4 (3.19)
Trong đó:
• Index: vị trí phần tử mảng
• Pixel.y: tọa độ y của pixel tương ứng với phần tử index