Оглавление:

Необычная светодиодная шляпа: 5 шагов (с изображениями)
Необычная светодиодная шляпа: 5 шагов (с изображениями)

Видео: Необычная светодиодная шляпа: 5 шагов (с изображениями)

Видео: Необычная светодиодная шляпа: 5 шагов (с изображениями)
Видео: Когда тренер - твой друг😏 2024, Ноябрь
Anonim
Image
Image
Необычная светодиодная шляпа
Необычная светодиодная шляпа

Я всегда хотел создать проект Arduino, но у меня никогда не было хороших идей для него, пока мою семью не пригласили на модную вечеринку со шляпами. Учитывая двухнедельный срок выполнения заказа, мне было любопытно, смогу ли я спланировать и реализовать чувствительную к движению светодиодную анимацию. Оказывается, я мог! Я, наверное, немного переборщил, но общая стоимость проекта составила около 80 долларов. Экспериментируя и немного кодируя, вы можете сделать это с меньшими затратами.

Гол в шляпе был следующий:

  1. Переместите набор огней от центра передней части шляпы к спинке, по одному свету с каждой стороны.
  2. Измените скорость движения света, продиктованную наклоном шляпы спереди назад.
  3. Разрешить свету поменять местами, когда полоса шляпы наклонена вниз (т. Е. Имитирует влияние гравитации на свет)
  4. Изменить цвет в зависимости от наклона шляпы слева направо
  5. Почувствуйте удары и покажите специальный эффект
  6. Почувствуйте, как владелец вращается, и покажите специальный эффект
  7. Держите это полностью в шляпе

Шаг 1: Необходимые детали

Необходимые детали
Необходимые детали
Необходимые детали
Необходимые детали
Необходимые детали
Необходимые детали

Я использовал следующие основные компоненты (включая неаффилированные ссылки Amazon):

  • Микроконтроллер Teensy LC - я выбрал его вместо обычного Arduino из-за его небольшого размера, и у него есть специальное соединение для управления моими светодиодами, а также сильная библиотека и поддержка сообщества.
  • Датчик положения на базе Bosch BNO055 - честно говоря, один из первых, на который я нашел документацию. Есть гораздо менее дорогие варианты, однако, как только вы разберетесь с Bosch, он сделает для вас многое, что в противном случае вам пришлось бы делать в коде.
  • Адресная светодиодная лента WS2812 - я выбрал длину 1 метр с 144 светодиодами на метр. Такая плотность помогает свету выглядеть как движущийся, а не отдельные элементы, загорающиеся последовательно.

И следующие второстепенные компоненты:

  • Шапка - подойдет любая шапка с ободком. Это шляпа за 6 долларов из местного магазина. Если сзади будет шов, будет легче провести проводку. Обратите внимание, приклеена ли лента на шляпе, так как это также вызовет дополнительные трудности. Этот сшивается по верху, а вот низ легко поднимается.
  • Резисторы 4,7 кОм
  • 3 батарейных отсека типа AAA - при использовании 3 батареек AAA напряжение выводится точно в том диапазоне, который требуется электронике, что упрощает работу. AAA влезает в шляпу проще, чем AA, и при этом имеет отличное время работы.
  • Провод небольшого калибра - я использовал твердый провод, который лежал у меня в предыдущем светодиодном проекте.
  • Паяльник и припой
  • Немного спандекса, соответствующего внутреннему цвету шляпы, и ниток

Предлагается, но необязательно:

  • Быстроразъемные соединения для проводов аккумулятора
  • Инструмент «Руки помощи», эти штуки очень маленькие и их сложно паять

Шаг 2: модифицируйте шляпу

Измените шляпу
Измените шляпу
Измените шляпу
Измените шляпу
Измените шляпу
Измените шляпу
Измените шляпу
Измените шляпу

Вам понадобится место в шляпе для установки электроники и место для батареи. Моя жена профессионально занимается одеждой, поэтому я попросил у нее совета и помощи. В итоге мы сделали два кармана из спандекса. Первый карман меньшего размера по направлению к передней части заострен, как и сама шляпа, так что при установке электроники датчик положения удерживается на месте довольно хорошо, но при необходимости может быть легко удален. Второй карман сзади предназначен для удержания аккумуляторной батареи на месте.

Карманы зашивались нитками цвета шляпы по всей длине короны. В зависимости от стиля головного убора и материалов, он выполнен в этой технике из ЮММВ.

Мы также обнаружили, что полоса шляпы засовывается с одной стороны, и в этом месте она была полностью пришита к шляпе. Пришлось удалить оригинальный шов, чтобы светодиоды пропустили под ленту. Во время сборки он удерживался на месте булавками, а затем прошился подходящей нитью по завершении.

Наконец, мы открыли шов на задней части шляпы, где она была закрыта лентой. Мы пропустили жгут проводов, идущий со светодиодами, через этот шов и выровняли первый светодиод в полосе так, чтобы он оказался прямо на шве. Затем мы обернули светодиоды вокруг шляпы и разрезали полосу так, чтобы последний светодиод был рядом с первым. Светодиодную ленту можно удерживать на месте только с помощью ленты для шляпы, однако, в зависимости от вашей ленты и материала, вам может потребоваться закрепить светодиоды с помощью шитья или склеивания.

