Mục lục:

Điều khiển vòng đèn Neopixel bằng cảm biến cử chỉ: 3 bước (có hình ảnh)
Điều khiển vòng đèn Neopixel bằng cảm biến cử chỉ: 3 bước (có hình ảnh)

Video: Điều khiển vòng đèn Neopixel bằng cảm biến cử chỉ: 3 bước (có hình ảnh)

Video: Điều khiển vòng đèn Neopixel bằng cảm biến cử chỉ: 3 bước (có hình ảnh)
Video: ESP32 - Micropython - Bài 17: Điều khiển LED RGB WS2821B 2024, Tháng mười một
Anonim
Image
Image
Lắp ráp & tải lên
Lắp ráp & tải lên

Trong hướng dẫn này, chúng ta sẽ chơi với cảm biến cử chỉ (APDS-9960) và vòng neopixel để tìm hiểu cách kết hợp cả hai bằng cách sử dụng Arduino UNO.

Sản phẩm cuối cùng sẽ phản hồi các cử chỉ trái - phải bằng cách tạo hoạt ảnh chuyển động của đèn led sang phải hoặc sang trái và các cử chỉ lên xuống bằng cách thay đổi màu sắc của đèn led.

Trong các bước tiếp theo, bạn sẽ tổng quan ngắn gọn về danh sách bộ phận và cách kết nối các bộ phận. Và sau đó chúng tôi sẽ xem xét mã từng bước để tìm hiểu cách nó hoạt động.

Bước 1: Các thành phần

1. Arduino UNO

2. cáp usb

