Связка Mega2560 с p10 led module

korsianen
Offline
Зарегистрирован: 23.03.2013

Только начинаю юзать Ардуино.

Вот приобрел кит набор ARDUINO http://www.dhgate.com/arduino-experimentation-kits2-with-arduino/p-ff808...

и 3 ЛЕД панели http://www.dhgate.com/wholesale-10mm-pixel-led-screen-display-semi/p-ff8...

Направте плиз на путь истинный как скрестить два девайса и получить типа бегущей строки или просто вывода информации по заданной программе. Про контроллеры к этим панелям я знаю и у меня их нет.

maksim
Offline
Зарегистрирован: 12.02.2012

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

tsostik
Offline
Зарегистрирован: 28.02.2013

http://www.ebay.com/itm/Red-LED-Display-Module-Window-Sign-P10-16X32-Mat...

Очень похоже, что это одно и то же.

В таком случае, порядок работы примерно такой (я когда-то пытался разбираться с теми, которые на моей ссылке):

0)Подключаем панель на свои пять вольт, соединяем земли модуля (3,5,7,9,11,13,15  пины) и ардуины.

1)Устанавливаем row latch (пин 10)

2)на пины A и B посылаем нули (первая логическая строка, видим это соответствует первыч четырем физическим строкам)

3)Посылаем128 бит данных, каждый раз дергая CKД (данные - пин 12, CKL - пин 8)

4)Отпускаем latch.

Если эксперимент с одной строкой прошел успешно - в цикле по очереди ставим все 4 строки.

Вместо ручной отсылки 128 бит данных можно попробовать писать их через библиотеку для SPI

Как только одиночное табло будт освоено - соединяем последовательно два (три) табло и действуем так же, но куски данных получаются  по 256 (384) бита.
 

korsianen
Offline
Зарегистрирован: 23.03.2013

Спасибо tsostik!!! Начал въезжать понемногу. Вот накидал код:

int sclk = 8;
int a = 11;
int b = 12;
int r = 10;
int ckl = 9;
int z = 0;  //задержка
char matrix[8][4][4][4];
int piksel;
  
void setup() {                
  pinMode(sclk, OUTPUT);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(r, OUTPUT);
  pinMode(ckl, OUTPUT);
  for (int stolb=1; stolb <= 4; stolb++)  {
    for (int strpix=1; strpix <= 4; strpix++)  {
      for (int strlog=1; strlog <= 4; strlog++)  {
        for (int pix=1; pix <= 8; pix++)  {
         matrix[pix][strlog][strpix][stolb]=0;
        }
      }
    }
  }
}


void loop() {
  for (int stolb=1; stolb <= 4; stolb++)  {
    for (int strpix=1; strpix <= 4; strpix++)  {
      for (int strlog=1; strlog <= 4; strlog++)  {
        for (int pix=1; pix <= 8; pix++)  {
          piksel=matrix[pix][strlog][strpix][stolb];
            digitalWrite(sclk, LOW);   
            if (strlog == 1) {
              digitalWrite(a, HIGH);  
              digitalWrite(b, HIGH);
              }
            if (strlog == 2) {
              digitalWrite(a, LOW);  
              digitalWrite(b, HIGH);
              }
            if (strlog == 3) {
              digitalWrite(a, HIGH);  
              digitalWrite(b, LOW);
              }
            if (strlog == 4) {
              digitalWrite(a, LOW);  
              digitalWrite(b, LOW);
              }
            digitalWrite(ckl, HIGH); 
            digitalWrite(ckl, LOW);
            if (piksel == 1){
               digitalWrite(r, LOW);
               } 
             else{
              digitalWrite(r, HIGH);
              }
            digitalWrite(sclk, HIGH);
          
          
        }
      }
    }
  }
 
  delay(z);
}

Пока плохо работает (при заполнении массива 0 панель блымкает некоторыми строками, при 1 горит тускло вся панель). Я только смог добиться вывода одного пикселя по координатм (в другом коде). Сейчас я хочу заполнить матрицу из массива (1 горит 0 не горит пиксел). Возможно я не понимаю  ну например:

1)Устанавливаем row latch (пин 10) - я делаю digitalWrite(sclk, LOW);

4)Отпускаем latch. - я делаю digitalWrite(sclk, HIGH);

3)Посылаем128 бит данных, каждый раз дергая CKД - тут я в своем замудренном цикле (он соответствует расположению 4 столбца по 8 светодиодов и 4 логических А и В) 128 раз обрабатываю digitalWrite(r, LOW); или digitalWrite(r, HIGH); причем дергая

           digitalWrite(ckl, HIGH); 
            digitalWrite(ckl, LOW);

Вопрос такого характера- правильно ли я посылаю данные R и дергаю CKL?

tsostik
Offline
Зарегистрирован: 28.02.2013

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

Насколько я понимаю, отпускать latch надо после того, как мы отослали все необходимые данные (для одной псевдостроки (из четырех реальных)).

Чуть позже попробую накидать код, как он должен выглядеть по моему мнению и выложу.

Мне самому интересно, что из этого получится.

Кстати, посмотрите плз на панель, какая маркировака стоит на микросхемах сдвиговых регистров?

Может вообще идеально сфоторгафировать заднюю сторону в максимальном разрешении. (Чтобы не засорять форму, пришлите плз на tsostik@mail.ru)

 

korsianen
Offline
Зарегистрирован: 23.03.2013

Фото не получиться. У меня из фото только сотовый китайский, мегапикселов не хватит. Микросхемы 8 шт TM74HC595, 1шт SM74HC2450, и еще 6шт мелких плохо видно. На самой панели маркировка CAI LIANG P10(1R)-V901A и еще 100001/4 PCB05 XYTECH

Сейчас буду пробовать как Вы посоветовали на счет псевдострок. Результат выложу позднее.

 

tsostik
Offline
Зарегистрирован: 28.02.2013

Предлагаю начинать с простого.

int sclk = 8;
int r0 = 11;
int r1 = 12;
int data = 10;
int ckl = 9;

void pulseClock() //передергиваем линию clock
{
    digitalWrite(ckl, HIGH);  //включаем
    __asm volatile (              //ждем один такт. Скорее всего, можно и без этого, но на всякий случай
      "nop\n"
    );
    digitalWrite(ckl, LOW);  //выключаем
}

