В этой статье подключаем USB‑веб‑камеру к Arduino UNO Q и играем в шахматы на настоящей доске. Система с помощью методов компьютерного зрения распознаёт ваши ходы, отвечает с помощью Stockfish и даёт советы по игре.

Мне хотелось играть в шахматы против компьютера, но без необходимости постоянно смотреть в экран. Чтобы передо мной была настоящая доска с настоящими фигурами, которые можно двигать руками, а компьютер при этом делал ответные ходы.

Поэтому я направил веб‑камеру на шахматную доску и подключил её к Arduino UNO Q. Теперь UNO Q следит за доской, определяет каждый мой ход, отслеживает состояние партии, выбирает ответ с помощью Stockfish и сообщает, какую фигуру мне нужно передвинуть за компьютер. А ещё может объяснить, когда я ошибся и почему мой ход был неудачным.

В этой статье расскажу, что умеет система, какие компоненты понадобятся, как она определяет ходы без распознавания самих фигур и как всё настроить самостоятельно. 

Что умеет система

USB‑веб‑камера смотрит на доску сверху. Вы передвигаете фигуру, убираете руку, и приложение определяет сделанный ход.

Система отслеживает всю партию:

  • текущую позицию;

  • историю ходов;

  • очерёдность ходов;

  • шахи и маты;

  • рокировки;

  • взятия на проходе;

  • превращения пешек.

Stockfish выбирает ответные ходы компьютера. Силу игры можно настроить от уровня 0 («только что выучил правила») до уровня 20 («всё, хватит, сдаюсь»).

Ход компьютера отображается сразу в нескольких местах:

  • на веб‑странице;

  • стрелкой поверх изображения с камеры;

  • на светодиодной матрице UNO Q.

Начальная клетка подсвечивается тускло, конечная — ярко. Вы передвигаете фигуру за компьютер, а система проверяет, правильно ли вы выполнили ход.

Система умеет разговаривать с вами через Bluetooth‑колонку, подключённую к устройству, или прямо через браузер.

Если включить режим «Тренер» (Coach me), система будет анализировать каждый ваш ход и комментировать его, когда есть что сказать.

Например:

«Теперь я могу поставить мат, взяв ферзём на f7. Лучше было пойти пешкой на g6».

Или:

«Отличный ход! Вилка на короля и ладью».

Если зашли в тупик, в любой момент можно попросить подсказку.

Всё управление доступно через веб‑страницу, которую раздаёт UNO Q. Так что можно просто поставить рядом с доской телефон и пользоваться им.

The Chess Camera web page

Почему именно UNO Q?

UNO Q — это фактически два компьютера на одной плате в форм‑факторе Arduino: процессор Qualcomm под управлением Debian Linux и микроконтроллер STM32, на котором работает обычный скетч Arduino.

Для этого проекта такое разделение оказалось очень удобным:

Linux‑часть берёт на себя основную работу. Здесь:

  • OpenCV обрабатывает кадры с камеры;

  • python‑chess проверяет ходы по шахматным правилам;

  • Stockfish просчитывает ответные ходы;

  • небольшой веб‑сервер обслуживает страницу управления.

Микроконтроллерная часть управляет встроенной светодиодной матрицей, на которой отображаются ходы компьютера прямо на плате UNO Q.

Весь проект оформлен как приложение для Arduino App Lab. По сути, это папка с файлом app.yaml, каталогом python/, веб‑страницей в assets/ и скетчем в sketch/.

Достаточно открыть проект в App Lab и нажать кнопку Run.

Список компонентов

Компонент

Примечания

Arduino UNO Q

Основной компьютер. Linux‑часть запускает приложение, а микроконтроллерная часть управляет светодиодной матрицей

USB‑C‑хаб с поддержкой Power Delivery (PD)

У UNO Q всего один порт USB‑C, поэтому через хаб подключаются и питание, и веб‑камера

Блок питания USB‑C на 5 В

Подключается к PD‑входу хаба

USB‑веб‑камера

