ws2812 + 3 панели 8*32 + Adafruit_NeoMatrix

Grigory
Offline
Зарегистрирован: 29.03.2014

Доброго дня, столкнулся со следующей проблемой следующего плана. есть 6 панелей (https://ba3ar.kz/product/ws2812b-svetodiodnyj-cifrovoj-matrichnyj-ekran-...), подсоединил, включил тестовый скетч по простому линейному включению ледов и все отработало. Однако мне из этих панелей нужно собрать единое табло 2*3 и вот тут происходит "магия". 

В примере есть инициализация объекта по сборке панелей в одну панель, но результат - все панели не включаются. 

// Adafruit_NeoMatrix example for tiled NeoPixel matrices.  Scrolls
// 'Howdy' across three 10x8 NeoPixel grids that were created using
// NeoPixel 60 LEDs per meter flex strip.

#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 EACH NEOPIXEL MATRIX (not total display)
// Parameter 2 = height of each matrix
// Parameter 3 = number of matrices arranged horizontally
// Parameter 4 = number of matrices arranged vertically
// Parameter 5 = pin number (most are valid)
// Parameter 6 = 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 FIRST MATRIX; pick two, e.g.
//     NEO_MATRIX_TOP + NEO_MATRIX_LEFT for the top-left corner.
//   NEO_MATRIX_ROWS, NEO_MATRIX_COLUMNS: LEDs WITHIN EACH MATRIX are
//     arranged in horizontal rows or in vertical columns, respectively;
//     pick one or the other.
//   NEO_MATRIX_PROGRESSIVE, NEO_MATRIX_ZIGZAG: all rows/columns WITHIN
//     EACH MATRIX proceed in the same order, or alternate lines reverse
//     direction; pick one.
//   NEO_TILE_TOP, NEO_TILE_BOTTOM, NEO_TILE_LEFT, NEO_TILE_RIGHT:
//     Position of the FIRST MATRIX (tile) in the OVERALL DISPLAY; pick
//     two, e.g. NEO_TILE_TOP + NEO_TILE_LEFT for the top-left corner.
//   NEO_TILE_ROWS, NEO_TILE_COLUMNS: the matrices in the OVERALL DISPLAY
//     are arranged in horizontal rows or in vertical columns, respectively;
//     pick one or the other.
//   NEO_TILE_PROGRESSIVE, NEO_TILE_ZIGZAG: the ROWS/COLUMS OF MATRICES
//     (tiles) in the OVERALL DISPLAY proceed in the same order for every
//     line, or alternate lines reverse direction; pick one.  When using
//     zig-zag order, the orientation of the matrices in alternate rows
//     will be rotated 180 degrees (this is normal -- simplifies wiring).
//   See example below for these values in action.
// Parameter 7 = pixel type flags, add together as needed:
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 pixels)
//   NEO_GRB     Pixels are wired for GRB bitstream (v2 pixels)
//   NEO_KHZ400  400 KHz bitstream (e.g. FLORA v1 pixels)
//   NEO_KHZ800  800 KHz bitstream (e.g. High Density LED strip)

// Example with three 10x8 matrices (created using NeoPixel flex strip --
// these grids are not a ready-made product).  In this application we'd
// like to arrange the three matrices side-by-side in a wide display.
// The first matrix (tile) will be at the left, and the first pixel within
// that matrix is at the top left.  The matrices use zig-zag line ordering.
// There's only one row here, so it doesn't matter if we declare it in row
// or column order.  The matrices use 800 KHz (v2) pixels that expect GRB
// color data.
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, 2, 2, PIN,
  NEO_TILE_TOP   + NEO_TILE_LEFT   + NEO_TILE_ROWS   + NEO_TILE_PROGRESSIVE +
  NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
  NEO_GRB + NEO_KHZ400);

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(255);
  matrix.setTextColor(colors[0]);
}

int x    = matrix.width();
int pass = 0;

void loop() {
  matrix.fillScreen(0);
  matrix.setCursor(x, 0);
  matrix.print(F("Howdy"));
  if(--x < -36) {
    x = matrix.width();
    if(++pass >= 3) pass = 0;
    matrix.setTextColor(colors[pass]);
  }
  matrix.show();
  delay(100);
}

собственно вот здесь меняю 

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, 2, 3, PIN,
  NEO_TILE_TOP   + NEO_TILE_LEFT   + NEO_TILE_ROWS   + NEO_TILE_PROGRESSIVE +
  NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
  NEO_GRB + NEO_KHZ400);
 
подскажите кто работал с такими панелями и куда нужно копать? 
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Начните с 32, 8, 1, 1, PIN

Grigory
Offline
Зарегистрирован: 29.03.2014

пробовал, работает и 32,8,2,2 оживает, но криво очень

Grigory
Offline
Зарегистрирован: 29.03.2014
предполагаю что весь прикол вот здесь
 if(--x < -36) {
    x = matrix.width();
    if(++pass >= 3) pass = 0;
    matrix.setTextColor(colors[pass]);
  }
 

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

И почему NEO_KHZ400 ?

Grigory
Offline
Зарегистрирован: 29.03.2014

проверял на 800 и на 400 - результат одинаков

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

зависит от того как собраны диоды в матрице  и матрицы в панели

+ NEO_MATRIX_ZIGZAG попробуйте совсем убрать

https://wokwi.com/projects/328895784065958484

Grigory
Offline
Зарегистрирован: 29.03.2014

