DMD_STM32 - библиотека DMD матриц для СТМ32 и RP2040

Просто 256 очень граничное число и сразу надо смотреть на размерность переменной.

По второму вопросу - если скорости на вывод с одного выхода на 6 панелей хватает, то конечно все 6 последовательно. А на Мега и SPI то один…

Тут есть видео с заполнением разных панелей … китайцы там такое вытворяют при пайке … и спирали и змейки и вообще ХЗ что … так что до СТРОК там далеко !

Стандартное соединение панелей - последовательное. А уже потом цепочка из модулей укладывается как вам угодно. Преобразование координат - программно.

Использовать параллельное соединение на Меге бессмысленно, порты МК всего 8битные, обновлять более одной цепочки за раз не получится.

Т.е., я верно понимаю, что мне в “мозгах” необходимо как-то рисовать шрифт, разбивая на две части? Если я хочу высоту символов в две панели? По умолчанию же программа масштабирует шрифт, рисуя его от заданной координаты. Это, стало быть, и свой шрифт делать? Однако, да. Придется помучиться.

Нет. неверно. Ничего специально под панель перерисовывать не надо.
Достаточно простейшего преобразования координат.

Допустим, у вас есть две панели 64х32, подсоединенные последовательно, то есть они образуют экран размером 128х32.
Вы хотите поместить их в две строки одну над другой - то есть 64х64

Тогда переход от координат для дисплея 64х64 к 128х32 записывается в две строчки:

y_new = y_old % 32;
x_new  = x_old + 64* y_old/32 ;

И все.

Рисуете на экране так, будто он 64х64, стандартным шрифтом. А при выводе на матрицу преобразуете координаты нехитрой математикой, приведенной выше.

Ура! Оно работает! Пасиб!
Тока код такой в итоге вышел:

if (stretch & 1)
  {
	if (y >= _height)   
	{    y = y % 32;	  
	     x = x + 192;  	   
	}
  }
1 лайк

У STM дури много, конечно, но, может эко-код поспособствует снижению общепланетарной температуры…

tmp = y_old >> 5;
x_new = x_old + tmp << 6;
y_new = y_old - tmp

В данном случае согласен :slight_smile:
Но в общем случае там стоят переменные Width и Height, которые могут и не являтся степенью двойки :slight_smile:

Я больше избегал дорогой операции %, т.к. она все равно деление выполняет. Т.е. два одинаковых деления для одной транзакции.

1 лайк

согласен

День добрый! Решил я не тянуть кота за хвост. Думаю, возьму-ка Arduino DUE. Сразу на STM32 переходить как-то страшно. И с размаху уперся в стену. STM32, и DUE в том числе, любят 3.3.в. С 5 вольтами у них как-то не очень. И вот я сижу и ломаю голову - как хотя бы протестить на DUE те же панели? Они ж на 5 в, а входа/выхода на 3.3 в. Можете хотя бы намекнуть как быть? Или строке неважно, какого уровня я ей сигнал подаю - 3.3 или 5 В, лишь бы сила 5 в шла?

Нет, это важно. Если вы подаете логический сигнал 3.3 вместо 5в - панель может работать неустойчиво, вплоть до полного отсутствия изображения.
К счастью на многих распространенных панелях драйверы могут работать с сигналом 3.3в или на входе стоят микросхемы логического буфера, типа hc245, которые играют роль конвертера лог уровней. Но если таких буферов нет - нужно ставить конвертер логуровней 3.3 - 5в на всех входные линии HUB75

Добавлю - из примерно 20 панелей в моей коллекции только две требуют конвертеров. Но уж эти без конвертеров не работают вовсе.

Спасибо. На моих панелях есть такие буфера! Значит, DUE или STM32 можно подключать напрямую. Уже проще.

Здравствуйте! Странно работает функция поворота экрана setRotation().
Код

#include "DMD_RGB.h"
#include "hz2.h"

//Number of panels in x and y axis
#define DISPLAYS_ACROSS 1
#define DISPLAYS_DOWN 2

