Съдържание:

Фантастична LED шапка: 5 стъпки (със снимки)
Фантастична LED шапка: 5 стъпки (със снимки)

Видео: Фантастична LED шапка: 5 стъпки (със снимки)

Видео: Фантастична LED шапка: 5 стъпки (със снимки)
Видео: Стоян колев се кара с яница 2024, Ноември
Anonim
Image
Image
Модна LED шапка
Модна LED шапка

Винаги съм искал да направя проект на Arduino, но никога не съм имал страхотни идеи за него, докато семейството ми не беше поканено на фантастично парти с шапка. С две седмици време за изпълнение ми беше любопитно дали мога да планирам и изпълня чувствителна към движение LED шапка за анимация. Оказа се, че мога! Вероятно малко прекалих, но общата стойност на проекта струваше около 80 долара. С експерименти и малко кодиране бихте могли да го направите за по -малко.

Целта с шапката беше следната:

  1. Накарайте набор от светлини да се движат от централната предна част на шапката към задната част, по една светлина от всяка страна
  2. Променете скоростта на движение на светлината, продиктувана от наклона на шапката отпред назад
  3. Оставете светлините да се обърнат, когато лентата на шапката е наклонена надолу (т.е. подражава на ефекта на гравитацията върху светлините)
  4. Променете цвета въз основа на наклона на шапката отляво надясно
  5. Чувствайте шокове и показвайте специален ефект
  6. Усетете, че потребителят се върти, и покажете специален ефект
  7. Нека се съдържа изцяло в шапката

Стъпка 1: Необходими части

Необходими части
Необходими части
Необходими части
Необходими части
Необходими части
Необходими части

Използвах следните основни компоненти (включени са и асоциирани Amazon връзки):

  • Teensy LC микроконтролер - Избрах това пред обикновен Arduino поради малкия му размер и той има специална връзка за управление на моите светодиоди, както и силна библиотечна и обществена поддръжка.
  • Позиционен сензор, базиран на Bosch BNO055 - честно казано един от първите, на които намерих документация. Има много по -евтини опции, но след като разберете Bosch, това прави много за вас, което иначе би трябвало да направите в кода
  • WS2812 адресируема LED лента - Избрах дължина 1 метър с 144 светодиода на метър. Наличието на тази плътност помага на светлината да изглежда по -скоро сякаш се движи, а не отделни елементи да светят последователно.

И следните малки компоненти:

  • Шапка - всяка шапка с лента за шапка е подходяща. Това е шапка за 6 долара от местен магазин. Ако има шев отзад, ще бъде по -лесно да прокарате окабеляването. Обърнете внимание дали лентата на шапката е залепена, тъй като това също ще причини някои допълнителни трудности. Тази е ушита по горната част, но долната част се изтегля лесно нагоре.
  • 4.7K ома резистори
  • 3x AAA кутия за батерии - използвайки 3 AAA батерии, извежда напрежение точно в обхвата, който електрониката иска, което опростява нещата. AAA се вписва в шапка по -лесно от AA и все още има страхотно време за изпълнение.
  • Тел с малък габарит - използвах някакъв плътен проводник, който полагах от предишен светодиоден проект.
  • Поялник и спойка
  • Някои спандекс, който съответства на вътрешния цвят на шапката и конец

Предлага се, но по избор:

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

Стъпка 2: Променете шапката

Променете шапката
Променете шапката
Променете шапката
Променете шапката
Променете шапката
Променете шапката
Променете шапката
Променете шапката

Ще ви трябва място в шапката за монтиране на електрониката и място за батерията. Съпругата ми работи с дрехи професионално, затова я помолих за съвет и помощ. В крайна сметка създадохме два джоба със спандекс. Първият по -малък джоб отпред е заострен като самата шапка, така че когато електрониката е инсталирана, позиционният сензор се държи на място доста добре, но може лесно да се отстрани, ако е необходимо. Вторият джоб към гърба е да държи батерията на място.

Джобовете бяха засети с конец, съответстващ на цвета на шапката, всички дълги на линията на короната. В зависимост от стила на шапката и материалите тя е изработена от YMMV с тази техника.

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

Накрая отворихме шева на гърба на шапката, ако беше покрита от лентата. Пъхнахме кабелния сноп, който идваше със светодиодите през този шев и подредихме първия светодиод в лентата, който е точно на шева. След това увихме светодиодите около шапката и изрязахме лентата, така че последният светодиод да е точно до първия. LED лентата може да се държи на място само с лентата за шапка, но в зависимост от вашата лента и материал може да се наложи да закрепите светодиодите чрез шиене или залепване.

Стъпка 3: Свържете го

Свържете го
Свържете го

Платката Teensy и светодиодите ще работят с мощност от 3.3v до 5v. Ето защо избрах да използвам 3 батерии AAA, изходното напрежение от 4.5v е добре в този диапазон и те имат много време за работа по начина, по който съм програмирал светодиодите да работят. Трябва да можете да прекарате повече от 8 часа време на работа.

Окабеляване на захранването

Свързах положителните и отрицателните проводници от кутията за батерии и светодиодите заедно, след което запоех върху Teensy на подходящи места. Положителят от батерията трябва да бъде свързан към горния десен щифт на Teensy в диаграмата (обозначен с Vin на дъската), а отрицателният може да бъде свързан към всеки щифт с надпис GND. Удобно има такъв директно от противоположната страна на дъската или точно до щифта Vin. Пълната диаграма на извеждане на платката може да се намери в долната част на тази страница. В някои случаи хартиеното копие е включено, когато поръчвате дъската.

Ако планирате да използвате код, който има включени само няколко светодиода едновременно, можете да захранвате светодиодите от самия Teensy, като използвате 3.3v изход и GND, но ако се опитате да издърпате твърде много енергия, можете повреди дъската. Така че, за да си осигурите най -много възможности, най -добре е да свържете светодиодите директно към източника на батерията.

Окабеляване на светодиодите

Избрах Teensy LC за този проект, тъй като той има щифт, който улеснява свързването на адресируеми светодиоди. В долната част на платката щифтът, който е втори от левите огледала Pin #17, но също така има 3.3v върху него. Това се нарича изтегляне и на други платки ще трябва да включите резистор, за да осигурите това напрежение. В случая с Teensy LC можете просто да свържете от този щифт направо към вашия проводник за данни за светодиоди.

Окабеляване на сензора за положение

Някои от наличните платки BNO055 са много по -строги по напрежение и искат само 3.3v. Поради това свързах Vin на платката BNO055 от специалния 3.3v изход на Teensy, който е 3 -ият щифт надолу вдясно. След това можете да свържете GND на BNO055 към всеки GND на Teensy.

Сензорът за положение BNO055 използва I2c, за да разговаря с Teensy. I2c изисква издърпвания, така че свързах два 4,7K ома резистора от 3.3v изход на Teensy към пинове 18 и 19. След това свързах щифт 19 към SCL щифта на платката BNO055 и 18 към щифта SDA.

Съвети/трикове за окабеляване

За да направя този проект, използвах плътна тел, а не жила. Едно от предимствата на плътния проводник е при запояване към прототипни платки като тези. Можете да свалите малко жица, да я огънете на 90 градуса и да я поставите през дъното на един от терминалите, така че отрязаният край на проводника да стърчи над дъската ви. След това имате нужда само от малко количество спойка, за да я задържите към терминала, и можете лесно да отрежете излишъка.

Плътната тел може да бъде по -трудна за работа, тъй като има тенденция да иска да остане така, както е огъната. За този проект обаче това беше предимство. Изрязах и оформих проводниците си по такъв начин, че ориентацията на позиционния сензор да е последователна, докато вкарвам и изваждам електрониката от шапката за ощипване и програмиране.

Стъпка 4: Програмиране

Сега, когато всичко е сглобено, ще ви е необходим съвместим с Arduino инструмент за програмиране. Използвах действителната IDE на Arduino (работи с Linux, Mac и PC). Ще ви е необходим и софтуерът Teensyduino за взаимодействие с дъската Teensy. Този проект използва силно библиотеката FastLED за програмиране на цветовете и позицията на светодиодите.

Калибриране

Първото нещо, което ще искате да направите, е да отидете в отличното хранилище на GitHub на Kris Winer за BNO055 и да изтеглите неговата скица BNO_055_Nano_Basic_AHRS_t3.ino. Инсталирайте този код с работещ сериен монитор и той ще ви каже дали платката BNO055 правилно влиза в мрежа и преминава своите самотестове. Той също така ще ви преведе през калибрирането на BNO055, което ще ви даде по -последователни резултати по -късно.