void setup()
{
    pinMode(sclk, OUTPUT);
    pinMode(r0, OUTPUT);
    pinMode(r1, OUTPUT);
    pinMode(data, OUTPUT);
    pinMode(ckl, OUTPUT);
}

void loop()
{
    unsigned int i;
    digitalWrite(sclk, HIGH); //закрываем защелку
    digitalWrite(r0, LOW);     //первая строка
    digitalWrite(r1, LOW);
    for(i=0; i<127; i++)          //127 нулей
    {
        digitalWrite(data, LOW);
        pulseClock();
    }
    digitalWrite(data, HIGH); //и одна единица
    pulseClock();
    digitalWrite(sclk, LOW);
}

Сейчас должен гореть один диод - верхний левый.

Работает?

korsianen
Offline
Зарегистрирован: 23.03.2013

Горят все в псевдостроке кроме выше указанного. Короче все наоборот.

korsianen
Offline
Зарегистрирован: 23.03.2013

   for(i=0; i<127; i++)          //127 нулей
    {
        digitalWrite(data, HIGH);
        pulseClock();
    }
    digitalWrite(data, LOW); //и одна единица
    pulseClock();
    digitalWrite(sclk, LOW);

Вот так все норм.

korsianen
Offline
Зарегистрирован: 23.03.2013

Получилось. Косяк был у меня с массивом. Ну и советы помогли. Вот код:

int sclk = 8;
int a = 11;
int b = 12;
int r = 10;
int ckl = 9;
char matrix[8][4][4][4];
int piksel;
  
void setup() {                
  pinMode(sclk, OUTPUT);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(r, OUTPUT);
  pinMode(ckl, OUTPUT);
  // Заполняем массив для матрицы 1- горит, 0-не горит
  for (unsigned int strlog = 0; strlog <= 3; strlog++)  {
   for (unsigned int stolb = 0; stolb <= 3; stolb++)  {
      for (unsigned int strpix = 0; strpix <= 3; strpix++)  {
        for (unsigned int pix = 0; pix <= 7; pix++)  {
            matrix[pix][strlog][strpix][stolb]=1; // 1- горит, 0-не горит
        }
      }
    }
  }
}


void loop() {
  for (unsigned int strlog = 0; strlog <= 3; strlog++)  {
    digitalWrite(sclk, HIGH);  
    if (strlog == 0) {
      digitalWrite(a, HIGH);  
      digitalWrite(b, HIGH);
      }
    if (strlog == 1) {
      digitalWrite(a, LOW);  
      digitalWrite(b, HIGH);
      }
    if (strlog == 2) {
      digitalWrite(a, HIGH);  
      digitalWrite(b, LOW);
      }
    if (strlog == 3) {
      digitalWrite(a, LOW);  
      digitalWrite(b, LOW);
      }
    for (unsigned int stolb=0; stolb <= 3; stolb++)  {
      for (unsigned int strpix=0; strpix <= 3; strpix++)  {
        for (unsigned int pix=0; pix <= 7; pix++)  {
          piksel=matrix[pix][strlog][strpix][stolb];
             if (piksel == 1){
              digitalWrite(r, LOW);
              } 
             else{
               digitalWrite(r, HIGH);
               }
             digitalWrite(ckl, HIGH);  
             digitalWrite(ckl, LOW);  
         }
      }
    }
    digitalWrite(sclk, LOW);
  }
}

Теперь дело за малым, чистое программирование. Буду выносить все это в функцию и приводить к системе координат x,y. Типо видео дисплея.

Результаты буду выкладывать.

tsostik
Offline
Зарегистрирован: 28.02.2013

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

Хотя, я по размышлениям в этом уже не уверен. Попробуйте в конец скетча поставить что-то типа delay(10000) и посмотреть, что будет светиться во время этих десяти секунд?

korsianen
Offline
Зарегистрирован: 23.03.2013

Сначало код:

int sclk = 8;             //пин 8
int a = 11;               //пин 11
int b = 12;               //пин 12
int r = 10;               //пин 10
int ckl = 9;              //пин 9
char matrix[4][4][4][8];  // массив матрицы
int piksel;               // состояние ячейки в массиве матрицы 0-1
int x;                    // координаты 0-31
int y;                    // координаты 0-15
int strlog;               // псевдостроки 0-3
int stolb;                // столбец 0-3
int strpix;               // строка в столбце одной псевдостроки 0-3
int pix;                  // пиксель 1-8

// заполнение дисплея из массива матрицы
void disp(){
  for (int strlog = 0; strlog <= 3; strlog++)  {
    digitalWrite(sclk, LOW);
    if (strlog == 0) {
      digitalWrite(a, HIGH);  // 0 псевдострока
      digitalWrite(b, HIGH);
      }
    if (strlog == 1) {
      digitalWrite(a, LOW);  // 1 псевдострока
      digitalWrite(b, HIGH);
      }
    if (strlog == 2) {
      digitalWrite(a, HIGH);  // 2 псевдострока
      digitalWrite(b, LOW);
      }
    if (strlog == 3) {
      digitalWrite(a, LOW);  // 3 псевдострока
      digitalWrite(b, LOW);
      }
    for (int stolb=0; stolb <= 3; stolb++)  {
      for (int strpix=0; strpix <= 3; strpix++)  {
        for (int pix=0; pix <= 7; pix++)  {
          piksel=matrix[strlog][stolb][strpix][pix];
             if (piksel == 1){
              digitalWrite(r, LOW); // рисует точку
              } 
             else{
               digitalWrite(r, HIGH); // не рисует точку
               }
             digitalWrite(ckl, HIGH);  
             digitalWrite(ckl, LOW);  
         }
      }
    }
  digitalWrite(sclk, HIGH);  
  }
}

// очистка матрицы
void cls(){
  for (int strlog = 0; strlog <= 3; strlog++)  {
   for (int stolb = 0; stolb <= 3; stolb++)  {
      for (int strpix = 0; strpix <= 3; strpix++)  {
        for (int pix = 0; pix <= 7; pix++)  {
            matrix[strlog][stolb][strpix][pix]=0; 
        }
      }
    }
  }
}

// запись в массив матрицы по x,y
void zapis(int x1,int y1){
int strlog1 = y1-(y1/4)*4;
int stolb1  = x1/8;
int strpix1 = y1/4;
int pix1    = x1-(x1/8)*8;
matrix[strlog1][stolb1][strpix1][pix1] = 1;
}
  
void setup() {                
  pinMode(sclk, OUTPUT);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(r, OUTPUT);
  pinMode(ckl, OUTPUT);
  // Очистка матрицы
  cls();
  disp();
}


void loop() {
 // рисуем квадрат 11х11
  for (int y = 0; y <= 10; y++)  { 
    zapis(0,y);
    zapis(10,y);
  }
   for (int x = 0; x <= 10; x++)  { 
    zapis(x,0);
    zapis(x,10);
  }
  disp(); 
  delay(0);
}

tsostik на твою почту скинул видео. Задержка стоит 0,5 сек.

Возникла проблема наверно с выводом четырех псевдострок. Я сделал квадрат 11х11. Результат на фото:

   Как-то не получается квадрат. Идет смещение по у.

 

 

 

 

 

 

 

Прикол в том когда я вывожу псевдостроки по отдельности меняя в цикле strlog = 0,1,2,3 и соответственно  strlog <= 0,1,2,3 то все замечательно.

// заполнение дисплея из массива матрицы
void disp(){
  for (int strlog = 0; strlog <= 3; strlog++)  {

Вот фото в хронологии с псевдостроками:

 

 

korsianen
Offline
Зарегистрирован: 23.03.2013

Интересно а для чего нужен пин 1 ОЕ на панели? Может с ним надо тоже манипуляции произвести.

tsostik
Offline
Зарегистрирован: 28.02.2013

Похоже, вы где-то намудрилис  координатами.

Я не очень понял логики устройства четырехмерного массива, поэтому предлагаю такой вариант:

#define LATCH 8           //sclk на плате
#define R0    11          //low bit of row addres на плате
#define R1    12          //ршпр bit of row addres на плате
#define DATA  10          //red data на плате
#define CLOCK 9           //ckl на плате

unsigned char videoMem[128][4];    //Псевдовидеопамять, в боевом проекте можно будет использовать
                          //все биты, а не по одному в байте, но пока и так сойдет

void pulseClock()         //Передернуть clock
{
    digitalWrite(CLOCK, HIGH);
	digitalWrite(CLOCK, LOW);
}

void setPixel(unsigned char x, unsigned char y, unsigned char state)
//Устонавливаем пиксель по координатам x, y в состояние state
//входные координаты у нас будут в "физическом пространстве" 
//(то есть для одной панели - x : 0..31, y : 0..15) 
//Начало координат - левый верхний угол
//Для удобства state==0 будет обозначать "не горит", а state==1 - "горит"
//в функции физического отображения не забудем инвертировать биты
{
    unsigned char px;
	unsigned char py;
	
	px = x >> 2;
	py = x & 3 + y >> 2;
	videoMem[px][py] = (state ? 1 : 0); //чтобы принимать любое ненулевое значение
}

void display()
//отображаем содержимое видеопамяти на экран
{
    unsigned char x, y;
    for(y=0;y<4; y++)
	{
	    digitalWrite(LATCH, HIGH);                 //ставим защелку
		digitalWrite(R0, ((y & 1) ? HIGH : LOW) ); //младший бит адреса
		digitalWrite(R1, ((y & 2) ? HIGH : LOW) ); //старший бит адреса
		for(x=0;x<32; x++)
		{
		    digitalWrite(DATA, ( (videoMem[x][y]) ? LOW : HIGH) ); //записали инвертированный сигнал
			pulseClock();
		}
	    digitalWrite(LATCH, HIGH);                 //отпускаем защелку		
	}
}

void setup()
{
  unsigned char i;
//Инициализация пинов
  pinMode(LATCH, OUTPUT);
  pinMode(R0, OUTPUT);
  pinMode(R1, OUTPUT);
  pinMode(DATA, OUTPUT);
  pinMode(CLOCK, OUTPUT);
//Инициализация видеопамяти
  for(i=0; i < 32, i++)
  {
      videoMem[i][0] = videoMem[i][1] = videoMem[i][2] = videoMem[i][3] = 0;
  };
//Рисуем квадрат
  for(i = 0; i < 11; i++)
  {
      setPixel(0, i, 1);
      setPixel(i, 0, 1);
      setPixel(10, i, 1);
      setPixel(i, 10, 1);
  }
}

void loop()
{
    display();
}

Если что, заранее извиняюсь за возможные синтакические ошибки - я на работе и даже не могу проверить, что код компилируется.

Но вроде все должно быть ОК.

Опять же, нигде не вставлена проверка ошибок входных данных и жестко зашито, что все работает только для одной матрицы.

Если все будет ОК, можно будет чуть допилить код и сделать из него вполне работоспособное API.

tsostik
Offline
Зарегистрирован: 28.02.2013

Это output enableб нужен для того, чтобы несколько независимых панелей можно было управлять общими шинами данных (стандартный пин любого сдвиговово регистра)

korsianen
Offline
Зарегистрирован: 23.03.2013

Ваш код с координатами тоже хромает возможно что вы не знаете как идет псевдострока по панели. Вот нарисовал в поинте (не смейтесь сильно :) )

tsostik
Offline
Зарегистрирован: 28.02.2013

Я же говорю - пишу "на ощупь". Тут надо пробоваь от простого к сложному.

Сейчас сообразил, что не в том порядке посылаю биты для отдельных диодов.

Попробуйте поменять функцию display на вот такую:

void display()
//отображаем содержимое видеопамяти на экран
{
    unsigned char x, y;
    for(y=0;y<4; y++)
	{
	    digitalWrite(LATCH, HIGH);                 //ставим защелку
		digitalWrite(R0, ((y & 1) ? HIGH : LOW) ); //младший бит адреса
		digitalWrite(R1, ((y & 2) ? HIGH : LOW) ); //старший бит адреса
		for(x=31;x>=0; x--)
		{
		    digitalWrite(DATA, ( (videoMem[x][y]) ? LOW : HIGH) ); //записали инвертированный сигнал
			pulseClock();
		}
	    digitalWrite(LATCH, HIGH);                 //отпускаем защелку		
	}
}

То есть посылать данные "с конца",  а не "с начала".

Ну и опять же, хочется видеть, что получается в результате (учтите только, что из-за динамической индикации на фотографии скорее всего будет гореть только одна логическая строчка).

Опять же, неплохо выяснить, какая все-таки индикация на панели - гаснет ли старая строчка, когда мы посылаем данные для новой (по идее, должна гаснуть).

korsianen
Offline
Зарегистрирован: 23.03.2013

с одной из каждой псевдострок у меня проблем нет, а вот в связке хотябы с двумя псевдостроками начинает съезжать пикселы и на том месте где должны стоять горят точки очень слабо.

tsostik
Offline
Зарегистрирован: 28.02.2013

Покажите, плз, картинку, что горит при работе моего скетча (с измененной функцией display)?

 

korsianen
Offline
Зарегистрирован: 23.03.2013

каждый раз по разному отоброжает но в одной псевдостроке

а можешь объяснить вычесление или ссылку где это понять можно

    px = x >> 2;
    py = x & 3 + y >> 2;

чет я не знаю таких операторов

korsianen
Offline
Зарегистрирован: 23.03.2013

Выявил следующее: после записи псевдостроки она не гаснет потом когда идет переключение псевдостроки на следующую она гаснет но почемуто отображается копия в новой псевдостроке

korsianen
Offline
Зарегистрирован: 23.03.2013

Сделал. Надо перед переключением псевдострок стирать информацию с псевдостроки с которой переходим. Вот рабочий код вывода квадрата 11х11

int sclk = 8;             //пин 8
int a = 11;               //пин 11
int b = 12;               //пин 12
int r = 10;               //пин 10
int ckl = 9;              //пин 9
int oe = 7;              //пин 7
char matrix[4][4][4][8];  // массив матрицы
int piksel;               // состояние ячейки в массиве матрицы 0-1
int x;                    // координаты 0-31
int y;                    // координаты 0-15
int strlog;               // псевдостроки 0-3
int stolb;                // столбец 0-3
int strpix;               // строка в столбце одной псевдостроки 0-3
int pix;                  // пиксель 1-8

// заполнение дисплея из массива матрицы
void disp(){
  for (int strlog = 0; strlog <= 3; strlog++)  {
    digitalWrite(sclk, HIGH);
    digitalWrite(a, ((strlog & 1) ? LOW : HIGH) ); //младший бит адреса
    digitalWrite(b, ((strlog & 2) ? LOW : HIGH) ); //старший бит адреса
    for (int stolb=0; stolb <= 3; stolb++)  {
      for (int strpix=0; strpix <= 3; strpix++)  {
        for (int pix=0; pix <= 7; pix++)  {
          piksel=matrix[strlog][stolb][strpix][pix];
             if (piksel == 1){               
              digitalWrite(r, LOW); // рисует точку
              } 
             else{
               digitalWrite(r, HIGH); // не рисует точку
               }
             digitalWrite(ckl, LOW);  
             digitalWrite(ckl, HIGH); 
        }
      }
    }
    digitalWrite(sclk, LOW);
    digitalWrite(sclk, HIGH);
    for (int stolb=0; stolb <= 3; stolb++)  {
      for (int strpix=0; strpix <= 3; strpix++)  {
        for (int pix=0; pix <= 7; pix++)  {
          digitalWrite(r, HIGH); // не рисует точку
          digitalWrite(ckl, LOW);  
          digitalWrite(ckl, HIGH); 
        }
      }
    }
    digitalWrite(sclk, LOW);
  }
}

// очистка матрицы
void cls(){
  for (int strlog = 0; strlog <= 3; strlog++)  {
   for (int stolb = 0; stolb <= 3; stolb++)  {
      for (int strpix = 0; strpix <= 3; strpix++)  {
        for (int pix = 0; pix <= 7; pix++)  {
            matrix[strlog][stolb][strpix][pix]=0; 
        }
      }
    }
  }
}

// запись в массив матрицы по x,y
void zapis(int x1,int y1){
int strlog1 = y1-(y1/4)*4;
int stolb1  = x1/8;
int strpix1 = y1/4;
int pix1    = x1-(x1/8)*8;
matrix[strlog1][stolb1][strpix1][pix1] = 1;
}
  
void setup() {                
  pinMode(sclk, OUTPUT);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(r, OUTPUT);
  pinMode(ckl, OUTPUT);
  pinMode(oe, OUTPUT);
  // Очистка матрицы
  cls();
  disp();
 
}


void loop() {
 // рисуем квадрат 11х11
   for (int i = 0; i <= 10; i++)  { 
    zapis(0,i);
    zapis(10,i);
    zapis(i,0);
    zapis(i,10);
  }
  disp(); 
//   delay(100);
}

 

tsostik
Offline
Зарегистрирован: 28.02.2013

x >> 2 - сдвинуть x на два бита вправо (эквивалентно тому, чтобы взять целую часть от деления на 4)

x & 3 - побитовое "И" - в данном случае взять два младших бита, оно же эквивалентно взятию остатка от деления на 4

Копия старой стоки отображается в новой потому что перед переключением строки надо ставить latch

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

Защелку надо ставить ДО того, как устанавливаем адрес строки, а отключать ПОСЛЕ того, как отослали все данные. Как только защелка будет отпущена отосланные данные отобразятся в строке.

korsianen
Offline
Зарегистрирован: 23.03.2013

Вот две фигурки. Теперь надо заняться оптимизацией кода.

int sclk = 8;             //пин 8
int a = 11;               //пин 11
int b = 12;               //пин 12
int r = 10;               //пин 10
int ckl = 9;              //пин 9
int oe = 7;              //пин 7
char matrix[4][4][4][8];  // массив матрицы
int piksel;               // состояние ячейки в массиве матрицы 0-1
int x;                    // координаты 0-31
int y;                    // координаты 0-15
int strlog;               // псевдостроки 0-3
int stolb;                // столбец 0-3
int strpix;               // строка в столбце одной псевдостроки 0-3
int pix;                  // пиксель 1-8

// заполнение дисплея из массива матрицы
void disp(){
  for (int strlog = 0; strlog <= 3; strlog++)  {
    digitalWrite(sclk, HIGH);
    digitalWrite(a, ((strlog & 1) ? LOW : HIGH) ); //младший бит адреса
    digitalWrite(b, ((strlog & 2) ? LOW : HIGH) ); //старший бит адреса
    for (int stolb=0; stolb <= 3; stolb++)  {
      for (int strpix=0; strpix <= 3; strpix++)  {
        for (int pix=0; pix <= 7; pix++)  {
          piksel=matrix[strlog][stolb][strpix][pix];
             if (piksel == 1){               
              digitalWrite(r, LOW); // рисует точку
              } 
             else{
               digitalWrite(r, HIGH); // не рисует точку
               }
             digitalWrite(ckl, LOW);  
             digitalWrite(ckl, HIGH); 
        }
      }
    }
    digitalWrite(sclk, LOW);
    digitalWrite(sclk, HIGH);
    for (int stolb=0; stolb <= 3; stolb++)  {
      for (int strpix=0; strpix <= 3; strpix++)  {
        for (int pix=0; pix <= 7; pix++)  {
          digitalWrite(r, HIGH); // не рисует точку
          digitalWrite(ckl, LOW);  
          digitalWrite(ckl, HIGH); 
        }
      }
    }
    digitalWrite(sclk, LOW);
  }
}

// очистка матрицы
void cls(){
  for (int strlog = 0; strlog <= 3; strlog++)  {
   for (int stolb = 0; stolb <= 3; stolb++)  {
      for (int strpix = 0; strpix <= 3; strpix++)  {
        for (int pix = 0; pix <= 7; pix++)  {
            matrix[strlog][stolb][strpix][pix]=0; 
        }
      }
    }
  }
}

// запись в массив матрицы по x,y
void zapis(int x1,int y1){
int strlog1 = y1-(y1/4)*4;
int stolb1  = x1/8;
int strpix1 = y1/4;
int pix1    = x1-(x1/8)*8;
matrix[strlog1][stolb1][strpix1][pix1] = 1;
}
  
void setup() {                
  pinMode(sclk, OUTPUT);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(r, OUTPUT);
  pinMode(ckl, OUTPUT);
  pinMode(oe, OUTPUT);
  cls(); // Очистка матрицы
  disp();
  // Квадрат 11х11
  for (int i = 0; i <= 10; i++)  { 
    zapis(0,i);
    zapis(10,i);
    zapis(i,0);
    zapis(i,10);
  }
  // Круг
  int xc=19; // центр х
  int yc=7;  // центр у
  int rk=5;  // радиус
  for (int i = 0; i <= 359; i++)  { 
    x=xc+round(rk*cos(i));
    y=yc-round(rk*sin(i));
    zapis(x,y);
   }
}

void loop() {
  disp(); 
}

 

tsostik
Offline
Зарегистрирован: 28.02.2013

Посмотрел на код и что-то не понял, зачем в функции disp после отрисовки строки ее гасить?

korsianen
Offline
Зарегистрирован: 23.03.2013

без гашения строки она все равно появляется в новой строке. Я уже по всякому с защелкой наигрался, результата нет. Возможно особенность этих панелий такая. Я понимаю что лишний код на производительность влияет, но без этого никуда.

Сейчас сижу русские буквы кодирую размером 5х7 точек.

korsianen
Offline
Зарегистрирован: 23.03.2013

Вопрос: Как лучше организовать ввод данных на Ардуино для моего случая с панелью. Ну типа надо написать "ПРИВЕТ".  Клаву ведь можно подцепить к ардуино?

tsostik
Offline
Зарегистрирован: 28.02.2013

Я подозреваю, что надо аккуратно с защелкой все таки разобраться. Может быть, она active low?

для этого нужно залить совсем короткий скетч типа

void loop()
{
    digitalWrite(latch, HIGH);
    digitalWrite(r0, LOW);
    digitalWrite(r1, LOW);
    for(i=0; i < 128; i++)
    {
        digitalWrite(data, i&1?HIGH:LOW);
        pulseClock();
    }
}

То есть включаем пиксели "через один" в одной логической строке.

Обратите внимание, что latch обратно не восстанавливаем.

Отображается ли так что нибудь? Если да, то вместо

digitalWrite(latch, HIGH);

пишем

digitalWrite(latch, LOW);

Таким образом можно выяснить, при каком вообще уровне срабатывает защелка и срабатывает ли вообще?

Может она просто не к тому пину прицеплена?

Насчет клавиатуры - http://cxem.net/arduino/arduino22.php

korsianen
Offline
Зарегистрирован: 23.03.2013

За ссылку спасибо. Возьму на вооружение.

Еще раз убедился что сначало

digitalWrite(latch, HIGH)

в конце

digitalWrite(latch, LOW);

и когда делаем паузу строка остается гореть. Потом когда мы хотим перейти на следующую строку

digitalWrite(r0, LOW);
digitalWrite(r1, HIGH);

но пока не записываем данные в нее, происходит копия предыдущей строки в новой.

В этом коде 2 строчки мигают поочередно с интервалом 1 сек.

void loop()
{
    digitalWrite(sclk, HIGH);
    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    for(int i=0; i < 128; i++)
    {
        digitalWrite(r, i&1?HIGH:LOW);
         digitalWrite(ckl, LOW);  
          digitalWrite(ckl, HIGH); 
    }
    digitalWrite(sclk, LOW);
    delay(1000);
        digitalWrite(sclk, HIGH);

    digitalWrite(a, HIGH);
    digitalWrite(b, LOW);
 
        digitalWrite(sclk, LOW);
delay(1000);
}

То-есть надо гасить первую строчку перед переключением. Защелкой она не гасится! Так что приходиться записывать нули для стирания.

korsianen
Offline
Зарегистрирован: 23.03.2013

А вам какая панель идет?

tsostik
Offline
Зарегистрирован: 28.02.2013

Черт, я сообразил, что был неправ насчет предназначения защелки и OE.

В надо кажется чуть чуть поменять алгоритм.

Все-таки контакт OE нужен - он переводит выводы строки в HI-Z состояние, гася светодиоды.

То есть алгоритм чуть меняется:

1)Пишем адрес строки

