Прошивка для ардуино нано для адресной ленты

Arduino и адресная светодиодная лента

Описание

Адресная светодиодная лента, в отличие от обычной RGB, позволяет управлять цветом и яркостью каждого своего светодиода. Благодаря этому на ней можно отображать различные интересные эффекты, как статические, так и динамические. Сама по себе лента ничего не может, поэтому генерацией эффектов занимается микроконтроллер (или плата на его основе, например Arduino). Более подробно про виды адресных лент можно прочитать в моей статье.

В наборе GyverKIT есть 1 метр адресной светодиодной ленты WS2812b. При желании ленту можно докупить в том же магазине, где продаётся набор – Giant4.

Подключение

  • GND ленты соединяется с GND микроконтроллера, так как все сигналы ходят относительно “земли”
  • У любого отрезка ленты есть вход, а есть выход: у входа средний пин называется DI, а у выхода – DO. К Arduino подключается именно вход ленты, то есть пин DI
  • DI подключается на любой цифровой пин. Если лента питается отдельно от Arduino – DI нужно подключать через резистор 100-500 Ом, чтобы избежать питания ленты через пин, что приведёт к выходу из строя пина Arduino или первого светодиода в ленте. Лучше ставить резистор в любом случае, чтобы исключить такую возможность
  • 5V ленты подключается к питанию. Питание может быть общим с Arduino
  • Лента потребляет большой ток, поэтому питать её от Arduino, подключенной к USB – нельзя. В наборе GyverKIT есть сетевой адаптер на 5V, ленту нужно питать от него

В рассмотренных выше схемах Arduino питается от USB. Для работы от адаптера можно подключить питание с него на пин 5V платы:

При наличии на ленте штекера можно подключать управление и питание следующим образом:

Примечание:

  • Ленту можно питать напрямую от Arduino (при подключении к USB), если ток потребления не будет превышать 500 мА. В библиотеке FastLED можно настроить программное ограничение тока: FastLED.setMaxPowerInVoltsAndMilliamps(5, 500); – 5V 500mA
  • Ленту можно подключать без резистора, если исключена возможность наличия сигнала на ленту без подключенного питания, т.е. когда лента питается от одного источника с микроконтроллером

При работе с Wemos есть особенность: у него логический уровень 3.3V, чего не всегда хватает для передачи сигнала на ленту. При возникновении “артефактов” в эффектах можно подключить питание по следующей схеме: питать Wemos через диод (есть в наборе GyverKIT):

Библиотеки

Самой функциональной и известной библиотекой является FastLED, можно установить через диспетчер библиотек по названию FastLED. В библиотеке ОЧЕНЬ много возможностей, см. официальную вики-документацию, а также полный список модулей, классов и функций.

Как работать с FastLED

Коротко рассмотрим как работать с библиотекой FastLED и самые основные инструменты.

Логика работы с адресной лентой сводится к следующему: лента представляется в виде одномерного массива, каждый элемент – светодиод, точнее его цвет. Цвет светодиода кодируется тремя байтами, то есть 256 значений на каждый канал: красный, зелёный, синий. В программе можно производить различные манипуляции с этим массивом, то есть задавать цвета светодиодам при помощи различных инструментов библиотеки. Как только построение “кадра” закончено – массив можно отправить на ленту и светодиоды включатся соответственно заданным цветам.

Для начала обозначим константами длину ленты и пин, к которому она подключена, просто чтобы проще было редактировать программу в дальнейшем:

Создаём массив цветов, он имеет тип данных CRGB . Размер – сколько светодиодов в ленте, то есть наша константа. Пусть массив будет глобальным, чтобы доступ к нему был у всей программы:

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

Отлично! Всё настроено и готово к работе.

Общие функции

Помимо задания цветов в массиве, существуют следующие управляющие функции:

  • FastLED.show() – выводит массив на ленту, т.е. обновляет её текущими цветами
  • FastLED.clear() – очищает ленту, буквально обнуляет все цвета в массиве, задаёт “чёрный” цвет. Для применения нужно вызвать show()
  • FastLED.setBrightness(0-255) – устанавливает яркость всей ленты. Не меняет значения в массиве светодиодов, просто “приглушает” итоговую отображаемую яркость. Для применения нужно вызвать show()
  • FastLED.setMaxPowerInVoltsAndMilliamps(вольты, миллиамперы) – включает автоматическое ограничение яркости по настроенному току и напряжению. Полезно для длинных лент и/или слабых блоков питания
  • FastLED.showColor(CRGB цвет) – залить всю ленту указанным цветом

Тип данных CRGB

Библиотека организована так, что переменной типа CRGB можно задать значение несколькими способами. Рассмотрим задание цвета первому светодиоду в нашей ленте, то есть элемент массива под номером ноль: leds[0]

Подробнее про цветовые модели RGB и HSV можно почитать вот здесь.

Примеры

Итак, с базовыми понятиями разобрались, переходим к практике. Для начала зальём всю ленту статичной радугой. Для этого покрасим светодиоды в цикле, задав цвет от 0 до 255 от первого до последнего светодиода в ленте. Конструкция i * 255 / LED_NUM позволяет получить значения от 0 до 255 при изменении i от 0 до LED_NUM:

Можно сделать подвижную радугу, это будет уже полноценная анимация. Для этого ленту нужно постоянно обновлять новыми цветами, например 30 раз в секунду. Чтобы плавно менять цвет – добавим к нему счётчик, который будет меняться от 0 до 255 и так по кругу.

Можно сделать один бегающий светодиод: каждый раз очищать ленту и красить светодиод под номером, который задаётся счётчиком. Изменение счётчика закольцевать от 0 до количества светодиодов:

И таких эффектов можно придумать очень много! Займёмся этим уже в блоке проектов

Источник

Инструкция по подключению Arduino к адресной светодиодной ленте

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

Для начала необходимо разобраться с потреблением светодиодной ленты. Дело в том, что каждый светодиод в пикселе потребляет до 20 мА, в зависимости от яркости его свечения. Напомню, что яркость свечения задаем мы сами из программы. Итого получается, что каждый пиксель может потреблять до 60 мА. Это довольно много, если учитывать, что мы можем использовать несколько метров ленты. Но в рамках данной статьи я буду экспериментировать с отрезком на 5 пикселей. И по этой причине запитаю адресную ленту прямо от Arduino Nano . Хотя я бы сам не рекомендовал так делать, лучше всего ставить отдельный блок питания и подключить ленту к нему, а с МК реализовать только управление.

Как мы помним из прошлых статей, управление будет осуществлено любым из цифровых выходов с D 2 по D 13. В данном случае я решил использовать D 5 (просто для примера, Вы можете использовать любой). Итак, подключаем ленту к Arduino Nano . GND к GND , +5 V к +5 V и D — input к D 5 на плате Nano . Я не стал ничего придумывать и просто припаял. Визуально выглядит адресная лента подключенная к Ардуино:

А вот схема подключения адресной ленты к Arduino:

Тут главное помнить, что адресная светодиодная лента имеет направление и важно не перепутать к какому концу ленты подключать плату Arduino. Но об этом я уже говорил в прошлых статьях и больше заострять на этом внимание не будем.

Следующим действием предлагаю подключить плату Адруино к компьютеру и уже заняться написанием нашей первой программы под адресную светодиодную ленту.

Пишем программу для управления адресной светодиодной лентой через Arduino. Установка библиотеки

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

Для начала давайте откроем IDE Arduino . Это программа, которую мы установили в одной из прошлых статей.

Получилось? Отлично! Далее нам необходимо установить библиотеку. Это нужно, чтобы управлять адресной лентой. Дело в том, что лента принимает определенный набор команд, но нам, как молодым разработчикам, пока не интересно, что это за команды и как они устроены. Мы просто хотим управлять цветами. И библиотека управления адресной лентой поможет нам сделать это максимально просто и быстро. Мы будем сообщать программе, где какой цвет хотим видеть, а программа, с помощью библиотеки, будет формировать наборы команд, понятные для микросхем адресной ленты. На самом деле все достаточно просто и очевидно, нужно только привыкнуть. Поэтому нажимаем «Скетч» -> «Подключить библиотеку» — > «Управлять библиотеками».

После этого появится окно «Менеджер библиотек». Кстати, данному окну нужно немного времени чтобы прогрузиться, поэтому пару секунд оно будет не активным, нужно подождать.

На данный момент мы будем использовать библиотеку « Adafruit NeoPixel ». Проще всего будет воспользоваться поиском. Как видно, в списке есть похожие название, нужно быть внимательным и не перепутать.

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

Пишем программу для управления лентой через Ардуино

И теперь мы приступаем к следующему этапу — написанию программы. Начнем с чего-то простого и потом будем постепенно совершенствовать. Наша первая программа будет выглядеть следующим образом:

#define LED_COUNT 5

#define LED_PIN 5

Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

strip.begin(); //Инициализируем ленту.

strip.setPixelColor(i, strip.Color(255, 0, 0)); // Красный цвет.

strip.setPixelColor(i, strip.Color(0, 0, 0)); // null

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

Начнем с первой строчки. Тут мы объявляем библиотеку. Дело в том, что перед этим мы только ее скачали, а чтобы использовать в программе, необходимо ее объявить. Для этого используется директива # include <>. Где в скобках указано имя файла, который будет использоваться при компиляции, как часть кода. В нашем случае это название библиотеки. Кстати да, библиотека – это файл с программой.

