Визитка-PCB с игрой «Крестики-нолики» 4×4: руководство по проектированию, сборке и программированию
Обзор
В этом руководстве подробно описывается создание визитной карточки формата PCB, которая одновременно служит функциональной игрой «Крестики-нолики» 4×4. На лицевой стороне размещены логотип EDISON SCIENCE CORNER, иконки социальных сетей и QR-код, ведущий на YouTube-канал. На обратной стороне — полностью рабочая игровая схема на базе микроконтроллера ATmega328, светодиодов NeoPixel (WS2812B) и тактильных кнопок.
Компоненты и расходники
| Элемент | Кол-во |
|---|---|
| Микроконтроллер Microchip ATmega328P‑AU | 1 |
| Лента NeoPixel RGB (WS2812B) | 16 (матрица 4×4) |
| Тактильные кнопки, вертикального нажатия | 16 |
| Печатная плата (JLCPCB) | 1 |
| Arduino UNO (для прошивки) | 1 |
| USB Micro‑Female разъём | 1 |
| Конденсаторы 22 пФ (0805) | 2 |
| Конденсаторы 100 нФ (0805) | 2 |
| Резисторы 1 кОм (0805) | 3 |
| Резистор 10 кОм (0805) | 1 |
| Кварцевый резонатор 16 МГц | 1 |
| Светодиоды SMD 0805 | 2 |
Необходимые инструменты и оборудование
- Паяльник
- Бессвинцовый припой
- Флюс для пайки
- Набор перемычек (5 см, 10 шт.)
Программное обеспечение и онлайн-сервисы
- Arduino IDE
- EasyEDA — платформа для проектирования печатных плат
- JLCPCB — недорогое производство печатных плат (от $2 за 5 шт.)
Шаг 1: Проектирование и заказ платы
В EasyEDA была спроектирована плата размером 89 × 50 мм (стандартный размер визитной карточки) с матрицей 4×4 для игры. Схема построена на микроконтроллере ATmega328 и включает 16 светодиодов WS2812B и 16 тактильных кнопок. После завершения разводки были экспортированы гербер-файлы и загружены в JLCPCB. Платы толщиной 0,8 мм с чёрной маской прибыли через две недели — качество соответствует ожиданиям для хоббийных проектов.
Шаг 2: Подготовка компонентов
Список компонентов приведён выше. Все детали распространённые, недорогие и доступны у крупных дистрибьюторов (Digi‑Key, Mouser, AliExpress).
Шаг 3: Пайка
Начинаем с пайки USB micro‑female разъёма, затем устанавливаем ATmega328 и обвязку. Далее паяем ленту NeoPixel, выравнивая каждый светодиод с соответствующей кнопкой. Аккуратно припаиваем все 16 кнопок, соблюдая ориентацию. Вся сборка занимает около часа у опытного энтузиаста.
Шаг 4: Программирование
Подключаем плату к ПК через USB. Загружаем скетч через Arduino IDE:
Скетч инициализирует массив из 16 светодиодов, обрабатывает нажатия клавиатурной матрицы 4×4 и реализует простую логику определения победы. Игрок 1 — зелёные светодиоды, игрок 2 — синие. При победе плата мигает цветом победителя; при ничьей — красным.
Шаг 5: Игра и удовольствие
Переворачиваем карточку — открывается игровая сторона. Каждое нажатие зажигает соответствующий светодиод. Игра следует классическим правилам «Крестиков-ноликов», но на поле 4×4 с цветовой индикацией. Уникальная переносная игра, которая станет отличным поводом для разговора на конференциях и нетворкинге.
Исходный код
Полный скетч для Arduino (C/C++), включающий обработку клавиатуры, управление светодиодами и логику победы:
#include <Keypad.h>
#include <FastLED.h>
#define LED_PIN 5
#define NUM_LEDS 16
#define LED_TYPE WS2812B
#define COLOR_ORDER GBR
#define BRIGHTNESS 30
CRGB leds[NUM_LEDS];
int player = 1;
char board[16] = {'1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16'};
char key;
int moveCount = 0;
const byte ROWS = 4;
const byte COLS = 4;
char hexaKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {A0, A1, A2, A3};
byte colPins[COLS] = {A4, A5, 2, 3};
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup() {
Serial.begin(9600);
LEDS.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
// Тестовая индикация: зелёный, затем синий
for (int i = 0; i < 3; i++) {
for (int j = 0; j < NUM_LEDS; j++)
leds[j] = (i % 2 == 0) ? CRGB::Green : CRGB::Blue;
FastLED.show();
delay(500);
}
FastLED.clear();
}
void loop() {
key = customKeypad.getKey();
if (key && player == 1) {
int idx = keyToIndex(key);
leds[idx] = CRGB::Green;
FastLED.show();
board[idx] = 'X';
if (checkWinner('X')) announceWinner(1);
player = 2;
delay(1000);
}
if (key && player == 2) {
int idx = keyToIndex(key);
leds[idx] = CRGB::Blue;
FastLED.show();
board[idx] = 'O';
if (checkWinner('O')) announceWinner(2);
player = 1;
moveCount++;
delay(1000);
}
if (moveCount == 8) announceDraw();
}
int keyToIndex(char k) {
switch (k) {
case '1': return 0; case '2': return 1; case '3': return 2; case 'A': return 3;
case '4': return 4; case '5': return 5; case '6': return 6; case 'B': return 7;
case '7': return 8; case '8': return 9; case '9': return 10; case 'C': return 11;
case '*': return 12; case '0': return 13; case '#': return 14; case 'D': return 15;
}
return -1;
}
bool checkWinner(char mark) {
const int lines[10][4] = {
{0,1,2,3}, {4,5,6,7}, {8,9,10,11}, {12,13,14,15}, // строки
{0,4,8,12}, {1,5,9,13}, {2,6,10,14}, {3,7,11,15}, // столбцы
{0,5,10,15}, {3,6,9,12} // диагонали
};
for (auto &line : lines) {
if (board[line[0]] == mark && board[line[1]] == mark &&
board[line[2]] == mark && board[line[3]] == mark)
return true;
}
return false;
}
void announceWinner(int p) {
CRGB color = (p == 1) ? CRGB::Green : CRGB::Blue;
while (true) {
for (int i = 0; i < NUM_LEDS; i++) leds[i] = color;
FastLED.show(); delay(500);
FastLED.clear(); FastLED.show(); delay(500);
}
}
void announceDraw() {
while (true) {
for (int i = 0; i < NUM_LEDS; i++) leds[i] = CRGB::Red;
FastLED.show(); delay(1000);
FastLED.clear(); FastLED.show(); delay(500);
}
}
Схемы
Все файлы проекта, спецификация (BOM) и код доступны для скачивания.
Производственный процесс
- Создание игры в реальном времени на Arduino Nano с гироскопом MPU-6050 и OLED-дисплеем
- Многопозиционная система датчиков температуры для интеграции в умный дом
- Создание рулетки на 37 светодиодов с Arduino Nano
- DIY USB-геймпад на Arduino: собственный высокопроизводительный контроллер
- Создание сенсорной игры «Крестики-нолики» на Arduino Due
- MotionSense: умная система обнаружения проникновения на Arduino и ESP8266
- Пожарная безопасность 3D-принтера: умная система обнаружения дыма
- Pixel Chaser: игра на один тап с NeoPixel Ring и Arduino Nano
- Магнитная левитация на отталкивании с Arduino: Простая схема и DIY-руководство
- CoroFence: термический детектор на GridEye + PIR с IoT