Arduino DUE и 1 LED module P10

Giniss21
Giniss21 аватар
Offline
Зарегистрирован: 18.09.2014

Доброго времени суток! 

Есть отичная тема Связка Mega2560 с p10 led module. Так вот она решила примерно 80% моих проблем и вопросов.

У меня только Arduino DUE, и все библиотеки предлагаемые в теме выше да и вообще все что я смог найти в нете не подходят для DUE, так как там архитектура ARM а не AVR, а библиотеки под последнюю как раз и заточены.

С темы что написал выше взял код, и не могу разобраться в нем до конца, что бы мог сам кодировать свои изображения, собственно вот код, вопросы потом:

// названия пинов такие же, как и на модуле P10 
int nOE  = 13; 
int A    = 12; 
int B    = 11; 
int CKL  = 10;  
int SCLK = 9;  
int R    = 8;  

int vrem=0;  //Начало отсчета времени для переключения слов
int pa=60; // Интервал переключения

unsigned char screen [128]; //Видеопамять

// тут зашифрованно изображение, алгоритм данного изображения я не могу понять
char sl1 [] = { 
255,128,128,128,255,4,96,4,255,0,192,0,255,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,	
128,128,128,128,0,14,49,0,0,0,128,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,						
128,128,128,128,0,31,31,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,								
128,128,128,255,0,49,14,255,0,128,0,255,1,1,1,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0										
};
char sl2 [] = {
255,128,128,128,255,68,100,132,255,64,192,64,255,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,																						
130,128,128,129,0,46,49,0,8,128,128,32,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,																						
129,128,128,130,0,31,63,0,16,0,0,16,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,																						
128,128,128,255,128,49,78,255,32,128,128,255,1,1,1,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0																						
};

void setup() {   
  pinMode(R, OUTPUT);     
  pinMode(CKL, OUTPUT);     
  pinMode(SCLK, OUTPUT);     
  pinMode(nOE, OUTPUT);     
  pinMode(A, OUTPUT);     
  pinMode(B, OUTPUT); 
}

void loop() {
  for(byte i=0; i<4 ; i++)
  {
    SelectStr(i); // Выбор псевдостроки
    SendBytes(screen + i*32); // Рисуем псевдостроку /+ i*32
    digitalWrite(nOE, HIGH); // Включаем матрицы
    delayMicroseconds(300); // Пауза 200
    digitalWrite(nOE, LOW); // Отключаем матрицы
  }
 
  if (vrem == pa) {
   for(int i = 0; i < 128; i++) //Заносим в видеопамять первое слово
    {
      screen[i]  = sl1[i];
    };
  };
  
  if (vrem == pa*2) {
   for(int i = 0; i < 128; i++) //Заносим в видеопамять второе слово
    {
      screen[i]  = sl2[i];
    };
     vrem=0;
  }; 
 vrem=vrem+1; // Увеличение отсчета времени
}

void SelectStr(byte n) // Выбор псевдостроки
{
  if (n & B00000001) digitalWrite(A, LOW); else digitalWrite(A, HIGH);    
  if (n & B00000010) digitalWrite(B, LOW); else digitalWrite(B, HIGH);    
}

// ниже никаких комментариев не было, и тут я ничего не понял
void SendBytes(unsigned char* b) // Рисуем псевдостроку
{
  byte i;
  byte k;
  for(k = 0; k<16; k++)
    for(i = 0; i<8; i++)
    {
      digitalWrite(CKL, LOW); 
      if((b[k] & (1 <<  (7-i))) ) {
        digitalWrite(R, LOW);
      } else {
        digitalWrite(R, HIGH);
      }
      digitalWrite(CKL, HIGH);     
    }
  digitalWrite(SCLK, HIGH);
  digitalWrite(SCLK, LOW);
  return;
};

Вопрос № 1. Можете на пальцах объяснить как примерно понимать что здесь будет отображено, я бы понял если бы там были 1 - горит, 0 не горит. Но эти два массива выводят два кадра по очереди, вот 1 из них. Но как заполнять массив если я хочу придумать свои изображения.

char sl1 [] = { 
255,128,128,128,255,4,96,4,255,0,192,0,255,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,	
128,128,128,128,0,14,49,0,0,0,128,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,						
128,128,128,128,0,31,31,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,								
128,128,128,255,0,49,14,255,0,128,0,255,1,1,1,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0										
};
char sl2 [] = {
255,128,128,128,255,68,100,132,255,64,192,64,255,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,																						
130,128,128,129,0,46,49,0,8,128,128,32,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,																						
129,128,128,130,0,31,63,0,16,0,0,16,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,																						
128,128,128,255,128,49,78,255,32,128,128,255,1,1,1,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0																						
};

Вопрос № 2. В функцию SendBytes передается (screen + i * 32), но screen это же массив символов, что значит (screen + i * 32). Я пытался вывести Serial.begin(String(screen + i * 32)), думал посмотреть что выведет в строку, но вылезает ошибка.

unsigned char screen [128]; //Видеопамять
...
void loop() {
  for(byte i=0; i<4 ; i++)
  {
    SelectStr(i); // Выбор псевдостроки
    SendBytes(screen + i*32); // Рисуем псевдостроку /+ i*32
    digitalWrite(nOE, HIGH); // Включаем матрицы
    delayMicroseconds(300); // Пауза 200
    digitalWrite(nOE, LOW); // Отключаем матрицы
  }
...

Вопрос № 3. Самый главный. Не могу никак понять алгоритм данной функции. И как понять это условие if((b[k] & (1 << (7-i))) )

Там ## между решеток ## в кде вопрос еще один :)

void SendBytes(unsigned char* b) // Рисуем псевдостроку
{
  byte i;
  byte k;
  for(k = 0; k<16; k++)
    for(i = 0; i<8; i++)
    {
      digitalWrite(CKL, LOW); 
      if((b[k] & (1 <<  (7-i))) ) {
        digitalWrite(R, LOW);  
#### данное условия никогда не истина и не выполняется, 
но если убрать то выйдет бардак, ставил туда Serial.begin() и он ниразу не вылез, а ниже отображается ####
      } else {
        digitalWrite(R, HIGH);
      }
      digitalWrite(CKL, HIGH);     
    }
  digitalWrite(SCLK, HIGH);
  digitalWrite(SCLK, LOW);
  return;
};

Массив screen состоит из 128 элементов, который передается в эту функцию, но в цикле проходит всего  for(k = 0; k<16; k++) 16 итераций, что я понял не так?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

А 128 / 16 сколько получается? Все остальные ваши вопросы отсель же.

Giniss21
Giniss21 аватар
Offline
Зарегистрирован: 18.09.2014

Puhlyaviy пишет:
А 128 / 16 сколько получается? Все остальные ваши вопросы отсель же.

Забыл уточнить, этот код был расчитан на 2 таких панели, т.е. screen как я понял хранит информацию для двух панелей, а мне бы с одной разобраться :)

Собственно как формировать картинку то? Как она преобразуется из моей головы например в массив значений, а потом из этого массива на панель?

MikSer
Offline
Зарегистрирован: 27.01.2012

http://st.lartmaster.ru/1/759/621/LED_matrix_16x32.pdf

Вот описание данного модуля и описание алгоритма работы с ним. Думаю после прочтения Вы сами ответите на все ваши вопросы.

tomas111
Offline
Зарегистрирован: 01.03.2018

Всем привет, тема довольно старая но решил поднять. Не понялтно в чем делать графику а точнее в какой программе можно было бы нарисовать и после сохранить как код для импорта в код? Спасибо.