Вторая и третья строчки, — тут мы задаем кол-во пикселей в нашей ленте и номер вывода, с которого будет организовано управление.

Обратите внимание: речь идет именно о количестве пикселей, то есть чипов в ленте, а не о количестве светодиодов. В некоторых адресных лентах, например с чипом ws2811 и ws2818 управление происходит кратно 3 диодам, поэтому лента с 60 диодами на метр будет управляться всего 20 пикселями. Если у вас адресная лента ws2812b, ws2813 или ws2815, то управление происходит кратно одному диоду, то есть количество пикселей = количество светодиодов.

Идем далее. Директива # define определяет идентификатор и последовательность символов, которой будет замещаться данный идентификатор при его обнаружении в коде. Давайте разберем вторую строку более подробно «#define LED_COUNT 5». «LED_COUNT» — это идентификатор, которому соответствует символ «5». Это позволит нам в теле программы (везде, где нужно) написать «5», писать «LED_COUNT». Возможно, это звучит немного непотяно, но подумайте вот о чем: нам пришло в голову изменить кол-во пикселей в ленте и тогда нам придется во всем коде менять их кол-во. Но благодаря # define , мы имеем возможность поменять всего лишь последовательность символов в идентификаторе. Понятное дело, в нашей программе возможно заменить все значения, потому что тут всего 2-а десятка строк. Но бывают и очень большие программы, где действия по замене потребуют огромного количества времени и терпения.

В пятой строке мы объявляем экземпляр класса Adafruit_NeoPixel и передаем его конструктору значения о длине ленты, выводе управления и типу адресной ленты. В данной статье мы не будем разбирать само понятие классов, поэтому предлагаю просто принять данную строчку как должное, где в скобках мы передаем необходимые параметры. Скажу только одно: тут мы создали объект под именем « strip ». И этот объект полностью отвечает за работу подключенной ленты.

В теле функции setup () мы сообщаем компилятору, что данный объект « strip » у нас будет использован. По сути, эту команду инициализации пока тоже нужно принять как необходимый минимум.

А дальше у нас уже идет самое интересное — основная часть программы, в которой и происходит волшебство, она находится в теле функции loop (). Но перед этим необходимо ввести новое понятие – цикл.

Цикл — это определенный блок программы, выполняющийся по кругу. Даже сама функция loop () является циклом. Циклы бывают конечными и бесконечными и у циклов так же, как и у функций, есть тело, где написаны повторяющиеся команды. В данной программе мы использовали цикл – for . Если данный цикл описан правильно, то он, как правило, конечен. Цикл for имеет 3 параметра «for(int i = 0; i Первый параметр задает начальное значение для переменной i . Кстати, в данном случае переменная i инициализируется при начале работы цикла и забывается при окончании работы цикла. Второй параметр – это условие, при котором цикл продолжает выполняться. В нашем случае цикл выполняется до тех пор, пока i меньше 5. И третий параметр прибавляет единицу к i , при каждом повторе цикла. Сейчас ограничимся этим коротким объяснением. В дальнейшем у меня выйдет короткая статья, посвящённая программированию.

Итак, вернемся к программе. С 13-ой по 17-ую строку у нас расположен цикл, цикл на 5 повторений, где i меняется от 0 до 4 включительно.

В 14-ой строке мы вызываем метод setPixel , объекта strip и передаем ему два параметра. Где i это номер пикселя на адресной ленте, а « s trip.Color(255, 0, 0)» его цвет. Про то, как задается цвет по системе RGB мы уже говорили ранее. Скажу только очевидную вещь, «255, 0, 0» — это максимально красный цвет.

Получается, когда мы объявили объект strip и передали ему, что в нашей адресной ленте будет 5 пикселей, то в памяти было зарезервировано 5 ячеек, предназначенные для хранения цвета. И теперь в данном цикле мы их заполняем.

В 15-ой строке расположена команда, которая выводит на ленту цвета из памяти в МК (микроконтроллер). То есть последовательность такая: сначала пишем цвета в память, потом разом выводим их на адресную ленту. Изначально пока мы еще не успели заполнить память, там хранятся нулевые цвета «0, 0, 0».

И в 16-ой строке у нас стоит задержка в 300 млс.

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

Теперь давайте разберем строки кода с 18-й по 23-ю. Тут происходит практически то же самое. В таком же цикле, мы обнуляем цвета, только это происходит без какой-либо задержки. И данные поступают на адресную ленту уже после выполнения всего цикла, то есть обнуления всех цветов. И уже после этого мы используем задержку.

На мой взгляд все достаточно просто. Светодиоды поочередно загораются красным, а затем гаснут и все это происходит по кругу. Результат выполнения программы вы можете увидеть ниже.

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

Источник

Adblock
detector