Първи стъпки с Fancy LED скица

Кодът за шапката Fancy LED е специално приложен, а също и в моето хранилище на GitHub. Планирам да направя още корекции на кода и те ще бъдат публикувани в репото на GitHub. Файлът тук отразява кода, когато тази инструкция е публикувана. След като изтеглите и отворите скицата, ще трябва да промените няколко неща. Повечето от важните стойности, които трябва да се променят, са в горната част като #define изявления:

Ред 24: #define NUM_LEDS 89 - променете това на действителния брой светодиоди на вашата LED лента

Ред 28: #define SERIAL_DEBUG false - вероятно ще искате да направите това вярно, така че да можете да видите изхода на серийния монитор

Код за откриване на позиция

Откриването на позиция и по -голямата част от настройките ви започва от ред 742 и преминава през 802. Получаваме данни за Pitch, Roll и Yaw от сензора за положение и ги използваме за задаване на стойности. В зависимост от това как е монтирана вашата електроника, може да се наложи да ги промените. Ако монтирате сензора за положение с чипа към върха на шапката и стрелката до X, отпечатана на дъската, насочена към предната част на шапката, трябва да видите следното:

  • Пич кима с глава
  • Рол е накланяне на главата ви, напр. докоснете ухото си до рамото
  • Яа в коя посока. сте изправени (на север, на запад и т.н.).

Ако дъската ви е монтирана в различна ориентация, ще трябва да смените Pitch/Roll/Yaw, за да се държат така, както бихте искали.

За да регулирате настройките на Roll, можете да промените следните стойности #define:

  • ROLLOFFSET: със стабилна шапка и възможно най -центрирана, ако ролката не е 0, променете това с разликата. Т.е. ако виждате Roll при -20, когато шапката ви е центрирана, направете това 20.
  • ROLLMAX: максималната стойност, която да се използва за измерване на ролката. Най -лесно се намира, като носите шапката и преместите дясното си ухо към дясното рамо. За да направите това, докато използвате серийния монитор, ще ви е необходим дълъг USB кабел.
  • ROLLMIN: най -ниската стойност, която да използвате за измерване на Roll, когато накланяте главата си наляво

По същия начин, за Pitch:

  • MAXPITCH - максималната стойност, когато гледате нагоре
  • MINPITCH - минималната стойност, когато гледате надолу
  • PITCHCENTER - стойността на терена, когато гледате право напред

Ако зададете SERIALDEBUG на true в горната част на файла, трябва да видите текущите стойности за Roll/Pitch/Yaw изход към серийния монитор, за да помогнете за промяна на тези стойности.

Други параметри, които може да искате да промените

  • MAX_LED_DELAY 35 - най -бавното, което LED частицата може да се движи. Това е в милисекунди. Това е забавянето от преминаване от един светодиод към следващия в низа.
  • MIN_LED_DELAY 10 - на гладно, че LED частицата може да се движи. Както по -горе е в милисекунди.

Заключение

Ако сте стигнали толкова далеч, трябва да имате напълно функционираща и забавна LED шапка! Ако искате да направите повече с него, на следващата страница има разширена информация за промяна на настройките и извършване на ваши собствени неща. както и някои обяснения за това, което прави останалата част от моя код.

Стъпка 5: Разширени и незадължителни: Вътре в кода

Откриване на удар и центрофугиране

Откриването на удар/завъртане се извършва с помощта на сензорните функции с висок G на BNO055. Можете да промените чувствителността му със следните редове в initBNO055 ():

  • Ред #316: BNO055_ACC_HG_DURATION - колко време трябва да продължи събитието
  • Ред #317: BNO055_ACC_HG_THRESH - колко силно трябва да бъде въздействието
  • Ред #319: BNO055_GYR_HR_Z_SET - праг на скоростта на въртене
  • Ред #320: BNO055_GYR_DUR_Z - колко време трябва да продължи ротацията

И двете стойности са 8 битови двоични, в момента въздействието е настроено на B11000000, което е 192 от 255.

Когато се открие удар или завъртане, BNO055 задава стойност, която кодът търси точно в началото на цикъла:

