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

smashrod 26 января 2014 в 23:51 49,6k
Итак, дорогие друзья, начну слегка из далека. Решил заказать с 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 компа своего, чтобы красиво разными цветами показывать что с ним происходит!
Проголосовать:
+37
Сохранить: