Arduino Uno · pinport
готово
⋮

Робот Port поднимается по лестнице

Port поднимается на четыре ступени приставным шагом: места стоп — по плану лестницы, корпус — по расчёту ZMP с предуправлением, как у настоящих шагающих роботов.

Что на схеме

Плата Arduino Uno, к ней подключены:

  • Робот-человек Port — r1, площадка «Лестница»

Задействованы выводы платы: GND, A4, A5. Всего соединений на схеме: 3.

Как смотреть

Нажмите ▶ Запустить — после сборки откроется окно робота (потом его открывает кнопка 🤖 над схемой). Мышью камеру можно повернуть, колесом — приблизить; щелчок по суставу показывает номер привода, канал PCA9685 и строку кода для него. Кнопка ⏺ над схемой записывает сцену в GIF — с теми поворотами камеры, что вы делаете.

Робот — не анимация, а модель с массами, шарнирами и трением: скетч только шлёт импульсы приводам и читает датчики, а встанет робот, пойдёт или упадёт — решает физика. Как она устроена — на странице «Физика сцен с роботами».

Как это работает

Где ставить стопы, скетч знает заранее: по полу — шаги по 12 см, последний — вплотную к первой ступени, по лестнице — приставным шагом, стопа — на середину ступени. Шагающая стопа сначала поднимается, потом идёт вперёд, потом опускается — носок не цепляет край.

Корпус ведёт расчёт по ZMP (точке нулевого момента) с предуправлением: робот считается «тележкой на столе», и чтобы точка опоры шла по стопам, корпус должен начинать движение заранее. Контроллер смотрит на 1,6 секунды вперёд; коэффициенты посчитаны заранее и лежат во флеше. Плата ещё и оценивает, где у робота центр масс, когда одна нога выше другой, — по массам звеньев и наклону корпуса.

Всё это укладывается в Arduino Uno: такт управления 20 мс, из них работа — около 11 мс.

Что попробовать

  • Уберите поправку центра масс (offX, offZ всегда 0) — и посмотрите, как Port заваливается на ступенях.
  • H_STAIR = 0.86 — таз на лестнице не опускается: дотянется ли нога до нижней ступени?

Библиотеки

Дополнительных библиотек не нужно: всё делается ядром Arduino AVR, которое уже стоит в сборочном окружении.

Как это устроено в коде

Основное, чем пользуется скетч:

  • MPU6050 — акселерометр и гироскоп по I²C
  • micros() — микросекунды с запуска, для коротких интервалов
  • millis() — миллисекунды с запуска: на них строят работу без остановки
  • Serial.println() — печатает строку в монитор порта
  • Serial.begin() — открывает монитор порта на заданной скорости
  • Wire.begin() — поднимает шину I²C, по ней говорят датчики и дисплеи
  • delay() — пауза, на время которой ядро занято ожиданием

В скетче 348 строк; свои функции: reg(), setJoint(), leg(), treadOf(), nextFoot(), planMore(), zmpRef(), pushRef(); подключено заголовков: 3. Сам скетч открыт на соседней вкладке — его можно менять и запускать заново.

Что попробовать изменить

  • Поменяйте период в константе и посмотрите на анализаторе, как меняется картина на выводе.
  • Добавьте свои Serial.println() в интересных местах — монитор порта здесь и есть отладчик.
  • Перенесите деталь на другой вывод — на схеме и в коде — и убедитесь, что пример работает так же.
  • Нажмите «Форкнуть»: копия станет вашим проектом, и в ней можно менять что угодно.
Схема подключения: Робот Port поднимается по лестнице (Arduino Uno)
Схема подключения: Робот Port поднимается по лестнице (Arduino Uno)

Смотрите также

← Все примеры галереи

Схема
Проект из галереи — запускать можно, менять нельзя.

      
Сборка ещё не запускалась.

    Печатайте в Serial числа — они станут графиком. Serial.println(t); — один ряд, Serial.printf("t:%.1f h:%.1f\n", t, h); — два с подписями. Формат тот же, что понимает плоттер Arduino IDE.