Любая камера с поддержкой UVC. Работает с разрешением 1280×720 при 15 кадрах/с

Штатив или кронштейн для камеры

Нужен, чтобы разместить камеру как можно точнее над центром доски

Шахматная доска

Можно распечатать (PDF‑файлы есть в репозитории) или взять любую доску с хорошим контрастом между светлыми и тёмными клетками

Шахматные фигуры

Подойдёт любой набор, но низкие шахматные фигуры или плоские фишки, напечатанные на 3D‑принтере, распознаются надёжнее

Bluetooth‑колонка (необязательно)

Для голосового озвучивания ходов и советов тренера. У UNO Q нет вывода звука через HDMI

3D‑принтер (необязательно)

Для печати фигур или фишек. Я использовал Prusa Core One с MMU3

Программное обеспечение: Arduino App Lab и само приложение из репозитория. При запуске первой партии Stockfish загрузится автоматически.

Шахматная доска

В репозитории, в папке board/, лежат готовые макеты доски для печати на бумаге форматов A4 и Letter.

Размер клетки — 50 мм, а вся доска распределена по шести листам. Остаётся только обрезать края и склеить листы скотчем.

Если нужны другие цвета или размеры, макеты можно сгенерировать заново с помощью make_board.py.

Шахматные фигуры

Я довольно быстро обнаружил, что высокие шахматные фигуры типа «Стаунтон» создают проблемы при распознавании.

Если камера расположена не строго над доской, высокий король на изображении словно наклоняется и заходит на соседние клетки.

Поэтому я разработал два набора фигур для 3D‑печати:

Printable low pieces

1. Низкие широкие фигуры

Высотой от 14 до 25 мм для доски с клетками 50 мм. Сверху камера видит большой диск с хорошо различимым символом.

На фигурах используются следующие обозначения:

  • пешка — точка;

  • конь — буква L;

  • слон — косая черта;

  • ладья — квадрат;

  • ферзь — корона из точек;

  • король — крест.

2. Плоские фишки

Диаметром 15 мм и толщиной 4 мм для небольших досок с клетками меньше 20 мм.

Символы выполнены другим цветом и утоплены заподлицо с поверхностью. В файлах проекта PrusaSlicer уже настроены слоты MMU для печати разными цветами.

Printable chess coins
Шахматные фишки для 3D‑печати

Выбирайте цвета, которые хорошо выделяются и на светлых, и на тёмных клетках. У меня хорошо сработали кремовые фигуры с красными символами и чёрные с жёлтыми.

Сложнее всего камере различать обычные белые фигуры на светлых клетках.

Как система определяет ходы

Это моя любимая часть проекта: приложению вообще не нужно распознавать, какая именно фигура стоит на клетке.

Вот как всё устроено:

1. Выравниваем изображение доски.

Сначала нужно один раз выполнить калибровку: отметить четыре угла доски или позволить приложению самостоятельно найти шахматную разметку.

После этого каждый кадр проходит перспективное преобразование и превращается в плоскую сетку 8×8 при виде сверху. Благодаря этому приложение точно знает, какие пиксели относятся к каждой клетке.

2. Дожидаемся прекращения движения.

Пока ваша рука находится над доской, приложение ничего не распознаёт.

Оно сравнивает средний цвет каждой клетки между кадрами и ждёт, пока изменения прекратятся. При этом общие изменения яркости всей доски игнорируются, поэтому автоматическая регулировка экспозиции веб‑камеры не воспринимается как движение.

3. Оцениваем изменения на каждой клетке.

Приложение сравнивает текущее неподвижное состояние доски с предыдущим и вычисляет, насколько изменилась каждая из 64 клеток.

4. Сверяемся с шахматными правилами.

Приложение всегда знает текущую позицию, поэтому получает от python‑chess все допустимые ходы и выбирает тот, при котором изменились нужные клетки, а остальные остались без изменений.

Дополнительно проверяется, что начальная клетка теперь выглядит пустой.

Такой подход работает, потому что в типичной шахматной позиции доступно около 30 допустимых ходов, и только один из них соответствует изменениям на нужных клетках.

При этом:

  • при рокировке меняются четыре клетки;

  • при взятии на проходе — три.

Оба случая обрабатываются по тому же принципу.

The straightened board with tracked pieces

Дополнительные проверки

Но в реальности всё не так идеально, поэтому я добавил несколько дополнительных проверок:

  • Случайное смещение соседней фигуры. Если во время хода вы случайно заденете соседнюю фигуру, приложение всё равно определит правильный ход, а затем попросит поправить сдвинутую фигуру, чтобы она стояла по центру клетки.

  • Смещение всей доски. Если сдвинется вся доска, изменения появятся почти на всех клетках одновременно. Приложение распознает такую ситуацию, заново найдёт доску, совместит с ней сетку и сохранит обновлённую калибровку.

  • Проверка занятости клеток. Раз в секунду, пока на доске ничего не движется, приложение проверяет, какие клетки заняты фигурами. Если какой‑то фигуры не хватает, соответствующая клетка выделяется красным контуром, а если фигура появилась там, где её быть не должно, — жёлтым. Так можно сразу заметить рассинхронизацию между реальной доской и состоянием партии в приложении.

В репозитории есть офлайн‑тесты для всех этих сценариев, включая 604 смоделированных хода на синтетических изображениях, имитирующих кадры с камеры под углом и с шумами.

Так что проверить алгоритм распознавания можно прямо на ноутбуке, ещё до покупки оборудования.

Шахматный тренер

Когда распознавание ходов заработало достаточно надёжно, я задумался: а может, система ещё и научит меня чему‑нибудь? Если включить режим «Тренер», каждый ваш ход будет проходить две проверки:

  • Stockfish оценивает ход, сравнивая его с лучшим вариантом, который сам нашёл бы на максимальном уровне сложности. Возможные оценки: лучший ход, хороший ход, неточность, ошибка и грубая ошибка.

  • Затем python‑chess анализирует ход по нескольким простым правилам. Например, проверяет, не оставили ли вы незащищённую фигуру под боем, не допустили ли мат, не упустили ли возможность взятия без потерь, не создали ли вилку или связку, не сделали ли рокировку или не вывели ли фигуру из начальной позиции.

Обычные ходы система не комментирует, поэтому не будет отвлекать вас замечаниями на протяжении всей партии. Она подаёт голос только тогда, когда действительно есть что сказать. А когда ход делает компьютер, тренер объясняет, почему он выбрал именно этот вариант.

Как всё настроить самостоятельно

1. Устанавливаем приложение на UNO Q

Клонируйте репозиторий в папку приложений App Lab на плате:

git clone https://github.com/kevinmcaleer/uno\_q\_chess ~/ArduinoApps/chess-camera

Либо создайте новое приложение в App Lab и скопируйте в него папки проекта.

2. Подключаем и устанавливаем камеру

Подключите веб‑камеру к USB‑C‑хабу, а сам хаб — к UNO Q. Постарайтесь закрепить камеру как можно точнее над доской. Освещение должно быть равномерным, без резких теней.

3. Запускаем приложение

Откройте приложение в App Lab и нажмите Run.

Для запуска первой партии понадобится интернет: приложение загрузит Stockfish (около 30 МБ) в папку data/.

App Lab запускает приложения в контейнере без прав root, поэтому установить Stockfish через apt install не получится.

Вместо этого приложение самостоятельно скачивает Debian‑пакет Stockfish, используя обычный Python.

4. Открываем веб‑страницу

На телефоне или компьютере откройте в браузере адрес:

http://<UNO-Q-IP>:7000

5. Калибруем камеру

В разделе Camera выберите Calibrate («Калибровать»), а затем один из двух вариантов:

  • Нажмите Find board automatically («Найти доску автоматически»). Лучше всего работает, когда на доске нет фигур.

  • Либо вручную отметьте примерное положение внешних углов клеток a8, h8, h1 и a1, после чего нажмите Snap to squares («Привязать к клеткам»).

Увеличьте изображение и при необходимости перетащите угловые точки, чтобы точнее совместить сетку с доской.

Убедитесь, что голубая сетка совпадает с клетками, а клетка a1 подсвечена в правильном углу. Если это не так, нажмите Rotate labels («Повернуть обозначения»).

После этого нажмите Save calibration («Сохранить калибровку»). Повторная калибровка понадобится только в том случае, если камера сдвинется.

Calibrating the board

6. Играем

Расставьте фигуры, выберите свой цвет и уровень сложности компьютера, затем нажмите Start new game («Начать новую партию»).

Сделайте ход, уберите руку с доски и дождитесь ответа компьютера.

7. Необязательно: подключаем колонку к доске

UNO Q не выводит звук через HDMI, зато можно использовать Bluetooth‑колонку.

Приложение самостоятельно синтезирует речь с помощью espeak-ng и передаёт звук на аудиосервер платы через TCP‑порт 4712.

Для этого порт нужно один раз настроить.

Подробная инструкция, включая сопряжение колонки, настройку PipeWire и конфигурационный файл, который обеспечивает доступность порта после перезагрузки, есть в README репозитория.

Полезные советы

  • Обеспечьте равномерное освещение. Лампа с одной стороны создаёт тени, которые камера может принять за перемещение фигур. Лучше всего использовать два источника света или кольцевую лампу вокруг камеры.

  • Размещайте камеру строго над доской. Если снимать под углом, фигуры на изображении будут словно наклоняться в сторону соседних клеток. Это создаёт больше проблем, чем чуть большее расстояние до доски.

  • Следите за контрастностью. Чем лучше фигуры различимы на светлых и тёмных клетках, тем надёжнее система распознаёт ходы.

  • Приложение пропускает ходы? Увеличьте освещённость или уменьшите порог изменений в разделе Tuning. Распознаёт не тот ход? Увеличьте минимальную степень соответствия.

  • Застряло на сообщении «Waiting for the board to settle» («Ожидание неподвижного состояния доски»)? Значит, что‑то постоянно меняется в какой‑то части изображения. Чаще всего виноваты мерцающий свет или движущаяся тень.

  • Не получается распознать ход? Введите его вручную (e2e4 или Nf3) и передвиньте фигуру на доске.

Что дальше

Сейчас приложение уже умеет давать советы во время партии, но мне хочется, чтобы оно ещё и обучало шахматам.

Я работаю над вкладкой с уроками: сначала она будет объяснять, как ходят фигуры, затем познакомит с основами стратегии и популярными дебютами, например ферзевым гамбитом. И всё это с возможностью разыгрывать позиции на настоящей доске.

В дальнейшем хочу попробовать разместить на каждой фигуре распечатанные маркеры ArUco.

Тогда система сможет распознавать сами фигуры и начинать партию с любой расстановки на доске.

Ещё планирую добавить:

  • выбор фигуры при превращении пешки не в ферзя;

  • возможность сохранять партии в файлы PGN.

Если соберёте такую систему, мне будет очень интересно посмотреть, что у вас получилось. Напишите в комментариях, чему ещё, по‑вашему, стоит её научить.

Хотите научиться создавать устройства, которые не просто выполняют команды, а самостоятельно распознают объекты и принимают решения?

Разобраться в Edge AI и компьютерном зрении помогут бесплатные уроки:

  • 23 ноября, 20:00. «Edge AI баттл: Raspberry Pi 5 + Hailo-8 против Jetson Orin Nano». Записаться

  • 14 декабря, 20:00. «От YOLO к Vision Transformers: как меняется современный object detection». Записаться

А ещё загляните в ноябрьский дайджест OTUS — там собрано 52 бесплатных урока по программированию, архитектуре, инфраструктуре, ML и другим направлениям.

Комментарии (1)


  1. kalapanga
    06.11.2026 20:43

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