Мобилни телефони и джаджи

Мобилни телефони и джаджи

» 8x8 матричен контрол

8x8 матричен контрол


Китай предлага на ниска цена огромно количество не само електронни устройства, но и техните компоненти. Малък набор от диоди, излъчващи светлина, може да покаже информацията, от която се нуждаете, вероятно числа, тъй като разделителната способност не е много висока, 8 на 8 светодиода, всеки диаметър 3 мм. Тази матрица свети в червено, защото е най-видимо и привлича вниманието повече от другите цветове.


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


Тази матрица има 16 пина, по-горе е дадена диаграма, която ясно показва как са свързани елементарните компоненти на матрицата - светодиоди, ръководени от нея, можете правилно да свържете модула за възпроизвеждане на информация както от цифрови, така и от аналогови устройства. Не забравяйте за резисторите за ограничаване на тока, ще бъде тъжно, ако някой от пикселите изгори. Номиналният продължителен ток на една точка е равен на 20 mA, пиков ток напред 100 mA, захранващо напрежение 2.1-2.1V, дължина на вълната 625-630 nm, максималната разсейвана мощност е 40 mW, анодът е общ тук, тоест плюс. Габаритни размери на LED матрицата 37 на 37 на 8 мм. Трябва да запоявате внимателно, не докосвайте поялника с температура от 260 градуса за повече от 5 s, препоръчителната работна температура е -40 - +70 по Целзий.

Ако имате няколко такива матрици на светодиоди, можете да ги свържете, за да създадете големи информационни табла.

Матричен дисплей - устройство, състоящо се от 8x8 LED матрица и контролна платка, базирана на чип MAX7219 с минимално необходимия тръбопровод. На снимката вече можете да видите готовото устройство, но то дойде при мен по пощата в тази форма, така че трябваше да взема поялник и да запоя всичко по правилния начин.

Основната връзка към платката Arduino Nano е показана на електрическата схема.

Както можете да видите от диаграмата, всичко е просто, просто трябва да свържете контактите на двете платки с проводници в следния ред:

Ардуино НаноМатрица 8х8
ПИН 12ПИН DIN
ПИН 11PIN CLK
PIN 10PIN CS
PIN 5VPIN 5V
PIN GNDPIN 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; } } }

Видео на скицата:


Моля, активирайте javascript, за да работят коментарите.

Тази статия е създадена за тези, които са закупили гола матрица 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

Необходима е инсталация на библиотека, когато се използва панел 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.

Parola от MajicDesigns.

Собствениците на модули с чип в 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 матрицата.

1. Матричен индикатор

Както вече знаем, сегментните индикатори, независимо дали са скали или числа, се състоят от отделни светодиоди, свързани заедно. Например, група светодиоди може да има всички свързани катоди. Такъв индикатор има послепис "с общ катод", в противен случай - "с общ анод". И какво ще стане, ако поставим светодиодите не под формата на число или скала, а под формата на решетка? Ще се окаже доста графичен индикатор. Тоест такъв, на който можете да покажете не само число, но и някакъв вид изображение. Такава решетка се нарича матричен индикатор, а в случай на светодиоди - LED матрица. Разделителната способност на матричен индикатор е броят на хоризонталните и вертикалните точки. Например, най-често срещаните индикатори са с резолюция 8×8 пиксела. Ако е необходима LED матрица с по-висока разделителна способност, тогава тя просто се състои от няколко индикатора 8x8. Как да стане това, ще видим по-късно. Междувременно нека да разберем как са свързани всичките 64 светодиода в матрицата. Разбира се, би било възможно, както в случая на седемсегментен индикатор, да свържете всички светодиоди с общ катод или анод. В този случай ще ни трябват или 64 пина на контролера, или 8 регистъра за преместване. И двата варианта са много разточителни. По-правилен вариант е да комбинирате светодиодите в групи от 8 броя с общ катод. Нека това са колоните на матрицата. След това паралелните светодиоди в тези колони се комбинират отново в групи от 8 броя вече с общ анод. Получавате следната схема:
Да предположим, че задачата е да запалите светодиода R6C3. За да направим това, трябва да приложим високо ниво на сигнала към щифт R6 и да свържем щифт C3 към земята. Без да изключваме тази точка, нека се опитаме да запалим друга - R3C7. Свържете положителния захранващ щифт към R3 и заземете към C7. Но в този случай редове R6 и R3 ще се пресичат с колони C3 и C7 не на две, а на четири места! Следователно ще светнат не две, а четири точки. проблем! Очевидно същото може да помогне. Ако включим точките R6C3 и R3C7 на свой ред много бързо, можем да използваме постоянството на зрението - способността да интерпретираме бързо променящите се изображения като цяло.

2. LED матрица и регистри за смяна

В нашия урок ще свържем най-простата червена LED матрица 8 × 8 към Arduino Uno. Номерирането на пиновете започва от долния ляв ъгъл. В същото време номерирането на краката 1-16 не е свързано с никаква логика с номерирането на колони и редове C и R.
Фокусирайки се върху урока за динамичната индикация, нека се опитаме да използваме 8-битови регистри за смяна в схемата за контрол на матричния индикатор. Свързваме един регистър към изходите на индикатора, отговорни за колоните, а вторият към изходите на редовете. електрическа схема
Важна забележка #1.Необходимо е резисторите в тази схема да са на линиите, идващи от първия регистър за смяна. Този регистър за смяна отговаря за колоните. С тази връзка всеки резистор ще задава тока само за един светодиод на всяка стъпка от динамичния алгоритъм. Следователно всички светодиоди ще светят равномерно. Важна забележка #2.Диаграмата по-горе е само за информационни цели. Би било по-правилно да се включи допълнителна захранваща микросхема в пролуката между втория регистър и матрицата, например транзисторния модул ULN2003.

