Делаем клон BlinkM. Или наш ответ Чемберлену – RoboCraft (original) (raw)
Делаем клон BlinkM. Или наш ответ Чемберлену
Постепенно нашу жизнь заполняют умные вещи. Смартфоны, смартТВ, умные скороварки, умные автомобили и т.п. И вот дело дошло даже до «умных светодиодов»!!! Итак, спешу представить: 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 своими руками, я выполнил. Результат мне самому понравился, а это ВАЖНО.
Полезность в хозяйстве «умного светодиода»? Это пока открытый вопрос.
Все необходимое для повторения, а также фото и даташиты заботливо сложены в архивчик 🙂 Пользуйтесь на здоровье!