Китай предлага на ниска цена огромно количество не само електронни устройства, но и техните компоненти. Малък набор от диоди, излъчващи светлина, може да покаже информацията, от която се нуждаете, вероятно числа, тъй като разделителната способност не е много висока, 8 на 8 светодиода, всеки диаметър 3 мм. Тази матрица свети в червено, защото е най-видимо и привлича вниманието повече от другите цветове.
Ако имате няколко такива матрици на светодиоди, можете да ги свържете, за да създадете големи информационни табла.
Матричен дисплей - устройство, състоящо се от 8x8 LED матрица и контролна платка, базирана на чип MAX7219 с минимално необходимия тръбопровод. На снимката вече можете да видите готовото устройство, но то дойде при мен по пощата в тази форма, така че трябваше да взема поялник и да запоя всичко по правилния начин.
Основната връзка към платката Arduino Nano е показана на електрическата схема.
Както можете да видите от диаграмата, всичко е просто, просто трябва да свържете контактите на двете платки с проводници в следния ред:
Ардуино Нано | Матрица 8х8 |
ПИН 12 | ПИН DIN |
ПИН 11 | PIN CLK |
PIN 10 | PIN CS |
PIN 5V | PIN 5V |
PIN GND | PIN GND |
И така, най-накрая е време да работим с кода и за да стартирате LED матрицата, трябва да изтеглите и инсталирате библиотеката LedControl. Библиотеката поддържа микросхеми MAXIM 7221 и 7219. LED матрицата използва MAX7219 като драйвер, това е, от което се нуждаем. Мисля, че трябва да започнем с малка скица, демонстрираща основните функции на тази библиотека. В скицата функцията setRow() се използва за включване/изключване на светодиодите. Синтаксисът за извикване на функцията setRow() е:
matrix.setRow(0, ред, колона, набор);
Където матрица- клас обект LedControl
0 - адрес на устройството на SPI шината, в този случай има само едно устройство и номерирането започва от адрес нула
ред- ред (Възможни стойности от 0 до 7)
полк- колона (Възможните стойности са от 0 до 7)
комплект- стойност на настройката ( вярно- включи, невярно- изключвам)
matrix.setRow(0, 1, 4, вярно)
Включете светодиода на матрицата, разположен на 1-ви ред и в 4-та колона.
Друг пример:
int x = 1;
int y = 4;
matrix.setRow(0, x, y, true);
matrix.setRow(0, x, y, false);
Същото е само с използване на променливи и последващо изключване на светещия светодиод при зададените координати. И така, в скицата се възпроизвеждат няколко анимации с помощта на функцията setRow ().
#include "LedControl.h" //Синтаксис за създаване на клас LedControl(dataPin,clockPin,csPin,numDevices) //Където LedControl е обект от класа //dataPin е щифтът на платката на Arduino, към който DIN щифтът ще бъде свързан //clockPin е изводът на платката Arduino, към който ще бъде свързан CLK изводът //csPin - изводът на платката Arduino, към който ще бъде свързан CS изводът //numDevices - броят на устройствата в шината / /Създаване на обект от класа матрица в нашия случай с едно свързано устройство LedControl matrix = LedControl(12, 11 , 10, 1); //Време на забавяне за включване/изключване на светодиода на матрицата const int delayValue = 100; //Прототипи на функции //Последователно включване/изключване void PointSerialSet(); //Змия отдясно наляво void PointRigthToLeft(); //Змия отдолу нагоре void PointDownToUp(); //Змия отляво надясно void PointLeftToRigth(); //Змия отгоре надолу void PointUpToDown(); //Ефект - затихващ импулс void PointFading(); //Ефект - импулс празен PointPulse(); //Ефект - нарастващ импулс void PointClimbing(); //Ефект от усукване на спиралата вътре void PointToSpiralIn(); //Ефект от завъртане на спиралата навън void PointToSpiralOut(); void setup() ( // Устройство с адрес 0 се събужда по подразбиране matrix.shutdown(0, false); //Задайте яркостта на Led матрицата на 8 //Възможните стойности са от 0 до 15 matrix.setIntensity( 0, 8) ; //Изчистване на дисплея matrix.clearDisplay(0); ) void loop() ( //Извикване на функции една по една PointSerialSet(); PointRigthToLeft(); PointDownToUp(); PointLeftToRigth(); PointUpToDown(); PointFading (); PointPulse() ; PointClimbing(); PointToSpiralIn(); PointToSpiralOut(); ) //Тела на функцията void PointSerialSet() ( //Използване на функцията setLed(address, row, col, set) //Последователно включване от редове за (int i = 0; i< 8; i ++) { for(int j = 0; j < 8; j ++) { //Включить светодиод matrix.setLed(0, i, j, true); delay(delayValue); //Выключить светодиод matrix.setLed(0, i, j, false); } } } void PointRigthToLeft() { //Используем функцию setLed(address, row, col, set) //Змейка справа - налево for(int i = 7; i >= 0; i --) ( for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); ) else ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) ) ) ) void PointDownToUp() ( //Използвайте функцията setLed(address, row, col, set) //Змия отдолу нагоре за (int i = 7; i >= 0; i --) ( for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, i, n, true); delay(delayValue); matrix.setLed(0, i, n, false); ) else ( matrix.setLed(0, i, j, true); delay(delayValue); matrix.setLed(0, i, j, false); ) ) ) ) void PointLeftToRigth() ( //Използвайте функцията setLed(address, row, col, set) //Змия отляво надясно за (int i = 0 i< 8; i ++) { for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); ) else ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) ) ) ) void PointUpToDown() ( //Използвайте функцията setLed(address, row, col, set) //Змия отгоре надолу за (int i = 0 i< 8; i ++) { for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, i, n, true); delay(delayValue); matrix.setLed(0, i, n, false); ) else ( matrix.setLed(0, i, j, true); delay(delayValue); matrix.setLed(0, i, j, false); ) ) ) ) void PointFading() ( //Използвайте функцията setLed(address, row, col, set) //Fading effect int upValue = 0 ; int downValue = 7; for(int i = 0; i< 8; i ++) { if(i % 2) { for(int n = downValue; n >= upValue; n --) ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) downValue --; ) else ( for(int j = upValue; j< downValue + 1; j ++) { matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); } upValue ++; } } } void PointClimbing() { //Используем функцию setLed(address, row, col, set) //Эффект затухания int upValue = 4; int downValue = 4; for(int i = 0; i < 8; i ++) { if(i % 2) { for(int n = downValue; n >= upValue; n --) ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) downValue ++; ) else ( for(int j = upValue; j< downValue + 1; j ++) { matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); } upValue --; } } } void PointPulse() { //Используем функцию setLed(address, row, col, set) //Эффект пульса for(int i = 0; i < 8; i ++) { if(i == 4) { for(int climb = i; climb >= 0; изкачване --) ( matrix.setLed(0, изкачване, i, true); забавяне (delayValue / 4); matrix.setLed(0, изкачване, i, false); ) for(int избледняване = 1; избледняване< 8; fade ++) { matrix.setLed(0, fade, i, true); delay(delayValue / 4); matrix.setLed(0, fade, i, false); } } else { matrix.setLed(0, 4, i, true); delay(delayValue); matrix.setLed(0, 4, i, false); } } } void PointToSpiralIn() { //Используем функцию setLed(address, row, col, set) //Эффект спирали внутрь int lengthX = 8; // Ширина матрицы int lengthY = 8; // Высота матрицы int pointX = 0; int pointY = 0; int dir = 0; // Направление (0 - вправо, 1 - вниз, 2 - влево, 3 - вверх) int offset = 0; // Смещение // Перебираем всю матрицу for (int i = 0; i < lengthX * lengthY; i++) { matrix.setLed(0, pointY, pointX, true); delay(delayValue); matrix.setLed(0, pointY, pointX, false); if(dir == 0) { pointX ++; if(pointX >= lengthX - 1 - отместване) ( dir = 1; ) продължи; ) if(dir == 1) ( pointY ++; if(pointY ><= offset) { dir = 3; } continue; } if(dir == 3) { pointY --; if(pointY <= offset + 1) { dir = 0; offset ++; pointY = offset; } continue; } } } void PointToSpiralOut() { //Используем функцию setLed(address, row, col, set) //Эффект спирали внаружу int lengthX = 8; // Ширина матрицы int lengthY = 8; // Высота матрицы int pointX = 3; //начать с этих координат int pointY = 3; //начать с этих координат int dir = 0; // Направление (0 - вправо, 1 - вниз, 2 - влево, 3 - вверх) int offset = 3; // Смещение // Перебираем всю матрицу for (int i = 0; i < lengthX * lengthY; i++) { matrix.setLed(0, pointY, pointX, true); delay(delayValue); matrix.setLed(0, pointY, pointX, false); if(dir == 0) { pointX ++; if(pointX >= lengthX - 1 - отместване) ( dir = 1; ) продължи; ) if(dir == 1) ( pointY ++; if(pointY >= lengthY - 1 - отместване) ( dir = 2; ) продължи; ) if(dir == 2) ( pointX --; if(pointX<= offset - 1) { dir = 3; } continue; } if(dir == 3) { pointY --; if(pointY <= offset - 1) { dir = 0; offset --; pointY = offset; } continue; } } }
Видео на скицата:
Тази статия е създадена за тези, които са закупили гола матрица 8x8 и регистри за смяна 74hc595 и не знаят как да свържат всичко.
Търсих в интернет дълго време за инструкции как да свържа горните компоненти, но намерих или не за моите регистри, или с неработещи скици, така че реших, че все още трябва да работя с ръцете и главата си, за да се харесам с 8*8 снимки.
След като намерих таблици с данни за матрицата и регистрите за смяна в Интернет, нарисувах следната диаграма:
12-ият крак на двете микросхеми (заключващ щифт), за да запазите портове, е често срещан, тъй като няма смисъл да се заключват регистрите по различно време. Някои от щифтовете на матрицата (анодите) са свързани чрез токоограничаващи резистори с номинална стойност 220 ома. Всичко останало според схемата е изключително просто. За всеки случай снимки с pinout на матрицата.
Изображенията ще трябва да се показват ред по ред (иначе при подобни матрици няма как), с малко закъснение (човешкото око на практика не прави разлика между закъснение от 1ms).
Опитах се да обясня всичко в скицата. При качване на платката, дисплеят ще покаже числата, които ще изпратим към монитора на порта на arduino. (Вижте видеото)
Снимка на готовото устройство (зигзаг на екрана, в скицата изображението му се съхранява в масива от снимки)
В бъдеще ще се опитам да направя нещо интересно на този дисплей.
Най-накрая матричните модули пристигнаха от Китай. Всеки модул се състои от чип MAX7219 (), LED матрица, един кондензатор и един резистор са в снопа.
Управлява се от MAX7219 чрез SPI интерфейс.
Микросхемите в клъстер са свързани последователно. Четох в интернет, че максималната възможна серийна връзка позволява само 8 броя MAX7219. Не вярвайте. 16 модула са свързани и всичко работи добре.
Модулите, представени на Ali, се предлагат в няколко версии. Най-популярните са 2 вида: с микросхема в DIP и в SOIC пакети. DIP чип модулът е по-голям и не е толкова удобен, когато е свързан в клъстер. Ще трябва да свържете куп кабели.
Модулите с чип в SOIC корпус са с размер на LED матрица и се свързват чрез запояване или джъмпери. Получава се хубаво и спретнато.
Най-известните библиотеки за работа с матрици и клъстери са Панел MAX72xx от Марк Райси Parola от MajicDesigns:Първата библиотека е по-лесна за използване, втората е по-сложна с повече функции. Ще го напиша по-подробно.
Необходима е инсталация на библиотека, когато се използва панел MAX72xx Adafruit GFX.
За да русифицирате текста, ще трябва да изтеглите ТОЗИ ФАЙЛи заменете файла glcdfont.c по подразбиране в директорията Arduino/Libraries/Adafruit-GFX-Library-master. Също така в този файл, освен необходимите букви и цифри, са описани куп всякакви знаци. Не всички от тях може да са полезни. Картината по-долу обяснява как се формират символите.
Ако е необходимо, можете да създадете свои собствени символи и да ги замените с всички неизползвани във файла. Почти всички растерни шрифтове, използвани в различни библиотеки, са формирани по този начин.
И така, библиотеките MAX72xx Panel и Adafruit GFX са инсталирани, файлът glcdfont.c е заменен. Стартирайте Arduino IDE, отворете ФАЙЛ. В скицата има функция utf8rus. Той осигурява прекодиране на таблицата със знаци за руски език. Той е необходим само за нормален изход от програмата, тоест в програмата желаният текст е написан на руски език. Ако текстът е въведен през COM порта, тогава кодовете на знаците се коригират във функцията Serial_Read. В IDE и в конзолата разработчиците са използвали различни кодировки.
В началото на файла има редове, необходими за работата на библиотеката.
int numberOfHorizontalDisplays = 1;
int numberOfVerticalDisplays = 16;
Имам модули с чип в SOIC корпус. Те имат малка особеност. Матрицата на модулите се монтира завъртяна на 90 градуса. Това е такса за удобство. Ако стартирате скиците, които идват с библиотеките, те ще извеждат текст отдолу нагоре във всеки модул. Текстът ще се показва на зигзаг. За да се лекува това заболяване, на библиотеката трябва да се „каже“, че има 16 вертикални дисплея (те са физически разположени хоризонтално). И след това в void Setup посочете реда за библиотеката
matrix.setRotation(matrix.getRotation() + 1);
Той програмно ще обърне всяка матрица. И всичко ще се показва нормално.
Модулите с DIP чип пакет нямат това. Всичко е красиво, с изключение на куп жици.
Библиотеката на панела MAX72xx е доста скромна. Няма визуални изходни ефекти. Клъстерът се възприема като едно цяло. Нещата са много по-добри с MD Parola.
Собствениците на модули с чип в SOIC пакет също ще се сблъскат с проблема с ориентирането на модули в клъстер. Само че изглежда малко по-различно от MAX72xx. Тук модулите ще се появят, така да се каже, извън реда си.
HelloWorld скица от мостри, включени в библиотеката.
Програмно в скицата не успях да излекувам това заболяване. Отнесох се с него различно. Във файла Adruino/libraries/MD_MAX72xx_lib.h в края трябва да намерите редовете като на снимката.
И коригирайте избрания ред, избран от 1 до 0. Запазете файла. Arduino IDE не трябва да се рестартира. Наливаме, гледаме.
Сега можете да използвате 24 анимационни ефекта. Анимацията се стартира с командата P.displayText(“Текст за показване”, “подравняване на текста”, скорост, забавяне на дисплея, ефект на избледняване, ефект на избледняване). Както можете да видите, има много настройки.
И най-приятното е разделянето на клъстера на виртуални зони. Работата със зони не е много трудна. Не публикувам скицата, тя е в мострите, които идват с библиотеката. Вече можете да показвате часовника в началото на клъстера и тикера за новини на останалите модули почти без никакви проблеми.
Както може би вече се досещате, проблемът е в буквите на кирилицата. Тя също е разрешима. До предишния файл в същата директория е файлът MD_MAX72xx_font.cpp. Това е файл с шрифтове. Знаците в него се формират подобно на GFX шрифтовия файл на библиотеката. Има малка разлика. Тук размерът на знака може да бъде по-малък от 5 точки. В библиотеката Adafruit GFX, удивителният знак, например, заема същите 5 точки толкова широки, колкото всеки друг символ, използва се само един ред точки. Останалите не светят, а се използват като символ. В Parola същият удивителен знак също заема един ред точки, само че наблизо няма празни точки, но могат да бъдат съседни знаци. Ще бъде по-ясно да разберете картината.
Няма време за допълване на файла с кирилица по подобие на файла от първата разглеждана библиотека. Ако някой направи това и ми изпрати файл, ще го добавя към тази статия и както аз, така и гостите на моя сайт ще сме ви благодарни.
Резултат. Панелната библиотека MAX72xx от Марк Райс е лесна за използване и разбиране, но с лоша функционалност.
Библиотеката Parola от MajicDesigns е по-сложна и има достатъчно възможности за почти всяко приложение.
В предишните уроци учихме с помощта на регистър за смяна. Това се оказа малко по-трудно, отколкото директно от щифтове за общо предназначение. Проблемът, който тогава трябваше да решим, беше ограниченият брой контролирани изходи на контролера Arduino. Апогеят на нашите изследвания беше използването на динамична индикация за. Сега е време да усложним задачата още малко: ние се учим да работим с LED матрицата.