Приветствую всех муськовчан. После экспериментов на ленте на адресуемых светодиодах WS2812b заказал гибкую матрицу на этих же светодиодах WS2812b, 16х16 (256 пикселей). Посылка с Bangood пришла неожиданно быстро –за десять дней.
Технические данные от поставщика.
Напряжение: DC5V
LED чип: SMD5050
Тип IC: WS2812B (IC Built in LED)
LED количество: 256 пикселей
LED цвет: многоцветный, цифровой RGB, каждый LED индивидуальный контроль
Водонепроницаемость: нет
Режим работы: внешний контроллер Arduino
Подключение: VCC: красный; GND: белый; DAT: синий
Размер: 16 * 16 см, 8 * 32 см
Не буду загружать шелестящими распаковками, треками, взвешиваниями и т. д, (кому надо могут посмотреть видео). В общем те же светодиоды как и в ленте, только грубо говоря смонтированные на квадратной матрице размером 16х16 см, по зигзагу слева на право (если смотреть с от левого нижнего угла матрицы где идет подключение к Ардуино). Управлять матрицей можно как с Ардуино, так и с STM32, всевозможных контроллеров типа T-1000S и т.п.
Я подключал к Arduino Uno. Управление осуществляется по одному проводу с пина Ардуино. Необходим источник питания 5вольт, до 3ампер. Я подключил от самодельного БП через понижающую плату с индикацией выходного напряжения.
Фото.платы
Внимание — при загрузке скетчей с компьютера источник питания светодиодов самой матрицы должен быть отключен! Пин управления матрицей подключаем через резистор 500 Ом.
С обратной стороны матрицы находятся провода для подключения –вход, дополнительный вход по питанию, выход для подключения следующей матрицы( для сборки более большого экрана). То есть можно из таких матриц собрать матрицу 16х32, 32х32 и т.д. Питание 5 вольт (чтобы исключить падение напряжения на светодиодах расположенных в конце матрицы) нужно также подключить и к выходу матрицы.
Cхема, и обратная сторона матрицs
Матрицы разных размеров.
На этой матрице можно получить огромное количество световых эффектов, анимацию, бегущую строку, собрать рекламное панно и т.д. Из этих готовых матриц можно собрать экраны большего размера.Для начала загрузил скетч бегущей строки для теста матрицы 16х16 на светодиодах WS2812b. В нем нужно правильно установить параметры NEO_MATRIX_BOTTOM, NEO_MATRIX_LEFT – НИЖНИЙ ЛЕВЫЙ УГОЛ NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG — СТРОКИ ЗИГЗАГ. Подключаем к ардуино, загружаем скетч текста, настраиваем параметры бегущей строки и вводим нужный вам текст.
Скетч бегущей строки.
Дополнительная информация
[code]
// Adafruit_NeoMatrix example for single NeoPixel Shield.
// Scrolls 'Howdy' across the matrix in a portrait (vertical) orientation.
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#ifndef PSTR
#define PSTR // Make Arduino Due happy
#endif
#define PIN 6
// MATRIX DECLARATION:
// Parameter 1 = width of NeoPixel matrix
// Parameter 2 = height of matrix
// Parameter 3 = pin number (most are valid)
// Parameter 4 = matrix layout flags, add together as needed:
// NEO_MATRIX_TOP, NEO_MATRIX_BOTTOM, NEO_MATRIX_LEFT, NEO_MATRIX_RIGHT:
// Position of the FIRST LED in the matrix; pick two, e.g.
// NEO_MATRIX_TOP + NEO_MATRIX_LEFT for the top-left corner.
// NEO_MATRIX_ROWS, NEO_MATRIX_COLUMNS: LEDs are arranged in horizontal
// rows or in vertical columns, respectively; pick one or the other.
// NEO_MATRIX_PROGRESSIVE, NEO_MATRIX_ZIGZAG: all rows/columns proceed
// in the same order, or alternate lines reverse direction; pick one.
// See example below for these values in action.
// Parameter 5 = pixel type flags, add together as needed:
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
// Example for NeoPixel Shield. In this application we'd like to use it
// as a 5x8 tall matrix, with the USB port positioned at the top of the
// Arduino. When held that way, the first pixel is at the top right, and
// lines are arranged in columns, progressive order. The shield uses
// 800 KHz (v2) pixels that expect GRB color data.
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 16, PIN,
NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT +
NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
NEO_GRB + NEO_KHZ800);
const uint16_t colors[] = {
matrix.Color(255, 0, 0), matrix.Color(0, 255, 0), matrix.Color(0, 0, 255) };//цвет текста
void setup() {
matrix.begin();
matrix.setTextWrap(false);
matrix.setBrightness(30);//яркость букв
matrix.setTextColor(colors[0]);
}
int x = matrix.width();
int pass = 0;
void loop() {
matrix.fillScreen(10);//Яркость фона
matrix.setCursor(x, 5);//Расположение текста-выше, ниже
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
if(--x < -184) { //184 -зависит количество букв
x = matrix.width();
if(++pass >= 3) pass = 0;
matrix.setTextColor(colors[pass]);
}
matrix.show();
delay(100);//скорость текста
}
[/code]
Примеры световых эффектов на матрице в 256 пикселей.
Для создания эффектов на таких матрицах существует много программ (одна из них Glediator).
Сейчас считается обычным проведение дискотек и вечеринок с помощью компьютера, но их роль сводится максимум к музыкальному сопровождению. С компьютера программой Glediator можно управлять онлайн светодиодной матрицей. Это отличный способ добавить впечатляющий объем цвета при сохранении в состоянии индивидуально контроля по каждому светодиоду.
Программа Glediator очень хорошо подходит для анимирования светодиодных матриц на вечеринках дома. Она способна управлять матрицей, состоящей до 512 светодиодов WS2812/NeoPixels, формируя до 24 кадров/сек — этого вполне достаточно для нашего дисплея, можно даже выводить на него простые анимационные гифы. Микшер позволяет делать плавные переходы между анимациями.
Недостатков матрицы я не вижу, кроме цены — но надо учитывать что здесь установлено 256 светодиодов WS2812В. Плюсом считаю этой матрицы что она дает большой простор для творчества даже в домашних условиях при применении платформы Ардуино.
Кому интересно подробнее можно посмотреть в видео
youtu.be/sQ-bmsHLhWY
Всем желаю здоровья и удачи по жизни и в покупках!
насколько же серьёзнее приходится питание организовывать на «неумных»;) лентах, чтобы не было просадки по яркости в середине
В этом плане, кстати, 2812 удобней, т.к. в них есть встроенный стабилизатор тока через диоды, благодаря чему их яркость не падает, даже если напряжение питания упадет до 4 В. Но зато они требуют в три раза больший ток по питанию.
У меня получалось на Atmega328 (та, что в основе УНО) сделать два варианта вывода — с использованием USART выводить 1 канал, но на прерываниях (т.е. вывод идет параллельно с основной программой) и выводить 5 каналов сразу с запрещенными прерываниями. Я сократил цветность до 8 бит на светодиод с использованием таблицы цветов в ПЗУ (по факту, хоть диоды и имеют по 256 градаций цвета на каждом канале, толку от них не так много, ведь они изменяют яркость линейно. А в мониторах, например, используется гамма 2.2, в итоге получается по 4 «настоящих» бита на канал).
а в частоту ШИМ (2 кГц для 2812) вам не приходилось упираться, какие-нибудь странные артефакты не проявлялись на сотнях диодов?
В идеале было бы использовать по 4 бита на канал, тогда каждый канал обеспечит как раз 16 градаций яркости, что является практически пределом при гамме 2.2 с балансом белого (об этом ниже). Но это дает 1.5 байта на канал, что увеличивает размер экрана из 600 диодов до 900 байт, т.е. практически до половины ОЗУ микроконтроллера. У себя я использовал по 6 градаций яркости на канал (0 = выключено, 5 = полностью включено), это дает 216 цветов, один цвет, транслирующийся в 0xFFFFFF (поясню ниже), 23 неиспользуемых (пока) цвета и 16 градаций серого. 6 градаций яркости требуют двукратного умножения на 6 для формирования индекса цвета, но это не так сложно, т.к. результат умещается в одном регистре:
Вообще, оригинальная идея была такая — я заказал две 5 м катушки ленты по 300 диодов каждая, из которых хотел сделать матрицу 30х20 с шагом между диодами 16.67 мм. На полученном экране можно было бы сделать, например, игру в тетрис =) Но пока экран не реализован из-за нехватки времени, есть только код, выводящий «изображение» на линию из 600 диодов 50 раз в секунду.
Да, на счет частоты шима — нет, не упирался. 2 КГц — это весьма много, получить артефакты можно только если выводить какое-то быстромигающее изображение. Если изменение яркости будет плавным, вряд ли глаз заметит какие-то артефакты.
С этой точки зрения мой второй вариант вывода (5 линий сразу по 120 диодов каждая) лучше, т.к. обновление экрана и работа программы никогда не приходятся на одно и то же время, но он требует полного запрещения прерываний, что не позволяет, например, опрашивать ИК-приемник или работать с другими interrupt-driven устройствами.
Фаст лед тупо вешает контроллер.
Найденная альтернативная библиотечка — использует кусок api для ик-передатчика и у того из-за ограничения на расшариваемую память ограничение — после 22 пикселя ошибка по памяти…
Как итог — плюнул и впаял промежуточный контроллер на атмеге для экрана.
Я бы поковырял исходный код библиотеки (если он доступен).
Вроде вот так рекомендуют подключать, т.е. питание разделять.
Можете привести пример, как прикрутив датчик, выводить его показания на матрицу?
P.S. У вас схема питания неверно нарисована, вывод IOREF тут совсем не причём…
In file included from /Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino/Arduino.h:28:0,
from sketch/sketch_nov21a.ino.cpp:1:
sketch_nov21a:58:16: error: stray '\302' in program
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:58:14: note: in expansion of macro 'F'
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
sketch_nov21a:58:17: error: stray '\253' in program
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:58:14: note: in expansion of macro 'F'
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
sketch_nov21a:58:51: error: stray '\302' in program
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:58:14: note: in expansion of macro 'F'
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
sketch_nov21a:58:52: error: stray '\273' in program
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:58:14: note: in expansion of macro 'F'
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
sketch_nov21a:124:16: error: stray '\302' in program
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:124:14: note: in expansion of macro 'F'
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
sketch_nov21a:124:17: error: stray '\253' in program
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:124:14: note: in expansion of macro 'F'
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
sketch_nov21a:124:51: error: stray '\302' in program
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:124:14: note: in expansion of macro 'F'
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
sketch_nov21a:124:52: error: stray '\273' in program
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:124:14: note: in expansion of macro 'F'
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino: In function 'void loop()':
sketch_nov21a:58:18: error: 'TEST' was not declared in this scope
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:58:14: note: in expansion of macro 'F'
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:58:18: note: suggested alternative: 'TWSR'
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:58:14: note: in expansion of macro 'F'
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
sketch_nov21a:58:23: error: expected ')' before 'MATRIZI16x16'
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:58:14: note: in expansion of macro 'F'
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino: At global scope:
sketch_nov21a:103:20: error: redefinition of 'Adafruit_NeoMatrix matrix'
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 16, PIN,
^~~~~~
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:37:20: note: 'Adafruit_NeoMatrix matrix' previously declared here
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 16, PIN,
^~~~~~
sketch_nov21a:108:23: error: redefinition of 'const uint16_t colors []'
const uint16_t colors[] = {
^
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:42:16: note: 'const uint16_t colors [3]' previously declared here
const uint16_t colors[] = {
^~~~~~
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino: In function 'void setup()':
sketch_nov21a:111:6: error: redefinition of 'void setup()'
void setup() {
^~~~~
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:45:6: note: 'void setup()' previously defined here
void setup() {
^~~~~
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino: At global scope:
sketch_nov21a:118:5: error: redefinition of 'int x'
int x = matrix.width();
^
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:52:5: note: 'int x' previously declared here
int x = matrix.width();
^
sketch_nov21a:119:5: error: redefinition of 'int pass'
int pass = 0;
^~~~
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:53:5: note: 'int pass' previously defined here
int pass = 0;
^~~~
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino: In function 'void loop()':
sketch_nov21a:121:6: error: redefinition of 'void loop()'
void loop() {
^~~~
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:55:6: note: 'void loop()' previously defined here
void loop() {
^~~~
In file included from /Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino/Arduino.h:28:0,
from sketch/sketch_nov21a.ino.cpp:1:
sketch_nov21a:124:18: error: 'TEST' was not declared in this scope
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:124:14: note: in expansion of macro 'F'
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:124:18: note: suggested alternative: 'TWSR'
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:124:14: note: in expansion of macro 'F'
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
sketch_nov21a:124:23: error: expected ')' before 'MATRIZI16x16'
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
/var/folders/qj/pm02y_4n44qbtwzxzmzs136h0000gn/T/arduino_modified_sketch_941117/sketch_nov21a.ino:124:14: note: in expansion of macro 'F'
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
^
Несколько библиотеу было найдено для «Adafruit_GFX.h»
Использовано: /Users/MacDoc/Documents/Arduino/libraries/Adafruit_GFX_Library
Несколько библиотеу было найдено для «Adafruit_NeoMatrix.h»
Использовано: /Users/MacDoc/Documents/Arduino/libraries/Adafruit_NeoMatrix
Несколько библиотеу было найдено для «Adafruit_NeoPixel.h»
Использовано: /Users/MacDoc/Documents/Arduino/libraries/Adafruit_NeoPixel
Несколько библиотеу было найдено для «SPI.h»
Использовано: /Applications/Arduino.app/Contents/Java/hardware/arduino/avr/libraries/SPI
exit status 1
stray '\302' in program