Делаем клон 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 своими руками, я выполнил. Результат мне самому понравился, а это ВАЖНО.
Полезность в хозяйстве «умного светодиода»? Это пока открытый вопрос.

Все необходимое для повторения, а также фото и даташиты заботливо сложены в архивчик 🙂 Пользуйтесь на здоровье!