Андрей Смирнов
Время чтения: ~19 мин.
Просмотров: 0

Светодиодная матрица на базе max7219

Что такое мундштук?

Если перевести слово «мундштук» с немецкого, получим два корня: mund (т. е. «рот») и stück («часть»). Получается, речь идет о части рта? Да. Сегодня это часть сигареты, которую называют фильтром. Однако раньше мундштук представлял собой полую тонкую трубку, выполненную из дерева. В нее и вставлялась сигарета.

Heart Blinking on the 8X8 matrix

Since the wiring of this experiment is a little complicated, we need to do it step by step.

Code Program

Below is my code, you can download it here, note that I used the code from the Arduino Tutorials to work out how to get everything working.

// 2-dimensional array of row pin numbers:
int R = {2,7,A5,5,13,A4,12,A2};  
// 2-dimensional array of column pin numbers:
int C = {6,11,10,3,A3,4,8,9};    
  
unsigned char biglove88 =     //the big "heart"   
{  
  ,,,,,,,,  
  ,1,1,,,1,1,,  
  1,1,1,1,1,1,1,1,  
  1,1,1,1,1,1,1,1,  
  1,1,1,1,1,1,1,1,  
  ,1,1,1,1,1,1,,  
  ,,1,1,1,1,,,  
  ,,,1,1,,,,  
};  
  
unsigned char smalllove88 =      //the small "heart" 
{  
  ,,,,,,,,  
  ,,,,,,,,  
  ,,1,,,1,,,  
  ,1,1,1,1,1,1,,  
  ,1,1,1,1,1,1,,  
  ,,1,1,1,1,,,  
  ,,,1,1,,,,  
  ,,,,,,,,  
};  
  
void setup()  
{  
   // iterate over the pins:
  for(int i = ;i8;i++)  
  // initialize the output pins:
  {  
    pinMode(Ri,OUTPUT);  
    pinMode(Ci,OUTPUT);  
  }  
}  
  
void loop()  
{  
  for(int i =  ; i  100 ; i++)        //Loop display 100 times 
  {  
    Display(biglove);                   //Display the "Big Heart"  
  }  
  for(int i =  ; i  50 ; i++)         //Loop display 50 times
  {     
    Display(smalllove);                 //Display the "small Heart" 
  }  
}  
  
void Display(unsigned char dat88)    
{  
  for(int c = ; c8;c++)  
  {  
    digitalWrite(Cc,LOW);//use thr column 
    //loop
    for(int r = ;r8;r++)  
    {  
      digitalWrite(Rr,datrc);  
    }  
    delay(1);  
    Clear();  //Remove empty display light
  }  
}  
  
void Clear()                          //清空显示  
{  
  for(int i = ;i8;i++)  
  {  
    digitalWrite(Ri,LOW);  
    digitalWrite(Ci,HIGH);  
  }  
}  

Светодиодная матрица

Я использовал матрицу 16 на 16 светодиодов на черной подложке. Ссылка на Алиэкспресс будет внизу. Матрица хорошо гнется. Работает от 5 вольт и бывает во многих формфакторах. 8 на 8, 16 на 16 и 8 на 32 светодиодов.

Светодиодная матрица WS2812B (SK6812)

Визуальный редактор

Рассмотрим ещё один пример создания бегущей строки со словами «Я кота». Символы для фразы уже подготовлены. Вы можете создать собственные символы и добавить в код.

Редактор для создания собственных символов для матрицы с драйвером MAX7219

Щёлкайте по квадратам для генерации кода.

Результат

byte customChar = {
	B00000000,
	B00000000,
	B00000000,
	B00000000,
	B00000000,
	B00000000,
	B00000000,
	B00000000
};
8×8 MAX7219 Arduino Pin
DIN
CLK
CS

Код для скетча Arduino

#include "LedControl.h"

// initialize the library
/*
  pin 12 is connected to the DIN
  pin 11 is connected to the CLK
  pin 10 is connected to CS
*/
LedControl lc = LedControl(12, 11, 10, 1);

/* we always wait a bit between updates of the display */
unsigned long delaytime = 600;
void setup()
{
  lc.shutdown(0, false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0, 8);
  /* and clear the display */
  lc.clearDisplay(0);
}

void loop()
{
  writeText();
}

