Матрица 8х32 на MAX7219 и перевернутое изображение

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Получил наконец-то матрицу и начал опыты. К собственному удивлению обнаружил, что текст на матрице почему-то перевернут набок, соответственно, на большинстве примеров получается фигня. Только один пример выдал мне строку в горизонтали, но в обратной последовательности, т.е. первая матрица почему-то получилась последней. Видимо, автор тоже боролся с подобным глюком.

Вот кусок тестового скетча из примеров к LedControl

#include <LedControl.h>

/*
  Now we need a LedControl to work with.
 ***** These pin numbers will probably not work with your hardware *****
  pin 6 is connected to the DataIn
  pin 5 is connected to the CLK
  pin 4 is connected to LOAD
  We have only a single MAX72XX.
*/
LedControl lc = LedControl(6, 5, 4, 4);

void setup() {
  /*
    The MAX72XX is in power-saving mode on startup,
    we have to do a wakeup call
  */
  for (int i = 0; i < 4; i++)
  { lc.shutdown(i, false);
    /* Set the brightness to a medium values */
    lc.setIntensity(i, 8);
    /* and clear the display */
    lc.clearDisplay(i);
  }
  /* here is the data for the characters */
  byte r[5]   = {B00111110, B00010000, B00100000, B00100000, B00010000};
  byte one[6] = {B00000000, B10000010, B11111111, B11111111, B10000000, B00000000};
  /* now display them one by one with a small delay */
  lc.setRow(0, 0, r[0]);
  lc.setRow(0, 1, r[1]);
  lc.setRow(0, 2, r[2]);
  lc.setRow(0, 3, r[3]);
  lc.setRow(0, 4, r[4]);

  lc.setColumn(1, 0, one[0]);
  lc.setColumn(1, 1, one[1]);
  lc.setColumn(1, 2, one[2]);
  lc.setColumn(1, 3, one[3]);
  lc.setColumn(1, 4, one[4]);
  lc.setColumn(1, 5, one[5]);
}

void loop() {
}

массив r[5] и блок lc.setRow()... взял из примера

массив one[6] и блок lc.setColumn()... нарисовал сам. 

Результат выполнения скетча на фото

Как видим - картинка зеркалится и нулевой пиксель блока матрицы находится почему-то в нижнем правом углу. Как это можно победить?

b707
Offline
Зарегистрирован: 26.05.2017

проблема известная. Лежащие в инете скетчи рассчитаны на отдельные матрицы , а вы явно купили целиковый модуль. Будь у вас матрицы - вы бы их просто повернули на бок и проблема бы решилась. Варианта тут два - один для умелых, другой для ленивых :) Умелые берут ножовку и распиливают плату на отдельные матрицы. Остальные переписывают код. Поскольку я не "умелый". а скорее наоборот, типичный "рукожоп" - я переписывал. Заняло, как помню, минут пятнадцать...

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Если бы еще не зеркалило)))

Да, модуль цельный. Пилить вроде не нужно, плата подрезанная, по идее можно просто поломать. Но возиться не хочется ))

Если вспомнить не трудно - в каком направлении смотреть, что переписать?

b707
Offline
Зарегистрирован: 26.05.2017

для случая повернутых на бок символов - менять SetRow и SetColumn местами и при необходимости зеркалить

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Отзеркалить то, что изначально выводилось setColumn() оказалось просто - отзеркалить номера столбцов (вместо i сделал 7 - i)

А вот с заменой setRow на setColumn все оказалось не просто

Тут нужно зеркалить по вертикали, т.е. нужно разворачивать байты наоборот. Как-то так

#include <LedControl.h>

/*
  Now we need a LedControl to work with.
 ***** These pin numbers will probably not work with your hardware *****
  pin 6 is connected to the DataIn
  pin 5 is connected to the CLK
  pin 4 is connected to LOAD
  We have only a single MAX72XX.
*/
LedControl lc = LedControl(6, 5, 4, 4);

byte Reverse(byte _x)
{
  byte Rez = 0;
  for(int i = 0; i<8;i++)
  {
    Rez =  Rez<<1;
    Rez|=(_x&1);
    _x = _x>>1;
  }
  return Rez;
}

void setup() {
  /*
    The MAX72XX is in power-saving mode on startup,
    we have to do a wakeup call
  */
  for (int i = 0; i < 4; i++)
  { lc.shutdown(i, false);
    /* Set the brightness to a medium values */
    lc.setIntensity(i, 8);
    /* and clear the display */
    lc.clearDisplay(i);
  }
  /* here is the data for the characters */
  byte r[5]   = {B00111110, B00010000, B00100000, B00100000, B00010000};
  byte one[6] = {B00000000, B10000010, B11111111, B11111111, B10000000, B00000000};
  /* now display them one by one with a small delay */
  for (byte i = 0; i < 5; i++)
  {
    lc.setColumn(0, 7 - i, Reverse(r[i]));
  }

  for (byte i = 0; i < 6; i++)
  {
    lc.setColumn(1, 7 - i, one[i]);
  }
}

void loop() {
}

Ну, не знаю, насколько это оправданно, но таки получилось так

Ох и муторно ))