Шаг 3: Подключите его

Подключите его
Подключите его

Плата Teensy и светодиоды будут работать с питанием от 3,3 до 5 В. Вот почему я решил использовать 3 батарейки AAA, выходное напряжение 4,5 В находится в этом диапазоне, и у них достаточно времени работы для того, как я запрограммировал работу светодиодов. Вы сможете выздороветь за 8 часов работы.

Подключение питания

Я соединил вместе положительный и отрицательный выводы батарейного отсека и светодиоды, а затем припаял их к Teensy в соответствующих местах. Положительный вывод от батареи должен быть подключен к верхнему правому контакту Teensy на схеме (обозначен Vin на плате), а отрицательный вывод может быть подключен к любому контакту с маркировкой GND. Удобно, чтобы он был прямо на противоположной стороне платы или рядом с выводом Vin. Полную распиновку платы можно найти внизу этой страницы. А в некоторых случаях к заказу платы прилагается бумажная копия.

Если вы планируете запускать код, в котором одновременно включается только несколько светодиодов, вы можете включить светодиоды от самого Teensy, используя выход 3,3 В и заземление, однако, если вы попытаетесь потреблять слишком много энергии, вы можете повредить доску. Таким образом, чтобы иметь больше возможностей, лучше всего подключить светодиоды напрямую к источнику батареи.

Подключение светодиодов

Я выбрал Teensy LC для этого проекта, так как у него есть штырь, который значительно упрощает подключение адресуемых светодиодов. В нижней части платы второй слева контакт соответствует контакту № 17, но на нем также присутствует напряжение 3,3 В. Это называется подтягиванием, и на других платах вам придется подключить резистор, чтобы обеспечить это напряжение. В случае с Teensy LC вы можете просто подключить этот контакт прямо к проводу данных светодиодов.

Подключение датчика положения

Некоторые из доступных плат BNO055 гораздо более строги по напряжению и требуют только 3,3 В. Из-за этого я подключил Vin на плате BNO055 к выделенному выходу 3,3 В на Teensy, который является третьим контактом справа. Затем вы можете подключить GND на BNO055 к любому GND на Teensy.

Датчик положения BNO055 использует I2c для связи с Teensy. I2c требует подтягивания, поэтому я подключил два резистора 4,7 кОм от выхода 3,3 В на Teensy к контактам 18 и 19. Затем я подключил контакт 19 к контакту SCL на плате BNO055, а контакт 18 - к контакту SDA.

Советы / хитрости по подключению

Для этого проекта я использовал сплошной провод, а не многожильный. Одно из преимуществ сплошного провода - это при пайке таких прототипов плат. Вы можете зачистить провод, согнуть его под углом 90 градусов и вставить через нижнюю часть одной из клемм, чтобы обрезанный конец провода торчал над вашей платой. Затем вам понадобится лишь небольшое количество припоя, чтобы прикрепить его к клемме, и вы можете легко отрезать излишки.

С твердой проволокой может быть труднее работать, так как она имеет тенденцию оставаться в том состоянии, в котором она изогнута. Однако для этого проекта это было преимуществом. Я вырезал и сформировал свои провода таким образом, чтобы ориентация позиционного датчика была одинаковой, когда я вставлял и извлекал электронику из шляпы для настройки и программирования.

Шаг 4: программирование

Теперь, когда все собрано, вам понадобится инструмент программирования, совместимый с Arduino. Я использовал настоящую IDE Arduino (работает с Linux, Mac и ПК). Вам также понадобится программное обеспечение Teensyduino для взаимодействия с платой Teensy. В этом проекте широко используется библиотека FastLED для программирования цвета и положения светодиодов.

Калибровка

Первое, что вам нужно сделать, это зайти в отличный репозиторий GitHub Криса Винера для BNO055 и загрузить его скетч BNO_055_Nano_Basic_AHRS_t3.ino. Установите этот код с запущенным Serial Monitor, и он сообщит вам, правильно ли работает плата BNO055 и проходит ли ее самотестирование. Он также проведет вас через калибровку BNO055, что даст вам более стабильные результаты позже.

Начало работы с эскизом Fancy LED

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

Строка 24: #define NUM_LEDS 89 - измените это на фактическое количество светодиодов на вашей светодиодной ленте

Строка 28: #define SERIAL_DEBUG false - вы, вероятно, захотите сделать это истинным, чтобы вы могли видеть вывод на последовательном мониторе

Код определения положения

Определение положения и большая часть ваших настроек начинается со строки 742 и продолжается до 802. Мы получаем данные о тангажах, кренах и рысканьях от датчика положения и используем их для установки значений. В зависимости от того, как установлена ваша электроника, вам может потребоваться их изменить. Если вы установите датчик положения так, чтобы микросхема была направлена к верхней части шляпы, а стрелка рядом с X, напечатанная на плате, была направлена в сторону передней части шляпы, вы должны увидеть следующее:

  • Питч кивает головой
  • Ролл - это наклон головы, например прикоснись ухом к плечу
  • Рыскание - это направление. вы стоите лицом (на север, запад и т. д.).

