Skip to main content

Светодиодная снежинка: Arduino NANO + WS2812B

До Нового года осталось совсем немного, а значит самое время делать бесполезные мигающие штуки, у которых цель одна - создавать праздничное настроение. В прошлом году это был Рождественский светильник-арка, сегодня же я предлагаю сделать светодиодную снежинку. Не смотря на то, что ее эффекты зависят только от фантазии, ее конструкция предельно проста. Arduino NANO, лента с адресными светодиодами WS2812B и резистор - это все, что нужно.

Конструкция

Снежинке нужна основа, а в моем распоряжении имеется 3D принтер, и вполне логично, что для этой задачи была создана соответствующая 3D модель. Снежинка состоит из основания, на котором крепятся светодиодные ленты, верхней полупрозрачной крышки и отсека под Arduino, который располагается с обратной стороны. Существует два варианта исполнения отсека, отличаются они лишь расположением окна под разъем. Отсек так же имеет второе назначение - на нем расположено крепление для подвешивания снежинки на стену. А для настольной установки существует специальная подставка.

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

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

Существуют различные вариации подобных светодиодных лент, с количеством светодиодов от 30 до 144 штук на метр. В данном случае используется 74 светодиода на метр, именно под такую ленту спроектирован корпус снежинки. Это важный момент, если вы собираетесь печатать корпус на 3D принтере. К слову, снежинка состоит из 36 светодиодов (6 лучей по 6 светодиодов), а значит, одного метра хватит ровно на две снежинки, еще и два светодиода останется.

Перед приклеиванием отрезков ленты необходимо аккуратно удалить защитное покрытие (если используется лента с защитой), и залудить контактные площадки.

Лента имеет четкое направление, и соединять ее как попало недопустимо, устройство просто не будет работать. Это направление указано непосредственно на ленте.

Для удобного соединения лучи необходимо разместить таким образом, чтобы стрелки на лучах указывали от центра снежинки к ее краям.

После этого можно переходить к непосредственной сборке схемы.


Схема

Схема предельно проста, и наша цель фактически заключается в том, чтобы соединить разрезанную ленту обратно. Выход первого луча (DO) соединяется со входом (DI) второго луча, выход второго со входом третьего, и так далее, до последнего луча снежинки. А питание ленты (5V и GND) соединяется теперь в центре снежинки.

В результате всех соединений к ленте должно быть подключено три провода: вход первого луча снежинки (DI) и два вывода питания (5V и GND). И вот их необходимо подключить к Arduino.

Резистор 330 Ом припаян непосредственно к проводу, и на всякий случай защищен термоусадкой.

Выводы питания светодиодной ленты припаяны к соответствующим контактным площадкам Arduino (5V и GND), и всё это закреплено для надежности термоклеем.

Одним из вариантов питания Arduino является разъем mini USB на борту. При этом, на соответствующих выводах 5V и GND так же появляется питание. И велик соблазн запитать нагрузку (в нашем случае это светодиодная лента) непосредственно от Arduino. Это вполне допустимо, но с небольшими оговорками. Во-первых, потребляемый ток не должен быть более 500 мА. Да, запитать Arduino в дальнейшем можно будет от того же зарядника телефона, но прошивать-то микроконтроллер все равно придется, а если ток будет выше, то USB порт компьютера вероятнее всего уйдет в защиту. И во-вторых сами дорожки на плате не рассчитаны на большой ток. В нашем случае ток при работе снежинки не превышает 200 мА, потому такое подключение вполне позволительно и безопасно. Но если же Вы решите увеличить количество светодиодов, то имейте ввиду этот момент.

Теперь можно поместить плату в отсек. Держится плата за счет торцевой защелки и направляющих, и в дополнительном креплении не нуждается.

Крепится отсек к основанию снежинки при помощи четырех маленьких шурупов со стороны ленты.


Прошивка

Самая сложная часть работы выполнена, осталось прошить микроконтроллер. К счастью, все платы Arduino имеют уже "залитый" загрузчик на борту, что значительно облегчает задачу, так как для прошивки не требуется дополнительное оборудование. Все манипуляции выполняются путем подключения к разъему mini USB Arduino. А так как этот разъем выведен наружу для питания устройства, складывается весьма удачная ситуация, когда для прошивки не потребуется разбирать устройство. Это удобно и при выходе новой прошивки, и при экспериментах по созданию собственных эффектов.