void writeText() {
  // Символы для фразы Я люблю кота
  byte Ya = { B00111111,B00100001,B00100001,B00111111,B00000101,B00001001,B00010001,B00100001};
  byte love = { B00000000, B01100110, B10011001, B10011001, B10000001, B01000010, B00100100, B00011000};
  byte K = { B01000100,B01001000,B01010000,B01100000,B01010000,B01001000,B01000100,B01000010};
  byte O = {B00011000, B00100100, B01000010, B01000010, B01000010, B01000010, B00100100, B00011000};
  byte T = { B00111110,B00001000,B00001000,B00001000,B00001000,B00001000,B00001000,B00001000};
  byte A = {B00111000, B01000100, B10000010, B11111110, B10000010, B10000010, B10000010, B10000010};

  
  /* Я */
  for (int i = 0; i 

Ещё один визуальный редактор для создания анимационных эффектов LED Matrix Editor.

Библиотека LEDMatrixDriver

В описании говорится, что библиотека LEDMatrixDriver является наследником устаревшей LedControl. Также доступна через менеджер библиотек. На Гитхабе есть несколько примеров с применением библиотеки. Я использовал пример SetPixel, который заполняет все ряды светодиодов светом поочерёдно.

При подключении использовались пины DIN=11, CS=9, CLK=13.

Дополнительные материалы

Arduino-er: Arduino Uno: scan LED Matrix in Timer Interrupt (+видео)

Arduino-er: Beating Heart animation on 8×8 LED Matrix + Arduino Uno (+видео)

Arduino 8×8 LED Matrix Pong — YouTube (исходники)

Старая библиотека, давно не обновляется.

Код

Ниже – простой скетч, который показывает на матрице три разные рожицы: веселую, «покерфейс» и грустную. Загрузите его на свою Arduino:

 1 /*
 2  Автор – Руи Сантос (Rui Santos)
 3  Более подробно о проекте на: http://randomnerdtutorials.com/
 4 */
 5 
 6 #include "LedControl.h"
 7 #include "binary.h"
 8 
 9 /*
10  Контакт DIN на матрице – к цифровому контакту 12 на Arduino
11  Контакт CLK – к цифровому контакту 11
12  Контакт CS – к цифровому контакту 10
13 */
14 LedControl lc=LedControl(12,11,10,1);
15 
16 // задержка между разными рожицами:
17 unsigned long delaytime=1000;
18 
19 // веселая рожица:
20 byte hf8= {B00111100,B01000010,B10100101,B10000001,B10100101,B10011001,B01000010,B00111100};
21 // «покерфейс»:
22 byte nf8={B00111100, B01000010,B10100101,B10000001,B10111101,B10000001,B01000010,B00111100};
23 // грустная рожица:
24 byte sf8= {B00111100,B01000010,B10100101,B10000001,B10011001,B10100101,B01000010,B00111100};
25 
26 void setup() {
27   lc.shutdown(,false);
28   // выставляем яркость на среднее значение:
29   lc.setIntensity(,8);
30   // очищаем дисплей:
31   lc.clearDisplay();  
32 }
33 
34 void drawFaces(){
35   // показываем грустную рожицу:
36   lc.setRow(,,sf]);
37   lc.setRow(,1,sf1]);
38   lc.setRow(,2,sf2]);
39   lc.setRow(,3,sf3]);
40   lc.setRow(,4,sf4]);
41   lc.setRow(,5,sf5]);
42   lc.setRow(,6,sf6]);
43   lc.setRow(,7,sf7]);
44   delay(delaytime);
45   
46   // показываем «покерфейс»:
47   lc.setRow(,,nf]);
48   lc.setRow(,1,nf1]);
49   lc.setRow(,2,nf2]);
50   lc.setRow(,3,nf3]);
51   lc.setRow(,4,nf4]);
52   lc.setRow(,5,nf5]);
53   lc.setRow(,6,nf6]);
54   lc.setRow(,7,nf7]);
55   delay(delaytime);
56   
57   // показываем веселую рожицу:
58   lc.setRow(,,hf]);
59   lc.setRow(,1,hf1]);
60   lc.setRow(,2,hf2]);
61   lc.setRow(,3,hf3]);
62   lc.setRow(,4,hf4]);
63   lc.setRow(,5,hf5]);
64   lc.setRow(,6,hf6]);
65   lc.setRow(,7,hf7]);
66   delay(delaytime);
67 }
68 
69 void loop(){
70   drawFaces();
71 }

В результате у вас должно получится примерно следующее:

07.Display: RowColumnScanning