Если ваша доска установлена в другой ориентации, вам нужно будет поменять местами Pitch / Roll / Yaw, чтобы они вели себя так, как вам хотелось бы.

Чтобы настроить параметры рулона, вы можете изменить следующие значения #define:

  • ROLLOFFSET: держите шляпу стабильно и по центру, если Roll не равен 0, измените это по разнице. Т.е. если вы видите Roll на -20, когда ваша шляпа находится в центре, сделайте это 20.
  • ROLLMAX: максимальное значение для измерения крена. Легче всего найти, надев шляпу и переместив правое ухо к правому плечу. Для этого вам понадобится длинный USB-кабель при использовании последовательного монитора.
  • ROLLMIN: наименьшее значение для измерения крена, когда вы наклоняете голову влево.

Аналогично для Pitch:

  • MAXPITCH - максимальное значение, когда вы смотрите вверх
  • MINPITCH - минимальное значение, когда вы смотрите вниз
  • PITCHCENTER - значение высоты тона, когда вы смотрите прямо вперед

Если вы установите для SERIALDEBUG значение true в верхней части файла, вы должны увидеть текущие значения для вывода Roll / Pitch / Yaw на последовательный монитор, чтобы помочь настроить эти значения.

Другие параметры, которые вы можете изменить

  • MAX_LED_DELAY 35 - самое медленное, на которое может двигаться светодиодная частица. Это в миллисекундах. Это задержка перехода от одного светодиода к следующему в цепочке.
  • MIN_LED_DELAY 10 - время, когда светодиодная частица может двигаться. Как и выше, это в миллисекундах.

Заключение

Если вы зашли так далеко, у вас должна быть полнофункциональная и веселая светодиодная шляпа! Если вы хотите сделать с ним больше, на следующей странице есть дополнительная информация об изменении настроек и выполнении ваших собственных действий. а также некоторое объяснение того, что делает остальная часть моего кода.

Шаг 5: Дополнительно и необязательно: внутри кода

Обнаружение удара и вращения

Обнаружение удара / вращения осуществляется с помощью функций датчика высокой перегрузки 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); если (intStatus> 8) {воздействие (); } иначе, если (intStatus> 0) {spin (); }

Найдите строку void impact () выше в коде, чтобы изменить поведение при ударе, или void spin (), чтобы изменить поведение вращения.

Помощники

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

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

Или вы можете выбрать любой цвет, распознаваемый библиотекой FastLED:

setAllLeds (CRGB:: Красный);

Также есть функция fadeAllLeds (), которая затемняет все светодиоды на 25%.

Класс частиц

Чтобы значительно упростить разводку, я хотел использовать одну цепочку светодиодов, но чтобы они вели себя как несколько цепочек. Поскольку это была моя первая попытка, я хотел сделать ее как можно более простой, поэтому я рассматриваю одну струну как две, со средним светодиодом (ами) там, где будет разделение. Поскольку у нас может быть четное или нечетное число, нам нужно это учитывать. Начну с некоторых глобальных переменных:

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

И немного кода в setup ():

если (NUM_LEDS% 2 == 1) {oddLeds = 1; maxLedPos = NUM_LEDS / 2; } еще {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.

Затем в нашем коде частиц мы должны сделать некоторый подсчет от нашей общей позиции до фактических позиций на светодиодной строке:

если (oddLeds) {Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; } else {Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; }

В коде также есть условия, при которых частица может менять направление, поэтому мы также должны это учитывать:

если (ParticleDir) {если ((currPos == NUM_LEDS / 2) && oddLeds) {currPos = 0; } else if ((currPos == NUM_LEDS / 2 - 1) && (! oddLeds)) {currPos = 0; } else {currPos ++; }} еще {если ((currPos == 0) && oddLeds) {currPos = centerLed; } иначе, если ((currPos == 0) && (! oddLeds)) {currPos = centerLed - 1; } else {currPos--; }}

Таким образом, мы используем предполагаемое направление (ParticleDir), чтобы вычислить, какой светодиод должен загореться следующим, но мы также должны учитывать, достигли ли мы либо реального конца светодиодной цепочки, либо нашей центральной точки, которая также действует как конец для каждая из виртуальных струн.

Как только мы со всем этим разобрались, при необходимости зажигаем следующий свет:

если (ParticleDir) {если (oddLeds) {Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; } else {Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; }} else {если (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 ();}

Зачем вообще делать это классом? Как бы то ни было, это довольно просто, и на самом деле не обязательно быть в классе. Однако у меня есть планы на будущее по обновлению кода, чтобы разрешить одновременное появление более чем одной частицы, и некоторые из них будут работать в обратном направлении, а другие - вперед. Я думаю, что есть действительно отличные возможности для обнаружения спина с использованием нескольких частиц.

Рекомендуемые: