DualLEDMatrixControl на Arduino

Проект «DualLEDMatrixControl» демонстрирует, как синхронизировать отображение анимации на двух светодиодных матрицах 8x8, управляемых джойстиком с использованием Arduino. Этот проект включает в себя подключение матриц последовательно, создание управляемых анимаций и взаимодействие с пользователем через джойстик

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

Цели проекта:

  • Создать систему управления двумя светодиодными матрицами с помощью Arduino.

  • Реализовать синхронное отображение анимации на обеих матрицах.

  • Управлять анимацией с помощью джойстика.

Что потребуется:

Подключение:

  1. Подключите VCC первый матрицы к 5V на Arduino.

  2. Подключите GND первый матрицы к GND на Arduino.

  3. Подключите DIN первой матрицы к пину 11 на Arduino.

  4. Подключите CLK первой матрицы к пину 13 на Arduino.

  5. Подключите CS первой матрицы к пину 9 на Arduino.

  6. Соедините матрицы друг с другом.

  7. Подключите VRx джойстика к A0 на Arduino.

  8. Подключите VRy джойстика к A1 на Arduino.

  9. Подключите кнопку джойстика к пину 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 и создайте новый скетч. Перепишите следующий код:

dual_led_matrix_control.ino
#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», который синхронизирует анимацию на двух светодиодных матрицах, управляемых джойстиком. Вы можете адаптировать и расширять этот проект, добавляя новые анимации и эффекты. Удачи в ваших экспериментах и разработках!