2)Подаем единицу на OE

3)Заполняем строку данными (по прежнему через тактовые импульсы)

4)Подаем ноль на OE В этот момент строка включается.

 

А защелка нужна только в ситуации, когда мы работаем с одной единственной строкой и не включаем OE.

Прошу прощения за невольную дезинформацию.

Панель мне едет вот такая: http://www.sureelectronics.net/goods.php?id=1122

Выбрал ее потому что она двухцветная и с подробным описанием, как с ней работать.

korsianen
Offline
Зарегистрирован: 23.03.2013

Не работает и так. ОЕ просто отключает и включает свет, на логику регистров он не влияет. Короче если сталкнетесь с такой проблемой на своих модулях то просто стирайте строки. Я уже все перепробовал. 3 дня подряд.

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

char kod[]="АБВГДЕ";

 

korsianen
Offline
Зарегистрирован: 23.03.2013

Подключил вторую панель, тоесть подключил следущую проблему на свою голову :)

Передаю в 2 раза больше, а вторая панель молчит. Подстыковал все последовательно со второго разъема, а-а в-в масса-масса ну и т.д.

int sclk = 8;
int a = 11;
int b = 12;
int r = 10;
int ckl = 9;
  
void setup() {                
  pinMode(sclk, OUTPUT);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(r, OUTPUT);
  pinMode(ckl, OUTPUT);
}

void loop() {
  digitalWrite(sclk, HIGH);  
  digitalWrite(a, HIGH);  
  digitalWrite(b, HIGH);
  for (int i=0; i <= 255; i++)  {
    digitalWrite(r, LOW);
    digitalWrite(ckl, LOW);  
    digitalWrite(ckl, HIGH); 
  }
  digitalWrite(sclk, LOW);
 
}

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

По поводу русских букв. ArduinoIDE хранит русские буквы в кодировке utf8. Если для вывода нужна другая кодировка, придется перекодировать.

tsostik
Offline
Зарегистрирован: 28.02.2013

То есть данные по первой панели проходят, а по второй нет?

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

Тут пригодится тестовый скетч примерно следующего содержания:

int sclk = 8;
int a = 11;
int b = 12;
int r = 10;
int ckl = 9;
int toSend = HIGH;
  
void setup() {                
  pinMode(sclk, OUTPUT);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(r, OUTPUT);
  pinMode(ckl, OUTPUT);
}

void loop() {
  digitalWrite(sclk, HIGH);  
  digitalWrite(a, HIGH);  
  digitalWrite(b, HIGH);
  digitalWrite(r, toSend);
  toSend = (toSend==HIGH)?LOW:HIGH;
  digitalWrite(ckl, LOW);  
  digitalWrite(ckl, HIGH); 
  digitalWrite(sclk, LOW);
   //ждем нажатия кнопки (или команды из сериалпорта)
}

