Съдържание:
Видео: Управление на Neopixel Led пръстен със сензор за жестове: 3 стъпки (със снимки)
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-30 07:52
В този урок ще играем със сензор за жестове (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, интензитет); }}
Надявам се, че това ви е харесало, можете да използвате секцията за коментари, за да ми задавате въпроси.
Препоръчано:
Най -лесният начин да направите робот за управление на жестове: 7 стъпки (със снимки)
Най -лесният начин да направите робот за управление на жестове: Управлявайте играчки като супергерой. Научете как да направите автомобил, управляван с жестове. Това е как да направите автомобил, управляван с жестове. По принцип това е просто приложение на 3-осен жироскоп MPU-6050, акселерометър. Можете да направите още много неща
Скелетен бот за управление на жестове - 4WD Херкулесова мобилна роботизирана платформа - Arduino IDE: 4 стъпки (със снимки)
Скелетен бот за управление на жестове - 4WD Херкулесова мобилна роботизирана платформа - Arduino IDE: Превозно средство за управление на жестове, направено от Seeedstudio Skeleton Bot - 4WD Hercules Mobile Robotic Platform. Забавлявайки се много по време на периода на управление на епидемията от коронарен вирус у дома. Мой приятел ми даде 4WD Херкулесова мобилна роботизирана платформа като нова
Калидоскоп с пръстен NeoPixel: 8 стъпки (със снимки)
NeoPixel Ring Kaleidoscope: Имам удоволствието да ви предложа инструкции и файлове с материали за направата на LightLogo калейдоскоп! Мислех да направя това в продължение на много месеци и най -накрая разработих дизайн. Ако имате подобрения в този дизайн, моля, споделете! Ще
Кола за управление с жестове, използваща Mpu6050 и Arduino: 7 стъпки (със снимки)
Автомобил за управление на жестове, използващ Mpu6050 и Arduino: тук е автомобил за ръчен контрол с жестове, направен с помощта на mpu6050 и arduino. Използвам RF модул за безжична връзка
Кутия за годежен пръстен със светеща LED светлина: 9 стъпки (със снимки)
Кутия за годежен пръстен със светеща LED светлина: Взех най-важното решение в живота си: да помоля приятелката си да се ожени за мен. Тъй като моето момиче е перфектно, намерих перфектния годежен пръстен за нея с идеалния размер, който да пасне на безименния й пръст и добави перфектния камък, така че да я накара да