Также опытным путем было определено, что заполнение матрицы идет по 128 бит. То есть загоняются первые 64 бита (с 0 по 63) они загружаются в сдвиговый регистр и отправляются в 9 строку. Потом загружаются следующие 64 бита (с 64 по 127) и они загружаются в 1 строку. Сама панель разделена на 2 почти независимые панели. верхние 16 строк (которые заполняются 1-9, 2-10, 3-11…8-16) и нижние 16 строк заполняются точно по такому же принципу.
Пожалуйста, покажите код, как вы заполняете матрицу. Заполнять надо по одному пикселю с интервалом 30-50 миллисекунд между точками, чтобы было видно порядок заполнения.
Не “почти”, а полностью независимые. Пины R0 G0 B0 управляют верхней половиной, а R1 G1 B1 - нижней. Это справедливо для любой HUB75 панели.
/*--------------------------------------------------------------------------------------
Demo for RGB panels
DMD_STM32a example code for STM32F103xxx board
Pattern test for 32x16 1/2 1/4 RGB panels
------------------------------------------------------------------------------------- */
#include "DMD_RGB.h"
#define RGB64x32_S8_Eu057 3,64,32,8,58 // 64x32 1/8 Eugene057
template<int COL_DEPTH>
class DMD_RGB<RGB64x32_S8_Eu057, COL_DEPTH> : public DMD_RGB_BASE2<COL_DEPTH>
{
public:
DMD_RGB(uint8_t* mux_list, byte _pin_nOE, byte _pin_SCLK, uint8_t* pinlist,
byte panelsWide, byte panelsHigh, bool d_buf = false) :
DMD_RGB_BASE2<COL_DEPTH>(3, mux_list, _pin_nOE, _pin_SCLK, pinlist,
panelsWide, panelsHigh, d_buf, COL_DEPTH, 8, 64, 32)
{
this->fast_Hbyte = false;
this->use_shift = false;
}
// Fast text shift is disabled for complex patterns, so we don't need the method
void disableFastTextShift(bool shift) override {}
protected:
uint16_t get_base_addr(int16_t& x, int16_t& y) override {
this->transform_XY(x, y);
uint8_t pol_y = y % this->pol_displ;
x += (y / this->DMD_PIXELS_DOWN) * this->WIDTH;
uint16_t base_addr = (pol_y % this->nRows) * this->x_len + (x / 16) * this->multiplex * 16;
if (pol_y / this->nRows) base_addr += x % 16;
else base_addr += (16 + x % 16);
return base_addr;
}
};
//Number of panels in x and y axis
#define DISPLAYS_ACROSS 1
#define DISPLAYS_DOWN 1
// Output buffering - false
#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 PB4
#define DMD_PIN_D PB3
#define DMD_PIN_E PB8
// 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 PB7
// 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[] = { PA15, PA0,PA1,PA2,PA3,PA4,PA8 }; // CLK, R0, G0, B0, R1, G1, B1
// Fire up the DMD object as dmd<MATRIX_TYPE, COLOR_DEPTH>
// For pattern testing use one of matrix below:
// RGB32x16plainS4 - 32x16 1/4 Binary mux
// RGB32x16plainS4_DIRECT - 32x16 1/4 DIRECT mux
// RGB32x16plainS2_DIRECT - 32x16 1/2 Binary mux
DMD_RGB <RGB64x32_S8_Eu057 , COLOR_4BITS> dmd(mux_list, DMD_PIN_nOE, DMD_PIN_SCLK, custom_rgbpins, DISPLAYS_ACROSS, DISPLAYS_DOWN, ENABLE_DUAL_BUFFER);
uint16_t bg = 0; // background - black
uint16_t fg = 0; // foreground
void setup(void)
{
dmd.init();
fg = dmd.Color888(0, 255, 0);
dmd.setBrightness(10);
}
void loop(void) {
// fill the matrix with points row by row
for (int i = 0; i < dmd.height(); i++) {
for (int j = 0; j < dmd.width(); j++) {
dmd.drawPixel(j,i, fg);
delay(30);
}
}
// clear the screen
dmd.fillScreen(bg);
}
Если честно. Я не понял, где здесь менять время чтобы пиксели заполнялись медленнее. Вот этот год я заливаю и выходит вот такой быстрый результат как на видео
строка 88. Но у вас и так все стоит правильно.
Но вот чего я не вижу - где вы изменили дефайны для матриц, как я просил в сообщении 318? В коде остается матрица
#pragma once
#include "DMD_RGB.h"
#ifndef DMD_PANEL_TEMPLATES_H
#define DMD_PANEL_TEMPLATES_H
/*--------------------------------------------------------------------------------------
This file is a part of the library DMD_STM32
DMD_STM32.h - STM32 port of DMD.h library
https://github.com/board707/DMD_STM32
Dmitry Dmitriev (c) 2019-2023
/--------------------------------------------------------------------------------------*/
// == MATRIX TYPES ==
/*--------------------------------------------------------------------------------------*/
// == Syntax of panel define ==
//
// #define NAME_OF_PANEL MUX pins, Panel_width, Panel_height, scan, pattern ID
//
// example:
// #define RGB80x40plainS20 5,80,40,20,0 // 5 mux pins(A B C D E), 80x40, scan 1/20, pattern 0
//
// pattern_ID is unique number for pattern design
// pattern ID between 0 and 31 and after 255 are reserved for library use
// and from 32 to 127 - for user panels, added by author
// for new panels added yourself use pattern_ID between 128 and 255
//
/*--------------------------------------------------------------------------------------*/
// = matrices with plain pattern =
// single row scan (where scan = height /2 )
#define RGB32x16plainS8 3,32,16,8,0 // 32x16 1/8
#define RGB40x20plainS10 4,40,20,10,0 // 40x20 1/10
#define RGB32x32plainS16 4,32,32,16,0 // 32x32 1/16
#define RGB64x32plainS16 4,64,32,16,0 // 64x32 1/16
#define RGB80x40plainS20 5,80,40,20,0 // 80x40 1/20
#define RGB64x64plainS32 5,64,64,32,0 // 64x64 1/32
#define RGB128x64plainS32 5,128,64,32,0 // 128x64 1/32
// multirow outdoor, plain pattern
#define RGB32x16plainS4 2,32,16,4,1 // 32x16 1/4 BINARY Mux pattern 1
#define RGB32x16plainS4_pt2 2,32,16,4,2 // 32x16 1/4 BINARY Mux pattern 2
#define RGB32x16plainS4_DIRECT 4,32,16,4,1 // 32x16 1/4 DIRECT Mux pattern 1
#define RGB32x16plainS2 1,32,16,2,1 // 32x16 1/2 BINARY
#define RGB32x16plainS2_DIRECT 2,32,16,2,1 // 32x16 1/2 DIRECT
#define RGB32x32_S8_maxmurugan 3,32,32,8,33 // 32x32 1/8 BINARY from @maxmurugan
#define RGB64x32_S8_OKSingra 3,64,32,8,3 // 64x32 1/8 BINARY from @OKSingra
#define RGB64x32_S8_Eu057 3,64,32,8,58 // 64x32 1/8 32pix pattern, SHIFT_REG mux from Eugene057
#define RGB64x32_S8_pt1 3,64,32,8,1 // 64x32 1/8 pt1
#define RGB64x32_S8_pt2 3,64,32,8,2 // 64x32 1/8 pt2
// multirow outdoor, complex pattern
#define RGB32x16_S4_variable 2,32,16,4,32 // 32x16 1/4 variable pattern for 3216_s4 example
// *** User panels ***
#define RGB32x16_S4 2,32,16,4,50 // 32x16 1/4 ZIGGII pattern matrix, BINARY mux
#define RGB32x16_S4_bilalibrir 4,32,16,4,51 // 32x16 1/4 ZAGGIZ pattern, DIRECT mux
#define RGB32x16_S2 2,32,16,2,52 // 32x16 1/2 complex pattern, DIRECT mux
#define RGB32x16_S2_quangli 2,32,16,2,53 // 32x16 1/2 complex pattern, DIRECT mux
#define RGB32x16_S2_horro 1,32,16,2,54 // 32x16 1/2 complex pattern, BINARY mux from @horro
#define RGB32x16_S2_OKSingra 1,32,16,2,55 // 32x16 1/2 complex pattern, BINARY mux from @OKSingra
#define RGB40x20_S5_LNikon 3,40,20,5,56 // 40x20 1/5 4pixels pattern, BINARY mux from @LNikon
#define RGB80x40_S10_LNikon 4,80,40,10,57 // 80x40 1/10 4pixels pattern, BINARY mux from @LNikon
/*--------------------------------------------------------------------------------------*/
template <int MUX_CNT, int P_Width, int P_Height, int SCAN, int SCAN_TYPE, int COL_DEPTH>
class DMD_RGB : public DMD_RGB_BASE2<COL_DEPTH>
{
public:
DMD_RGB() = 0;
};
//--------------------------------------------------------------------------------------/
// Matrix types templates
//--------------------------------------------------------------------------------------/
// Plain panels with Scan = P_Height / 2
//--------------------------------------------------------------------------------------/
template <int MUX_CNT, int P_Width, int P_Height, int SCAN, int COL_DEPTH>
class DMD_RGB<MUX_CNT, P_Width, P_Height, SCAN, 0, COL_DEPTH> : public DMD_RGB_BASE2<COL_DEPTH>
{
public:
DMD_RGB(uint8_t* mux_list, byte _pin_nOE, byte _pin_SCLK, uint8_t* pinlist,
byte panelsWide, byte panelsHigh, bool d_buf = false) :
DMD_RGB_BASE2<COL_DEPTH>(MUX_CNT, mux_list, _pin_nOE, _pin_SCLK, pinlist,
panelsWide, panelsHigh, d_buf, COL_DEPTH, SCAN, P_Width, P_Height)
{}
};
//--------------------------------------------------------------------------------------
// "plain" type outdoor matrix, BINARY/DIRECT mux
// with consecutive bytes in consecutive horizontal lines
// (0,1) (2,3)...
// left for testing
//--------------------------------------------------------------------------------------/
template <int MUX_CNT, int P_Width, int P_Height, int SCAN, int COL_DEPTH>
class DMD_RGB<MUX_CNT, P_Width, P_Height, SCAN, 1, COL_DEPTH> : public DMD_RGB_BASE2<COL_DEPTH>
{
public:
DMD_RGB(uint8_t* mux_list, byte _pin_nOE, byte _pin_SCLK, uint8_t* pinlist,
byte panelsWide, byte panelsHigh, bool d_buf = false) :
DMD_RGB_BASE2<COL_DEPTH>(MUX_CNT, mux_list, _pin_nOE, _pin_SCLK, pinlist,
panelsWide, panelsHigh, d_buf, COL_DEPTH, SCAN, P_Width, P_Height)
{}
protected:
uint16_t get_base_addr(int16_t& x, int16_t& y) override {
this->transform_XY(x, y);
uint8_t pol_y = y % this->pol_displ;
x += (y / this->DMD_PIXELS_DOWN) * this->WIDTH;
uint16_t base_addr = (pol_y / this->multiplex) * this->x_len +
(x / this->DMD_PIXELS_ACROSS) * this->multiplex * this->DMD_PIXELS_ACROSS +
(pol_y % this->multiplex) * this->DMD_PIXELS_ACROSS + x % this->DMD_PIXELS_ACROSS;
return base_addr;
}
};
//--------------------------------------------------------------------------------------
// "plain" type outdoor matrix, BINARY/DIRECT mux
// with consecutive bytes in horizontal lines
// separated by nRows lines
// (0,nRows) (1, nRows+1)...
// left for testing
//--------------------------------------------------------------------------------------/
template <int MUX_CNT, int P_Width, int P_Height, int SCAN, int COL_DEPTH>
class DMD_RGB<MUX_CNT, P_Width, P_Height, SCAN, 2, COL_DEPTH> : public DMD_RGB_BASE2<COL_DEPTH>
{
public:
DMD_RGB(uint8_t* mux_list, byte _pin_nOE, byte _pin_SCLK, uint8_t* pinlist,
byte panelsWide, byte panelsHigh, bool d_buf = false) :
DMD_RGB_BASE2<COL_DEPTH>(MUX_CNT, mux_list, _pin_nOE, _pin_SCLK, pinlist,
panelsWide, panelsHigh, d_buf, COL_DEPTH, SCAN, P_Width, P_Height)
{}
protected:
uint16_t get_base_addr(int16_t& x, int16_t& y) override {
this->transform_XY(x, y);
uint8_t pol_y = y % this->pol_displ;
x += (y / this->DMD_PIXELS_DOWN) * this->WIDTH;
uint16_t base_addr = (pol_y % this->nRows) * this->x_len +
(x / this->DMD_PIXELS_ACROSS) * this->multiplex * this->DMD_PIXELS_ACROSS +
(pol_y / this->nRows) * this->DMD_PIXELS_ACROSS + x % this->DMD_PIXELS_ACROSS;
return base_addr;
}
};
//--------------------------------------------------------------------------------------
// "plain" type outdoor matrix, BINARY/DIRECT mux
// with consecutive bytes in horizontal lines
// separated by nRows lines
// scan quarter of height (i.e 64x32 1/8), start scan from nRows line
// (nRows, 0) (nRows+1, 1)...
//
// s/n GKGD-P5-6432-2727-8S-v3.4
//--------------------------------------------------------------------------------------/
template <int MUX_CNT, int P_Width, int P_Height, int SCAN, int COL_DEPTH>
class DMD_RGB<MUX_CNT, P_Width, P_Height, SCAN, 3, COL_DEPTH> : public DMD_RGB_BASE2<COL_DEPTH>
{
public:
DMD_RGB(uint8_t* mux_list, byte _pin_nOE, byte _pin_SCLK, uint8_t* pinlist,
byte panelsWide, byte panelsHigh, bool d_buf = false) :
DMD_RGB_BASE2<COL_DEPTH>(MUX_CNT, mux_list, _pin_nOE, _pin_SCLK, pinlist,
panelsWide, panelsHigh, d_buf, COL_DEPTH, SCAN, P_Width, P_Height)
{
this->fast_Hbyte = false;
this->use_shift = false;
}
// Fast text shift is disabled for complex patterns, so we don't need the method
void disableFastTextShift(bool shift) override {}
protected:
uint16_t get_base_addr(int16_t& x, int16_t& y) override {
this->transform_XY(x, y);
uint8_t pol_y = y % this->pol_displ;
x += (y / this->DMD_PIXELS_DOWN) * this->WIDTH;
uint16_t base_addr = (pol_y % this->nRows) * this->x_len +
(x / this->DMD_PIXELS_ACROSS) * this->multiplex * this->DMD_PIXELS_ACROSS +
x % this->DMD_PIXELS_ACROSS;
if (pol_y < this->nRows) base_addr += this->DMD_PIXELS_ACROSS;
return base_addr;
}
};
//--------------------------------------------------------------------------------------
// Non-plain outdoor matrices
// Each such matrix is not like the others, so each needs an individual template.
//--------------------------------------------------------------------------------------
// p6 32x32 scan 8 matrix from @maxmurugan
// plain pattern with consecutive bytes in horizontal lines
// lower row first
// RGB32x32_S8_maxmurugan
//--------------------------------------------------------------------------------------/
template<int COL_DEPTH>
class DMD_RGB<RGB32x32_S8_maxmurugan, COL_DEPTH> : public DMD_RGB_BASE2<COL_DEPTH>
{
public:
DMD_RGB(uint8_t* mux_list, byte _pin_nOE, byte _pin_SCLK, uint8_t* pinlist,
byte panelsWide, byte panelsHigh, bool d_buf = false) :
DMD_RGB_BASE2<COL_DEPTH>(3, mux_list, _pin_nOE, _pin_SCLK, pinlist,
panelsWide, panelsHigh, d_buf, COL_DEPTH, 8, 32, 32)
{
this->fast_Hbyte = false;
this->use_shift = false;
}
// Fast text shift is disabled for complex patterns, so we don't need the method
void disableFastTextShift(bool shift) override {}
protected:
uint16_t get_base_addr(int16_t &x, int16_t &y) override {
this->transform_XY(x, y);
uint8_t pol_y = y % this->pol_displ;
x += (y / this->DMD_PIXELS_DOWN) * this->WIDTH;
static const uint8_t A_tbl[16] = { 0,1,2,3,4,5,6,7,
0,1,2,3,4,5,6,7 };
static const uint8_t B_tbl[16] = { 1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0 };
static const uint8_t C_tbl[8] = { 0,1,2,3,4,5,6,7 };
static const uint8_t Pan_Okt_cnt = this->DMD_PIXELS_ACROSS / 8;
uint8_t Oktet_m = B_tbl[pol_y] * Pan_Okt_cnt + (x / 8) % Pan_Okt_cnt;
uint16_t base_addr = this->x_len * A_tbl[pol_y] + (x / this->DMD_PIXELS_ACROSS) * this->DMD_PIXELS_ACROSS * this->multiplex + C_tbl[Oktet_m] * 8;
base_addr += x % 8;
return base_addr;
}
};
//--------------------------------------------------------------------------------------
// 1/4 matrix I have
//
// with pattern [1H|1L] [3H|3L]
// | * |
// [0L|0H] [2L|2H]
// and BINARY mux
//
// s/n S10-(3535)-4S-3216-A3
//--------------------------------------------------------------------------------------/
template<int COL_DEPTH>
class DMD_RGB<RGB32x16_S4, COL_DEPTH> : public DMD_RGB_BASE2<COL_DEPTH>
{
public:
DMD_RGB(uint8_t* mux_list, byte _pin_nOE, byte _pin_SCLK, uint8_t* pinlist,
byte panelsWide, byte panelsHigh, bool d_buf = false) :
DMD_RGB_BASE2<COL_DEPTH>(2, mux_list, _pin_nOE, _pin_SCLK, pinlist,
panelsWide, panelsHigh, d_buf, COL_DEPTH, 4, 32, 16)
{
this->fast_Hbyte = false;
this->use_shift = false;
}
// Fast text shift is disabled for complex patterns, so we don't need the method
void disableFastTextShift(bool shift) override {}
protected:
uint16_t get_base_addr(int16_t& x, int16_t& y) override {
this->transform_XY(x, y);
uint8_t pol_y = y % this->pol_displ;
x += (y / this->DMD_PIXELS_DOWN) * this->WIDTH;
uint16_t base_addr = (pol_y % this->nRows) * this->x_len + (x / 8) * this->multiplex * 8;
if (pol_y / this->nRows) base_addr += x % 8;
else base_addr += (15 - x % 8);
return base_addr;
}
};
//--------------------------------------------------------------------------------------
// 40x20 1/5 matrix from LNikon
// BINARY mux
// 138 mux, SN16207 driver
//
// 4-pixel pattern, lower line first (LPS type)
// Qiang li Q8S5V3H BQWZ-ZP
//--------------------------------------------------------------------------------------/
template<int COL_DEPTH>
class DMD_RGB<RGB40x20_S5_LNikon, COL_DEPTH> : public DMD_RGB_BASE2<COL_DEPTH>
{
public:
DMD_RGB(uint8_t* mux_list, byte _pin_nOE, byte _pin_SCLK, uint8_t* pinlist,
byte panelsWide, byte panelsHigh, bool d_buf = false) :
DMD_RGB_BASE2<COL_DEPTH>(3, mux_list, _pin_nOE, _pin_SCLK, pinlist,
panelsWide, panelsHigh, d_buf, COL_DEPTH, 5, 40, 20)
{
this->fast_Hbyte = false;
this->use_shift = false;
}
// Fast text shift is disabled for complex patterns, so we don't need the method
void disableFastTextShift(bool shift) override {}
protected:
uint16_t get_base_addr(int16_t& x, int16_t& y) override {
this->transform_XY(x, y);
uint8_t pol_y = y % this->pol_displ;
x += (y / this->DMD_PIXELS_DOWN) * this->WIDTH;
uint16_t base_addr = (pol_y % this->nRows) * this->x_len + (x / 4) * this->multiplex * 4;
if (pol_y / this->nRows) base_addr += x % 4;
else base_addr += (4 + x % 4);
return base_addr;
}
};
//--------------------------------------------------------------------------------------
// 80x40 1/10 matrix from LNikon
// BINARY mux
// SM5166P mux, SM16227S driver
//
// 4-pixel pattern, upper line first (UPS type)
// Qiang li Q4Y10V5H
//--------------------------------------------------------------------------------------/
template<int COL_DEPTH>
class DMD_RGB< RGB80x40_S10_LNikon, COL_DEPTH> : public DMD_RGB_BASE2<COL_DEPTH>
{
public:
DMD_RGB(uint8_t* mux_list, byte _pin_nOE, byte _pin_SCLK, uint8_t* pinlist,
byte panelsWide, byte panelsHigh, bool d_buf = false) :
DMD_RGB_BASE2<COL_DEPTH>(4, mux_list, _pin_nOE, _pin_SCLK, pinlist,
panelsWide, panelsHigh, d_buf, COL_DEPTH, 10, 80, 40)
{
this->fast_Hbyte = false;
this->use_shift = false;
}
// Fast text shift is disabled for complex patterns, so we don't need the method
void disableFastTextShift(bool shift) override {}
protected:
uint16_t get_base_addr(int16_t& x, int16_t& y) override {
this->transform_XY(x, y);
uint8_t pol_y = y % this->pol_displ;
x += (y / this->DMD_PIXELS_DOWN) * this->WIDTH;
uint16_t base_addr = (pol_y % this->nRows) * this->x_len + (x / 4) * this->multiplex * 4;
if (pol_y / this->nRows) base_addr += (4 + x % 4);
else base_addr += x % 4;
return base_addr;
}
};
//--------------------------------------------------------------------------------------
// 1/4 matrix from Bilal Ibrir
//
// with pattern [0H|0L] [2H|2L]
// | / | /
// [1L|1H] [3L|3H]
// and DIRECT mux
//--------------------------------------------------------------------------------------/
template<int COL_DEPTH>
class DMD_RGB< RGB32x16_S4_bilalibrir, COL_DEPTH> : public DMD_RGB_BASE2<COL_DEPTH>
{
public:
DMD_RGB(uint8_t* mux_list, byte _pin_nOE, byte _pin_SCLK, uint8_t* pinlist,
byte panelsWide, byte panelsHigh, bool d_buf = false) :
DMD_RGB_BASE2<COL_DEPTH>(4, mux_list, _pin_nOE, _pin_SCLK, pinlist,
panelsWide, panelsHigh, d_buf, COL_DEPTH, 4, 32, 16)
{
this->fast_Hbyte = false;
this->use_shift = false;
}
// Fast text shift is disabled for complex patterns, so we don't need the method
void disableFastTextShift(bool shift) override {}
protected:
uint16_t get_base_addr(int16_t& x, int16_t& y) override {
this->transform_XY(x, y);
uint8_t pol_y = y % this->pol_displ;
x += (y / this->DMD_PIXELS_DOWN) * this->WIDTH;
uint16_t base_addr = (pol_y % this->nRows) * this->x_len + (x / 8) * this->multiplex * 8;
if (pol_y / this->nRows) base_addr += 8 + x % 8;
else base_addr += (7 - x % 8);
return base_addr;
}
};
//--------------------------------------------------------------------------------------
// 1/2 matrix I have
//
// with pattern [0H|0L] [4H|4L]
// | / |
// [1L|1H] / [5L|5H]
// | / |
// [2H|2L] / [6H|6L]
// | / | /
// [3L|3H] [7L|7H]
// and DIRECT mux
//
// s/n P10(3535)16X32-2S-V1.3
//--------------------------------------------------------------------------------------/
template<int COL_DEPTH>
class DMD_RGB<RGB32x16_S2, COL_DEPTH> : public DMD_RGB_BASE2<COL_DEPTH>
{
public:
DMD_RGB(uint8_t* mux_list, byte _pin_nOE, byte _pin_SCLK, uint8_t* pinlist,
byte panelsWide, byte panelsHigh, bool d_buf = false) :
DMD_RGB_BASE2<COL_DEPTH>(2, mux_list, _pin_nOE, _pin_SCLK, pinlist,
panelsWide, panelsHigh, d_buf, COL_DEPTH, 2, 32, 16)
{
this->fast_Hbyte = false;
this->use_shift = false;
}
// Fast text shift is disabled for complex patterns, so we don't need the method
void disableFastTextShift(bool shift) override {}
protected:
uint16_t get_base_addr(int16_t& x, int16_t& y) override {
this->transform_XY(x, y);
uint8_t pol_y = y % this->pol_displ;
x += (y / this->DMD_PIXELS_DOWN) * this->WIDTH;
uint16_t base_addr = (pol_y % this->nRows) * this->x_len + (x / 8) * this->multiplex * 8 + (pol_y / this->nRows) * 8;
if (((pol_y / this->nRows) % 2) == 0) { base_addr += (7 - x % 8); }
else base_addr += x % 8;
return base_addr;
}
};
/*--------------------------------------------------------------------------------------*/
// 32x16 1/2 matrix from horro
// Binary mux
//
// s/n P10(3535)16X32-2S-M1
//--------------------------------------------------------------------------------------/
template<int COL_DEPTH>
class DMD_RGB<RGB32x16_S2_horro, COL_DEPTH> : public DMD_RGB_BASE2<COL_DEPTH>
{
public:
DMD_RGB(uint8_t* mux_list, byte _pin_nOE, byte _pin_SCLK, uint8_t* pinlist,
byte panelsWide, byte panelsHigh, bool d_buf = false) :
DMD_RGB_BASE2<COL_DEPTH>(1, mux_list, _pin_nOE, _pin_SCLK, pinlist,
panelsWide, panelsHigh, d_buf, COL_DEPTH, 2, 32, 16)
{
this->fast_Hbyte = false;
this->use_shift = false;
}
// Fast text shift is disabled for complex patterns, so we don't need the method
void disableFastTextShift(bool shift) override {}
protected:
uint16_t get_base_addr(int16_t& x, int16_t& y) override {
this->transform_XY(x, y);
uint8_t pol_y = y % this->pol_displ;
x += (y / this->DMD_PIXELS_DOWN) * this->WIDTH;
static const uint8_t A_tbl[8] = { 0,1,0,1,0,1,0,1 };
static const uint8_t B_tbl[8] = { 2,2,3,3,0,0,1,1 };
static const uint8_t C_tbl[16] = { 0,2,4,6,
1,3,5,7,
8,10,12,14,
9,11,13,15 };
static const uint8_t Pan_Okt_cnt = this->DMD_PIXELS_ACROSS / 8;
uint8_t Oktet_m = B_tbl[pol_y] * Pan_Okt_cnt + (x / 8) % Pan_Okt_cnt;
uint16_t base_addr = this->x_len * A_tbl[pol_y] + (x / this->DMD_PIXELS_ACROSS) * this->DMD_PIXELS_ACROSS * this->multiplex + C_tbl[Oktet_m] * 8;
if (!(B_tbl[pol_y] % 2)) { base_addr += (7 - x % 8); }
else base_addr += x % 8;
return base_addr;
}
};
/*--------------------------------------------------------------------------------------*/
// 32x16 1/2 matrix from OKSingra
// Binary mux
// !! Non-standard !! 3rd quarter pattern is different from 1st, 2nd and 4th
//
// s/n GKGD-P10-3216-2727-2S-v1.4
//--------------------------------------------------------------------------------------/
template<int COL_DEPTH>
class DMD_RGB<RGB32x16_S2_OKSingra, COL_DEPTH> : public DMD_RGB_BASE2<COL_DEPTH>
{
public:
DMD_RGB(uint8_t* mux_list, byte _pin_nOE, byte _pin_SCLK, uint8_t* pinlist,
byte panelsWide, byte panelsHigh, bool d_buf = false) :
DMD_RGB_BASE2<COL_DEPTH>(1, mux_list, _pin_nOE, _pin_SCLK, pinlist,
panelsWide, panelsHigh, d_buf, COL_DEPTH, 2, 32, 16)
{
this->fast_Hbyte = false;
this->use_shift = false;
}
// Fast text shift is disabled for complex patterns, so we don't need the method
void disableFastTextShift(bool shift) override {}
protected:
uint16_t get_base_addr(int16_t& x, int16_t& y) override {
this->transform_XY(x, y);
uint8_t pol_y = y % this->pol_displ;
x += (y / this->DMD_PIXELS_DOWN) * this->WIDTH;
static const uint8_t A_tbl[8] = { 0,1,0,1,0,1,0,1 };
static const uint8_t B_tbl[8] = { 3,3,2,2,1,1,0,0 };
static const uint8_t C_tbl[16] = { 0,4,10,12,
1,5,11,13,
2,6,8,14,
3,7,9,15 };
static const uint8_t Pan_Okt_cnt = this->DMD_PIXELS_ACROSS / 8;
uint8_t Oktet_m = B_tbl[pol_y] * Pan_Okt_cnt + (x / 8) % Pan_Okt_cnt;
uint16_t base_addr = this->x_len * A_tbl[pol_y] + (x / this->DMD_PIXELS_ACROSS) * this->DMD_PIXELS_ACROSS * this->multiplex + C_tbl[Oktet_m] * 8;
if ((B_tbl[pol_y] % 2)) { base_addr += (7 - x % 8); }
else base_addr += x % 8;
return base_addr;
}
};
//--------------------------------------------------------------------------------------
// 1/2 matrix from quangli with two-byte pattern
// DIRECT mux
//
// Qiang li Q10C2V5.2H BQWZ-ZP
//--------------------------------------------------------------------------------------/
template<int COL_DEPTH>
class DMD_RGB<RGB32x16_S2_quangli, COL_DEPTH> : public DMD_RGB_BASE2<COL_DEPTH>
{
public:
DMD_RGB(uint8_t* mux_list, byte _pin_nOE, byte _pin_SCLK, uint8_t* pinlist,
byte panelsWide, byte panelsHigh, bool d_buf = false) :
DMD_RGB_BASE2<COL_DEPTH>(2, mux_list, _pin_nOE, _pin_SCLK, pinlist,
panelsWide, panelsHigh, d_buf, COL_DEPTH, 2, 32, 16)
{
this->fast_Hbyte = false;
this->use_shift = false;
}
// Fast text shift is disabled for complex patterns, so we don't need the method
void disableFastTextShift(bool shift) override {}
protected:
uint16_t get_base_addr(int16_t& x, int16_t& y) override {
this->transform_XY(x, y);
uint8_t pol_y = y % this->pol_displ;
x += (y / this->DMD_PIXELS_DOWN) * this->WIDTH;
/*uint16_t base_addr = (pol_y % this->nRows) * this->x_len + (x / 16) * this->multiplex * 16;
switch (pol_y / this->nRows) {
case 0: base_addr += 32; break;
case 1: base_addr += 40; break;
case 2: break;
case 3: base_addr += 8; break;
}
if (x % 16 > 7) base_addr += 16 + x % 8;
else base_addr += x % 8;
*/
static const uint8_t A_tbl[8] = { 0,1,0,1,0,1,0,1 };
static const uint8_t B_tbl[8] = { 2,2,3,3,0,0,1,1 };
static const uint8_t C_tbl[16] = { 0,2,8,10,
1,3,9,11,
4,6,12,14,
5,7,13,15 };
static const uint8_t Pan_Okt_cnt = this->DMD_PIXELS_ACROSS / 8;
uint8_t Oktet_m = B_tbl[pol_y] * Pan_Okt_cnt + (x / 8) % Pan_Okt_cnt;
uint16_t base_addr = this->x_len * A_tbl[pol_y] + (x / this->DMD_PIXELS_ACROSS) * this->DMD_PIXELS_ACROSS * this->multiplex + C_tbl[Oktet_m] * 8;
base_addr += x % 8;
return base_addr;
}
};
//--------------------------------------------------------------------------------------
/*template <int MUX_CNT, int P_Width, int P_Height, int SCAN, int SCAN_TYPE, int COL_DEPTH>
class DMD_RGB_SHIFTREG_ABC : public DMD_RGB<MUX_CNT, P_Width, P_Height, SCAN, SCAN_TYPE, COL_DEPTH>
{
public:
DMD_RGB_SHIFTREG_ABC() = 0;
};*/
//--------------------------------------------------------------------------------------
template <int MUX_CNT, int P_Width, int P_Height, int SCAN, int SCAN_TYPE, int COL_DEPTH>
class DMD_RGB_SHIFTREG_ABC : public DMD_RGB<MUX_CNT, P_Width, P_Height, SCAN, SCAN_TYPE, COL_DEPTH>
{
public:
DMD_RGB_SHIFTREG_ABC(uint8_t* mux_list, byte _pin_nOE, byte _pin_SCLK, uint8_t* pinlist,
byte panelsWide, byte panelsHigh, bool d_buf = false) :
DMD_RGB<MUX_CNT, P_Width, P_Height, SCAN, SCAN_TYPE, COL_DEPTH>(mux_list, _pin_nOE, _pin_SCLK, pinlist,
panelsWide, panelsHigh, d_buf)
{}
protected:
void generate_muxmask() override
{
pinMode(this->mux_pins[0], OUTPUT);
pinMode(this->mux_pins[1], OUTPUT);
pinMode(this->mux_pins[2], OUTPUT);
}
void set_mux(uint8_t curr_row) override {
byte pin_DMD_A = this->mux_pins[0];
byte pin_DMD_B = this->mux_pins[1];
byte pin_DMD_C = this->mux_pins[2];
// Just shift the row mux by one for incremental access
digitalWrite(pin_DMD_B, HIGH);
digitalWrite(pin_DMD_C, (curr_row == 0)); // Shift out 1 for line 0, 0 otherwise
digitalWrite(pin_DMD_A, HIGH); // Clock out this bit
digitalWrite(pin_DMD_A, LOW);
digitalWrite(pin_DMD_B, LOW);
}
};
#endif
Я все дефайны перепробовал. Даже которые не подходили. Ничего не заработало
И все комбинации с COLOR_4BITS_Packed и COLOR_4BITS
Не совсем понял, зачем Вы мне файл из библиотеки показываете. Библиотеку трогать не надо.
Вам нужно было вставить дефайны матриц в скетч. А описание чужой матрицы RGB64x32_S8_Eu057
- убрать.
Показать вам, что исправить, или сами справитесь?
Покажите пожалуйста, а то у меня туго это все идет
я начал изобретать свой велосипед потому что не знал с чего начать и могу показать код, который выводит мне статический массив который я нарисую. И не знаю, поможет ли он вам или нет. Но нарисованные в массиве буквы он выводит. И даже я их уже двигать научился
В принципе, матрицу RGB64x32_S8_Eu057 можно даже не убирать, она не мешает.
После вот этих строк
вставьте вот эти две
#define RGB64x32_S8_pt1 3,64,32,8,1 // 64x32 1/8 pt1
#define RGB64x32_S8_pt2 3,64,32,8,2 // 64x32 1/8 pt2
И далее в вызове класса матрицы (строка 71 по коду из сообщения 323)
DMD_RGB <RGB64x32_S8_Eu057 , COLOR_4BITS> dmd(mux_list, DMD_PIN_nOE, DMD_PIN_SCLK, custom_rgbpins, DISPLAYS_ACROSS, DISPLAYS_DOWN, ENABLE_DUAL_BUFFER);
замените RGB64x32_S8_Eu057 на RGB64x32_S8_pt1 - запишите видео.
Потом так же замените на RGB64x32_S8_pt2 и тоже запишите
Файлы библиотеки верните к исходному виду.
Чет у меня вообще все сломалось. Чуть позже покажу результаты
Такое ощущение, что раньше то что я скидывал заполнение по 4 полосы это были какие-то наводки. Потому что я когда прикасаюсь к проводам начинает что-то моргать. Я укоротил шлейф. Прошивка загружается в МК, но ничего не происходит. Перепроверил подключение. Оно правильное. Загружал блинк в STM через ARDUINO IDE - загрузка проходит успешно. Светодиод моргает. Проверял подключение на своем коде - выводит то что я задавал. Сейчас опять перепробовал все RGB режимы менять в коде в том числе и RGB64x32_S8_pt1 и RGB64x32_S8_pt2. Ничего не происходит. Ничего не загорается. Хотя когда к проводам прикасаешься начинает что-то моргать. Но теже 4 строки как на видео, только пока прикасаешься - что-то бежит, отпускаешь - все останавливается.
Очевидно где-то плохой контакт. Если у вас использованы перемычки, проверьте чтобы они держались плотно. Особое внимание обратите на контакты CLK OE и GND - проблемы с ними могут привести к полному пропадению картинки.
Если у вас есть другая такая панель, попробуйте сменить. То же самое с платой сти32
А мы можем на почту перейти?
вот параметры
P4-2121-6432-16S-HL1, ICN2037, DP245C, SM5166PC, 64X32 16S
P4-1921-320160-10S, ICB2037, RVC7258D, 74HC245KA, 80X40 10S
обе не могу запустить. Все пробовал.
Это должна работать без настройки, совершенно стандартная панель
а на этой надо немного настраивать, но тоже вполне совместима с кодом
По первой если не работает - проверяйте контакты.
По второй смогу помочь только через 2 недели
ок, попробую, спасибо!
У меня вопрос к знающим. Когда я скачал данную библиотеку. Захожу в папку DMD_STM32-dev-V2\DMD_STM32-dev-V2\examples\STM32F4_RP2040\dmd_rgb Пытаюсь просто скомпилировать файл для платы stm32f401ccu6 и у меня во всех примерах показывает ошибку `c:\Users\Serg\Documents\Arduino\libraries\Adafruit_BusIO\Adafruit_I2CDevice.cpp: In member function ‘bool Adafruit_I2CDevice::write(const uint8_t*, size_t, bool, const uint8_t*, size_t)’:
c:\Users\Serg\Documents\Arduino\libraries\Adafruit_BusIO\Adafruit_I2CDevice.cpp:112:47: error: invalid conversion from ‘const uint8_t* {aka const unsigned char*}’ to ‘uint8* {aka unsigned char*}’ [-fpermissive]
if (_wire->write(prefix_buffer, prefix_len) != prefix_len) {
^
In file included from C:\Users\Serg\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F4\2022.9.26\libraries\Wire/Wire.h:41:0,
from c:\Users\Serg\Documents\Arduino\libraries\Adafruit_BusIO\Adafruit_I2CDevice.h:5,
from c:\Users\Serg\Documents\Arduino\libraries\Adafruit_BusIO\Adafruit_I2CDevice.cpp:1:
C:\Users\Serg\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F4\2022.9.26\libraries\Wire/WireBase.h:116:10: error: initializing argument 1 of ‘void WireBase::write(uint8*, int)’ [-fpermissive]
void write(uint8*, int);
^
c:\Users\Serg\Documents\Arduino\libraries\Adafruit_BusIO\Adafruit_I2CDevice.cpp:112:52: error: invalid operands of types ‘void’ and ‘size_t {aka unsigned int}’ to binary ‘operator!=’
if (_wire->write(prefix_buffer, prefix_len) != prefix_len) {
^
c:\Users\Serg\Documents\Arduino\libraries\Adafruit_BusIO\Adafruit_I2CDevice.cpp:121:31: error: invalid conversion from ‘const uint8_t* {aka const unsigned char*}’ to ‘uint8* {aka unsigned char*}’ [-fpermissive]
if (_wire->write(buffer, len) != len) {
^
In file included from C:\Users\Serg\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F4\2022.9.26\libraries\Wire/Wire.h:41:0,
from c:\Users\Serg\Documents\Arduino\libraries\Adafruit_BusIO\Adafruit_I2CDevice.h:5,
from c:\Users\Serg\Documents\Arduino\libraries\Adafruit_BusIO\Adafruit_I2CDevice.cpp:1:
C:\Users\Serg\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F4\2022.9.26\libraries\Wire/WireBase.h:116:10: error: initializing argument 1 of ‘void WireBase::write(uint8*, int)’ [-fpermissive]
void write(uint8*, int);
^
c:\Users\Serg\Documents\Arduino\libraries\Adafruit_BusIO\Adafruit_I2CDevice.cpp:121:36: error: invalid operands of types ‘void’ and ‘size_t {aka unsigned int}’ to binary ‘operator!=’
if (_wire->write(buffer, len) != len) {
^
c:\Users\Serg\Documents\Arduino\libraries\Adafruit_BusIO\Adafruit_I2CDevice.cpp: In member function ‘bool Adafruit_I2CDevice::_read(uint8_t*, size_t, bool)’:
c:\Users\Serg\Documents\Arduino\libraries\Adafruit_BusIO\Adafruit_I2CDevice.cpp:195:79: error: no matching function for call to ‘TwoWire::requestFrom(uint8_t, uint8_t, uint8_t)’
size_t recv = _wire->requestFrom((uint8_t)_addr, (uint8_t)len, (uint8_t)stop);
^
c:\Users\Serg\Documents\Arduino\libraries\Adafruit_BusIO\Adafruit_I2CDevice.cpp:195:79: note: candidates are:
In file included from C:\Users\Serg\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F4\2022.9.26\libraries\Wire/Wire.h:41:0,
from c:\Users\Serg\Documents\Arduino\libraries\Adafruit_BusIO\Adafruit_I2CDevice.h:5,
from c:\Users\Serg\Documents\Arduino\libraries\Adafruit_BusIO\Adafruit_I2CDevice.cpp:1:
C:\Users\Serg\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F4\2022.9.26\libraries\Wire/WireBase.h:101:11: note: uint8 WireBase::requestFrom(uint8, int)
uint8 requestFrom(uint8, int);
^
C:\Users\Serg\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F4\2022.9.26\libraries\Wire/WireBase.h:101:11: note: candidate expects 2 arguments, 3 provided
C:\Users\Serg\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F4\2022.9.26\libraries\Wire/WireBase.h:106:11: note: uint8 WireBase::requestFrom(int, int)
uint8 requestFrom(int, int);
^
C:\Users\Serg\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F4\2022.9.26\libraries\Wire/WireBase.h:106:11: note: candidate expects 2 arguments, 3 provided
In file included from c:\Users\Serg\Documents\Arduino\libraries\Adafruit_BusIO\Adafruit_BusIO_Register.cpp:1:0:
c:\Users\Serg\Documents\Arduino\libraries\Adafruit_BusIO/Adafruit_BusIO_Register.h:74:27: error: ‘Serial’ was not declared in this scope
void print(Stream *s = &Serial);
^
c:\Users\Serg\Documents\Arduino\libraries\Adafruit_BusIO/Adafruit_BusIO_Register.h:75:29: error: ‘Serial’ was not declared in this scope
void println(Stream *s = &Serial);
^
Используем библиотеку DMD_STM32 версии 1.0.6 из папки: C:\Users\Serg\Documents\Arduino\libraries\DMD_STM32-dev-V2
Используем библиотеку Adafruit GFX Library версии 1.11.8 из папки: C:\Users\Serg\Documents\Arduino\libraries\Adafruit_GFX_Library
Используем библиотеку Adafruit BusIO версии 1.14.4 из папки: C:\Users\Serg\Documents\Arduino\libraries\Adafruit_BusIO
Используем библиотеку Wire в папке: C:\Users\Serg\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F4\2022.9.26\libraries\Wire (устаревшее)
Используем библиотеку SPI версии 1.0 из папки: C:\Users\Serg\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F4\2022.9.26\libraries\SPI
exit status 1
Compilation error: exit status 1`