Для программирования используется среда разработки Arduino IDE, которую необходимо скачать с официального сайта (https://www.arduino.cc/en/software).

Открываем скетч "SnowFlake_V1.ino", но перед прошивкой необходимо провести ряд обязательных манипуляций.

Установка библиотеки FastLED

Так как скетч снежинки использует стороннюю библиотеку FastLED, ее необходимо установить. Сделать это можно несколькими способами, я же покажу два.

Способ 1. Менеджер библиотек

Перейдите в меню "Скетч" -> "Подключить библиотеку" -> "Управлять библиотеками...". В строке поиска наберите "fastled" и нажмите "Установка" в поле нужной библиотеки (FastLED by Daniel Garcia).

Способ 2. Архив библиотеки

Если по каким-либо причинам установка библиотеки первым способом невозможна (например, отсутствует интернет), ее можно установить через меню "Скетч" -> "Подключить библиотеку" -> "Добавить .ZIP библиотеку...". Архив библиотеки находится в папке проекта (FastLED-master.zip). Распаковывать его не нужно, указывается именно архив.

Подключение к Arduino

Далее необходимо настроить параметры программируемого устройства. На этом этапе нужно подключить снежинку к USB порту. Выполняется настройка в меню "Инструменты". Всего нам нужно указать три параметра:

  • Плата: "Arduino Nano".
  • Процессор: "ATmega328P" или "ATmega328P (Old Bootloader)". Выбор зависит непосредственно от залитого загрузчика. Если контроллер отказывается прошиваться с первым вариантом, просто выберите второй вариант.
  • Порт: номер порта можно посмотреть в "Диспетчере устройств". Подключенная Arduino определяется как COM порт, и вот его и нужно указать в данном поле.

Загрузка скетча

Все предварительные настройки выполнены, можно переходить к непосредственной загрузке скетча. Для этого нажимаем кнопку "Загрузка" в верхней части экрана (или меню "Скетч" -> "Загрузка" (Ctrl + U)). Если все сделано верно, то после компиляции скетча он будет загружен в Arduino, появится сообщение о том, что загрузка завершена.

Осталось закрыть верхнюю крышку (она тоже крепится маленькими шурупами) и снежинка готова создавать новогоднее настроение.

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


Видео

Комплектующие

Arduino NANO: https://aliexpress.ru/item/Nano-With-the-bootloader-compatible-Nano-3-0-controller-for-arduino-CH340-USB-driver-16Mhz-Nano/32341832857.html

Лента с адресными светодиодами WS2812B: https://aliexpress.ru/item/DC5V-WS2812B-1m-4m-5m-30-60-74-96-144-pixels-leds-m-Smart-led-pixel/32832420003.html


Загрузки
Значок
Светодиодная снежинка на Arduino

Схема, скетч для загрузки, 3D модели для печати корпуса.

26 комментарии в “Светодиодная снежинка: Arduino NANO + WS2812B”

  1. Здравствуйте! Может подскажете куда копать? Плата с процессором Atmega 328P (old bootloader) грузится и работает нормально, как и должна. Другая плата загружается только с процессором Atmega 328P. В таком виде грузится без ошибок. Но при запуске работает некорректно. Какая-то хаотичная смена вспышек. Надеюсь, что понятно изложил. Заранее благодарен за ответ!

    1. Здравствуйте, Виталий. Тут однозначно сложно что-то сказать, нужно как-то пытаться локализовать проблему, чтобы понять, в железе дело или в софте. Попробуйте для начала прошить простейший скетч мигания светодиодом L (на плате Ардуино). Уже хотя бы будет понятно, правильно ли настроено тактирование МК. Светодиод должен одну секунду светить, и одну секунду быть погашен. Если здесь всё в порядке, то попробуйте изменить в скетче снежинки номер пина для линии данных ленты (#define LED_PIN 13), возможно он был когда-то подпален. Если всё это безрезультатно, то крайне желательно уже иметь программатор (USBasp, например), тогда можно будет попробовать перезалить загрузчик МК.


      void setup() {
      pinMode(13, OUTPUT);
      }

      void loop() {
      digitalWrite(13, !(digitalRead(13)));
      delay(1000);
      }

      1. Здравствуйте! Спасибо за ответ! Программатор имеется. Попробую последовать вашим советам.

      2. Здравствуйте! Вообщем заметил такую особенность. Прошил и собрал на макетной плате проект. Работает. Но после пайки плата перестает работать корректно. И так с несколькими платами. Их у меня было пять штук. С последнего заказа. Картина одинаковая со всеми пятью.

        1. Здравствуйте, Виталий. Хм, интересно. Может, у Вас паяльник на корпус пробивает? А как они перестают работать? Частично? Мигающий светодиод работает? Может всё же попробовать сменить пин подключения ленты...

          1. Самое интересное, что это мой уже далеко не первый опыт работы с этими платами. Может я неправильно обЪясняю... Не то, чтобы совсем перестают работать, а начинают работать по какому-то своему алгоритму. Хаотичная смена цветов и хаотичные вспышки. Или же может просто зависнуть. Пробовал уже другие прошивки использовать для проверки - такая же ситуация.

          2. Ну смотрите, происходит такая история после пайки. Что первое приходит на ум? Ну самое простое - неотмытый активный флюс, он как раз запросто может давать такую картину. Что еще касается пайки... Перегрев? Ну это совсем мимо, тем более, мы же не сам МК паяем. Остаются крайне редкие случаи, когда на корпусе паяльника присутствует потенциал, или тому подобная статика. Конечно интересно, что со старыми платами всё работает и после пайки, но и эти платы ведь работали до пайки. Пусть там и МК из какой-нибудь отбраковки, но всё равно они не должны выходить из строя после прикосновения паяльника...

          3. Пины менял... Мигающий светодиод вроде работает. С паяльником версия интересная, но сегодня собрал проект на старой плате (с предыдущего заказа) - все работает.

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

          5. Ну вообще и такая история может быть, да. Конденсатор по идее крайне желательно ставить, так как неизвестно, БП какого качества используется. Я обязательно добавлю Ваш опыт в статью, это ведь действительно важно. Режимы будут добавляться, нужно вообще кардинально изменить подход в плане реализации эффектов. Думается мне, стоит попробовать перевести расположение светодиодов в систему координат, и тогда уже можно будет работать с ними, как с упрощенной матрицей. Обязательно попробую.

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

  2. Здравствуйте! Попробовал прозрачный колпак и полностью белый. Белый колпак более подходит к этой модели. Разница с прозрачным существенная. Буду делать с белыми колпаками. Размеры корпуса подобраны отлично! Соединяются с друг другом без всяких усилий. Еще немного изменил корпус под контроллер. Отредактировал STL-файл, чтобы завести питание под штекер 5,5*2,1. Это один из вариантов. Думаю дальше...

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

  3. Спасибо за ответ, да еще такой оперативный! Тогда начну печатать корпус. Я попробую, сначала, сам собрать. После сообщу о своих успехах. Еще раз спасибо! До связи!

  4. Здравствуйте! Спасибо за интересный проект! Но я хотел использовать ленту на 60 светодиодов на метр. Тогда возникает вопрос. Прошивка будет работать с любым количеством светодиодов или же привязана к количеству светодиодов в данном проекте? Еще раз спасибо за проект!

    Заранее благодарен за ответ!

    1. Здравствуйте, Виталий. Если у Вас изменится количество светодиодов в луче, то в исходнике, как минимум, необходимо будет изменить значение:

      #define RAY_PIXEL 6 // количество светодиодов в одном луче

      А так же переназначить массив:

      const uint8_t snowFlakeArray[RAY_NUM][RAY_PIXEL] PROGMEM { // массив, описывающий расположение светодиодов по лучам (храним во FLASH)

      По идее, после этого всё должно заработать, но на практике я это не проверял. Я всегда на связи, поэтому Вы можете в любой момент написать мне прямо на почту public@enabledevice.ru. Если потребуется, я могу и макет собрать, чтобы проверить всё в боевых условиях. Так что без прошивки Вы не останетесь точно. 🙂

      1. Здравствуйте! Спасибо за подсказку. Собрал макет, отредактировал скетч, залил прошивку и .... заработало. Теперь осталось напечатать колпак на снежинку и корпус под контроллер. Хотел поинтересоваться - количество режимов не увеличилось за прошедшее время? Еще раз спасибо за проект и обратную связь!

        1. Здравствуйте, Виталий. Отлично! Руки у Вас точно откуда нужно растут. 🙂 Количество режимов пока не увеличилось, но заняться этим я совершенно точно планировал. И кстати, Вы могли бы мне помочь. Как минимум, пожеланиями на тему этих самых эффектов. Ну или вообще можете попробовать наваять что-то самостоятельно, там код прокомментирован наиподробнейшим образом, и в принципе, всё должно быть понятно. Дело лишь фантазией ограничивается. 🙂

          P.S. Кстати, колпак можно попробовать из белого пластика напечатать, должны получиться цветные пятна, и в принципе, может выйти годно...

          1. Здравствуйте! Спасибо за комплимент! Очень приятно! Но, пока, моих знаний в Arduino хватало лишь на то, чтобы повторить такие проекты. Но я попытаюсь. Пробовал залить другой скетч другого автора. Тоже про снежинку. Возможно вы с этим проектом знакомы. Вроде тоже заработало.
            В планах сделать полупрозрачный колпак с белыми стенками. То есть использовать в печати колпака два пластика. Белый и полупрозрачный.
            Если делать колпак полностью из белого пластика, сможет ли яркость светодиодов обеспечить приемлемую картинку? Там вроде 3 слоя пластика просветить придется...
            Вообщем попробую и сообщу, что получилось.
            Желаю всего хорошего! До связи!

          2. Ну на самом деле реализовать что-то в коде не так и сложно. Самое главное, чтобы к этому моменту в голове уже было четкое представление о том, чего именно ты хочешь. А дальше останется всего лишь на язык понятный МК это перевести. 🙂 Касаемо пластика, в принципе белый пластик очень хорошо просвечивает. Я когда подобные штуки делаю, то печатаю пластинки с разным количеством слоев, и просто прикладываю их потом, добиваясь нужного эффекта. Например, здесь обязательно нужно, чтобы каждый пиксель оставлял свое пятно на экране, в ином случае будет просто размазанная мешанина. А иногда нужно наоборот рассеять равномерно весь свет... Ну да это Вы прекрасно знаете, я думаю. Если нужно будет изменить ту же толщину передней стенки, то Вы пишите, я пересоберу модель.

      2. Здравствуйте , я собрал ваш проэкт. У меня 6 лучей по 8 светодиодов. я поменял количество светодиодов в вашем скетче #define RAY_PIXEL 8 // количество светодиодов в одном луче. Но только несколько эффектов работают полностью, а в остальных загораются только 36 светодиодов.Не горит один луч посностью и 4 в предпоследнем. Подскажите что надо изменить в этой строчке? ----- const uint8_t snowFlakeArray[RAY_NUM][RAY_PIXEL] PROGMEM { // массив, описывающий расположение светодиодов по лучам (храним во FLASH) Заранее спасибо.

        1. Здравствуйте, Сергей. Да, в Вашем случае нужно обязательно изменить массив расположения светодиодов:


          const uint8_t snowFlakeArray[RAY_NUM][RAY_PIXEL] PROGMEM { // массив, описывающий расположение светодиодов по лучам (храним во FLASH)

          {0, 1, 2, 3, 4, 5, 6, 7},
          {8, 9, 10, 11, 12, 13, 14, 15},
          {16, 17, 18, 19, 20, 21, 22, 23},
          {24, 25, 26, 27, 28, 29, 30, 31},
          {32, 33, 34, 35, 36, 37, 38, 39},
          {40, 41, 42, 43, 44, 45, 46, 47}
          };

          Понятное дело, далеко не все комбинации проверялись в железе, это в принципе невозможно. Потому если что-то пойдет не так - обязательно пишите. Можете сразу на public@enabledevice.ru

          1. при компиляции выходит ошибка
            too many initializers for 'const uint8_t [5] {aka const unsigned char [5]}'

          2. Скачал проект, пересобрал - всё компилируется без проблем. Версия среды разработки последняя - 1.8.16. Вы что-то в коде меняли? Что за инициализация массива констант такая странная, во-первых имени нет, а во-вторых в коде вообще ничего подобного не объявлялось.

          3. Добрый вечер!
            Давно искал подобную красотень для новогодней ели,вышел на ваш сайт.Уже заказал комплектующие,к сожалению на новый год не успеваю,но до старого нового года точно будет.Я скажем так абсолютный новичек в программировании ардуино,но сомневаюсь что там есть много сложностей.Мозги есть,научусь.Благо опыт есть в программировании в целом.Хотелось бы узнать,можно ли подцепить к ардуино ИК модуль чтобы была возможность управления эффектами с пульта?Например вот этот?
            https://a.aliexpress.com/_vXNK0j
            И как это реализовать?Я тут сверху прочел по поводу пожеланий эффектов,можно например спираль добавить.

          4. Здравствуйте, Александр.
            Да конечно можно прикрутить что угодно, было бы желание. 🙂 Тем более, в Ардуино всё это реализовано на уровне библиотек, и проблем возникнуть не должно. При появлении вопросов Вы всегда можете писать напрямую на почту public@enabledevice.ru. P.S. А спираль в эффектах есть, в разных вариантах. К слову, если у Вас есть опыт в программировании, то можете посмотреть исходник. Там всё прокомментировано наиподробнейшим образом, и в создании нового эффекта гораздо сложнее его придумать, чем реализовать. 🙂

Добавить комментарий

Ваш адрес email не будет опубликован.