Подкиньте идею по реализации дисплея из 9 светодиодных матриц.

uscr
Offline
Зарегистрирован: 17.08.2012

 Здравствуйте. Хочу сделать некое устройство, которому потребуется индикация чуть сложнее, чем пара светодиодов. Устройство будет стоять в машине. Поэтому, нужно максимально чёткий способ вывода информации - ЖК дисплей слишком мелкий для такой цели. Решил использовать 9 светодиодный матриц (8Х8), собрав их них квадрат 24Х24. Устройство - некая приблуда с функциями парктроника и контролем слепых зон, ему потребуется выводить информацию о расстоянии (число, до 3 знаков) и показывать, с какой стороны событие (например, стрелка или просто заливка соответствующей матрицы цветом). Напрашивается реализация "в лоб" - 3 матрицы в центре под цифры, по 3 сверху и снизу под остальную индикацию. Это я смогу - сдвиговые регистры, киллограмм резисторов и относительно простая прошивка. НО! Не подскажете ли, есть ли шанс соорудить настоящий дисплей? Так, что бы я мог по настоящему оперировать пространством - выводить число в определённой координате не привязываясь к отдельным матрицам. Нечто вроде ledmatrix.write('Hello', 9, 1).

P.S. Думаю, я прошу помощи кодом, как прожжёных халявщик, но боюсь признаться в этом :) Потому как сам я могу написать сложный парсер логов, и положить результат в БД, например. Но вот в данном случае просто не знаю с чего начать. Это же нужно нечто вроде программного драйвера дисплея...

 

 

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

Для реализации данного проекта понадобится:
1. Светодиодная матрица 8х8 - 9шт.
2. Сдвиговый регистр 74HC595 - 6шт.
3. Транзисторная сборка ULN2803 - 3шт.
4. Резистор 100 Ом - 24шт.

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

 

 

uscr
Offline
Зарегистрирован: 17.08.2012

maksim пишет:

Для реализации данного проекта понадобится:
1. Светодиодная матрица 8х8 - 9шт.
2. Сдвиговый регистр 74HC595 - 6шт.
3. Транзисторная сборка ULN2803 - 3шт.
4. Резистор 100 Ом - 24шт.

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

Ну... Спасибо. Это такой намёк, что нужно самому ковыряться?

P.S.
А чем опасно без транзисторов светить? Ну...всмысле: "оно же работает". Регистр долго не проживёт или просто опять таки яркость?

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

uscr пишет:
Ну... Спасибо. Это такой намёк, что нужно самому ковыряться?
Что значит ковыряться? Самому паять? Самому травить плату? Или это кто-то за вас здесь должен сделать? Нет, если не хотите, то можете ничего не далать, но тогда у вас ничего и не будет. Или это чисто теоретический проект?

uscr пишет:
А чем опасно без транзисторов светить? Ну...всмысле: "оно же работает". Регистр долго не проживёт или просто опять таки яркость?
8 светодиодов еле-еле тянет, а вы хотите 24, без транзисторов (сборок) вообще никак.

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

 И вот схема

mixail844
Онлайн
Зарегистрирован: 30.04.2012

я бы посовсетовал порыскать по сайтам разработчиков готовых драйверов чем маяться с сборкой драйвера по частям(из 74595 и ULN2803),например :

max6960,как мне кажеться поиск такого решения,если вы на "ты" с  ЛУТом,намного упростит програмную реализацию)) такие же драйвера можно поискать и у других гигантов полупроводниковой индустрии : PCF8562 - NXP Semiconductors,AS1130 - Austriamicrosystems

 еще лучше,тупо поискать готовые библиотеки под матрицы,и поглядять на каком драйвере все реализованно ,например AS1107(совместим с MAX7221) ролик демонстрации,ссылки и пояснения на библиотеки(из гугла) : один,два,три

uscr
Offline
Зарегистрирован: 17.08.2012

maksim пишет:

uscr пишет:
Ну... Спасибо. Это такой намёк, что нужно самому ковыряться?
Что значит ковыряться? Самому паять? Самому травить плату? Или это кто-то за вас здесь должен сделать? Нет, если не хотите, то можете ничего не далать, но тогда у вас ничего и не будет. Или это чисто теоретический проект?

И часто в "программировании" задают вопросы по аппаратной реализации? Я представляю, как это выглядит "в железе". У меня нет идею по программной реализации. Я совершенно не представляю, как мне формировать "кадр" на дисплее 24Х24, не задумываясь об отдельных матрицах. 

mixail844 пишет:

 

я бы посовсетовал порыскать по сайтам разработчиков готовых драйверов чем маяться с сборкой драйвера по частям(из 74595 и ULN2803),например

Кажется это то, что нужно.

uscr
Offline
Зарегистрирован: 17.08.2012

maksim пишет:

 И вот схема

Ах тыж я тупая обезьяна! Вы же дали мне схему ьез привязки к конкретной матрице! Это спасибо! Осталось теперь прояснить, насчёт формирования кадра.

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

uscr пишет:
И часто в "программировании" задают вопросы по аппаратной реализации? Я представляю, как это выглядит "в железе". У меня нет идею по программной реализации. Я совершенно не представляю, как мне формировать "кадр" на дисплее 24Х24, не задумываясь об отдельных матрицах. 

Бывает, но чаще что бы решить ту или иную программную задачу нужно правильное железо. А кадр формировать просто - объявляете массив байт соответствующий вашей матрице и пишите функцию, которая выводит этот массив на дислей, меняя в этом массиве данные они меняются на дисплее.
Вот есть похожая тема. 

uscr
Offline
Зарегистрирован: 17.08.2012

maksim пишет:

uscr пишет:
И часто в "программировании" задают вопросы по аппаратной реализации? Я представляю, как это выглядит "в железе". У меня нет идею по программной реализации. Я совершенно не представляю, как мне формировать "кадр" на дисплее 24Х24, не задумываясь об отдельных матрицах. 

Бывает, но чаще что бы решить ту или иную программную задачу нужно правильное железо. А кадр формировать просто - объявляете массив байт соответствующий вашей матрице и пифите функцию, которая выводит этот массив на дислей, меняя в этом массиве данные они меняются на дисплее.
Вот есть похожая тема. 

 

Это я понимаю. Не понимаю, как мне работать с массивом. Вот вывожу я число 42 и заливаю левую грань цветом. А что делать, если число теперь - 111? Не писать же кучу if'ов для каждого случая.

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

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

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Все не так просто... Здесь же матрица 24х24 - ей динамическую индикацию надобно организовывать.

Но идея (я имею ввиду схему) - правильная, нужно использовать SPI. 

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

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

maksim пишет:
Резисторы специально заниженного номинала дабы повысить яркость матриц т.к. индикация динамическая.
И что не так просто?

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Не так просто, как в той теме, на которую ссылка была дана. Нужно делать динамическую индикацию, которая будет работать "в фоне", то есть по прерыванию, чтобы о ней потом вообще не задумываться.  24 бита - нестандартная длина, нужно будет выделять или по 3 байта на строку, или по long int (4 байта).

И еще. "не так просто" - не подразумевает "очень сложно" 

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

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

byte array[] = { // Массив из 3 байт - 24 бита
  B00000000, B00000000, B00000000
};


void setup() {
  Serial.begin(115200);

  // Что бы в сериал-мониторе было видно все биты в правильном порядке используем вот такой способ вывода:
  for(char i = 23; i > -1; i--) Serial.print(bitRead(array[2-i/8], i%8), DEC);
  Serial.println();

  // Двигаем байт B11100011 с права на лево в массиве из 3 байт, причем начиная с последнего бита двигающегося байта!
  for(char c = -7; c < 24; c++){    
    shiftByteInArray(B11100011, c);   // Вставляем байт в массив
    for(char i = 23; i > -1; i--) Serial.print(bitRead(array[2-i/8], i%8), DEC);    // Выводим
    Serial.println();
    delay(100);   // Задержка для наглядности
    array[0] = 0;   // Стрираем массив
    array[1] = 0;
    array[2] = 0;
  }
}


void loop() {
}


void shiftByteInArray(byte _byte, char _bit){
  for(byte i = 0; i < 8; i++){
    char bit_n = _bit + i;
    if(bit_n >= 0 && bit_n < 24){
      if(bitRead(_byte, i%8)) array[2-bit_n/8] |= 1<<bit_n%8; 
      else array[2-bit_n/8] &= ~(1<<bit_n%8);
    }
  }
}
000000000000000000000000
000000000000000000000001
000000000000000000000011
000000000000000000000111
000000000000000000001110
000000000000000000011100
000000000000000000111000
000000000000000001110001
000000000000000011100011
000000000000000111000110
000000000000001110001100
000000000000011100011000
000000000000111000110000
000000000001110001100000
000000000011100011000000
000000000111000110000000
000000001110001100000000
000000011100011000000000
000000111000110000000000
000001110001100000000000
000011100011000000000000
000111000110000000000000
001110001100000000000000
011100011000000000000000
111000110000000000000000
110001100000000000000000
100011000000000000000000
000110000000000000000000
001100000000000000000000
011000000000000000000000
110000000000000000000000
100000000000000000000000

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

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Часто простые вещи для нас становятся камнем преткновения для других :)

Для меня "не так просто" - эквивалент "не решается с классическим набором библиотек и функциями Ардуино (без заглубления в с)

uscr
Offline
Зарегистрирован: 17.08.2012

maksim пишет:

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

 

Я погуглил и невод вернулся с тиною морскою... Не ткнёте носом, раз уж такое дело?

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

 Вот например MsTimer2

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

И вот TimerOne