- Các thành phần bắt buộc
- Giới thiệu về APDS-9960 Digital Proximity RGB & Cảm biến cử chỉ
- Sơ đồ mạch
- Lập trình Arduino cho Cử chỉ và Cảm biến Màu sắc
Ngày nay hầu hết các điện thoại đều có tính năng điều khiển bằng cử chỉ để mở hoặc đóng bất kỳ ứng dụng nào, bắt đầu nghe nhạc, tham gia cuộc gọi… Đây là một tính năng rất tiện dụng để tiết kiệm thời gian và điều khiển bất kỳ thiết bị nào bằng cử chỉ cũng rất tuyệt. Trước đây, chúng tôi đã sử dụng gia tốc kế để xây dựng robot điều khiển bằng cử chỉ và chuột không khí được điều khiển bằng cử chỉ. Nhưng hôm nay chúng ta học cách giao tiếp cảm biến cử chỉ APDS9960 với Arduino. Cảm biến này cũng có cảm biến RGB để phát hiện màu sắc, cũng sẽ được sử dụng trong hướng dẫn này. Vì vậy, bạn không cần phải sử dụng các cảm biến riêng biệt để phát hiện cử chỉ và màu sắc, mặc dù cảm biến chuyên dụng để phát hiện màu sắc đã có sẵn - cảm biến màu TCS3200 mà chúng tôi đã sử dụng với Arduino để xây dựng máy phân loại màu.
Các thành phần bắt buộc
- Arduino UNO
- APDS9960 RGB và Cảm biến cử chỉ
- LCD 16x2
- Công tắc DPDT
- Nồi 100K và điện trở 10K
- Cáp nhảy
Giới thiệu về APDS-9960 Digital Proximity RGB & Cảm biến cử chỉ
APDS9960 là một cảm biến đa chức năng. Nó có thể phát hiện cử chỉ, ánh sáng xung quanh và các giá trị RGB trong ánh sáng. Cảm biến này cũng có thể được sử dụng như một cảm biến khoảng cách và chủ yếu được sử dụng trong điện thoại thông minh, để tắt màn hình cảm ứng trong khi tham gia cuộc gọi.
Cảm biến này bao gồm bốn điốt quang. Các điốt quang này phát hiện năng lượng IR phản xạ được truyền bởi đèn LED trên bo mạch. Vì vậy, bất cứ khi nào thực hiện bất kỳ cử chỉ nào thì năng lượng hồng ngoại này sẽ bị cản trở và phản xạ trở lại cảm biến, lúc này cảm biến sẽ phát hiện thông tin (hướng, vận tốc) về cử chỉ và chuyển nó thành thông tin kỹ thuật số. Cảm biến này có thể được sử dụng để đo khoảng cách của chướng ngại vật bằng cách phát hiện ánh sáng hồng ngoại phản xạ. Nó có các bộ lọc chặn tia UV và IR để cảm nhận màu RGB và nó tạo ra dữ liệu 16 bit cho mỗi màu.
Chân ra của cảm biến APDS-9960 được hiển thị bên dưới. Cảm biến này hoạt động trên giao thức truyền thông I 2 C. Nó tiêu thụ dòng điện 1µA và được cung cấp bởi 3.3V nên hãy cẩn thận và không kết nối nó với chân 5V. Chân INT ở đây là chân ngắt, được sử dụng để điều khiển giao tiếp I 2 C. Và chân VL là chân nguồn tùy chọn cho đèn LED trên bo mạch nếu jumper PS không được kết nối. Nếu jumper PS được đóng thì bạn chỉ cần cấp nguồn cho chân VCC, nó sẽ cung cấp nguồn cho cả hai - mô-đun và đèn LED hồng ngoại.
Sơ đồ mạch
Kết nối APDS960 với Arduino rất đơn giản. Chúng tôi sẽ sử dụng nút DPDT để chuyển đổi giữa hai chế độ Cảm biến RGB và Cảm biến cử chỉ. Đầu tiên, các chân giao tiếp I2C SDA và SCL của APDS9960 được kết nối tương ứng với chân Arduino A4 và A5. Như đã nêu trước đó, điện áp hoạt động cho cảm biến là 3,3v vì vậy, VCC và GND của APDS9960 được kết nối với 3,3V và GND của Arduino. Chân ngắt (INT) của APDS9960 được kết nối với chân D2 của Arduino.
Đối với LCD, chân dữ liệu (D4-D7) được kết nối với chân kỹ thuật số D6-D3 của Arduino và chân RS và EN được kết nối với D6 và D7 của Arduino. V0 của LCD được kết nối với nồi và nồi 100K được sử dụng để điều khiển độ sáng của LCD. Đối với các nút DPDT, chúng tôi chỉ sử dụng 3 chân. Chân thứ hai được kết nối với chân D7 của Arduino để làm đầu vào và hai chân còn lại được kết nối với GND và VCC theo sau là một điện trở 10K.
Lập trình Arduino cho Cử chỉ và Cảm biến Màu sắc
Phần lập trình rất đơn giản và dễ dàng và chương trình hoàn chỉnh với video demo được đưa ra ở cuối hướng dẫn này.
Đầu tiên, chúng ta cần cài đặt một thư viện do Sparkfun tạo ra. Để cài đặt thư viện này, hãy điều hướng đến Sketch-> Bao gồm Thư viện-> Quản lý Thư viện.
Bây giờ trong thanh tìm kiếm, gõ “Sparkfun APDS9960” và nhấp vào nút cài đặt khi bạn thấy thư viện.
Và chúng tôi đã sẵn sàng để đi. Bắt đầu nào.
Vì vậy, trước hết chúng ta phải bao gồm tất cả các tệp tiêu đề bắt buộc. Tệp tiêu đề đầu tiên LiquidCrystal.h được sử dụng cho các chức năng LCD. Tệp tiêu đề thứ hai Wire.h được sử dụng cho giao tiếp I 2 C và tệp cuối cùng SparkFun_APDS996.h được sử dụng cho cảm biến APDS9960.
#include
Bây giờ trong các dòng tiếp theo, chúng ta đã xác định các chân cho nút và màn hình LCD.
const int buttonPin = 7; const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Trong phần tiếp theo, chúng tôi đã xác định một macro cho chân ngắt được kết nối trên chân kỹ thuật số 2 và một nút thay đổiState cho trạng thái hiện tại của nút và isr_flag cho quy trình dịch vụ ngắt.
#define APDS9960_INT 2 int buttonState; int isr_flag = 0;
Tiếp theo, một đối tượng được tạo cho SparkFun_APDS9960, để chúng ta có thể truy cập các chuyển động cử chỉ và tìm nạp các giá trị RGB.
SparkFun_APDS9960 apds = SparkFun_APDS9960 (); uint16_t ambient_light = 0; uint16_t red_light = 0; uint16_t green_light = 0; uint16_t blue_light = 0;
Trong chức năng thiết lập , dòng đầu tiên là lấy giá trị từ nút (thấp / cao) và dòng thứ hai & thứ ba xác định ngắt và chân nút làm đầu vào. apds.init () khởi chạy cảm biến APDS9960 và lcd.begin (16,2) khởi chạy màn hình LCD.
void setup () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.begin (16, 2); }
Trong hàm vòng lặp , dòng đầu tiên nhận các giá trị từ nút và lưu trữ nó trong biến buttonState được xác định trước đó. Bây giờ trong các dòng tiếp theo, chúng tôi đang kiểm tra các giá trị từ nút, nếu nó cao thì chúng tôi bật cảm biến ánh sáng và nếu nó thấp thì khởi chạy cảm biến cử chỉ.
Các attachInterrupt () là một hàm dùng để ngắt bên ngoài mà trong trường hợp này là cảm biến của ngắt. Đối số đầu tiên trong hàm này là số ngắt. Trong Arduino UNO, có hai chân kỹ thuật số chân ngắt - 2 và 3 được ký hiệu là INT.0 và INT.1. Và chúng tôi đã kết nối nó với pin 2 nên chúng tôi đã viết số 0 ở đó. Đối số thứ hai gọi hàmruptRoutine () được định nghĩa sau. Đối số cuối cùng là FALLING để nó sẽ kích hoạt ngắt khi chân đi từ cao xuống thấp. Tìm hiểu thêm về Ngắt Arduino tại đây.
void loop () { buttonState = digitalRead (buttonPin); if (buttonState == HIGH) { apds.enableLightSensor (true); }
Trong phần tiếp theo, chúng tôi kiểm tra ghim nút. Nếu nó cao thì hãy bắt đầu quá trình cho cảm biến RGB. Sau đó kiểm tra xem cảm biến ánh sáng có đang đọc các giá trị hay không. Nếu nó không thể đọc các giá trị thì trong trường hợp đó, hãy in " Lỗi khi đọc các giá trị đèn". Và nếu nó có thể đọc các giá trị sau đó, hãy so sánh giá trị của ba màu và màu nào cao nhất, in màu đó ra màn hình LCD.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("Lỗi khi đọc các giá trị ánh sáng"); } else { if (red_light> green_light) { if (red_light> blue_light) { lcd.print ("Red"); chậm trễ (1000); lcd.clear (); } ……. ………..
Trong các dòng tiếp theo, hãy kiểm tra lại pin của nút và nếu nó ở mức thấp thì là quá trình Cảm biến cử chỉ. Sau đó, kiểm tra isr_flag và nếu nó là 1 thì hàm detachInterrupt () được gọi. Chức năng này dùng để tắt ngắt. Dòng tiếp theo gọi hàm handleGesture () được định nghĩa sau này. Trong các dòng tiếp theo, định nghĩa isr_flag bằng 0 và đính kèm ngắt.
else if (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; mountInterrupt (0, ngắt quãng, FALLING); } }
Tiếp theo là hàmruptRoutine () . Hàm này được sử dụng để biến isr_flag biến 1, để dịch vụ ngắt có thể được khởi tạo.
void ngắtRoutine (). { isr_flag = 1; }
Hàm handleGesture () được định nghĩa trong phần tiếp theo. Chức năng này trước hết kiểm tra tính khả dụng của cảm biến cử chỉ. Nếu có sẵn thì nó sẽ đọc các giá trị cử chỉ và kiểm tra cử chỉ đó là (LÊN, XUỐNG, PHẢI, TRÁI, FAR, GẦN) và in các giá trị tương ứng ra màn hình LCD.
void handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); chậm trễ (1000); lcd.clear (); phá vỡ; case DIR_DOWN: lcd.print ("DOWN"); chậm trễ (1000); lcd.clear (); phá vỡ; case DIR_LEFT: lcd.print ("LEFT"); chậm trễ (1000); lcd.clear (); phá vỡ; case DIR_RIGHT: lcd.print ("RIGHT"); chậm trễ (1000); lcd.clear (); phá vỡ; case DIR_NEAR: lcd.print ("GẦN"); chậm trễ (1000); lcd.clear (); phá vỡ; trường hợp DIR_FAR: lcd.print ("FAR"); chậm trễ (1000); lcd.clear (); phá vỡ; mặc định: lcd.print ("KHÔNG"); chậm trễ (1000); lcd.clear (); } } }
Cuối cùng, tải mã lên Arduino và đợi cảm biến khởi tạo. Bây giờ trong khi nút TẮT có nghĩa là nó đang ở chế độ cử chỉ. Vì vậy, hãy thử di chuyển tay của bạn theo các hướng trái, phải, lên, xuống. Đối với cử chỉ xa , hãy giữ tay của bạn ở khoảng cách 2-4 inch so với cảm biến trong 2-3 giây và lấy tay ra. Và đối với cử chỉ gần, hãy giữ tay của bạn cách xa cảm biến, sau đó đưa tay lại gần và loại bỏ nó.
Bây giờ, hãy BẬT nút để đưa nó vào chế độ cảm biến màu sắc và đưa từng vật thể màu đỏ, xanh lam và xanh lục đến gần cảm biến. Nó sẽ in màu của đối tượng.