Который записывает биты по одному по команде извне.

Это позволит посмотреть, в какой момент какие значения на выходе.

Еще лучше эти пины запихать на вход свободных пинов ардуины, считывать их каждый шаг и писать в сериалпорт для отладки и анализа. Пин часов лучше CKL вообще на осциллограф повесить, чтобы проверить, проходят ли импульсы синхронизации.

korsianen
Offline
Зарегистрирован: 23.03.2013

Извени меня, моя ошибка. Я когда с одной панелью работал, питание на нее не подовал, ардуино ее запитывала сама. Для второй панели пришлось уже подовать питание. Но пока до меня дошло я с светодиодами поигрался так примерно 3-4 часа. Прикольно так, моргают в такты.

Надо что то дальше думать на счет псевдострок, так как мерцание появляется. Обработки стало больше в 2 раза, а если больше панелий подключить то вообще мигать начнет.

У меня есть задумка:

в void setup()

1. гасим панель ОЕ

2. записываем во все псевдостроки информуху

в void loop()

1. вкл панель ОЕ

2. Просто перебираем все псевдостроки

На скорую руку накидал код, пока не получается.

Нашел в инете схожее http://www.jonshouse.co.uk/ledsign.cgi

Надо в коде там разобраться и я думаю все получиться.

tsostik
Offline
Зарегистрирован: 28.02.2013

Попробуй на вход OE подцепить кнопку одной ногой на землю, второй ногой на вход и одновременно через подтяжку 10К на +5 ардуины.

После чего запустить скетч, который что-то рисует и посмотреть, что происходит при нажатии кнопки. Теоретически,табло должно гаснуть (точнее должна гаснуть активная строка,

но учитывая то, что в любой момент  времени горит одна строка, гаснуть будет все табло).  А практически?

Или при установке выходов a и b дописать что-то типа

digitalWrite(OE, ((a==1)&(b==(0))?HIGH:LOW);

В этом случае одна псевдострока (видимо, вторая сверху) должны быть постоянно выключена. Это так?

korsianen
Offline
Зарегистрирован: 23.03.2013

Вот что нарыл (перевод с китайского)

светодиодный дисплей над буквами объяснить

Светодиодный дисплей общее понимание сигнал 
тактового сигнала CLK: подается в регистр сдвига сдвига импульсов, каждый импульс будет вызывать данные в или из. Порт на данных должны быть согласованы с тактового сигнала для нормальной передачи данных, частота сигнала данных должна быть 1/2 раза частоту тактового сигнала. В любом случае, когда тактового сигнала является ненормальным, сделать весь табло дезорганизованы. 
STB сигнала защелки: данные в регистр сдвига на защелку, и его содержание данных через приводной цепи горит светодиодный дисплей. Тем не менее, схема привода по сигналу управления EN включить, освещение ее посылка должна быть включена в открытом состоянии. Защелка сигнал также нуждаются в координации тактового сигнала для того, чтобы увидеть полное изображение. В любом случае, когда защелка сигнал аномалии сделает весь борт дезорганизованы. 
EN разрешающий сигнал: весь экран регулировки яркости сигнал также используется для отображения гашения.Пока вы можете управлять яркостью изменения настройки рабочего цикла. Когда разрешающий сигнал при возникновении исключения, весь экран будет появляться яркие, темные, яркие или задней. 
Данные сигнала: обеспечение визуального отображения необходимых данных. Должны быть согласованы с тактового сигнала для того, чтобы передать данные в любой части дисплея пунктов. Вообще отделена от красного, зеленого и синего данных на дисплее сигнала к сигналу данных замкнут на положительный или отрицательный, соответствующий цвет появится полная ярких или не яркий цвет, соответствующий когда данные сигнала вакантные Ситуация переменной. 
ABCD сигналы линии: дисплей только существует только в динамическом сканировании, ABCD является двоичные числа, это младший бит, и если двоичное представление ABCD сигнал для управления максимальный диапазон линии 16 (1111), 1/4 тех пор, как сканирование AB сигнал может , потому что диапазон сигнала AB на четыре линии (11). Линия сигнала управления ненормальное явление покажет дислокации, подсветка или изображение перекрытия. 
R красный G зеленая B синяя

tsostik
Offline
Зарегистрирован: 28.02.2013

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

Для того, чтобы глаз не видел мерцания, диоды должны загораться с частотой не менее 50 ГЦ, что дает 20мс на цикл обновления экрана.

За один цикл нужно сделать (для двух табло, соединенных последовательно) минимум 3072 digitalWrite'ов. (Это записать данные для всех диодов и передернуть clock). В Вашем варианте с записью нулей между переходами - уже 6144 записи.

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

Попробуйте добавить Serial.println(misros()) первым вызовом в loop и посмотреть на время?

Будем ускорять digitalWrite'ы прямой записью в регистры. По грубым прикидкам должно остаться не более 10мс на цикл, чего с лихвой хватит для отрисовки и даже оставится время для работы контроллера по собственно генерации отображения.

 

korsianen
Offline
Зарегистрирован: 23.03.2013

Вот нашел на просторах инета то что надо.

http://we.easyelectronics.ru/woddy/kontroller-svetodiodnogo-tablo.html

Буду тестить.

korsianen
Offline
Зарегистрирован: 23.03.2013

Все теперь работает отлично. Вот код:

#define pinData1 10
#define pinClk  9
#define pinStr  8
#define pinEn  7
#define pinA  11
#define pinB  12
  int vrem=0;  //Начало отсчета времени для переключения слов
  int pa=100; // Интервал переключения
unsigned char screen [128]; //Видеопамять

char sl1 [] = { //Слово ВОЛГОГРАД тонкий шрифт
240,133,241,133,98,9,9,9,20,20,20,20,3,8,8,8,16,80,80,80,32,32,60,33,66,34,34,34,129,66,66,66,
136,133,137,133,145,9,9,9,20,20,20,20,4,8,8,8,144,80,80,80,32,32,34,33,34,34,34,34,255,66,66,66,
133,133,133,136,9,9,9,144,20,20,20,148,8,8,8,4,80,80,80,144,32,32,33,34,34,62,34,18,66,66,66,36,
133,137,133,240,9,9,9,96,20,20,20,119,8,8,8,227,80,80,80,31,32,32,33,188,34,34,34,14,66,66,66,24
};
char sl2 [] = {//Слово ВОЛГОГРАД жирный шрифт
240,205,241,205,99,153,153,153,54,182,182,182,3,12,12,12,24,216,216,216,48,48,60,51,102,54,54,54,195,102,102,102,
216,205,201,221,241,153,153,153,182,182,182,182,7,12,12,12,152,216,216,216,48,48,62,51,54,54,54,54,255,102,102,102,
205,205,205,248,153,153,153,240,182,182,182,247,12,12,12,231,216,216,216,159,48,48,51,190,54,62,54,30,126,102,102,60,
205,201,205,240,153,153,153,96,182,182,182,119,12,12,12,227,216,216,216,31,48,48,51,188,54,62,54,14,102,102,102,24
};
char sl3 [] = {//Слово ЗНАМЕНСК тонкий шрифт
56,2,4,2,130,130,254,130,130,66,66,66,130,130,146,170,254,128,248,128,130,130,254,130,56,128,128,128,129,136,192,136,
68,2,56,130,130,130,130,130,66,66,66,66,130,130,146,198,128,128,128,128,130,130,130,130,68,128,128,130,130,144,192,132,
130,2,4,68,130,130,130,130,66,126,66,34,130,130,170,198,128,128,128,128,130,130,130,130,130,128,128,68,132,144,160,130,
2,2,2,56,130,130,130,130,66,66,66,30,130,146,170,130,128,128,128,254,130,130,130,130,128,128,128,56,136,160,144,129
};
char sl4 [] = {//Слово ЗНАМЕНСК жирный шрифт
28,3,6,67,99,99,127,99,99,51,51,51,99,99,107,119,127,96,124,96,99,99,127,99,28,96,96,97,99,108,112,110,
62,3,28,103,99,99,127,99,51,51,51,59,99,99,107,99,127,96,124,96,99,99,127,99,62,96,96,115,99,108,112,103,
103,3,14,62,99,99,99,99,51,63,51,31,99,99,119,99,96,96,96,127,99,99,99,99,115,96,96,62,102,120,120,99,
67,7,3,28,99,99,99,99,51,63,51,15,99,107,119,99,96,96,96,127,99,99,99,99,97,96,96,28,102,120,124,97
};

void setup() {   
  
  pinMode(pinData1, OUTPUT);     
  pinMode(pinClk, OUTPUT);     
  pinMode(pinStr, OUTPUT);     
  pinMode(pinEn, OUTPUT);     
  pinMode(pinA, OUTPUT);     
  pinMode(pinB, OUTPUT); 

  for(int i = 0; i < 128; i++) //Очистка видеопамяти
  {
    screen[i] = 0;
  };
}

void loop() {
  for(byte i=0; i<4 ; i++)
  {
    SelectStr(i); // Выбор псевдостроки
    SendBytes(screen + i*32); // Рисуем псевдостроку
    digitalWrite(pinEn, HIGH); // Включаем матрицы
    delayMicroseconds(200); // Пауза
    digitalWrite(pinEn, 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];
    };
  }; 
  if (vrem == pa*3) {
   for(int i = 0; i < 128; i++) //Заносим в видеопамять третье слово
    {
      screen[i]  = sl3[i];
    };
  };
  if (vrem == pa*4) {
   for(int i = 0; i < 128; i++) //Заносим в видеопамять четвертое слово
    {
      screen[i]  = sl4[i];
    };
    vrem=0; // Сбрасываем счетчик
  };
 vrem=vrem+1; // Увеличение отсчета времени
  
}

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

void SendBytes(unsigned char* b) // Рисуем псевдостроку
{
  byte i;
  byte k;
  for(k = 0; k<32; k++)
  for(i = 0; i<8 ; i++)
  {
    digitalWrite(pinClk, LOW); 
    if((b[k] & (1 <<  (7-i))) ) digitalWrite(pinData1, LOW); else digitalWrite(pinData1, HIGH);
    digitalWrite(pinClk, HIGH);     
  }
  digitalWrite(pinStr, HIGH);
  digitalWrite(pinStr, LOW);
  return;
};

Результат кода:

Выводит на 2 матрицы поочередно 4 слова.

Фото:

PS

Кодировал слова в EXCELE http://yadi.sk/d/5fKwB0Xx4GkG1

sav13
sav13 аватар
Онлайн
Зарегистрирован: 17.06.2013

Приехал такой дисплей с taobao.com с матрицей RGB 16x32

В комплекте свой контроллер с часами, датчиком DHT11 и инфракрасным диодом. С ним все работает.

Как бы это чудо пдключить к Arduino?

Дисплей явно вручную паяли

Разъем 20pin, из них 10 - земля.

Остальные промаркированы:

G, CLK, STR, R, BD, C, B, A, E, BD

Контролер сделан поаккуратнее

Тот же разъем промаркирован немного подругому:

G1, SCR, STR, R1, R2, C, B, A, EN, G2

Вот думаю, куда копать, чтобы приспособить эту железку.

И нужно ли по уровням согласовывать? Дисплей питается от своего блока 5В, но когда к дискретным разъемам Arduino подключаю вместе с землей - загорается светодиод питания, хоья контролер отключен от питания и USB.

kalasas18
Offline
Зарегистрирован: 15.03.2014

Я попробовал этот код, но не было две фигурки как вам фотографии. 
Может быть, я неправильно подключен Arduino c DMD.  Вот как это кажется в моей схеме:

правильно или нет?

kalasas18
Offline
Зарегистрирован: 15.03.2014

korsianen пишет:

Вот две фигурки. Теперь надо заняться оптимизацией кода.

int sclk = 8;             //пин 8
int a = 11;               //пин 11
int b = 12;               //пин 12
int r = 10;               //пин 10
int ckl = 9;              //пин 9
int oe = 7;              //пин 7
char matrix[4][4][4][8];  // массив матрицы
int piksel;               // состояние ячейки в массиве матрицы 0-1
int x;                    // координаты 0-31
int y;                    // координаты 0-15
int strlog;               // псевдостроки 0-3
int stolb;                // столбец 0-3
int strpix;               // строка в столбце одной псевдостроки 0-3
int pix;                  // пиксель 1-8

// заполнение дисплея из массива матрицы
void disp(){
  for (int strlog = 0; strlog <= 3; strlog++)  {
    digitalWrite(sclk, HIGH);
    digitalWrite(a, ((strlog & 1) ? LOW : HIGH) ); //младший бит адреса
    digitalWrite(b, ((strlog & 2) ? LOW : HIGH) ); //старший бит адреса
    for (int stolb=0; stolb <= 3; stolb++)  {
      for (int strpix=0; strpix <= 3; strpix++)  {
        for (int pix=0; pix <= 7; pix++)  {
          piksel=matrix[strlog][stolb][strpix][pix];
             if (piksel == 1){               
              digitalWrite(r, LOW); // рисует точку
              } 
             else{
               digitalWrite(r, HIGH); // не рисует точку
               }
             digitalWrite(ckl, LOW);  
             digitalWrite(ckl, HIGH); 
        }
      }
    }
    digitalWrite(sclk, LOW);
    digitalWrite(sclk, HIGH);
    for (int stolb=0; stolb <= 3; stolb++)  {
      for (int strpix=0; strpix <= 3; strpix++)  {
        for (int pix=0; pix <= 7; pix++)  {
          digitalWrite(r, HIGH); // не рисует точку
          digitalWrite(ckl, LOW);  
          digitalWrite(ckl, HIGH); 
        }
      }
    }
    digitalWrite(sclk, LOW);
  }
}

// очистка матрицы
void cls(){
  for (int strlog = 0; strlog <= 3; strlog++)  {
   for (int stolb = 0; stolb <= 3; stolb++)  {
      for (int strpix = 0; strpix <= 3; strpix++)  {
        for (int pix = 0; pix <= 7; pix++)  {
            matrix[strlog][stolb][strpix][pix]=0; 
        }
      }
    }
  }
}

// запись в массив матрицы по x,y
void zapis(int x1,int y1){
int strlog1 = y1-(y1/4)*4;
int stolb1  = x1/8;
int strpix1 = y1/4;
int pix1    = x1-(x1/8)*8;
matrix[strlog1][stolb1][strpix1][pix1] = 1;
}
  
void setup() {                
  pinMode(sclk, OUTPUT);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(r, OUTPUT);
  pinMode(ckl, OUTPUT);
  pinMode(oe, OUTPUT);
  cls(); // Очистка матрицы
  disp();
  // Квадрат 11х11
  for (int i = 0; i <= 10; i++)  { 
    zapis(0,i);
    zapis(10,i);
    zapis(i,0);
    zapis(i,10);
  }
  // Круг
  int xc=19; // центр х
  int yc=7;  // центр у
  int rk=5;  // радиус
  for (int i = 0; i <= 359; i++)  { 
    x=xc+round(rk*cos(i));
    y=yc-round(rk*sin(i));
    zapis(x,y);
   }
}

void loop() {
  disp(); 
}

 

 

Я попробовал этот код, но не было две фигурки как вам фотографии. 
Может быть, я неправильно подключен Arduino c DMD.  Вот как это кажется в моей схеме:

правильно или нет?

kalasas18
Offline
Зарегистрирован: 15.03.2014

Я извиняюсь за спам. Я  не знаю, как удалить сообщение. 

korsianen
Offline
Зарегистрирован: 23.03.2013

Вроде все правильно. Я советую брать код из сообщения №40. Оно самое идеальное.

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

Есть готовая библиотека для работы с массивами этих панелей. https://github.com/freetronics/DMD

Translator
Offline
Зарегистрирован: 03.02.2014

Подключил по этой схеме к ардуино UNO и у меня выводится хаос какой-то. Не работает пример. Что может быть не так? Обязательно надо на GROUND все ножки ставить?

Translator
Offline
Зарегистрирован: 03.02.2014

Как организовать работу 4х модулей расположенных следующим образом:

1 2

3 4

MikSer
Offline
Зарегистрирован: 27.01.2012
#define DISPLAYS_ACROSS 2
#define DISPLAYS_DOWN 2

DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);

 

Translator
Offline
Зарегистрирован: 03.02.2014

MikSer пишет:

#define DISPLAYS_ACROSS 2
#define DISPLAYS_DOWN 2

DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);

 

Где почитать как работать с этой библиотекой? Чего-то я не могу разобраться.

А схема подключения там такая же как указаная в этой ветке? У меня пример из библиотеки работает как-то некорректно.