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

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


0 комментариев на «“Делаем клон BlinkM. Или наш ответ Чемберлену”»

    • Нет, вроде повезло с этим. И как понять мерцает? Это происходит на всех «основных» цветах или при включении одного из…

      Я единственное столкнулся с одним RGB светодиодом (выпаянный из старого видика), он был странный, для него пришлось ставить одинаковые резисторы.

    • 1. Решение есть. В микросхеме по умолчанию установлен фуз CKDIV8 — его надо сбросить. То есть по умолчанию LOW бит равен 0x62 а нужно установить 0xe2.

      2. У Вас в схеме, после слов «Схема «нагуглилась» достаточно быстро:» ошибочка. 5 и 6 ножка перепуталась местами.

    • А ведь верно! Спасибо, за внимательность. Вот что значит, «взял с интернета». Слава богу, при разводке печатной платы я этой схемой не пользовался… Постараюсь исправить (если это возможно).

    • … пришлось мне поломать голову. Во-первых, прошивал я микросхемы не Ардуино, а программатором через стороннюю отладочную плату. Возможно тот способ прошивки, который описан здесь и меняет фуз, а при программировании hex файлов напрямую это, естественно не происходит. Ну и соединял после программирования по Вашей схеме. То есть в итоге дикое мерцание (до ряди в глазах) и ноль реакции на шину 🙂 Ступор!
      Предлагаю Вам внести в статью замечание о фузах. Думаю, через некоторое время статья будет востребована и вот в связи с чем.
      Есть такой очень популярный проект — подсветка лестницы, посмотрите на habrahabr. Там реализация ШИМ управления одноцветными диодными лентами. Я себе такую сделал.
      Но хочется большего. Управление цветными лентами на основе I2C и сборки дарлингтона будет повеселее. И проводов поменьше. Надо лишь делать плату ATtiny45 + uln2003a на каждую ступеньку.

  1. Огромное СПАСИБО внимательным людям 🙂 Схему поправил… Про фьюзы и другие варианты прошивки пока нету времени разбираться… (Дача и сезон отпусков полностью поглощают все свободное время).

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

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение