светодиодные матрицы 8х8 работа с библиотеками Adafruit_GFX.h и Max72xxPanel.h

вадимыч
Offline
Зарегистрирован: 26.01.2017

Здравствуйте , я начинающий - прошу помощи тех кто работал с этими матрицами (фото во вложении) или им подобными (например 4 таких модуля одной планкой) через библиотеки Adafruit_GFX.h и Max72xxPanel.h .





С библиотекой Max72xxPanel.h есть пример - ticker - выводит бегущей строкой слово arduino 

Код (Text):

 
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>

int pinCS = 10; // Attach CS to this pin, DIN to MOSI and CLK to SCK (cf http://arduino.cc/en/Reference/SPI )
int numberOfHorizontalDisplays =1;
int numberOfVerticalDisplays = 8;

Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

String tape = "Arduino";
int wait = 20; // In milliseconds

int spacer = 1;
int width = 5 + spacer; // The font width is 5 pixels

void setup() {

  matrix.setIntensity(7); // Use a value between 0 and 15 for brightness

// Adjust to your own needs
//  matrix.setPosition(0, 0, 0); // The first display is at <0, 0>
//  matrix.setPosition(1, 1, 0); // The second display is at <1, 0>
//  matrix.setPosition(2, 2, 0); // The third display is at <2, 0>
//  matrix.setPosition(3, 3, 0); // And the last display is at <3, 0>
//  ...
//  matrix.setRotation(0, 2);    // The first display is position upside down
//  matrix.setRotation(3, 2);    // The same hold for the last display
matrix.setRotation(3);
}

void loop() {

  for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) {

    matrix.fillScreen(LOW);

    int letter = i / width;
    int x = (matrix.width() - 1) - i % width;
    int y = (matrix.height() - 8) / 2; // center the text vertically

    while ( x + width - spacer >= 0 && letter >= 0 ) {
      if ( letter < tape.length() ) {
        matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1);
      }

      letter--;
      x -= width;
    }

    matrix.write(); // Send bitmap to display

    delay(wait);
  }
}

 
 

Для этих матриц прописал настройки -все работает правильно.

Код (Text):

int numberOfHorizontalDisplays = 1;
int numberOfVerticalDisplays = 8;
matrix.setRotation(3);
 

Теперь вопрос - как в настройках прописать например 2 строки по 8 матриц в каждой ?

3 строки по 8 ?

Пробовал так - на матрицах мусор(изображение на верхней матрице не сходится с нижней)

Код (Text):

int numberOfHorizontalDisplays = 2;
int numberOfVerticalDisplays = 16;
matrix.setRotation(3);
 

Что я делаю не правильно ?



Еще вопрос в библиотеке Max72xxPanel.h есть команда-

Код (Text):

invertDisplay   

 

что это за команда, для чего нужна,как с ней работать ?

bwn
Offline
Зарегистрирован: 25.08.2014

Сам только на днях получил, думаю должно быть
int numberOfHorizontalDisplays = 2;
int numberOfVerticalDisplays = 8;
если два ряда по 8 штук. Теперь со статичным выводом воюю.))))
P/S У меня одна планка из четырех штук, проверить не могу.
 

вадимыч
Offline
Зарегистрирован: 26.01.2017

bwn пишет:

Сам только на днях получил, думаю должно быть
int numberOfHorizontalDisplays = 2;
int numberOfVerticalDisplays = 8;
если два ряда по 8 штук. Теперь со с воюю.))))
P/S У меня одна планка из четырех штук, проверить не могу.
 

Так тоже пробовал - как уже говорил на матрицах мусор - картинка на верхнем ряду матриц не сходится с картинкой на нижнем ряду матриц .

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

bwn
Offline
Зарегистрирован: 25.08.2014

Для одной планки - 1,4. Со статичным - надо пересчет сделать, чтобы по центру выравнивалось. Воюю, это так, сильно сказано.))))

AleksLux
Offline
Зарегистрирован: 23.04.2017

Удалось ли вам все таки решить вопрос? вывести текст на двухрядных табло?

AndrewDeD
Offline
Зарегистрирован: 16.05.2017

У меня удалось, без особых проблем, у меня 12 матриц, 2 ряда по 6

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>

int pinCS = 10; // Attach CS to this pin, DIN to MOSI and CLK to SCK (cf http://arduino.cc/en/Reference/SPI )
int numberOfHorizontalDisplays = 2;
int numberOfVerticalDisplays = 6;

Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

void setup() {

  matrix.setIntensity(5); // Use a value between 0 and 15 for brightness

// Adjust to your own needs
  matrix.setPosition(11, 0, 0); 
  matrix.setPosition(0, 1, 0); 
  matrix.setPosition(10, 2, 0); 
  matrix.setPosition(1, 3, 0); 
  matrix.setPosition(9, 4, 0); 
  matrix.setPosition(2, 5, 0); 
  matrix.setPosition(8, 6, 0); 
  matrix.setPosition(3, 7, 0);
  matrix.setPosition(7, 8, 0); 
  matrix.setPosition(4, 9, 0); 
  matrix.setPosition(6, 10, 0); 
  matrix.setPosition(5, 11, 0); 

  matrix.setRotation(0, 0);    
  matrix.setRotation(1, 0);   
  matrix.setRotation(2, 0);   
  matrix.setRotation(3, 0);  
  matrix.setRotation(4, 0);   
  matrix.setRotation(5, 0);    
  matrix.setRotation(6, 2);   
  matrix.setRotation(7, 2);    
  matrix.setRotation(8, 2);  
  matrix.setRotation(9, 2);   
  matrix.setRotation(10, 2);    
  matrix.setRotation(11, 2);    
    
  matrix.setRotation(3);    // The same hold for the last display
}

........................................

Необходимо указать позицию и поворот каждой матрицы

А вот со статичным текстом не разобрался

AleksLux
Offline
Зарегистрирован: 23.04.2017

Спасибо. а как дела с кирилицей? отображает? Надо выводить как одно статичное слово, так и бегущие по несколько слов

AndrewDeD
Offline
Зарегистрирован: 16.05.2017

нет, кирилицу не отображет, думаю надо править файлы шрифтов Adafrut

Вот так выглядит мой дисплей с бегущей строкой 

AleksLux
Offline
Зарегистрирован: 23.04.2017

А чтоб большие буквы на всю матрицу? по русификации возможно будет полезно http://zlitos.com/publ/ehlektronika/arduino_i_t_p/arduino_i_svetodiodnye_matricy_8kh8_max7219/12-1-0-35

 

И так понял статичные слова не получилось отображать?

borzov
borzov аватар
Offline
Зарегистрирован: 17.10.2016

а как вам библиотека MD.Parola

вот что у меня получилось

https://www.drive2.ru/r/lada/456924323106523636/

AndrewDeD
Offline
Зарегистрирован: 16.05.2017

Вывод статичного текста, может кому пригодиться

//Вывод текста
void text (String tape) {

    int x = (matrix.width() - (tape.length() * width)) / 2; //выравнивание по центру X
    int y = (matrix.height() - 8) / 2; //выравнивание по центру Y
    
    matrix.fillScreen(LOW);
    
    for ( int i = 0 ; i < tape.length(); i++ ) {   
      int letter = i;
      matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1);   
      x += width;  
    }
    matrix.write(); // отправка данных на дисплей
}

добавляете этот код в конец скетча и вызываете функцию в любом месте программы

text("Ваш текст");

PS эта функция не добавляет поддержки кириллицы

вадимыч
Offline
Зарегистрирован: 26.01.2017

У меня матрицы FC-16, 2 строки по 8 матриц в каждой. Сделал так :

int numberOfHorizontalDisplays = 2;
int numberOfVerticalDisplays = 8;
void setup() {
matrix.setPosition(0, 1, 0);
matrix.setPosition(8, 0, 0);
matrix.setPosition(1, 3, 0);
matrix.setPosition(9, 2, 0);
matrix.setPosition(2, 5, 0);
matrix.setPosition(10, 4, 0);
matrix.setPosition(3, 7, 0);
matrix.setPosition(11, 6, 0);
matrix.setPosition(4, 9, 0);
matrix.setPosition(12, 8, 0);
matrix.setPosition(5, 11, 0);
matrix.setPosition(13, 10, 0);
matrix.setPosition(6, 13, 0);
matrix.setPosition(14, 12, 0);
matrix.setPosition(7, 15, 0);
matrix.setPosition(15, 14, 0);
matrix.setRotation(3);    
}

 

вадимыч
Offline
Зарегистрирован: 26.01.2017

                         видео-https://youtu.be/gaqv7PJ0jeU                     

вадимыч
Offline
Зарегистрирован: 26.01.2017
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Достаточно простая микросхема. Библиотеку можно нарисовать. Конечно много времени займет. У меня такой матрицы нет. Так что мне никчему.

вадимыч
Offline
Зарегистрирован: 26.01.2017

qwone пишет:

Достаточно простая микросхема. Библиотеку можно нарисовать. Конечно много времени займет. У меня такой матрицы нет. Так что мне никчему.

У меня тоже нет,эту первую увидел,интересуюсь пока. Может еще какие м/сх драйверов есть для RG матриц?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

вадимыч пишет:

У меня тоже нет,эту первую увидел,интересуюсь пока. Может еще какие м/сх драйверов есть для RG матриц?

https://ru.aliexpress.com/w/wholesale-8*8-8x8-Full-Colour-RGB.html?spm=2...

Но здесь уже надо и схему придумывать. Или же переходить на умные диоды.

вадимыч
Offline
Зарегистрирован: 26.01.2017

qwone пишет:

вадимыч пишет:

У меня тоже нет,эту первую увидел,интересуюсь пока. Может еще какие м/сх драйверов есть для RG матриц?

https://ru.aliexpress.com/w/wholesale-8*8-8x8-Full-Colour-RGB.html?spm=2...

Но здесь уже надо и схему придумывать. Или же переходить на умные диоды.

Это RGB матрицы , меня интересуют именно RG с драйвером  чтоб сделать чтото подобное-как на фото.

borzov
borzov аватар
Offline
Зарегистрирован: 17.10.2016
borzov
borzov аватар
Offline
Зарегистрирован: 17.10.2016

доделал свое табло на МАХ7219.

https://www.youtube.com/watch?v=qCh_Q4xWqd4

Кстати Австралиец Марко (автор библиотек MD.PAROLA), добавил мою кирилицу в примеры.

https://github.com/MajicDesigns/MD_Parola

 

PVL
Offline
Зарегистрирован: 28.05.2017

Сделал 3 строки по 1х4 планки - получил проблему при инициализации. при включении не всегда запускается 3-я строка.. С двумя строками работало без проблем, но нужно было увеличить экран. Инициализировал так:

int pinCS = 10; 
int numberOfHorizontalDisplays = 4;
int numberOfVerticalDisplays   = 3;

Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

// Настройка дисплея
  matrix.setIntensity(7); // Use a value between 0 and 15 for brightness

// Порядок матриц
  matrix.setPosition(8,  3, 0); 
  matrix.setPosition(9,  2, 0); 
  matrix.setPosition(10, 1, 0);
  matrix.setPosition(11, 0, 0);
  matrix.setPosition(4, 3, 1);
  matrix.setPosition(5, 2, 1); 
  matrix.setPosition(6, 1, 1); 
  matrix.setPosition(7, 0, 1); 
  matrix.setPosition(0, 3, 2); 
  matrix.setPosition(1, 2, 2); 
  matrix.setPosition(2, 1, 2); 
  matrix.setPosition(3, 0, 2);   
    
// Ориентация каждой матрицы
  matrix.setRotation(0, 3);
  matrix.setRotation(1, 3); 
  matrix.setRotation(2, 3);
  matrix.setRotation(3, 3);
  matrix.setRotation(4, 3); 
  matrix.setRotation(5, 3);
  matrix.setRotation(6, 3);
  matrix.setRotation(7, 3);
  matrix.setRotation(8, 3);
  matrix.setRotation(9, 3);
  matrix.setRotation(10,3);
  matrix.setRotation(11,3);

Может кто подскажет что за проблема может быть..

При загрузке в Arduino Nano V3 (на матрицах LD-1088AS) скетча всё запускается и инициализируется как положено, но при запуске от включения питания 3-я строка (верхняя) не инициализируется. Но с N-ой попытки включения может запуститься..

P.S. Хотел сейчас снять на видео, но из 5-ти попыток всё запускалось.. чертовщина какая-то...

Получилось.. видео:   https://hdd.tomsk.ru/file/sdzprrwu

bwn
Offline
Зарегистрирован: 25.08.2014

PVL пишет:

Сделал 3 строки по 1х4 планки - получил проблему при инициализации. при включении не всегда запускается 3-я строка.. С двумя строками работало без проблем, но нужно было увеличить экран. Инициализировал так:

Так увеличить размер или разрешение? Если размер, то 2088. Две строки из них = четыре из 1088, правда по лапам не войдут (ширина) или проводами, или переразводить плату.

PVL
Offline
Зарегистрирован: 28.05.2017

bwn пишет:

PVL пишет:

Сделал 3 строки по 1х4 планки - получил проблему при инициализации. при включении не всегда запускается 3-я строка.. С двумя строками работало без проблем, но нужно было увеличить экран. Инициализировал так:

Так увеличить размер или разрешение? 

Увеличить размер экрана, что бы увеличить размер цифр, что бы видно было с более далекого расстояния..

Использовал готовые планки из 4-х матриц, т.е. 3 планки по 4 матрицы

bwn
Offline
Зарегистрирован: 25.08.2014

Матрица 2088 в два раза выше и шире чем 1088, соответственно 2 строки из них будут по высоте как из 4-ех 1088. По распиновке они идентичные, а вот ширина между гребенками разная. Готовых плат под них не встречал, либо самому разводить, либо на основе готовой от 1088 растаскивать гребенки.

вадимыч
Offline
Зарегистрирован: 26.01.2017

Приветствую.

Блок питания у вас достаточен для 3 планок ?

Какая длина проводов от контроллера до 1 планки и между планками?

А  вы где такой шрифт взяли - сами написали или редактировали готовый ?

вадимыч
Offline
Зарегистрирован: 26.01.2017

И еще я не совсем понял -  при подключении третьей планки у вас не работает только третья или первые две тоже?

И питание на планки у вас как подано ?

вадимыч
Offline
Зарегистрирован: 26.01.2017

Я запустил 3 ряда по 8 матриц - все  работает стабильно , сейчас работаю с такой матрицей - https://ru.aliexpress.com/item/Indoor-full-color-video-wall-SMD-P5-RGB-Module-P5-RGB-LED-Panel-Indoor-Full-color/32760855293.html?spm=a2g0s.9042311.0.0.3NnhDk

PVL
Offline
Зарегистрирован: 28.05.2017

вадимыч пишет:

Блок питания у вас достаточен для 3 планок ?

Пробовал и от USB, и от такого: https://www.ebay.com/itm/DC-DC-Step-Down-Buck-Module-12V-To-5V-3-3V-Power-Supply-Module-50x32mm-/122356145347?hash=item1c7cfe9cc3

вадимыч пишет:

Какая длина проводов от контроллера до 1 планки и между планками?

Длина минимальная, около 10-15 см

вадимыч пишет:

А  вы где такой шрифт взяли - сами написали или редактировали готовый ?

Шрифт сам сделал, думаю, сейчас это не проблема.. можно здесь: https://www.riyas.org/2013/12/online-led-matrix-font-generator-with.html

PVL
Offline
Зарегистрирован: 28.05.2017

вадимыч пишет:

И еще я не совсем понял -  при подключении третьей планки у вас не работает только третья или первые две тоже?

При загрузке скетча из Arduino IDE всё работает! 

А когда просто включаю питание (так же от USB)- проблема как на картинке, но с нескольких попыток может запуститься. Не работает только третья планка (вся или может только одна матрица не запуститься). Выше давал ссылку на короткое видео.

PVL
Offline
Зарегистрирован: 28.05.2017

bwn пишет:

Матрица 2088 в два раза выше и шире чем 1088, соответственно 2 строки из них будут по высоте как из 4-ех 1088. По распиновке они идентичные, а вот ширина между гребенками разная. Готовых плат под них не встречал, либо самому разводить, либо на основе готовой от 1088 растаскивать гребенки.

У меня 5 планок, надеялся как-то их использовать.. что бы без особых заморочек.. ;-))

bwn
Offline
Зарегистрирован: 25.08.2014

PVL пишет:

У меня 5 планок, надеялся как-то их использовать.. что бы без особых заморочек.. ;-))

Так уже не хватает, увеличиваем высоту, надо пропорционально и длину, иначе уе...ще сплющенное получится. А по питанию каждая единица жрет как и большая. ИМХО.
С USB аккуратнее, восемь матриц при полном заполнении и полной яркости ~1,3А, спалите легко. Питание лучше заведите с двух сторон и конденсаторов добавьте.

