Да будет онлайн битва роботов на Arduino
Я построил для вас роботов, а вам остаётся только запрограммировать их. Паяльник покупать не нужно, L298N из Китая ждать тоже: Uno, драйвер моторов, дальномер и датчики линии уже собраны и работают прямо в браузере. И это не мультяшная анимация. Робот там честно падает, буксует и вылетает с ринга по законам физики.
Что за Rotor
Rotor это виртуальный колёсный робот. Его подключение я сделал один в один как у популярного набора:
Arduino Uno
драйвер моторов L298N
ультразвуковой дальномер HC-SR04
датчики линии TCRT5000
То есть скетч, который вы отладили в симуляторе, можно залить в настоящего робота из такого набора. На схеме у Uno задействованы выводы GND, A4, A5, D5, D7, D8, D6, D9, D10, D11, D12, A0, A1, A2, D2, D3. Всего 16 соединений.
Важный момент: скетч не говорит роботу "встань вот в такую позу" или "проедь два метра". Он делает ровно то же, что и на реальном железе: выставляет уровни на выводах драйвера L298N и читает датчики. А куда робот в итоге поедет, решает физический движок.
Правила соревнований по мини-сумо
Правила мини-сумо простые: два робота на круглом ринге, кто вытолкнул соперника или не съехал сам, тот и молодец. По правилам робот должен помещаться в 10 × 10 см и весить не больше 500 г, а после старта по команде стоит 5 секунд. Rotor этим габаритам соответствует.
В моём примере вместо соперника коробка. Ринг 77 см, чёрный с белой каёмкой.
Алгоритм у робота такой:
Крутится на месте и меряет расстояние дальномером.
Если что-то ближе 60 см, это цель, и он едет вперёд на полной мощности.
Датчики линии замечают белую каёмку раньше, чем колёса доедут до края. Тогда робот сдаёт назад и разворачивается внутрь ринга.
Коробка, которую довезли до края, падает с помоста. Победа.
В симуляторе я поставил задержку перед стартом 1 секунду, чтобы не скучать. Если хочется как на соревнованиях, ставите START_MS = 5000.
Весь скетч занимает 75 строк. Свои функции в нём: motor(), drive(), distanceCm() и onEdge(). Дополнительных библиотек не нужно, хватает штатного ядра Arduino AVR.
Как смотреть
Нажимаете «Запустить», и после сборки открывается окно робота. Есть режим «Вид сверху»: плоский план с разметкой, следом робота, лучом дальномера и стрелками моторов. Обвод датчика линии становится красным, когда он стоит на чёрном. В строке состояния видно напряжение на моторах в процентах и показания датчиков.
Проект можно форкнуть, поменять код и запустить заново, ничего не ломая.
Почему это не анимация: физика под капотом
Самое интересное тут движок. Робот это трёхмерная модель с массами, шарнирами и трением, а считает её Rapier 3D (версия 0.21), физический движок с открытым кодом, собранный в WebAssembly.
Что стоит знать:
Детерминизм. Я взял сборку deterministic: одни и те же входные данные дают одинаковый результат до последнего бита на любом компьютере и в любом браузере. Если робот упал, падение можно повторить и разобрать по кадрам. Случайных чисел и шума нет.
Плата и физика идут в ногу. Прошивка исполняется 2 мс модельного времени, затем физика делает один шаг мира тоже на 2 мс, и так по кругу. Это 500 шагов в секунду. Время модельное: millis() и micros() в скетче считают время прошивки, а не часы компьютера. Слабый компьютер покажет движение медленнее, но результат будет тем же.
Один код в трёх местах. Тот же код считает робота в браузере (в фоновом потоке), в node (тесты) и на сервере (проверка уроков). Поэтому задание, пройденное в браузере, засчитывается и сервером.
Единицы СИ. Метры, килограммы, секунды, ньютон-метры, тяжесть 9,81 м/с². Оси мира: Y вверх, Z вперёд, X влево.
Точный решатель. 20 итераций на шаг и допуск проникновения 0,3 мм. С допуском по умолчанию (5 мм) стопа шагающего робота проседала краем в пол и опрокидывалась, так что мне пришлось повозиться.
Трение сухое, по Кулону. Пол и подошвы имеют коэффициент 1,0, остальные звенья робота 0,6, а предметы вроде кубика и мяча 0,8 с упругостью 0,1. Коробка в сумо как раз такой предмет: она сталкивается со всем, в том числе с самим роботом.
Весит движок около 4 МБ и грузится только на страницах, где в схеме есть робот.
Честно об упрощениях
Сразу скажу, где модель идеальна:
у моторов нет люфта, нагрева, падения напряжения и просадки батареи;
звенья абсолютно твёрдые и не гнутся;
колёса и подошвы жёсткие, резина не сминается;
у датчиков нет шума и смещения нуля.
Так что симулятор отлично учит логике: поиск цели, реакция на край, развороты. А вот настоящую мощность моторов и сцепление колёс с реальным рингом всё равно придётся подбирать руками.
Что попробовать
Поставить START_MS = 5000, как на настоящих соревнованиях.
Искать цель, вращаясь то в одну, то в другую сторону. Найдётся ли коробка быстрее?
Переключиться на площадку «Ринг сумо» без коробки и проехать по рингу минуту, ни разу не съехав.
Заменить delay() на счёт по millis(), чтобы loop() освободился для параллельных задач.
Добавить Serial.println() в интересных местах: монитор порта здесь служит отладчиком.
Робот построен, ринг готов. Ваш ход: пишите свой алгоритм и устраивайте битву.
Ссылки
Устройство и подключение робота: https://pinport.ru/robot/car
Как устроена физика: https://pinport.ru/robot/physics
Пример «Rotor выталкивает коробку с ринга»: https://pinport.ru/p/ex-robot-car-sumo
Все мои роботы на Arduino: https://pinport.ru/gallery/robots





























