Постепенно нашу жизнь заполняют умные вещи. Смартфоны, смартТВ, умные скороварки, умные автомобили и т.п. И вот дело дошло даже до «умных светодиодов»!!! Итак, спешу представить: BlinkM это RGB-светодиод с управлением по I2C. Как я себе представляю, областями применения интеллектуальных светодиодов является декоративная подсветка интерьера, автомобильная светотехника, другие программируемые светотехнические решения. После беглого знакомства с описанием этого «зверька» больше всего меня впечатлило две вещи: 1-размеры и простота, а 2-ое — НЕАДЕКВАТНОСТЬ цены на готовое изделие!!! Пробежавшись по официальному сайту, заметил много интересных «прибамбасов»!!!. Тут тебе и COMMUNICATOR для подключения к Ардуино, какой-то SEQUENCER, и примеры стыковки на разных языках программирования и т.д. Ну и чего греха таить, «глазки загорелись» и ОЧЕНЬ захотелось воочию поиграть с этой штукой. Но купить !?!?!? Неа. Абсолютно никакого желания 🙂 Да и любимый жизненный принцип моего хорошего друга: «Это не наш метод. Мы сделаем сами, пусть по выходу окажется и в два раза дороже!». 🙂
Вектор намечен. Сделаем самостоятельно!
Короткий поход на радиорынок.
Расходы:
-> Attiny45 — (около 2$). Правда в корпусе SOIC, а я хотел изначально в DIP-e (но вышло даже лучше).
-> RGB светодиод — (0.5$)
-> SMD-резисторы — (пусть еще 0.5$)
——-
ИТОГО: 3$
Заинтересовались? Тогда читаем дальше 🙂
Поиски RGB-светодиода на радиорынке закончились покупкой «ноунемовского», типа такого:
Схема «нагуглилась» достаточно быстро, но содержала ошибку… Вот исправленный вариант:
При повторении я постарался максимально приблизиться к оригинальному изделию, хотя бы по контактам 🙂 К сожалению, конденсатор по питанию пришлось исключить 🙁
Вот, что вышло (размер платы 12х12 мм):
Будьте внимательны при повторении. Это вид на плату сверху (НЕ СКВОЗЬ ПЛАТУ!!!). Медный слой сверху. Однако при распечатке из SprintLayout-а, если выбрать птичку «ЗЕРКАЛЬНО» — печатается совсем не так, как задумано… Я и раньше замечал эту «странность». Но как правило, это происходило, когда я распечатывал типа «маски» расположения элементов, что не являлось критичным.
А тут пришлось прибегнуть к небольшой «военной хитрости»: я «отзеркалил» плату в редакторе, а при выводе на печать птичку «Зеркально» не ставил, и все вышло очень даже неплохо.
После распечатывания, Вы должны получить изображение как на картинке ниже.
Делал сразу две платы, себе и приятелю. (Потом я и третью плату запаял :))
ЛУТим
А вот после 20-ти минутного «купания» в хлорном железе:
Ну, поехали паять:
Последние штрихи, запаиваем микроконтроллер и RGB-светодиод.
Подражая «оригиналу», я впаивал только четыре штырька, а крайние «пятачки» (сигналы RST и MISO)-при необходимости припаяем провода. Фактически это придется сделать только один раз, прошивая Attiny.
Я остался ОЧЕНЬ доволен получившемся результатом :).
Приступаем ко второй части «марлезонского балета», а именно прошивка микроконтроллера. Ниже картинка, каким образом подключается BlinkM к программатору.
Для прошивки грех не воспользоваться имеющимся (смайлик) программатором USBTinyISP.
В каталоге архива проекта, в папке FIRMWARE\!!_Original\ находится софт для прошивки и сама прошивка. Однако, прошивка не является открытой и предназначена для некоммерческого использования. Кому религия не позволяет, можете воспользоваться альтернативной FIRMWARE\CYZ_RGB. An alternative firmware. (Просто укажите утилите ReflashBlinkM.exe месторасположение альтернативной прошивки). Я человек не особо щепетильный, поэтому прошил оригинальной для Attiny45.
Уже и не припомню, почему у меня ни Arduino IDE, ни ReflashBlinkM.exe не работают с библиотекой rxtxSerial.dll (77759 байт). Причину этого явления можно поискать на официальном сайте Arduino. «Пофикшенная» версия rxtxSerial.dll (98381 байт) заботливо располагается в папке FIRMWARE\!!_Original\!_Fix_rxtxSerial. Если столкнетесь с аналогичной проблемой, просто замените эту библиотеку.
Во время прошивки, светодиод весело «перемаргивает»!
Вот и все! Заветная надпись REFLASHING DONE! Мои поздравления!
Поиграться с полученным клоном BlinkM-а у меня было пока совсем мало времени. Ниже то, что успел сделать 🙂
Пока у меня на руках было два BlinkM, попробовал «покомандовать» ими по отдельности. Меняем адрес устройства (так как изначально они все отвечают по адресу 0х09):
При выполнении следующего кода, к шина I2C (выводы А5 и А4 на Ардуино) подключен только один BlinkM, адрес которого и будем менять. Адрес должен записаться в EEPROM
#include <Wire.h> void setup() { Wire.begin(); } void loop() { Wire.beginTransmission(0);// активируем I2C Wire.write('A'); // 'A' Команда изменения адреса устройства Wire.write(0x12); // Новый адрес Wire.write(0xd0); // Wire.write(0x0d); // Wire.write(0x12); // Новый адрес Wire.endTransmission(); // завершаем I2C }
Подключаем два, имеющихся BlinkM-а:
А тут ВИДЕО демонстрашки, код которой приведен ниже:
Общий смысл — плавное изменение цвета следующий образом: красный->желтый->зеленый->синий->фиолетовый.
/* BlinkM (Ghost D. Clone) Demo sketch Плавное изменение цвета от красного до фиолетового и так по кругу. Красоты ради, второй BlinkM будет отображать цвета наоборот от фиолетового к красному Скетч слеплен на скорую руку из готовых решений. Так, что не критикуйте сильно :) */ #include <Wire.h> const int address = 0x09; // I2C адрес 1-го BlinkM const int address1 = 0x12; // I2C адрес 2-го BlinkM int color = 0; // Переменная отвечающая за цвет в системе HSB byte R, G, B; // составляющие цвета. Красный, зеленый,синий void setup() { Wire.begin(); // подключаем I2C библиотеку } void loop() { int brightness = 255; HSB_To_RGB(color, brightness);//вызываем функцию преобразования hSB в RGB //саму функцию нашел готовую Wire.beginTransmission(address); // Взято "один в один" из даташита :) Wire.write('c'); // 'c' == fade to color Wire.write(R); // value for red channel Wire.write(B); // value for blue channel Wire.write(G); // value for green channel Wire.endTransmission(); // leave I2C bus HSB_To_RGB(255-color, brightness);// а это для второго BlinkM Wire.beginTransmission(address1);// для красоты, в обратной последовательности Wire.write('c'); // Wire.write(R); // Wire.write(B); // Wire.write(G); // Wire.endTransmission(); // color++; // увеличиваем счетчик цвета в HSB if (color > 255) color = 0; delay(100); } void HSB_To_RGB( int hue, int brightness) { unsigned int scaledHue = (hue * 6); // segment 0 to 5 around the color wheel unsigned int segment = scaledHue / 256; // position within the segment unsigned int segmentOffset = scaledHue - (segment * 256); unsigned int complement = 0; unsigned int prev = (brightness * ( 255 - segmentOffset)) / 256; unsigned int next = (brightness * segmentOffset) / 256; switch(segment ) { case 0: // red R = brightness; G = next; B = complement; break; case 1: // yellow R = prev; G = brightness; B = complement; break; case 2: // green R = complement; G = brightness; B = next; break; case 3: // cyan R = complement; G = prev; B = brightness; break; case 4: // blue R = next; G = complement; B = brightness; break; case 5: // magenta default: R = brightness; G = complement; B = prev; break; } }
Резюме. Поставленную задачу, изготовить клон BlinkM своими руками, я выполнил. Результат мне самому понравился, а это ВАЖНО.
Полезность в хозяйстве «умного светодиода»? Это пока открытый вопрос.
Все необходимое для повторения, а также фото и даташиты заботливо сложены в архивчик 🙂 Пользуйтесь на здоровье!
0 комментариев на «“Делаем клон BlinkM. Или наш ответ Чемберлену”»
Сделал. Работает. Но очень сильно мерцает при изменении цвета. Не сталкивались?
Нет, вроде повезло с этим. И как понять мерцает? Это происходит на всех «основных» цветах или при включении одного из…
Я единственное столкнулся с одним RGB светодиодом (выпаянный из старого видика), он был странный, для него пришлось ставить одинаковые резисторы.
1. Решение есть. В микросхеме по умолчанию установлен фуз CKDIV8 — его надо сбросить. То есть по умолчанию LOW бит равен 0x62 а нужно установить 0xe2.
2. У Вас в схеме, после слов «Схема «нагуглилась» достаточно быстро:» ошибочка. 5 и 6 ножка перепуталась местами.
А ведь верно! Спасибо, за внимательность. Вот что значит, «взял с интернета». Слава богу, при разводке печатной платы я этой схемой не пользовался… Постараюсь исправить (если это возможно).
… пришлось мне поломать голову. Во-первых, прошивал я микросхемы не Ардуино, а программатором через стороннюю отладочную плату. Возможно тот способ прошивки, который описан здесь и меняет фуз, а при программировании hex файлов напрямую это, естественно не происходит. Ну и соединял после программирования по Вашей схеме. То есть в итоге дикое мерцание (до ряди в глазах) и ноль реакции на шину 🙂 Ступор!
Предлагаю Вам внести в статью замечание о фузах. Думаю, через некоторое время статья будет востребована и вот в связи с чем.
Есть такой очень популярный проект — подсветка лестницы, посмотрите на habrahabr. Там реализация ШИМ управления одноцветными диодными лентами. Я себе такую сделал.
Но хочется большего. Управление цветными лентами на основе I2C и сборки дарлингтона будет повеселее. И проводов поменьше. Надо лишь делать плату ATtiny45 + uln2003a на каждую ступеньку.
Огромное СПАСИБО внимательным людям 🙂 Схему поправил… Про фьюзы и другие варианты прошивки пока нету времени разбираться… (Дача и сезон отпусков полностью поглощают все свободное время).