// Enable of output buffering
// if true, changes only outputs to matrix after
// swapBuffers(true) command
// If dual buffer not enabled, all output draw at matrix directly
// and swapBuffers(true) cimmand do nothing
#define ENABLE_DUAL_BUFFER false

// ==== DMD_RGB pins ====
// mux pins - A, B, C... all mux pins must be selected from same port!
#define DMD_PIN_A PB6
#define DMD_PIN_B PB5
#define DMD_PIN_C PB7
#define DMD_PIN_D PB8
#define DMD_PIN_E PB9
// put all mux pins at list
uint8_t mux_list[] = { DMD_PIN_A, DMD_PIN_B, DMD_PIN_C, DMD_PIN_D, DMD_PIN_E };

// pin OE must be one of PB0 PB1 PA6 PA7
#define DMD_PIN_nOE PB0
#define DMD_PIN_SCLK PA10

// Pins for R0, G0, B0, R1, G1, B1 channels and for clock.
// By default the library uses RGB color order.
// If you need to change this - reorder the R0, G0, B0, R1, G1, B1 pins.
// All this pins also must be selected from same port!
uint8_t custom_rgbpins[] = { PA0, PA1, PA2, PA3, PA5, PA6, PA7 };  // CLK, R0, G0, B0, R1, G1, B1

// Fire up the DMD object as dmd<MATRIX_TYPE, COLOR_DEPTH>
// We use 64x32 matrix with 16 scans and 4bit color:
DMD_RGB<RGB64x32plainS16, COLOR_4BITS_Packed> dmd(mux_list, DMD_PIN_nOE, DMD_PIN_SCLK, custom_rgbpins, DISPLAYS_ACROSS, DISPLAYS_DOWN, ENABLE_DUAL_BUFFER);
// other options are:
// <RGB32x16plainS8> -  32x16 matrix with 8scans
// <RGB80x40plainS20> - 80x40 matrix with 20scans
// <RGB64x64plainS32> - 64x64 matrix with 32scans
// Color depth - <COLOR_4BITS_Packed> or <COLOR_4BITS>
// <COLOR_1BITS> mode is not recomended for bitmap

#define BRIGHTNESS_DEFAULT 50  // (brightness 0-255, recomended 30-100)

// bitmap images to show
const uint16_t* bitmaps[] = { hz2 };
uint8_t ptr = 0;
/*--------------------------------------------------------------------------------------
  setup
  Called by the Arduino architecture before the main loop begins
--------------------------------------------------------------------------------------*/

int i = 0;
void setup(void) {
  // initialize DMD objects
  dmd.init();
}
void loop(void) {
  dmd.setRotation(i++);
  dmd.drawRGBBitmap(0, 0, bitmaps[0], 64, 64);

  delay(5000);
  dmd.clearScreen(true);
}

результат:
video_2023-04-05_11-11-11

красиво :slight_smile:
Надо будет посмотреть

День добрый! Я верно понимаю, что если я хочу использовать на STM32 наработки на базе библиотеки RGBMatrix для Arduino (с которой я собственно начал писать в этой ветке), мне достаточно изменить адреса и алгоритм вывода в порты устройства, не трогая собственно функции вывода? Или проще взять наработки уважаемого b707 и курочить их?

не очень понял вопрос. Код для цветных матриц в моей библиотеке начинался как раз с портирования RGBMatrix на СТМ, так что вы должны найти между ними много общего.
Это все открытый код, вы можете его курочить как угодно.

nik425 А курочилка уже выросла ???

Ага, понял. Тогда, думаю, разберусь , что куда.

Здравствуйте. Не могу запустить матрицу Q5E8V3H Qiangli hub75
на stm32f103с8т6
Всё подключил по описанию. Но вообще никаких реакций.


Здравствуйте
По этим фото не понятно, что за матрица.
Нужны хотя бы размер в пикселях Ширина Х Высота и число сканов.
Обычно на матрице бывает обозначение что-то типа P6-6432-2427-8S-V3.2
Кроме того, полезно было бы списать обозначения всех микросхем (обычно на матрице их три или четыре типа)