DualLEDMatrixControl на Arduino
Проект «DualLEDMatrixControl» демонстрирует, как синхронизировать отображение анимации на двух светодиодных матрицах 8x8, управляемых джойстиком с использованием Arduino. Этот проект включает в себя подключение матриц последовательно, создание управляемых анимаций и взаимодействие с пользователем через джойстик
Современные микроконтроллеры и светодиодные матрицы предоставляют разработчикам уникальные возможности для создания впечатляющих визуальных эффектов. В этом проекте мы рассмотрим, как синхронизировать отображение на двух светодиодных матрицах, управляемых джойстиком с использованием Arduino. Проект «DualLEDMatrixControl» продемонстрирует, как легко интегрировать аппаратные и программные компоненты для создания интересных анимаций.
Цели проекта:
Создать систему управления двумя светодиодными матрицами с помощью Arduino.
Реализовать синхронное отображение анимации на обеих матрицах.
Управлять анимацией с помощью джойстика.
Что потребуется:
Arduino Uno (или другой совместимый микроконтроллер).
Соединительные провода.
Подключение:
Подключите VCC первый матрицы к 5V на Arduino.
Подключите GND первый матрицы к GND на Arduino.
Подключите DIN первой матрицы к пину 11 на Arduino.
Подключите CLK первой матрицы к пину 13 на Arduino.
Подключите CS первой матрицы к пину 9 на Arduino.
Соедините матрицы друг с другом.
Подключите VRx джойстика к A0 на Arduino.
Подключите VRy джойстика к A1 на Arduino.
Подключите кнопку джойстика к пину 2 на Arduino.

Установка библиотеки:
Для работы с матрицами потребуется установить библиотеку AlashLEDMatrix8x8. Скачать и установить библиотеку можно с GitHub.
ВНИМАНИЕ: Чтобы подключить библиотеку для Arduino, выполните следующие шаги: 1. Скачайте библиотеку с официального сайта или из репозитория GitHub: https://github.com/Alash-electronics/AlashLEDMatrix8x8. 2. Откройте программу Arduino IDE и перейдите в меню «Скетч» → «Подключить библиотеку» → «Добавить.ZIP библиотеку…». 3. В открывшемся окне выберите скачанный .zip файл и нажмите «Открыть». 4. Внизу Arduino IDE появится сообщение «Библиотека добавлена. Проверьте меню «Подключить библиотеку»». 5. Теперь библиотека будет доступна для использования в ваших проектах.
Код
Откройте Arduino IDE и создайте новый скетч. Перепишите следующий код:
#include <AlashLEDMatrix8x8.hpp>
// Определяем пин Chip Select (CS) для светодиодной матрицы
const uint8_t LEDMATRIX_CS_PIN = 9;
// Количество сегментов 8x8, подключенных друг к другу
const int LEDMATRIX_SEGMENTS = 1;
int buttonState = 0;
// Экземпляр класса AlashLEDMatrix8x8
AlashLEDMatrix8x8 ledMatrix(LEDMATRIX_SEGMENTS, LEDMATRIX_CS_PIN);
// Массив для хранения данных глаза
byte eye[8] = {
0b00000000,
0b01111110,
0b10000001,
0b10000001,
0b10000001,
0b10000001,
0b01111110,
0b00000000
};
byte cleyes1[8] {
0b00000000,
0b00111100,
0b01000010,
0b01000010,
0b01000010,
0b01000010,
0b00111100,
0b00000000
};
byte cleyes2[8] {
0b00000000,
0b00011000,
0b00100100,
0b00100100,
0b00100100,
0b00100100,
0b00011000,
0b00000000
};
byte cleyes3[8] {
0b00000000,
0b00011000,
0b00011000,
0b00011000,
0b00011000,
0b00011000,
0b00011000,
0b00000000
};
byte righteye[8] {
0b00000000,
0b00000000,
0b01111110,
0b10000001,
0b10000001,
0b10000001,
0b10000001,
0b01111110
};
byte lefteye[8] {
0b01111110,
0b10000001,
0b10000001,
0b10000001,
0b10000001,
0b01111110,
0b00000000,
0b00000000
};
byte downeye[8] {
0b00000000,
0b01111100,
0b10000010,
0b10000010,
0b10000010,
0b10000010,
0b01111100,
0b00000000
};
byte downleft[8] {
0b01111100,
0b10000010,
0b10000010,
0b10000010,
0b10000010,
0b01111100,
0b00000000,
0b00000000
};
byte downright[8] {
0b00000000,
0b00000000,
0b01111100,
0b10000010,
0b10000010,
0b10000010,
0b10000010,
0b01111100
};
// Позиции зрачка
int pupilX = 3;
int pupilY = 3;
// Пины для джойстика
const int VRx = A0;
const int VRy = A1;
const int joystickButtonPin = 2; // Пин кнопки джойстика
int lastXPosition = 0;
int lastYPosition = 0;
void setup() {
// Инициализация дисплея
ledMatrix.setEnabled(true);
ledMatrix.setIntensity(5); // Установка яркости (0 - минимальная, 15 - максимальная)
// Инициализация пинов джойстика
pinMode(VRx, INPUT);
pinMode(VRy, INPUT);
pinMode(joystickButtonPin, INPUT_PULLUP); // Настройка пина кнопки джойстика
// Рисуем начальный глаз
drawSprite(eye, 0, 0, 8, 8);
ledMatrix.display();
}
void loop() {
if (digitalRead(joystickButtonPin) == LOW) {
clearSprite(eye, 0, 0, 8, 8);
drawSprite(cleyes1, 0, 0, 8, 8);
ledMatrix.display();
delay(30);
clearSprite(cleyes1, 0, 0, 8, 8);
drawSprite(cleyes2, 0, 0, 8, 8);
ledMatrix.display();
delay(30);
clearSprite(cleyes2, 0, 0, 8, 8);
drawSprite(cleyes3, 0, 0, 8, 8);
ledMatrix.display();
delay(30);
clearSprite(cleyes3, 0, 0, 8, 8);
drawSprite(cleyes2, 0, 0, 8, 8);
ledMatrix.display();
delay(30);
clearSprite(cleyes2, 0, 0, 8, 8);
drawSprite(cleyes1, 0, 0, 8, 8);
ledMatrix.display();
delay(30);
clearSprite(cleyes1, 0, 0, 8, 8);
drawSprite(eye, 0, 0, 8, 8);
ledMatrix.display();
}
int xPosition = analogRead(VRx);
int yPosition = analogRead(VRy);
// Обновление координат зрачка, если разница составляет 20 или более единиц
if (abs(xPosition - lastXPosition) >= 20) {
if (xPosition < 120) {
pupilX = 0;
} else if (xPosition < 240) {
pupilX = 1;
} else if (xPosition < 480) {
pupilX = 2;
} else if (xPosition < 600) {
pupilX = 3;
} else if (xPosition < 820) {
pupilX = 4;
} else {
pupilX = 5;
}
lastXPosition = xPosition;
}
if (abs(yPosition - lastYPosition) >= 20) {
if (yPosition < 205) {
pupilY = 1;
} else if (yPosition < 410) {
pupilY = 2;
} else if (yPosition < 615) {
pupilY = 3;
} else if (yPosition < 820) {
pupilY = 4;
} else {
pupilY = 5;
}
lastYPosition = yPosition;
}
ledMatrix.clear();
if (pupilY == 1 && pupilX != 0) {
drawSprite(lefteye, 0, 0, 8, 8);
} else if (pupilY == 1 && pupilX == 0) {
drawSprite(downleft, 0, 0, 8, 8);
} else if (pupilY == 5 && pupilX != 0) {
drawSprite(righteye, 0, 0, 8, 8);
} else if (pupilY == 5 && pupilX == 0) {
drawSprite(downright, 0, 0, 8, 8);
} else if (pupilX == 0) {
drawSprite(downeye, 0, 0, 8, 8);
} else {
drawSprite(eye, 0, 0, 8, 8);
}
drawEye();
delay(100); // Задержка для сглаживания движения
}
void drawEye() {
drawPupil(pupilX, pupilY); // Рисуем зрачок
ledMatrix.display();
}
// Функция для рисования спрайта на дисплее
void drawSprite(byte* sprite, int x, int y, int width, int height) {
ledMatrix.clear();
for (int iy = 0; iy < height; iy++) {
for (int ix = 0; ix < width; ix++) {
bool pixel = bitRead(sprite[iy], 7 - ix);
ledMatrix.setPixel(x + ix, y + iy, pixel);
}
}
ledMatrix.display();
}
// Функция для рисования зрачка на дисплее
void drawPupil(int x, int y) {
ledMatrix.setPixel(x, y, true);
ledMatrix.setPixel(x + 1, y, true);
ledMatrix.setPixel(x, y + 1, true);
ledMatrix.setPixel(x + 1, y + 1, true);
}
void clearSprite(byte* sprite, int x, int y, int width, int height) {
for (int iy = 0; iy < height; iy++) {
for (int ix = 0; ix < width; ix++) {
ledMatrix.setPixel(x + ix, y + iy, false);
}
}
}
Заключение
Теперь у вас есть рабочий проект «DualLEDMatrixControl», который синхронизирует анимацию на двух светодиодных матрицах, управляемых джойстиком. Вы можете адаптировать и расширять этот проект, добавляя новые анимации и эффекты. Удачи в ваших экспериментах и разработках!