// Откриване на всички задействани прекъсвания, т.е. поради висок G байт intStatus = readByte (BNO055_ADDRESS, BNO055_INT_STATUS); if (intStatus> 8) {въздействие (); } else if (intStatus> 0) {spin (); }

Потърсете линията void impact () по -горе в кода, за да промените поведението при удар, или void spin (), за да промените поведението на въртене.

Помощници

Създадох проста помощна функция (void setAllLeds ()) за бързо настройване на всички светодиоди в един цвят. Използвайте го, за да ги изключите всички:

setAllLeds (CRGB:: Черен);

Или можете да изберете всеки цвят, разпознат от библиотеката FastLED:

setAllLeds (CRGB:: Red);

Има и функция fadeAllLeds (), която ще затъмни всички светодиоди с 25%.

Класът на частиците

За да опростя значително окабеляването, исках да използвам един низ от светодиоди, но те да се държат като множество струни. Тъй като това беше първият ми опит, исках да го направя възможно най -опростен, така че третирам един низ като два, като средният светодиод (и) е там, разделянето ще бъде. Тъй като можем да имаме четно или нечетно число, трябва да отчетем това. Започвам с някои глобални променливи:

/ * * Променлива и контейнери за светодиоди */ CRGB светодиоди [NUM_LEDS]; статичен без знак int curLedDelay = MAX_LED_DELAY; static int centerLed = NUM_LEDS / 2; static int maxLedPos = NUM_LEDS / 2; static bool oddLeds = 0; статична bool частицаDir = 1; статичен bool speedDir = 1; без подпис дълъг dirCount; unsigned long hueCount;

И малко код в setup ():

ако (NUM_LEDS % 2 == 1) {oddLeds = 1; maxLedPos = NUM_LEDS/2; } else {oddLeds = 0; maxLedPos = NUM_LEDS/2 - 1; }

Ако имаме нечетни числа, искаме да използваме 1/2 точка като средна, в противен случай искаме 1/2 точка - 1. Това е лесно да се види с 10 или 11 светодиода:

  • 11 светодиода: 11/2 с цели числа трябва да се оценят на 5. и компютрите да броят от 0. Така че 0 - 4 е едната половина, 6 - 10 е другата половина, а 5 е между тях. Ние третираме #5 в този случай, сякаш е част и от двете, тоест това е #1 и за двата виртуални низа от светодиоди
  • 10 светодиода: 10/2 е 5. Но тъй като компютрите броят от 0, трябва да премахнем един. Тогава имаме 0 - 4 за едната половина и 5 - 9 за другата. #1 за първия виртуален низ ще бъде 4, а #1 за втория виртуален низ ще бъде #5.

След това в нашия код на частици трябва да преброим от общата ни позиция до действителните позиции на LED низа:

if (oddLeds) {Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; } else {Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; }

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

if (particleDir) {if ((currPos == NUM_LEDS/2) && oddLeds) {currPos = 0; } иначе ако ((currPos == NUM_LEDS/2 - 1) && (! oddLeds)) {currPos = 0; } else {currPos ++; }} else {if ((currPos == 0) && oddLeds) {currPos = centerLed; } иначе ако ((currPos == 0) && (! oddLeds)) {currPos = centerLed - 1; } else {currPos--; }}

Затова използваме предвидената посока (particleDir), за да изчислим кой светодиод трябва да светне след това, но също така трябва да вземем предвид дали сме достигнали или реалния край на LED низа, или нашата централна точка, която също действа като край за всеки от виртуалните низове.

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

if (particleDir) {if (oddLeds) {Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; } else {Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; }} else {if (oddLeds) {Pos1 = centerLed - currPos; Pos2 = centerLed + currPos; } else {Pos1 = centerLed - currPos; Pos2 = (centerLed -1) + currPos; }} светодиоди [Pos1] = CHSV (currHue, 255, 255); светодиоди [Pos2] = CHSV (currHue, 255, 255); FastLED.show ();}

Защо изобщо да правим това клас? Така е, това е доста ясно и не е нужно да бъде в клас. Въпреки това имам бъдещи планове да актуализирам кода, за да позволя да се появят повече от една частица наведнъж, а някои да работят обратно, докато други продължават напред. Мисля, че има някои наистина големи възможности за откриване на спин, използвайки множество частици.

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