вадимыч
Offline
Зарегистрирован: 26.01.2017

Повторяю вопрос - питание на третью планку как подано ?

На каждую планку от бп дайте отдельное питание

PVL
Offline
Зарегистрирован: 28.05.2017

вадимыч пишет:

Повторяю вопрос - питание на третью планку как подано ?

Питание на 3 планку сквозное - со второй. На первую отдельно с блока питания. На МК и датчики - отдельно с того же БП. Попробую на каждую отдельно завести питание. С этим понятно..

Не понятен другой момент: почему срозу после прошивки Arduino все планки работают всегда!!! А после выключения питания - как повезет, могут и все заработать..

PVL
Offline
Зарегистрирован: 28.05.2017

bwn пишет:

Так уже не хватает, увеличиваем высоту, надо пропорционально и длину, иначе уе...ще сплющенное получится. 

Полностью согласен! Пока главное добиться стабильной работы.. 

А можно эти планки разбивать и пересобирать другое количество? Например, сделать планки (они же строки) по 6 матриц? Итого получится 18 матриц.. С библиотекой корректно будет работать? 

bwn
Offline
Зарегистрирован: 25.08.2014

По идее должно, планки они как шоколадки, ломай по надобности. В проге только корректно указать.

borzov
borzov аватар
Offline
Зарегистрирован: 17.10.2016

при использовании библиотек md parola есть проблемы запуска табло более одной высоты. Автор библиотек говорит чудеса с динамической памятью. И проблему не устранил

PVL
Offline
Зарегистрирован: 28.05.2017

вадимыч пишет:

На каждую планку от бп дайте отдельное питание

Разводка питания помогла решить проблему!

Добавить модули и проверить пока не могу, пришлось отложить пока этот вопрос..

Rewipex
Offline
Зарегистрирован: 25.03.2016

AndrewDeD пишет:

Вывод статичного текста, может кому пригодиться

//Вывод текста
void text (String tape) {

    int x = (matrix.width() - (tape.length() * width)) / 2; //выравнивание по центру X
    int y = (matrix.height() - 8) / 2; //выравнивание по центру Y
    
    matrix.fillScreen(LOW);
    
    for ( int i = 0 ; i < tape.length(); i++ ) {   
      int letter = i;
      matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1);   
      x += width;  
    }
    matrix.write(); // отправка данных на дисплей
}

добавляете этот код в конец скетча и вызываете функцию в любом месте программы

text("Ваш текст");

PS эта функция не добавляет поддержки кириллицы

А как к этому коду привязать часы , например на 1307 ?

 

bwn
Offline
Зарегистрирован: 25.08.2014

Перевести в текст и отправить как "Ваш текст".

Rewipex
Offline
Зарегистрирован: 25.03.2016

bwn пишет:

Перевести в текст и отправить как "Ваш текст".

А как разбить "часы и минуты" по 4м сегментам? и помигать точками?

bwn
Offline
Зарегистрирован: 25.08.2014

Самое простое, создать массив char, распознать и вставить в свои позиции символы цифр, между ними вставить символ разделителя (двоеточия?). Символ разделителя каждую секунду менять на пусто-символ. Отправлять этот массив в функцию, желательно не чаще, чем требуется для корректного отображения. Как превратить цифру в символ, ищем на форуме.

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Если еще для кого актуально, вывод времени на матрицы (у меня 2 ряда по 4 шт):

void PrintTime()
{
  char s[6];
  LedMatrix.fillRect(0, 0, 32, 8, LOW);  
  if (setMenu != 3){
    sprintf(s, "%02d:%02d", hourDS, minuteDS);
    LedMatrix.setCursor(1, 0);
  }// end if
  else{
    sprintf(s, ":%02d", secondDS);
    LedMatrix.setCursor(17, 0);
  }// end else
  LedMatrix.print(s);
  
}// end PrintTime()

Если нужно просто вывести время:

void PrintTime()

{
  char s[6];
  LedMatrix.fillRect(0, 0, 32, 8, LOW);    // Очищаем прямоугольник
  sprintf(s, "%02d:%02d", hourDS, minuteDS);    // Преобразуем часы минуты в массив char
  LedMatrix.setCursor(1, 0);    // позици, с которой будем печатать текст
  LedMatrix.print(s);    // вывод текста
}// end PrintTime()