https://learn.adafruit.com/adafruit-neopixel-uberguide/neomatrix-library вот здесь вроде все доступно описано и зигзаг вроде как должен наоборот выстроить путь подсветки, но проверю

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

А какая плата Arduino у вас ??? 32*8*6*3=4608 байт ОЗУ требуется только под буфер для светодиодов !

Grigory
Offline
Зарегистрирован: 29.03.2014

mega2560

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Должна потянуть  ...

В каком порядке у вас матрицы подключены ?

Grigory
Offline
Зарегистрирован: 29.03.2014

да их собственно по другому и нельзя подключить , есть вход 2 провода, есть выход 3 провода, последовательно все соединил. отдельно питание +- дал. 

 

Grigory
Offline
Зарегистрирован: 29.03.2014

сори опечатался, вход 3 провода тоже

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

1 2 3

6 5 4

 

1 2 3

4 5 6

 

1 3 5

2 4 6

...

как у вас ?

Для панели с расположением матриц:

1 2 3

4 5 6

скетч и проект в эмуляторе - https://wokwi.com/projects/328895784065958484

 

 

Для панели с расположением матриц:

1 2 3

6 5 4

надо матрицы 4 5 6 физически развернуть на 180 градусов и в скетче NEO_TILE_PROGRESSIVE заменить на NEO_TILE_ZIGZAG...

Grigory
Offline
Зарегистрирован: 29.03.2014

спс проверю

 

Grigory
Offline
Зарегистрирован: 29.03.2014

я правильно понимаю что в этом примере вот так расположены матрицы? 

https://wokwi.com/projects/328895784065958484

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Да и все одинаково ориентированы.

Grigory
Offline
Зарегистрирован: 29.03.2014

вечером только смогу проверить

Grigory
Offline
Зарегистрирован: 29.03.2014

Спасибо, получилось

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Вот вам и "магия" ...

Grigory
Offline
Зарегистрирован: 29.03.2014

Доброго дня, при проверке rainbow все крутится вертится, а вот с выводом текста засада, при расположении матриц как у вас на  https://wokwi.com/projects/328895784065958484 матрицы как будто стоят вертикально(хотя исходя из  Parameter 3 = number of matrices arranged horizontally и   Parameter 4 = number of matrices arranged vertically выставлено правильно

Grigory
Offline
Зарегистрирован: 29.03.2014

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(количество пикселей - по длине - 32, количество пикселей по высоте -8,  количество матриц расположенных вертикально-2,  количество матриц расположенных горизонтально-3

Хотя проверил уже по разному

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Grigory пишет:

В эмуляторе матрицы соединены как на картинке выше ! (верхний ряд rgb1 rgb2 rgb3 нижний ряд rgb4 rgb5 rgb6)

Соединения:

"mega:6", "rgb1:DIN"
"rgb1:DOUT", "rgb2:DIN"
"rgb2:DOUT", "rgb3:DIN"
"rgb3:DOUT", "rgb4:DIN"
"rgb4:DOUT", "rgb5:DIN"
"rgb5:DOUT", "rgb6:DIN"

У вас как расположены матрицы ?

Выложите ссылку на короткое видео того что происходит ?!

У вас видимо диоды внутри матриц соединены иначе чем в эмуляторе и надо играться параметрами:

NEO_TILE_TOP NEO_TILE_LEFT NEO_TILE_ROWS NEO_TILE_PROGRESSIVE
 
Можно запустить скетч для ленты с количеством диодов 1, 9 и 33 - будет видно где первый светодиод и в какой последовательности они соединены внутри матрицы !
Grigory
Offline
Зарегистрирован: 29.03.2014

видео подготовлю, матрицы подключил как на схеме

Grigory
Offline
Зарегистрирован: 29.03.2014

https://dropmefiles.com/lGLfT

пример взял ваш

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

NEO_TILE_ROWS меняем на NEO_TILE_COLUMNS

NEO_TILE_PROGRESSIVE меняем на NEO_TILE_ZIGZAG

Grigory
Offline
Зарегистрирован: 29.03.2014
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, 3, 2, PIN,
  NEO_TILE_TOP   + NEO_TILE_LEFT   + NEO_TILE_COLUMNS   + NEO_TILE_ZIGZAG +
  NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_ROWS,
  NEO_GRB + NEO_KHZ800);
 
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Перепутал: TILE это расположение кусков, а MATRIX это расположение диодов в одной матрице !

Это изменение ОТМЕНЯЕМ !

NEO_TILE_ROWS меняем на NEO_TILE_COLUMNS

NEO_TILE_PROGRESSIVE меняем на NEO_TILE_ZIGZAG

Это делаем:

NEO_MATRIX_ROWS меняем на NEO_MATRIX_COLUMNS
и добавляем + NEO_MATRIX_ZIGZAG
Grigory
Offline
Зарегистрирован: 29.03.2014
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, 3, 2, PIN,
  NEO_TILE_TOP   + NEO_TILE_LEFT   + NEO_TILE_COLUMNS   + NEO_TILE_ZIGZAG +
  NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS,
  NEO_GRB + NEO_KHZ800);
 
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018
Вы не отменили и не добавили ...
Вот так пробуйте:
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, 3, 2, PIN,
  NEO_TILE_TOP   + NEO_TILE_LEFT   + NEO_TILE_ROWS  + NEO_TILE_PROGRESSIVE+
  NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB + NEO_KHZ800);
Grigory
Offline
Зарегистрирован: 29.03.2014

ура заработало)))))))))))))))))))

Grigory
Offline
Зарегистрирован: 29.03.2014

спасибо огромное