LED модуль 16х16 каскадное подключение

HEPEBAP
Offline
Зарегистрирован: 06.08.2015

Здравствуйте, имеб два вот таких модуля подключеных каскадно:

Никак не могу выводить "изображения" используя 16х32 матрицу, вместо этого второй модуль дублирует первый

step962
Offline
Зарегистрирован: 23.05.2011

Печалька...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а как подключаешь? 1 модуль к ардуине, 2 к 1 модулю?

HEPEBAP
Offline
Зарегистрирован: 06.08.2015

jeka_tm пишет:

а как подключаешь? 1 модуль к ардуине, 2 к 1 модулю?

 

Да, второй подключаю к первому, а первый к ардуине, но все примеры что есть только дают дублирующую панель

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Может быть там есть какой-то сигнал типа chip_select, module_enable, module_address ?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

кинь ссылку на плату

HEPEBAP
Offline
Зарегистрирован: 06.08.2015

http://dvrobot.ru/forum/blog/2/entry-138/

Вот ссылка с примером, но это для 1 платы

HEPEBAP
Offline
Зарегистрирован: 06.08.2015

Вот как выходит, а нужно чтобы я мог использовать это как 16х32

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

код расчитан на 16х16. что ты  увидишь на 16х32? а во вторых. там где out цепляешь к in второй платы?

HEPEBAP
Offline
Зарегистрирован: 06.08.2015

я понимаю что код расчитан на 1 плату, но никак не могу адаптировать это для 2х плат

Да, идет так - arduino к In первой платы -> Out первой платы к In второй платы

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Полная цоколёвка. https://bytedebugger.wordpress.com/2015/01/28/tutorial-how-to-use-dot-le...
Я думаю вам надо послать две разные картинки друг за другом.
Скорее всего клок просто модулей соединить и данные с выхода первого на вход второго.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

с кодом разбираться надо. рисует от линиями. вопрос как ты будешь. сначала первый отрисовывать а потом второй

но скорее всего придется также только линия будет не 16 пикселей, а 32. у тебя должно быть 4 буфера по байту, если делать аналогично. 

Send(Display_Buffer[3]);
Send(Display_Buffer[2]);
Send(Display_Buffer[1]);
Send(Display_Buffer[0]);

предварительно формируешь буфер. например так. зависит от того как ты будешь формировать изначальные данные. если как внизу то data должен быть в 2 раза больше с данными для 2 дисплея

Display_Buffer[0] = dat[0][i]; 
Display_Buffer[1] = dat[0][i+16];

//это вторая часть буфера для второго дисплея
Display_Buffer[2] = dat[0][i+32]; 
Display_Buffer[3] = dat[0][i+48];
HEPEBAP
Offline
Зарегистрирован: 06.08.2015

trembo пишет:

Полная цоколёвка. https://bytedebugger.wordpress.com/2015/01/28/tutorial-how-to-use-dot-le...
Я думаю вам надо послать две разные картинки друг за другом.
Скорее всего клок просто модулей соединить и данные с выхода первого на вход второго.

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

HEPEBAP
Offline
Зарегистрирован: 06.08.2015

Решено! Спасибо больше! Вот мой текущий код измененный по твоим рекомендациям:

#include <Arduino.h>
#define LEDARRAY_D 2
#define LEDARRAY_C 3
#define LEDARRAY_B 4
#define LEDARRAY_A 5
#define LEDARRAY_G 6
#define LEDARRAY_DI 7
#define LEDARRAY_CLK 8
#define LEDARRAY_LAT 9

//Плата подключены так: плата1 к ардуино, плата2 к плата1
unsigned char Display_Buffer[4];
const unsigned char  Word1[1][64] =
{
  0xFF,0x80,0x80,0x9f,0x9f,0x9f,0x9f,0x80,0x80,0x9f,0x9f,0x9f,0x9f,0x80,0x80,0xFF,//Изображение плата 2
  0xFF,0x01,0x01,0xff,0xff,0xff,0xff,0x03,0x03,0xff,0xff,0xff,0xff,0x01,0x01,0xFF,//Изображение плата 2
  0x80,0x80,0x80,0x9f,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//Изображение плата 1
  0x01,0x01,0x01,0xff,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//Изображение плата 1
};

const unsigned char  Init_Display[1][64] =
{
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

void setup()
{
  pinMode(LEDARRAY_D, OUTPUT);
  pinMode(LEDARRAY_C, OUTPUT);
  pinMode(LEDARRAY_B, OUTPUT);
  pinMode(LEDARRAY_A, OUTPUT);
  pinMode(LEDARRAY_G, OUTPUT);
  pinMode(LEDARRAY_DI, OUTPUT);
  pinMode(LEDARRAY_CLK, OUTPUT);
  pinMode(LEDARRAY_LAT, OUTPUT);

  Display(Init_Display);
}

void loop()
{
  Display(Word1);
}

void Display(const unsigned char dat[][64])  
{
  unsigned char i;

  for( i = 0 ; i < 16 ; i++ )
  {
    digitalWrite(LEDARRAY_G, HIGH); 

    Display_Buffer[0] = dat[0][i]; 
    Display_Buffer[1] = dat[0][i+16];
    
    Display_Buffer[2] = dat[0][i+32]; 
    Display_Buffer[3] = dat[0][i+48];

    Send(Display_Buffer[1]);
    Send(Display_Buffer[0]);
    Send(Display_Buffer[3]);
    Send(Display_Buffer[2]);

    digitalWrite(LEDARRAY_LAT, HIGH);   
    delayMicroseconds(1);

    digitalWrite(LEDARRAY_LAT, LOW);
    delayMicroseconds(1);

    Scan_Line(i);  
    digitalWrite(LEDARRAY_G, LOW);

    delayMicroseconds(500);   
  }
}

void Scan_Line( unsigned char m)
{
  switch(m)
  {
  case 0:  
    digitalWrite(LEDARRAY_D, LOW);
    digitalWrite(LEDARRAY_C, LOW);
    digitalWrite(LEDARRAY_B, LOW);
    digitalWrite(LEDARRAY_A, LOW);   
    break;
  case 1: 
    digitalWrite(LEDARRAY_D, LOW);
    digitalWrite(LEDARRAY_C, LOW);
    digitalWrite(LEDARRAY_B, LOW);
    digitalWrite(LEDARRAY_A, HIGH);  
    break;
  case 2: 
    digitalWrite(LEDARRAY_D, LOW);
    digitalWrite(LEDARRAY_C, LOW);
    digitalWrite(LEDARRAY_B, HIGH);
    digitalWrite(LEDARRAY_A, LOW);  
    break;
  case 3: 
    digitalWrite(LEDARRAY_D, LOW);
    digitalWrite(LEDARRAY_C, LOW);
    digitalWrite(LEDARRAY_B, HIGH);
    digitalWrite(LEDARRAY_A, HIGH);  
    break;
  case 4:
    digitalWrite(LEDARRAY_D, LOW);
    digitalWrite(LEDARRAY_C, HIGH);
    digitalWrite(LEDARRAY_B, LOW);
    digitalWrite(LEDARRAY_A, LOW);  
    break;
  case 5:
    digitalWrite(LEDARRAY_D, LOW);
    digitalWrite(LEDARRAY_C, HIGH);
    digitalWrite(LEDARRAY_B, LOW);
    digitalWrite(LEDARRAY_A, HIGH);  
    break;
  case 6:
    digitalWrite(LEDARRAY_D, LOW);
    digitalWrite(LEDARRAY_C, HIGH);
    digitalWrite(LEDARRAY_B, HIGH);
    digitalWrite(LEDARRAY_A, LOW);  
    break;
  case 7:
    digitalWrite(LEDARRAY_D, LOW);
    digitalWrite(LEDARRAY_C, HIGH);
    digitalWrite(LEDARRAY_B, HIGH);
    digitalWrite(LEDARRAY_A, HIGH);  
    break;
  case 8:
    digitalWrite(LEDARRAY_D, HIGH);
    digitalWrite(LEDARRAY_C, LOW);
    digitalWrite(LEDARRAY_B, LOW);
    digitalWrite(LEDARRAY_A, LOW);  
    break;
  case 9:
    digitalWrite(LEDARRAY_D, HIGH);
    digitalWrite(LEDARRAY_C, LOW);
    digitalWrite(LEDARRAY_B, LOW);
    digitalWrite(LEDARRAY_A, HIGH);  
    break;
  case 10:
    digitalWrite(LEDARRAY_D, HIGH);
    digitalWrite(LEDARRAY_C, LOW);
    digitalWrite(LEDARRAY_B, HIGH);
    digitalWrite(LEDARRAY_A, LOW);  
    break;
  case 11:
    digitalWrite(LEDARRAY_D, HIGH);
    digitalWrite(LEDARRAY_C, LOW);
    digitalWrite(LEDARRAY_B, HIGH);
    digitalWrite(LEDARRAY_A, HIGH);  
    break;
  case 12:
    digitalWrite(LEDARRAY_D, HIGH);
    digitalWrite(LEDARRAY_C, HIGH);
    digitalWrite(LEDARRAY_B, LOW);
    digitalWrite(LEDARRAY_A, LOW);  
    break;
  case 13:
    digitalWrite(LEDARRAY_D, HIGH);
    digitalWrite(LEDARRAY_C, HIGH);
    digitalWrite(LEDARRAY_B, LOW);
    digitalWrite(LEDARRAY_A, HIGH);  
    break;
  case 14:
    digitalWrite(LEDARRAY_D, HIGH);
    digitalWrite(LEDARRAY_C, HIGH);
    digitalWrite(LEDARRAY_B, HIGH);
    digitalWrite(LEDARRAY_A, LOW);  
    break;
  case 15:
    digitalWrite(LEDARRAY_D, HIGH);
    digitalWrite(LEDARRAY_C, HIGH);
    digitalWrite(LEDARRAY_B, HIGH);
    digitalWrite(LEDARRAY_A, HIGH);  
    break;
  default :
    break;
  }
}

void Send( unsigned char dat)
{
  unsigned char i;
  digitalWrite(LEDARRAY_CLK, LOW);
  delayMicroseconds(1);
  ;
  digitalWrite(LEDARRAY_LAT, LOW);
  delayMicroseconds(1);
  ;

  for( i = 0 ; i < 8 ; i++ )
  {
    if( dat&0x01 )
    {
    digitalWrite(LEDARRAY_DI, HIGH);
    }
    else
    {
    digitalWrite(LEDARRAY_DI, LOW);
    }

    delayMicroseconds(1);
    digitalWrite(LEDARRAY_CLK, HIGH);   
    delayMicroseconds(1);
    digitalWrite(LEDARRAY_CLK, LOW);
    delayMicroseconds(1); 
    dat >>= 1;

  }  
}

 

HEPEBAP
Offline
Зарегистрирован: 06.08.2015

Тут очень удобный модуль для работы такой платы:

https://bytedebugger.wordpress.com/2015/01/28/tutorial-how-to-use-dot-led-matrix-display-with-arduino/

Но он не адаптирован для каскадного подключения, попробую адаптировать его

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

пожалуйста. кидай фотку посмотреть что получилось

а вообще код можно переделать, сделать аккуратнее чтоли, не такой большой

особенно scan_line понравилась. ну так дубово написано))

да и это смешно)):


const unsigned char  Init_Display[1][64] =
{
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

сделать можно без этого массива очистки индикатора

да и данные хранить лучше во флеше, а то аперативки не хватит когда сделаешь их не одну-две-три

HEPEBAP
Offline
Зарегистрирован: 06.08.2015

Переделал библиотеку под две матрицы

Ссылка на файл: https://onedrive.live.com/redir?resid=EC3CE45CCC96627E!106940&authkey=!AE4BdSfHA7CEtfY&ithint=file%2c7z

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

led->setScene(Scene,Scene); // теперь задаются 2 массива для каждой из матриц

led->setLedOn2(int x, int y); // добавлены функции для включения и выключения диода для второй матрицы

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну переделай ты scan

возьми листок и ручку. и запиши все что на выходах в зависимости от цифры и поймешь

0  0000

1  0001

...