В этом проекте мы создадим игру "Змейка" на платформе Arduino. Для отображения игрового поля мы будем использовать LED матрицу 8x8 с драйвером MAX7219, а для управления змейкой — джойстик. Игра заключается в том, чтобы управлять змейкой, избегать столкновений и собирать еду, увеличивая её длину. Этот проект является отличным примером использования Arduino для создания интерактивных и увлекательных игр.
Необходимые компоненты:
Подключение компонентов
-
Подключение LED матрицы MAX7219:
- VCC к 5V Arduino
- GND к GND Arduino
- DIN к цифровому пину 12 Arduino
- CLK к цифровому пину 11 Arduino
- CS к цифровому пину 10 Arduino
-
Подключение джойстика:
- VCC к 5V Arduino
- GND к GND Arduino
- Ось X к аналоговому пину A0 Arduino
- Ось Y к аналоговому пину A1 Arduino

Установка библиотеки LedControl
Для работы с матрицей MAX7219 нам понадобится библиотека LedControl. Установите её следующим образом:
- Откройте Arduino IDE.
- Перейдите в "Скетч" -> "Подключить библиотеку" -> "Управлять библиотеками".
- Введите "LedControl" в строке поиска.
- Найдите библиотеку "LedControl by Eberhard Fahle" и установите её.
Программирование Arduino
Загрузите следующий код в ваш Arduino. Этот код реализует игру "Змейка" с управлением через джойстик и отображением на матрице MAX7219.
#include <LedControl.h>
// Определение пинов для матрицы MAX7219
#define DATA_IN 12
#define CLK 11
#define LOAD 10
// Инициализация библиотеки для работы с MAX7219
LedControl lc = LedControl(DATA_IN, CLK, LOAD, 1);
// Пины для подключения джойстика
#define JOYSTICK_X A0
#define JOYSTICK_Y A1
// Параметры змейки
#define MATRIX_SIZE 8
int snakeX[MATRIX_SIZE * MATRIX_SIZE];
int snakeY[MATRIX_SIZE * MATRIX_SIZE];
int snakeLength;
int foodX, foodY;
int dirX, dirY;
int lastDirX, lastDirY;
void setup() {
// Инициализация матрицы
lc.shutdown(0, false);
lc.setIntensity(0, 8); // Установите яркость от 0 до 15
lc.clearDisplay(0);
// Инициализация змейки
snakeLength = 3;
snakeX[0] = 4; snakeY[0] = 4;
snakeX[1] = 4; snakeY[1] = 5;
snakeX[2] = 4; snakeY[2] = 6;
dirX = 0; dirY = -1;
lastDirX = 0; lastDirY = -1;
// Генерация первой еды
generateFood();
}
void loop() {
// Считывание значений джойстика
int xValue = analogRead(JOYSTICK_X);
int yValue = analogRead(JOYSTICK_Y);
// Определение направления движения змейки
if (abs(xValue - 512) > abs(yValue - 512)) {
if (xValue < 400 && lastDirX != 1) {
dirX = -1;
dirY = 0;
} else if (xValue > 600 && lastDirX != -1) {
dirX = 1;
dirY = 0;
}
} else {
if (yValue < 400 && lastDirY != 1) {
dirX = 0;
dirY = -1;
} else if (yValue > 600 && lastDirY != -1) {
dirX = 0;
dirY = 1;
}
}
// Обновление позиции змейки
updateSnake();
// Отображение змейки и еды на матрице
display();
// Задержка для скорости игры
delay(200);
}
void updateSnake() {
// Перемещение змейки
int newX = snakeX[0] + dirX;
int newY = snakeY[0] + dirY;
// Проверка на выход за границы
if (newX < 0) newX = MATRIX_SIZE - 1;
if (newX >= MATRIX_SIZE) newX = 0;
if (newY < 0) newY = MATRIX_SIZE - 1;
if (newY >= MATRIX_SIZE) newY = 0;
// Проверка на столкновение с собой
for (int i = 0; i < snakeLength; i++) {
if (snakeX[i] == newX && snakeY[i] == newY) {
snakeLength = 3; // Перезапуск змейки
snakeX[0] = 4; snakeY[0] = 4;
snakeX[1] = 4; snakeY[1] = 5;
snakeX[2] = 4; snakeY[2] = 6;
dirX = 0; dirY = -1;
return;
}
}
// Обновление позиции змейки
for (int i = snakeLength; i > 0; i--) {
snakeX[i] = snakeX[i - 1];
snakeY[i] = snakeY[i - 1];
}
snakeX[0] = newX;
snakeY[0] = newY;
lastDirX = dirX;
lastDirY = dirY;
// Проверка на съедание еды
if (newX == foodX && newY == foodY) {
snakeLength++;
generateFood();
}
}
void generateFood() {
// Генерация позиции еды
foodX = random(MATRIX_SIZE);
foodY = random(MATRIX_SIZE);
// Проверка, чтобы еда не появилась на змейке
for (int i = 0; i < snakeLength; i++) {
if (snakeX[i] == foodX && snakeY[i] == foodY) {
generateFood();
return;
}
}
}
void display() {
// Очистка дисплея
lc.clearDisplay(0);
// Отображение змейки
for (int i = 0; i < snakeLength; i++) {
lc.setLed(0, snakeY[i], snakeX[i], true);
}
// Отображение еды
lc.setLed(0, foodY, foodX, true);
}
|
Пояснение к коду
- Инициализация библиотеки LedControl: Библиотека LedControl используется для управления матрицей MAX7219.
- Настройка матрицы: В функции
setup()
устанавливаются параметры яркости и очищается дисплей.
- Инициализация змейки: Змейка начинается с длины 3 и движется вверх.
- Считывание значений джойстика: В функции
loop()
считываются значения осей X и Y джойстика и определяется направление движения змейки.
- Запрет на движение назад: Код проверяет направление, чтобы змейка не могла двигаться назад по своей линии.
- Обновление позиции змейки: Перемещение змейки с проверкой на столкновение с собой и выход за границы.
- Генерация еды: Позиционирование еды случайным образом на матрице.
- Отображение: Отображение змейки и еды на матрице.
Заключение
Этот проект является отличным примером использования Arduino и матрицы MAX7219 для создания интерактивной игры. Вы сможете улучшить свои навыки программирования и работы с аппаратными компонентами, создавая увлекательные проекты.