3. Програма

За да бъде по-забавно, нека се опитаме да подчертаем усмивка на индикатора. Както вече споменахме, за да покажем изображението върху матрицата, ще използваме динамична индикация. А именно, ние ще маркираме нашата снимка ред по ред. Първо осветяваме необходимите колони в най-горния ред, след това във втория, в третия и така нататък за всичките 8 реда. Първият регистър за смяна ще отговаря за колоните, а вторият за редовете. Следователно изходът на низ ще се състои от две последователни записи в регистъра: първо предаваме кода на низа, след това кода на точките в този низ. В тази програма ще използваме и ускорена версия на функцията digitalWrite. Това е необходимо, за да може процесът на динамична индикация да протича много бързо. В противен случай ще видим забележимо трептене на матрицата. Източник const byte data_pin = PD2; const байт st_pin = PD3; const байт sh_pin = PD4; unsigned long tm, next_flick; const unsigned int to_flick = 500; байтов ред = 0; const байт данни = (0b00111100, 0b01000010, 0b10100101, 0b10000001, 0b10100101, 0b10011001, 0b01000010, 0b00111100); void latchOn()( digitalWriteFast(st_pin, HIGH); digitalWriteFast(st_pin, LOW); ) void fill(byte d)( for(char i=0; i<8; i++){ digitalWriteFast(sh_pin, LOW); digitalWriteFast(data_pin, d & (1<next_flick)( next_flick = tm + to_flick; line++; if(line == 8) line = 0; // предаване на ред код fill(~(1<<(7-line))); // зажигаем точки в строке № line fill(data); // открываем защелку latchOn(); } } Основная часть этой программы, включая переменные data_pin, sh_pin, st_pin, next_flick, to_flickи функция запълвамвече познати ни от уроците за и за. масив даннисъхранява осем реда от нашата картина. За да спестим памет, записахме всяка комбинация от точки в двоична форма. функция закопчаванеотваря ключалката на регистъра. Това трябва да се направи само след като и двата регистъра за смени са попълнени. След като заредите програмата на Arduino, на индикатора ще се появи усмивка.

4. Анимация на LED матрицата

И сега ще финализираме програмата по такъв начин, че изображението на индикатора да се променя на всеки половин секунда. За да направите това, нека си спомним отново. const byte data_pin = PD2; const байт st_pin = PD3; const байт sh_pin = PD4; unsigned long tm, next_flick, next_switch; const unsigned int to_flick = 500; const unsigned long to_switch = 500000; байтов ред = 0; байтова рамка = 0; const byte data = ( ( 0b00111100, 0b01000010, 0b10100101, 0b10000001, 0b10100101, 0b10011001, 0b01000010, 0b00111100 ), ( 0b00111100, 0b01000010, 0b10100101, 0b10000001, 0b10000001, 0b10111101, 0b01000010, 0b00111100 )); void latchOn()( digitalWriteFast(st_pin, HIGH); digitalWriteFast(st_pin, LOW); ) void fill(byte d)( for(char i=0; i<8; i++){ digitalWriteFast(sh_pin, LOW); digitalWriteFast(data_pin, d & (1<next_flick)( next_flick = tm + to_flick; line++; if(line == 8) line = 0; fill(~(1<<(7-line))); fill(data); latchOn(); } tm = micros(); if(tm >next_switch)( next_switch = tm + to_switch; frame = !frame; ) ) Зареждаме програмата Arduino и наблюдаваме резултата.

5. Мащабиране на LED матрица

LED матрица 8 × 8 е подходяща за показване на две числа или прост знак. Ако искате да покажете някакво повече или по-малко полезно изображение на индикатора, трябва да комбинирате матриците. Това се прави чрез добавяне на нови регистри за преместване както вертикално, така и хоризонтално. Трябва да се отбележи, че скоростта на контролера Arduino Uno във връзка с регистрите за смяна е достатъчна само за дисплей 16 × 16. По-нататъшното увеличаване на размера на LED дисплея ще доведе до забележимо трептене.

Задачи

  • хипноза. Програмирайте контролера по такъв начин, че върху LED матрицата да се появяват концентрични кръгове с непрекъснато нарастващ радиус с период от 1 секунда.
  • Игра със змия. Реализирайте такава добре позната игра като змия върху 8×8 LED матрица. Необходимо е да добавите четири бутона към веригата за контрол на посоката на движение, както и зумер за сигнализиране на събитието за ядене на ябълки (или каквото там яде змията ...).
  • Електронен нивелир. Добавете акселерометър към веригата. Напишете програма, която ще покаже точка на LED матрицата, чиито координати зависят от наклона на цялото устройство. Например, когато устройството е фиксирано успоредно на земята (перпендикулярно на вектора на гравитацията), тогава точката е в центъра. Когато електронният нивелир е наклонен наляво, точката се измества пропорционално надясно.

Заключение

След като сглобиха веригата за управление на матрицата, мнозина може да имат въпрос: „Е, никой ли не е измислил по-прост начин за работа с матрицата след 30 години?“ Всъщност те го разбраха. Има специализирани микросхеми за работа с различни видове дисплеи, включително за работа с LED матрица. В един от следващите уроци ще научим как да управляваме индикатора с помощта на чипа MAX7219. Този метод ще ни позволи лесно да комбинираме няколко матрици с един голям дисплей, без да е необходимо да усложняваме много електрическата верига.