Пользователь
0,0
рейтинг
26 января 2014 в 23:51

Визуализация с RGB-полоской

Итак, дорогие друзья, начну слегка из далека. Решил заказать с eBay из Америки недорого отладочную платку STMF4-DISCOVERY, долго ждал, хотел побаловаться с контроллером F4 серии, но через месяц на почте меня ждал облом. Вместо вкусной платки пришла натуральная хрень — RGB полоса на базе контроллера WS2801. Полоса водонепроницаемая с коннекторами и адресуемыми светодиодами по отдельности, но обо всем по порядку!

Первым делом надо попробовать её в деле! Приступим!

imageimage



Какие же варианты применения можно найти это дурной штуке? Не много посмотрев интернет, были определены следующие варианты использования полосы:
  • Непонятная штука для баловства и издевательств над коллегами
  • Декоративное освещение (авто, окошко, дача и т.д.)
  • Визуальное отображение некоторого параметра (уровни звука, напряжения, частоты, нагрузки и т.д.)

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

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

Для решения поставленной задачи нам понадобится:
  • Arduino Nano
  • Макетная плата
  • Несколько проводников
  • Изолента
  • Кабель mini-USB

Этап 1. Аппаратная часть


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

Судя по описанию продавца центы, она построена на контроллерах WS2801, управляемых по SPI или I2C, на выбор разработчика. Интересной особенностью данной ленты являются RGB диоды и отдельно управляемые микросхемы драйверы. Управляются они последовательность посылок, по количеству сегментов полосы. Временная диаграмма управления приставлена ниже:
image

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

Распиновка написана на самой ленте и в описании, так что тут ничего сложного:
  • Красный 5V DC
  • Зеленый Clock
  • Желтый Data
  • Коричневый Ground

Подключим напрямую нашу ленту к контроллеру на макетной плате, как показано на рисунке:
image

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

Этап 2. Программирование аппаратной и программной части


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

Аппаратная часть должна соответствовать следующим требованиям:
  1. Основной цикл программы не должен блокироваться
  2. Протокол управления должен быть простой и понятный
  3. Устройство работает в режиме SLAVE


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

Протокол управления лентой включает в себя следующие команды:
SET MODE %d\n Установить режим работы
SET COLOR %d\n Установить основной цвет
SET VALUE %d\n Установить значение от 0 до 1000


В качестве ответом возвращаются Эхо-строки команд начинающиеся с символов ">> ", например:
>> SET VALUE 673


Объект ленты настраивается в функции setup, приведу ее ниже:
void setup() {
  Serial.begin(115200);
  
  // Тип контроллера, номер пина данных, номер пина синхр., тип развертки, массив значений и его длина
  FastLED.addLeds<WS2801, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
}


Для примера приведу реализацию неблокирующей функции отрисовки змейки:
void runner(CRGB color, int period, uint8_t s) {
  static int pos = 0; /* Текущее положение ползунка */
  static long last = millis();
  
  if(millis() - last > period) { // Реализация временной задержки
    last = millis();
    clear_led();
    if(pos < NUM_LEDS - s) { // Реализация 
  
      for(uint8_t j = 0; j < s; ++j) {
        leds[pos + j] = color;
      }
      FastLED.show();
      
      ++pos;
    } else {
      pos = 0;
    }
  }
}


Режимы работы реализуем следующие:
  • Бегающий сегмент с заданной скоростью смещения
  • Заполнение ленты заданным цветом на заданной длины
  • Заполнение ленты с изменением цвета в зависимости от значения (0 — 300 зеленый, 301 — 660 желтый, 661 — 1000 красный)
  • Бегающий сегмент с заданной скоростью смещения с различно изменяющимися цветами
  • Заполнение ленты заданным цветом на заданной длины с различно изменяющимися цветами
  • Режим проверки цвета в соответствии с документацией на библиотеку FastLED

Чтобы не долго мучиться быстро можно на клепать программу управления на C#, которая реализует протокол:
image

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

Этап 3. Отладка и тестирование


Итак, все это хозяйство надо проверить, для чего воспользуемся бесплатной утилитой проверки процессора Hot CPU Tester 4.3, состав тестов специально урезал, чтобы видно было «живое» изменение эффектов ленты. Перечень тестов изображен на рисунке:
image

Результаты тестирования и процесс функционирования информера можно посмотреть на видео:


Исходный код:
LEDInformer.rar

Применять данное устройство планирую либо в машине, либо для украшения внутренностей High Tower компа своего, чтобы красиво разными цветами показывать что с ним происходит!
@smashrod
карма
70,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (29)

  • +1
    Выглядит эффектно, особенно вращение :) А вообще за stm32ftdiscovery далеко ездить/заказывать, не надо. Терраэлектроника по 800 вечно деревянных продаёт.
    • 0
      Да это ясно, мне в Москву тоже надо ехать, а тут по Best Offer обошлась в 600р, но так как прислали эще эту дурь, то отправил им 18 баксов за нее, это они мне типа дали скидку на 30% и доставку ленты не оплачивал получается ))))
  • 0
    Выглядит здорово, спасибо за интересную и вполне воплотимую идею!
    • 0
      На самом деле, лента режется просто, если задаться целью, то сделать простое устройство ELM327(OBDII)->RGBLed по скорости автомобиля и моргание по «джеки чану», то все обойдется в 1,5 тыр ))))
      • +1
        Мечтаю сделать подсветку своему Менделю) image
        Примерно как здесь: image
        • 0
          Кстати, во сколько он обошелся и какое качество печати? Поддаются обработке итоговые образцы?
          • +1
            Покупал кит из Польши (они само собой привозят из Китая), с доставкой обошёлся около 20 тыс. руб. Качество печати — толщина стенки 1мм минимальная, толщина слоя — пробовал на 0.1мм минимум. АБСные детали отлично обрабатываются ацетоном (но лично мне жутко не нравится ни запах горелого АБСа ни запах испаряющегося ацетона), поэтому печатаю ПЛА и обрабатываю канцелярским ножом и бутановым паяльником. Примеры печати можно посмотреть в контактовской группе.
        • +4
          пожалуйста, научитесь использовать спойлеры
  • 0
    Схема?
  • +2
    Схема не нужна, тут просто по пинам подключить на гребенку и все:
    Красный 5V DC
    Зеленый Clock
    Желтый Data
    Коричневый Ground
  • 0
    На последнем видео прям дискотека получилась :)

    Приходилось использовать LED strips, но пока только обычный белый. Устанавливал что бы подсвечивать CO2 лазерный станок изнутри.
    • 0
      Сначала хотел показать режим с изменением цвета, просто полосу, но она не показательна, а вращение отлично отражает процесс
      • 0
        Следующим надо было бы сделать субпиксельное движение которое даст эффект при медленном перемещении — например 1 пиксел в секунду.
  • 0
    Есть ли какой-нибудь бесплатный софт для создания «эффектов» для таких многоканальных систем? Так чтобы можно было преимущественно мышкой нарисовать эффект, задать цветовые или яркостные переходы по отдельным каналам или их группам и потом экспортировать в удобный для дальнейшей автоматической обработки формат(например CSV)?
    • 0
      Сдлелать такой не сложно, просто надо типовой проект сделать, если соберется сообщество можно сделать
      • 0
        я тоже думал не сложно, но еще до воплощения запутался в необходимом управлении, получаются какие-то частные случаи… на каждый случай кнопочек не напасёшься.
        • 0
          В смысле? Можно просто в виде суенари рисовать, пауза цвет пауза цвет и тд, вот и получиится редактор полосы
          • +1
            Хлопотно это, когда каналов становится штук под 20 и больше, как быть с полутонами? наглядностью? плавными переходами? А если нужна зависимость между полосами — хотябы убедится визуально что получился нужный сдвиг между каналами или в синхронности действий на нескольких каналах?
            особенно ад наступает когда хочется в некоторых местах включить некоторый элемент случайности… тут уже нужно придумывать сложные механизмы выражения что же именно нужно тебе от глупой но исполнительной машины.
            Хотя, может это лишнее… может и правда пойдет интерфейс как у первых MIDI-редакторов, расставляем ноты и…
            • 0
              а почему бы не взять конвертер ICO либо форматов, нарисуй в ФШ и потом простой конфертер файла для загрузки в железку?
              • 0
                Такой подход добавляет больше сложностей чем решает их.
  • 0
    Ешё вариант использования — это задняя подстветка манитора или телевизора. Как у Philips Ambient Light. WS2801 — это лучший выбор на данный момент.
    • 0
      Для такой проект есть, делают ребята из Перми кажется
  • 0
    Я так понимаю, из таких полосок можно и большой LED-дисплей собрать?
    • 0
      Дорого, можно купить 64 на 15 за 1200 купить на ибее уже готовую матрицу
      • 0
        Дорого, но зато на стене здания можно целый экран собрать! :)
        • +1
          Проще взять одну полоску, сделать привод и таскать с заданной частотой вверх вниз одну полоску, и получится забавная штука, экран на одной полосе и приводах )))
          • 0
            Не, просто в два раза меньше полос, чем количество выводимых строк. И мотором дергать чуть вверх, чуть вниз. Будет чересстрочная развертка.
  • 0
    Самодельная цветомузыка на светодиодной RGB-ленте WS2811. Работает микроконтроллер ATmega32A, оцифровывает сигнал с микрофонного усилителя и автоматически (в зависимости от спектра входного сигнала) создает цветовую картинку. Компьютер при этом не требуется. Исходный код (проект для AVR Studio) свободно доступен.


    • 0
      Это не сложно сделать, аудио ацп и все дела, дальше только меняй цвет

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.