В состав Android IDE входит пример для светодиодной матрицы File | Examples | 07.Display | RowColumnScanning. Суть в следующем — с помощью двух потенциометров считываем показания с аналоговых выводов в интервале от 0 до 7. Показания от первого потенциометра указывают на вывод из ряда, а от второго на вывод из колонки матрицы. Таким образом, мы можем крутить ручки двух потенциометров и выбирать, какой светодиод из матрицы следует включить.

Я предлагаю упростить пример. Уберём потенциометры и удалим функцию readSensors() из скетча. Теперь, чтобы включить любой светодиод, нужно указать номер ряда и номер колонки в двумерном массиве и подать на него LOW.

Включим светодиоды по диагонали.

Начинаем собирать.

Схему решил разделить на 2 части из-за огромного количества перемычек в разведенном моими кривыми лапками варианте, где все было на одной плате. Часы будут состоять из блока дисплея и блока питания и управления. Последний было решено собрать первым. Эстетов и бывалых радиолюбителей прошу не падать в обморок из-за жестокого обращения с деталями. Покупать принтер ради ЛУТа нет никакого желания, поэтому делаю по старинке — тренируюсь на бумажке, сверлю отверстия по шаблону, рисую маркером дорожки, затем травлю.

Принцип крепления индикаторов оставил тот же, как и на .

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

Рисуем дорожки и травим.

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

Вот готовые платы. На плате управления имеется посадочное место для ардуино нано, часов, а так же выходы для подключения к плате дисплея и датчики (фоторезистор для автояркости и цифровой термометр ds18s20) и блок питания на с регулировкой выходного напряжения (для больших семисегментников) и для питания часов и ардуино, на плате индикации находятся посадочные гнезда для дисплеев, панельки для max2719 и uln2003a, решение для питания четырех больших семисегментников и куча перемычек.

Программирование бегущей строки.

Бегущая строка из Arduino и светодиодных модулей под управлением MAX7219 практически готова. Настало время перейти к заключающей, программной части.

Бегущая строка на светодиодных модулях MAX7219 и Arduino

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 #include <SPI.h> #include <Adafruit_GFX.h> #include <Max72xxPanel.h> int pinCS = 10; // Подключаем CS к 10-му пину, DIN к MOSI и CLK к SCK int numberOfHorizontalDisplays = 1; // Количество модулей по горизонтали int numberOfVerticalDisplays = 8; // Количество модулей по вертикали Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); String tape = «»; int wait = 10; // Скорость прокрутки в миллисикундах int spacer = 1; // Промежуток между символами (кол-во точек) int width = 5 + spacer; // Ширина символа /* Перекодировка русского шрифта из UTF-8 в Windows-1251 */ String utf8rus(String source) { int i,k; String target; unsigned char n; char m = { ‘0’, ‘\0’ }; k = source.length(); i = 0; while (i < k) { n = source; i++; if (n >= 0xC0) { switch (n) { case 0xD0: { n = source; i++; if (n == 0x81) { n = 0xA8; break; } if (n >= 0x90 && n <= 0xBF) n = n + 0x2F; break; } case 0xD1: { n = source; i++; if (n == 0x91) { n = 0xB7; break; } if (n >= 0x80 && n <= 0x8F) n = n + 0x6F; break; } } } m = n; target = target + String(m); } return target; } /* Код для работы с com-портом */ String Serial_Read() { unsigned char c; // переменная для чтения сериал порта String Serial_string = «»; // Формируемая из символов строка while (Serial.available() > 0) { // Если в сериал порту есть символы c = Serial.read(); // Читаем символ //Serial.print(c,HEX); Serial.print(» «); Serial.print(c); if (c == ‘\n’) { // Если это конец строки return Serial_string; // Возвращаем строку } if (c == 0xB8) c = c — 0x01; // Коррекция кодов символа под таблицу ???? так как русские символы в таблице сдвинуты относительно стандартной кодировки utf на 1 символ if (c >= 0xBF && c <= 0xFF) c = c — 0x01; Serial_string = Serial_string + String(char(c)); //Добавить символ в строку } return Serial_string; } void setup() { Serial.begin(9600); tape = utf8rus(«QSY.BY Amateur Radio WorkShop»); // Этот текст выводиться при включении или если в com-порт не пришла информация matrix.setIntensity(3); // Яркость от 0 до 15 matrix.setRotation(matrix.getRotation()+3); //1 — 90 2 — 180 3 — 270 } void loop() { if (Serial.available()){ tape=Serial_Read(); } for ( int i = 0 ; i < width * tape.length() + matrix.width() — 1 — spacer; i++ ) { matrix.fillScreen(LOW); int letter = i / width; // Номер символа выводимого на матрицу int x = (matrix.width() — 1) — i % width; int y = (matrix.height() — 8) / 2; // Центрируем текст по вертикали while ( x + width — spacer >= 0 && letter >= 0 ) { if ( letter < tape.length() ) { matrix.drawChar(x, y, tape, HIGH, LOW,1); } letter—; x -= width; } matrix.write(); // Вывод сообщения на экран delay(wait); } }

Расписывать код не вижу смысла. Он и так хорошо прокомментирован. Однако есть некоторые особенности, о которых стоит упомянуть.

Примечание

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

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

Кусок кода для работы с com-портом, нужен для того чтобы оперативно менять текст сообщения выводимого на светодиодный модуль. Однако он нужен нам не только для этого. В дальнейшем посредством этой функции мы свяжем наш Telegram Bot и бегущую строку на Arduino.

часы на ардуино и max7219 .

Часы на матрице max7219, модуле DS1302 и arduino, очень простой скетч

Нажми для просмотра

Описание отсутсвует
 
 
 
Тэги:
 
часы ардуино ds3231 max7219 ds18b20

Нажми для просмотра

Описание отсутсвует
 
 
 
Тэги:
 
WIFI часы погоды на ютубе (esp8266+MAX7219)

Нажми для просмотра

Описание отсутсвует
 
 
 
Тэги:
 
Часы на MAX7219 с кнопками настроек

Нажми для просмотра

Описание отсутсвует
 
 
 
Тэги:
 
Часы на светодиодной матрице MAX7219 и arduino

Нажми для просмотра

Описание отсутсвует
 
 
 
Тэги:
 
часы ардуино ds3231 max7219 ds18b20

Нажми для просмотра

Описание отсутсвует
 
 
 
Тэги:
 
Интернет часы на ESP8266/ESP32 + MAX7219

Нажми для просмотра

Описание отсутсвует
 
 
 
Тэги:
 
Вывод реального времени на четыре матрицы с MAX7219

Нажми для просмотра

Описание отсутсвует
 
 
 
Тэги:
 
Матричные часы + Android

Нажми для просмотра

Описание отсутсвует
 
 
 
Тэги:
 
Часы+ будильник + FM приемник на Arduino Nano + MAX7219

Нажми для просмотра

Описание отсутсвует
 
 
 
Тэги:
 
Часы на светодиодной матрице на NodeMCU Esp8266 и MAX7219 Русские буквы

Нажми для просмотра

Описание отсутсвует
 
 
 
Тэги:
 
Часы термометр на MAX7219 V1.3 + радио датчик температуры.

Нажми для просмотра

Описание отсутсвует
 
 
 
Тэги:
 
DIY WiFi Clock Informer on MAX7219 and ESP8266 / WiFi часы информер на MAX7219 и ESP8266

Нажми для просмотра

Описание отсутсвует
 
 
 
Тэги:
 
Крутые часы из оргстекла на Arduino и Neopixels

Нажми для просмотра

Описание отсутсвует
 
 
 
Тэги:
 
Часы, информер, погодная станция на ESP8266 и MAX7219 ч.2

Нажми для просмотра

Описание отсутсвует
 
 
 
Тэги:
 
MQTT Wi-Fi часы на esp8266 | MQTT informer

Нажми для просмотра

Описание отсутсвует
 
 
 
Тэги:
 
Светодиодная матрица с драйвером МАХ7219

Нажми для просмотра

Описание отсутсвует
 
 
 
Тэги:
 
Arduino Start #6. Модуль MP3 и ARDUINO

Нажми для просмотра

Описание отсутсвует
 
 
 
Тэги:
 
WIFI часы на ESP8266 и MAX7219 с веб интерфейсом

Нажми для просмотра

Описание отсутсвует
 
 
 
Тэги:
 
Arduino Nano mini LED matrix clock

Нажми для просмотра

Описание отсутсвует
 
 
 
Тэги:
 
Интернет — часы на ESP8266 и MAX7219

Какие еще есть объяснения

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

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

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

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

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

READ Особенности мейн-кунов, все что нужно знать хозяевам

Исходный код программы

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

Чтобы изменить набор отображаемых символов вам необходимо будет сменить значения в массиве ALPHA[] на те, которые вам будут нужны.

К примеру, если вы захотите отобразить (проскроллить) слово DAD на светодиодной матрице, то в этом случае массив ALPHA[] будет выглядеть следующим образом:

Общее число значений сейчас 5*10=50, поэтому

Далее приведен полный текст программы.

Arduino

char ground = {8,9,10,11,12,13,A0,A1};

char ALPHA[] = {0,0,0,0,0,0,0,0,0,0,0,
60,102,96,96,96,102,60,0,0,0,
60,24,24,24,24,24,60,0,0,0,
124,102,102,124,120,108,102,0,0,0,
60,102,96,96,96,102,60,0,0,0,
102,102,102,102,102,102,60,0,0,0,
60,24,24,24,24,24,60,0,0,0,
126,24,24,24,24,24,24,0,0,0,
120,108,102,102,102,108,120,0,0,0,
60,24,24,24,24,24,60,0,0,0,
60,102,96,110,102,102,60,0,0,0,
126,96,96,120,96,96,126,0,0,0,
60,102,96,60,6,102,60,0,0,0,
126,24,24,24,24,24,24,0,0,0,
0,0,0,0,0,0,0,0,0,0,0
};
void setup()
{
for (int x=8;x<14;x++)
{
pinMode(x, OUTPUT);
}
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);

for (int i=0;i<8;i++)
{
digitalWrite(ground,HIGH);
}
DDRD = 0xFF;
PORTD =0;
}

void loop()
{
for(int x=0;x<142;x++)
{
for(int a=0;a<20;a++)
{
for (int i=0;i<8;i++)
{
digitalWrite(ground,LOW);
PORTD = ALPHA;
delay(1);
digitalWrite(ground,HIGH);
}
}
}
delay(1000);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

charground8={8,9,10,11,12,13,A0,A1};

charALPHA={,,,,,,,,,,,

60,102,96,96,96,102,60,,,,

60,24,24,24,24,24,60,,,,

124,102,102,124,120,108,102,,,,

60,102,96,96,96,102,60,,,,

102,102,102,102,102,102,60,,,,

60,24,24,24,24,24,60,,,,

126,24,24,24,24,24,24,,,,

120,108,102,102,102,108,120,,,,

60,24,24,24,24,24,60,,,,

60,102,96,110,102,102,60,,,,

126,96,96,120,96,96,126,,,,

60,102,96,60,6,102,60,,,,

126,24,24,24,24,24,24,,,,

,,,,,,,,,,

};

voidsetup()

{

for(intx=8;x<14;x++)

{

pinMode(x,OUTPUT);

}

pinMode(A0,OUTPUT);

pinMode(A1,OUTPUT);

for(inti=;i<8;i++)

{

digitalWrite(groundi,HIGH);

}

DDRD=0xFF;

PORTD=;

}
 

voidloop()

{

for(intx=;x<142;x++)

{

for(inta=;a<20;a++)

{

for(inti=;i<8;i++)

{

digitalWrite(groundi,LOW);

PORTD=ALPHAi+x;

delay(1);

digitalWrite(groundi,HIGH);

}

}

}

delay(1000);

}

Lights up an LED on the 8X8 matrix

As above subtitle, we will show how to light up an LED on the matrix.

Circuit Diagram

To light up the first LED on the upper left corner, you need to set pin 9 as high level and pin 13 as low level in the common anode dot matrix; for a common cathode one, set pin 13 as high and pin 9 as low.

Upload Sketch

After above operations are completed, connect the Arduino board to your computer using the USB cable. The green power LED (labelled PWR) should go on.

Code Program

Copy the example code below into an Arduino program.

int pin3=3; //Connect the matrix pin 9 to Uno pin 3
int pin11=11;//Connect the matrix pin 13 to Uno pin 11
void setup() {
// put your setup code here, to run once:
pinMode(pin3,OUTPUT);
pinMode(pin11,OUTPUT);
digitalWrite(pin3,HIGH);
digitalWrite(pin11,HIGH);
}
void loop() {
  // put your main code here, to run repeatedly:
digitalWrite(pin11,LOW);//set the pin11 low,led will be turned on 
delay(200);
digitalWrite(pin11,HIGH);//set the pin 11 high,led will be turned off。
delay(200);
}

Compile and upload

Open the Arduino IDE and select corresponding board type and port type for your Arduino board. After compile this sketch, simply click the “Upload” button in the environment. Wait a few seconds – you should see the RX and TX leds on the board flashing. If the upload is successful, the message “Done uploading.” will appear in the status bar.

Пробное подключение

У матрицы шестнадцать выводов, что представляет определённую проблему при прототипировании. Приходится задействовать практически все выводы платы. Но так как все светодиоды в матрице независимы, мы можем поиграться с одной. Соединим матрицу с платой по следующей схеме: вывод 9 от матрицы соединяем с выводом 2 на плате, а вывод 13 от матрицы с GND через резистор.

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

В реальных проектах мы должны соединить все выводы матрицы. Так как их шестнадцать, то кроме цифровых портов нам нужно задействовать и аналоговые, которые могут работать как цифровые. В этом случае порт A0 становится 14, A1 — 15 и т.д. Соединив все выводы матрицы, можно включить нужный светодиод, подавая HIGH на вывод ряда и LOW на вывод столбца. Включим светодиод из второй строки и первой колонки.

Вывод пикселей с помощью библиотеки Max72xxPanel

Для управления микросхемой MAX7219 воспользуемся библиотекой Max72xxPanel. Скачать её можно по ссылкам в конце статьи.

Установим библиотеку и напишем небольшой код, который будет выводить на дисплей всего одну точку с координатами x=3 и y=4. Точка будет мигать с периодом 600 миллисекунд.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include <SPI.h> #include <Adafruit_GFX.h> #include <Max72xxPanel.h> int pinCS = 10; int numberOfHorizontalDisplays = 1; // количество матриц по-горизонтали int numberOfVerticalDisplays = 1; // количество матриц по-вертикали Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); void setup() { matrix.setIntensity(4); // яркость от 0 до 15 } void loop() { matrix.drawPixel(3, 4, HIGH); // зажигаем пиксель с координатами {3,4} matrix.write(); // вывод всех пикселей на матрицу delay(300); matrix.drawPixel(3, 4, LOW); // гасим пиксель matrix.write(); delay(300); }

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

Важно отметить, что после включения и выключения пикселей с помощью функции drawPixel, необходимо вызвать функцию write. Без функции write, пиксели не высветятся на матрице!. Теперь напишем код, который отобразит на матрице смайл

Смайл зашифруем с помощью массива из восьми байт. Каждый байт массива будет отвечать за строку матрицы, а каждый бит в байте за точку в строке

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

Примечание. В библиотеке Max72xxPanel есть функция setRotation, которая задает ориентацию изображения на матрице. Например, если мы захотим повернуть смайл на 90 градусов, нужно будет сразу после вызова функции setIntensity вызвать setRotation с соответствующими аргументами:

matrix.setRotation( 0, 1 );

первый параметр — это индекс матрицы, в нашем случае он равен нулю; второй параметр — количество поворотов на 90 градусов.

Способ вывода данных на матрицы

При каскадном включении, выход DOUT предыдущего драйвера соединяется с входом DIN следующего драйвера, группы выводов CS и CLK соединяются параллельно. При загрузке данных информация сдвигается побитно, сначала загружаются данные предназначенные для последнего драйвера в цепочке, затем остальные по очереди. Для одного драйвера пакет состоит из 2 байт, это адресный байт и байт данных.

Печатная плата модуля спроектирована так, что данные загружаемые в регистры драйвера Digit0-Digit7 отображаются в строках матрицы (горизонтально), ниже приведена поясняющая картинка:

Для вывода символов я решил взять стандартную таблицу со шрифтом 5×7, которую использовал для графического дисплея Nokia 5110. Но в этой таблице байты символов упакованы по-другому, каждый байт предназначен для вертикального отображения в столбец, таким образом, просто передавать байты на драйвер не получится. Можно конечно переписать всю таблицу символов, но это слишком утомительно. В данном случае необходимо переворачивать символы, извлекая данные побитно.

Данные проще записать за один сеанс, предварительно подготовив пакеты байтов для всех матриц, то есть сразу заполнить одну строку на всю длину панели, затем остальные строки в последующих сеансах (всего 8 сток). Для 5-ти матриц за сеанс передается 10 байт данных, для всей панели соответственно получим 80 байт.

Можно конечно использовать пустой регистр No-Op (адрес 0x00), предназначенный для обращения к отдельному драйверу в цепочке, но при этом также придется отправлять байты на всю длину строки. В этом случае только один пакет будет записан в конкретный драйвер, для остальных драйверов данные запишутся в регистры No-Op, не повлияв на их функционирование. Такой способ нельзя назвать рациональным, так как увеличивается количество передаваемых данных, что замедляет процесс вывода информации.

Рейтинг автора
5
Материал подготовил
Максим Иванов
Наш эксперт
Написано статей
129
Ссылка на основную публикацию
Похожие публикации