3. Cảm biến cử chỉ APDS9960 (https://www.sparkfun.com/products/12787)

4. Vòng led neopixel 24 led (https://www.adafruit.com/product/1586)

5. cáp breadboard nam-nữ, nam-nam

6. breadboard

7. Nguồn điện 5 V cho vòng led (tôi đang sử dụng pin 4 trở lại)

8. Để gắn vòng neopixel vào breadboard, bạn sẽ cần hàn ba chân nam vào nó: GND, PWR và chốt điều khiển. Đối với điều này, bạn sẽ cần một mỏ hàn và chất trợ dung

Các thành phần chính ở đây là cảm biến cử chỉ APDS-9960 và vòng 24 neopixel. Bạn có thể chuyển đổi Arduinos, nguồn cấp điện cáp USB và breadboard khác nhau như bạn muốn.

Bước 2: Lắp ráp và tải lên

cuộc họp

Trước khi bắt đầu, hãy đảm bảo rằng bạn có tất cả các thành phần trên bảng. Chúng tôi sẽ có một số bước hay để làm theo:). Tôi cũng đã đính kèm giản đồ Fritzing dưới dạng một bức tranh và cũng ở định dạng Fritzing.

1. Hàn 3 chân đực vào vòng neopixel (GND, PWR, chân điều khiển)

2. gắn vòng neopixel vào breadboard

3. gắn cảm biến APDS9960 vào breadboard

4. kết nối mặt đất: bộ pin, arduino UNO, APDS9960 và neopixel với mặt đất bảng mạch

5. kết nối nguồn: arduino UNO 3V với chân nguồn APDS9960, neopixel với nguồn pin

6. kết nối chân điều khiển neopixel với chân arduino D6

7. kết nối SDA và SCL của APDS9960 với A4 và A5 tương ứng

8. kết nối chân ngắt APDS9960 với arduino D2

Tải lên mã

Trước hết, bạn sẽ cần tải xuống và cài đặt các thư viện arduino cần thiết:

1. Thư viện nhẫn Neopixel:

2. Thư viện cảm biến cử chỉ:

Nếu bạn không biết cách cài đặt thư viện arduino, hãy xem hướng dẫn này.

Sau khi bạn đã tải xuống và cài đặt các thư viện ở trên, bạn có thể sao chép hoặc tải xuống kho lưu trữ arduino của tôi tại đây: https://github.com/danionescu0/arduino và chúng tôi sẽ sử dụng bản phác thảo này: https://github.com/danionescu0 / arduino / tree / master / project / neopixel_ring_gestures

Trong phần tiếp theo, tôi sẽ nhúng mã trực tiếp vào hướng dẫn này, vì vậy nếu bạn thích, bạn có thể sao chép và dán nó từ đó.

Cuối cùng kết nối arduino với máy tính bằng cáp usb, lắp pin 1,5 v vào bộ pin và tải bản phác thảo lên arduino.

Bước 3: Nó hoạt động như thế nào?

Trong phần cuối cùng này, chúng ta sẽ tìm hiểu cách các thành phần này được kết hợp với nhau, cách sử dụng thư viện của chúng và cách tôi đã cấu trúc mã của mình:

Trước tiên, chúng ta hãy xem nhanh qua cảm biến và các phương thức API thư viện neopixel mà chúng ta sẽ sử dụng

1. Neopixel API từ adafruit

Từ thư viện này, chúng tôi sẽ sử dụng các phương pháp kiểm soát màu sắc của đèn led riêng lẻ và áp dụng chúng

- bao gồm thư viện:

#bao gồm

- khai báo thư viện

#define NEOPIXED_CONTROL_PIN 6

#define NUM_LEDS 24 dải Adafruit_NeoPixel = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800);

- khởi tạo

#typical bên trong khối thiết lập

void setup () {strip.begin (); # có thể một số thứ khác ở đây #…. }

- làm sáng các pixel riêng lẻ sau đó áp dụng tất cả các sửa đổi cho dải (kết xuất nó theo một cách)

# thiết lập pixel 0 thành màu đỏ

dải.setPixelColor (0, dải. Color (255, 0, 0)); # thiết lập pixel 1 thành màu xanh lục dải.setPixelColor (1, dải. Color (0, 255, 0)); # thiết lập pixel 2 thành màu xanh lam strip.setPixelColor (2, strip. Color (0, 0 255)); dải.show ();

2. Cảm biến cử chỉ APDS 9960

Từ thư viện này, chúng tôi sẽ sử dụng chức năng "cử chỉ đọc". Chức năng này sẽ có thể phân biệt giữa các lệnh trái phải, lên xuống, gần xa. Có một mẹo ở đây, chúng tôi sẽ không yêu cầu cảm biến liên tục về cử chỉ cuối cùng được cảm nhận. Bo mạch có khả năng "ping" thông qua một ngắt mà một cử chỉ đã được tìm thấy.

- bao gồm thư viện, tương tự như neopixel

- khai báo thư viện chân ngắt và cờ ngắt

#define APDS9960_INT 2

SparkFun_APDS9960 apds = SparkFun_APDS9960 (); int isr_flag = 0;

- khởi tạo thư viện, thường là bên trong chức năng thiết lập

void setup ()

{# khai báo chân ngắt là INPUT và gắn một hàm vào nó pinMode (APDS9960_INT, INPUT); mountInterrupt (0, ngắt quãng, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("Hoàn thành khởi tạo APDS-9960"); } else {Serial.println ("Đã xảy ra lỗi trong quá trình init APDS-9960!"); } # khởi tạo những thứ khác có thể}

- xác định hàm ngắt, ở đây chúng tôi sẽ chỉ đặt một cờ

void pauseRoutine () {

isr_flag = 1; }

- bên trong chức năng vòng lặp, kiểm tra cờ định kỳ để xem liệu cử chỉ đã được phát hiện chưa

void loop ()

{# kiểm tra cờ if (isr_flag == 1) {# nếu cờ được đặt, hãy loại bỏ ngắt, thực hiện xử lý cần thiết bên trong hàm handleGesture () #, sau đó đặt lại cờ và gắn lại ngắt detachInterrupt (0); handleGesture (); isr_flag = 0; mountInterrupt (0, ngắt quãng, FALLING); } # một số mã khác có thể ở đây}

- định nghĩa hàm handleGesture () nơi chúng ta có thể yêu cầu cử chỉ cuối cùng

void handleGesture () {

# nếu không có cử chỉ nào là khả dụng trở lại, đây chỉ là một kiểm tra an toàn nếu (! apds.isGestureAvailable ()) {return; } # đọc cử chỉ cuối cùng, so sánh với những cử chỉ đã biết và in chuyển đổi thông báo (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); nghỉ; case DIR_DOWN: Serial.println ("XUỐNG"); nghỉ; case DIR_LEFT: Serial.println ("TRÁI"); nghỉ; case DIR_RIGHT: Serial.println ("RIGHT"); nghỉ; case DIR_FAR: Serial.println ("FAR"); nghỉ; }}

Bây giờ chúng ta hãy xem toàn bộ mã đang hoạt động:

Vì vậy, tôi đã giải thích về API cơ sở của cảm biến cử chỉ và vòng neopixel, bây giờ hãy tập hợp mọi thứ lại với nhau:

Thuật toán chạy như thế này:

- khởi tạo các thư viện (xem đoạn mã ở trên)

- tạo một mảng cường độ dẫn được gọi là "ledStates". Mảng này sẽ chứa 24 cường độ led được sắp xếp theo cách giảm dần từ 150 đến 2

- bên trong vòng lặp chính kiểm tra xem chân ngắt đã được sửa đổi chưa nếu vậy đã đến lúc thay đổi hoạt ảnh hoặc màu sắc của đèn led

- hàm "handleGesture ()" kiểm tra cử chỉ cuối cùng và gọi hàm "toggleColor" cho các cử chỉ UP -DOWN hoặc đặt một biến chung "ledDirection" cho các cử chỉ LEFT - RIGHT

- hàm "toggleColor ()" chỉ đơn giản là thay đổi một biến toàn cục có tên "colorSelection" bằng một trong các giá trị 0, 1, 2

- cũng bên trong hàm vòng lặp chính một hàm khác có tên "animateLeds ();" được gọi là. Hàm này kiểm tra xem 100 mili giây đã trôi qua chưa và nếu có, nó sẽ xoay các đèn led bằng cách sử dụng hàm "xoayLeds ()" và sau đó vẽ lại chúng

- "RotationLeds ()" sẽ "xoay" các led về phía trước hoặc phía sau bằng cách sử dụng một mảng khác được gọi là "IntermediateLedStates".

"Hiệu ứng" xoay sẽ như thế này:

# sau khi khởi tạo

{150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # sau xoayLeds () được gọi là {0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # sau khi xoayLeds () được gọi lại {0, 0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # và như thế

Đối với điều này, đầu tiên hãy tạo mảng mới và sao chép cường độ dẫn cũ trên các vị trí mới (tăng vị trí hoặc giảm nó). Sau đó, nó ghi đè mảng "ledStates" bằng "middleLedStates" để quá trình này sẽ tiếp tục sau 100 mili giây nữa.

#include "SparkFun_APDS9960.h"

#include "Adafruit_NeoPixel.h"

#include "Wire.h" #define NEOPIXED_CONTROL_PIN 6 #define NUM_LEDS 24 #define APDS9960_INT 2 #define LED_SPEED_STEP_INTERVAL 100 Adafruit_NeoPixel dải = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL) SparkFun_APDS9960 apds = SparkFun_APDS9960 (); unsigned long lastLedChangeTime = 0; ngắn ledDirection = 0; màu ngắnSelection = 0; byte ledStates = {150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; int isr_flag = 0; void setup () {Serial.begin (9600); Serial.println ("Chương trình đã bắt đầu"); dải.begin (); pinMode (APDS9960_INT, INPUT); mountInterrupt (0, ngắt quãng, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("Hoàn thành khởi tạo APDS-9960"); } else {Serial.println ("Đã xảy ra sự cố trong quá trình init APDS-9960!"); } lastLedChangeTime = millis (); Serial.println ("Nhập thành công"); } void loop () {if (isr_flag == 1) {detachInterrupt (0); handleGesture (); isr_flag = 0; mountInterrupt (0, ngắt quãng, FALLING); } animateLeds (); } voidruptRoutine () {isr_flag = 1; } / ** * Thao tác này sẽ xử lý các cử chỉ từ cảm biến APDS9960 * Cử chỉ Lên và Xuống sẽ gọi hàm toggleColor * Cử chỉ Trái và Phải sẽ thay đổi hoạt ảnh dẫn đầu * / void handleGesture () {if (! Apds.isGestureAvailable ()) {return; } switch (apds.readGesture ()) {case DIR_UP: Serial.println ("LÊN"); toggleColor (); nghỉ; case DIR_DOWN: Serial.println ("XUỐNG"); toggleColor (); nghỉ; case DIR_LEFT: ledDirection = 1; Serial.println ("TRÁI"); nghỉ; case DIR_RIGHT: ledDirection = -1; Serial.println ("PHẢI"); nghỉ; case DIR_FAR: ledDirection = 0; Serial.println ("FAR"); nghỉ; }} / ** * Thay đổi màu led hiện tại * Mỗi lần gọi hàm này sẽ thay đổi trạng thái của led * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1; } else if (colorSelection == 1) {colorSelection = 2; } else {colorSelection = 0; }} / ** * Hoạt ảnh sẽ chạy sau một mili giây LED_SPEED_STEP_INTERVAL * Đầu tiên, hàm rotLeds được gọi, sau đó màu sắc của đèn led được đặt bằng cách sử dụng dải api * / void animateLeds () {if (millis () - lastLedChangeTime <LED_SPEED_STEP_INTERVAL) {return; } xoayLeds (); for (int i = 0; i <NUM_LEDS; i ++) {strip.setPixelColor (i, getColor (ledStates )); dải.show (); } lastLedChangeTime = millis (); } / ** * Sử dụng mảng phụ "IntermediateLedStates", cường độ của led được làm động * Đầu tiên, các giá trị từ "ledStates" được sao chép trên "IntermediateLedStates" như vậy * hãy xác định mảng "ledStates" là {100, 80, 60, 0, 0, 0} và ledDirection là 1 * thì sau khi hàm này được gọi là "ledStates", mảng là {0, 100, 80, 60, 0, 0} mô phỏng hiệu ứng xoay * / void xoayLeds () {byte trung gianLedStates [NUM_LEDS]; for (int i = 0; i <NUM_LEDS; i ++) {IntermediateLedStates = 0; } for (int i = 0; i <NUM_LEDS; i ++) {if (ledDirection == 1) {if (i == NUM_LEDS -1) {IntermediateLedStates [0] = ledStates ; } else {IntermediateLedStates [i + 1] = ledStates ; }} else {if (i == 0) {IntermediateLedStates [NUM_LEDS - 1] = ledStates ; } else {IntermediateLedStates [i - 1] = ledStates ; }}} for (int i = 0; i <NUM_LEDS; i ++) {ledStates = IntermediateLedStates ; }} uint32_t getColor (int Cường độ) {switch (colorSelection) {case 0: return strip. Color (cường độ, 0, 0); trường hợp 1: dải trả về. Color (0, cường độ, 0); default: return dải. Color (0, 0, cường độ); }}

Tôi hy vọng bạn thích điều này, bạn có thể sử dụng phần bình luận để đặt câu hỏi cho tôi.

Đề xuất: