Skip to main content

🎛️ Управление и регулирование

Теория управления для роботов

Вы командуете: “Поверни на 90°”. Мотор крутится… но как узнать, что он повернул именно на 90°? Что если нагрузка больше? Что если батарея села?

Теория управления решает эту проблему: робот измеряет результат и корректирует свои действия.


Что вы узнаете

Почему робот без датчиков — это “слепой” робот. Как измерить результат и использовать его для коррекции.

Для кого: 5-7 класс и старше

Главный инструмент управления в робототехнике. Как настроить, чтобы робот не раскачивался и быстро достигал цели.

Для кого: 7-9 класс и старше

Почему иногда робот начинает “вибрировать” или раскачиваться всё сильнее. Как избежать нестабильности.

Для кого: 9-11 класс


Главная идея

БЕЗ обратной связи:
[Команда: 90°] → [Мотор] → [???]
                           Никто не проверяет!

С обратной связью:
[Команда: 90°] → [Сравнение] → [Регулятор] → [Мотор] → [Энкодер]
       ↑              ↓                                    ↓
       └──────── [Ошибка] ←────────────────────────────────┘
                 "Сейчас 85°, нужно ещё 5°"

Аналогия: душ с регулировкой температуры

Без обратной связи:

  1. Открыли кран на “тёплую” позицию
  2. Вода может быть холодной (давление упало) или горячей (кто-то смыл унитаз)
  3. Вы этого не знаете, пока не зайдёте в душ

С обратной связью:

  1. Открыли кран
  2. Потрогали воду — холодная!
  3. Добавили горячую
  4. Потрогали — горячая!
  5. Убавили горячую
  6. Потрогали — в самый раз! ✓

Вы — PID-регулятор! Вы измеряете (рука), сравниваете с желаемым (комфортная температура) и корректируете (кран).


Где это используется?

СистемаЧто регулируетсяДатчик
Робот по линииПоложение над линиейИК-датчики
КвадрокоптерУглы наклонаГироскоп
МанипуляторУгол поворотаЭнкодер
3D-принтерПозиция соплаКонцевики + шаговый мотор
ТермостатТемператураТермодатчик
Круиз-контрольСкоростьСпидометр

Быстрый старт: простейший регулятор

// Пропорциональный регулятор (только P)
int target = 100;  // Целевое значение (например, расстояние)

void loop() {
  int current = analogRead(SENSOR_PIN);  // Текущее значение
  int error = target - current;           // Ошибка
  int output = error * 2;                 // Управляющее воздействие (Kp = 2)
  
  motor.write(output);
}

Это уже работает! Но для точного управления нужен полноценный PID — читайте дальше.