Съдържание:

Управление на Neopixel Led пръстен със сензор за жестове: 3 стъпки (със снимки)
Управление на Neopixel Led пръстен със сензор за жестове: 3 стъпки (със снимки)

Видео: Управление на Neopixel Led пръстен със сензор за жестове: 3 стъпки (със снимки)

Видео: Управление на Neopixel Led пръстен със сензор за жестове: 3 стъпки (със снимки)
Видео: WS2812 [Программируемая светодиодная лента] 2024, Ноември
Anonim
Image
Image
Сглобяване и качване
Сглобяване и качване

В този урок ще играем със сензор за жестове (APDS-9960) и неопикселов пръстен, за да научим как да ги комбинираме с помощта на Arduino UNO.

Крайният продукт ще реагира на жестове наляво -надясно, като анимира движението на светодиода надясно или наляво, и на жестове нагоре -надолу, като промени цвета на светодиодите.

В следващите стъпки ще прегледате накратко списъка с части и как да свържете компонентите. След това ще прегледаме кода стъпка по стъпка, за да научим как работи.

Стъпка 1: Компоненти

1. Arduino UNO

2. usb кабел

3. APDS9960 сензор за жестове (https://www.sparkfun.com/products/12787)

4. 24 светодиоден неопикселов светодиоден пръстен (https://www.adafruit.com/product/1586)

5. кабели мъжки-женски, мъжки-мъжки

6. макет

7. 5 V захранване за светодиодния пръстен (използвам 4 батерия назад)

8. За да прикрепите неопикселовия пръстен към макетната платка, ще трябва да запоите към него три мъжки щифта: GND, PWR и контролен щифт. За това ще ви трябва поялник и флюс

Основните компоненти тук са сензор за жестове APDS-9960 и 24 неопикселов пръстен. Можете да превключвате различни arduinos, usb кабели, захранващи устройства и платки, както желаете.

Стъпка 2: Сглобяване и качване

Монтаж

Преди да започнете, уверете се, че имате всички компоненти на масата си. Ще имаме няколко хубави стъпки, които да следваме:). Също така съм приложил схемата на Fritzing като картина и също във формат за фризиране.

1. Запояйте 3 мъжки щифта към неопикселовия пръстен (GND, PWR, контролен щифт)

2. прикрепете неопикселовия пръстен към макета

3. прикрепете сензора APDS9960 към макета

4. свържете основите: акумулаторна батерия, arduino UNO, APDS9960 и неопиксел към масата

5. свържете захранването: arduino UNO 3V към APDS9960 захранващ щифт, неопиксел към захранването на батерията

6. свържете неопикселовия контролен щифт към щифта arduino D6

7. свържете SDA и SCL на APDS9960 към A4 и A5 съответно

8. свържете прекъсващия щифт APDS9960 към arduino D2

Качване на код

На първо място ще трябва да изтеглите и инсталирате необходимите библиотеки arduino:

1. Библиотека с пръстени Neopixel:

2. Библиотека със сензори за жестове:

Ако не знаете как да инсталирате arduino библиотеки, вижте този урок.

След като изтеглите и инсталирате библиотеките по -горе, можете да клонирате или изтеглите моето хранилище на arduino, намиращо се тук: https://github.com/danionescu0/arduino, и ние ще използваме тази скица: https://github.com/danionescu0 /arduino/дърво/майстор/проекти/neopixel_ring_gestures

В следващия раздел ще вградя кода директно в този урок, така че ако искате, можете да го копирате и поставите от там.

Накрая свържете компютъра arduino с помощта на usb кабел, поставете батерии от 1.5 v в батерията и качете скицата в arduino.

Стъпка 3: Как работи?

В тази последна част ще научим как тези компоненти се комбинират заедно, как да използвам техните библиотеки и как съм структурирал моя код:

Първо нека да разгледаме набързо сензора и методите на API на библиотеката neopixel, които ще използваме

1. Neopixel API от adafruit

От тази библиотека ще използваме методите, които контролират цвета на отделните светодиоди и ги прилагаме

- включете библиотеката:

#включва

- декларирайте библиотеката

#дефинирайте NEOPIXED_CONTROL_PIN 6

#define NUM_LEDS 24 Adafruit_NeoPixel strip = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800);

- инициализирайте

#типично в блока за настройка

void setup () {strip.begin (); # може би някои други неща тук …. }

- осветявайте отделни пиксели, след което прилагайте всички модификации към лентата (изобразявайте я по някакъв начин)

# настройте пиксел 0 да бъде червен

strip.setPixelColor (0, strip. Color (255, 0, 0)); # настройте пиксел 1 на зелена лента.setPixelColor (1, strip. Color (0, 255, 0)); # настройте пиксел 2 да бъде синя лента.setPixelColor (2, strip. Color (0, 0 255)); strip.show ();

2. APDS 9960 сензор за жестове

От тази библиотека ще използваме функцията "четене на жест". Тази функция ще може да прави разлика между командите отляво-надясно, нагоре-надолу, отблизо. Тук има трик, няма да питаме сензора непрекъснато за последния възприет жест. Таблото има способността да "пингва" чрез прекъсване, че е намерен жест.

- включете библиотеката, подобна на neopixel

- декларирайте библиотеката за прекъсване и флаг за прекъсване

#дефинирайте APDS9960_INT 2

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

- инициализирайте библиотеката, обикновено вътре във функцията за настройка

void setup ()

{ # декларираме прекъсването на щифта като INPUT и прикачваме към него функция pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("APDS-9960 инициализация завършена"); } else {Serial.println ("Нещо се обърка по време на инициализация на APDS-9960!"); } # може да инициализира други неща}

- дефинирайте функцията за прекъсване, тук ще зададем само флаг

void interruptRoutine () {

isr_flag = 1; }

- вътре във функцията за цикъл проверявайте периодично флага, за да видите дали е открит жест

void loop ()

{ # проверете флага if (isr_flag == 1) { # ако флагът е зададен, премахнете прекъсването, направете необходимата обработка вътре в handleGesture () функция # и след това нулирайте флага и отново прикрепете прекъсването detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } # може би друг код тук}

- дефинирайте handleGesture () функция, където можем да поискаме последния жест

void handleGesture () {

# ако няма наличен жест за връщане, това е само сигурна проверка дали (! apds.isGestureAvailable ()) {return; } # чете последния жест, сравнява се с известните и отпечатва превключвател на съобщение (apds.readGesture ()) {случай DIR_UP: Serial.println ("НАГОРЕ"); прекъсване; регистър DIR_DOWN: Serial.println ("НАДОЛУ"); прекъсване; регистър DIR_LEFT: Serial.println ("НАЛЯВО"); прекъсване; регистър DIR_RIGHT: Serial.println ("RIGHT"); прекъсване; случай DIR_FAR: Serial.println ("FAR"); прекъсване; }}

Сега нека видим целия код в действие:

Така че обясних основния API на сензора за жестове и неопикселовия пръстен, сега нека сглобим нещата:

Алгоритъмът работи така:

- инициализирайте библиотеките (вижте кода по -горе)

- създайте масив от светодиодни интензитети, наречен "ledStates". Този масив ще съдържа 24 светодиодни интензитета, които са подредени по низходящ начин от 150 до 2

- вътре в основния цикъл проверете дали прекъсващият щифт е променен, ако е така, че е време да промените анимацията или цвета на светодиода

- функцията "handleGesture ()" проверява последния жест и извиква функцията "toggleColor" за жестове НАГОРЕ -НАДОЛУ или задава глобална променлива "ledDirection" за жестове НАЛЯВО - НАДЯСНО

- функцията "toggleColor ()" просто променя глобална променлива с име "colorSelection" с една от стойностите 0, 1, 2

- също вътре в функцията main loop друга функция, наречена "animateLeds ();" е наречен. Тази функция проверява дали са преминали 100 милисекунди и ако е така, тя завърта светодиодите с помощта на функцията "rotateLeds ()" и след това ги прекроява

- "rotateLeds ()" ще "завърти" светодиодите напред или назад, като използва друг масив, наречен "intermediateLedStates".

„Ефектът“на въртенето ще изглежда така:

# след инициализация

{150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # след rotateLeds () се нарича {0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # след rotateLeds () се извиква отново {0, 0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # и така нататък

За това първо създава новия масив и копира старите интензитети на светодиодите върху новите позиции (увеличете позицията или я намалете). След това той презаписва масива "ledStates" с "intermediateLedStates", така че процесът ще продължи след още 100 милисекунди.

#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 strip = Adafruit_NeoPixel (NUM_LEDS, NEOPRZ_PROPOZ_NOPOZBE_ NEOPIX_0; SparkFun_APDS9960 apds = SparkFun_APDS9960 (); unsigned long lastLedChangeTime = 0; кратко ledDirection = 0; short colorSelection = 0; байт 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, 0}; int isr_flag = 0; void setup () {Serial.begin (9600); Serial.println ("Програмата стартира"); strip.begin (); pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("APDS-9960 инициализация завършена"); } else {Serial.println ("Нещо се обърка по време на инициализация на APDS-9960!"); } lastLedChangeTime = millis (); Serial.println ("Init успешно"); } void loop () {if (isr_flag == 1) {detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } animateLeds (); } void interruptRoutine () {isr_flag = 1; } / ** * Това ще обработва жестове от сензора APDS9960 * Жестовете нагоре и надолу ще извикат toggleColor функцията * Жестовете наляво и надясно ще променят анимацията на LED * / void handleGesture () {if (! Apds.isGestureAvailable ()) {return; } превключвател (apds.readGesture ()) {случай DIR_UP: Serial.println ("НАГОРЕ"); toggleColor (); прекъсване; регистър DIR_DOWN: Serial.println ("НАДОЛУ"); toggleColor (); прекъсване; случай DIR_LEFT: ledDirection = 1; Serial.println ("НАЛЯВО"); прекъсване; случай DIR_RIGHT: ledDirection = -1; Serial.println ("НАДЯСНО"); прекъсване; случай DIR_FAR: ledDirection = 0; Serial.println ("FAR"); прекъсване; }} / ** * Промяна на текущия цвят на светодиодите * При всяко извикване на тази функция ще се променя състоянието на светодиодите * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1; } иначе ако (colorSelection == 1) {colorSelection = 2; } else {colorSelection = 0; }} / ** * Анимацията ще се изпълнява след LED_SPEED_STEP_INTERVAL millis * Първо се извиква функцията rotateLeds, след това цветовете на светодиодите се задават с помощта на лентата api * / void animateLeds () {if (millis () - lastLedChangeTime <LED_SPEED_STEP_INTERVAL) {return; } rotateLeds (); for (int i = 0; i <NUM_LEDS; i ++) {strip.setPixelColor (i, getColor (ledStates )); strip.show (); } lastLedChangeTime = millis (); } /** * Използвайки вторичен масив "intermediateLedStates", интензитетите на светодиодите се анимират * Първо стойностите от "ledStates" се копират в "intermediateLedStates", така че * нека седнем масивът "ledStates" е {100, 80, 60, 0, 0, 0} и ledDirection е 1 *, след като тази функция се нарече "ledStates" масивът е {0, 100, 80, 60, 0, 0} симулиращ ефект на въртене */ void rotateLeds () {байт intermediateLedStates [NUM_LEDS]; for (int i = 0; i <NUM_LEDS; i ++) {intermediateLedStates = 0; } за (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 ; }}} за (int i = 0; i <NUM_LEDS; i ++) {ledStates = intermediateLedStates ; }} uint32_t getColor (int интензитет) {switch (colorSelection) {случай 0: връщане на лента. Color (интензитет, 0, 0); случай 1: връщаща лента. Цвет (0, интензитет, 0); по подразбиране: връщаща лента. Цвет (0, 0, интензитет); }}

Надявам се, че това ви е харесало, можете да използвате секцията за коментари, за да ми задавате въпроси.

Препоръчано: