Skip to main content

Архитектура робототехнических систем. Как собрать робота, который работает правильно

Создание робота — это не просто “припаять датчик и написать код”. Это проектирование сложной системы, где все части должны работать вместе, не мешая друг другу, и продолжать работать даже когда что-то идет не так.

Что такое архитектура робота?

Простая аналогия: Построение дома.

  • Датчики — окна и двери (что видит и чувствует)
  • Моторы — ноги и руки (как двигается)
  • Микроконтроллер — мозг (что думает)
  • Архитектура — план дома (как всё это соединить)

Без плана дом может развалиться, даже если кирпичи хорошие.


Основные принципы хорошей архитектуры

1. Разделение ответственности

Каждая часть робота делает свою работу и не лезет в чужую.

Плохо:

void loop() {
  int distance = ultrasonic.read(); // Датчик
  if (distance < 20) {              // Логика
    motor.stop();                   // Действие
  }
  // Всё в одной функции!
}

Хорошо:

// Разные модули
class SensorManager {
  int getDistance() { /* только чтение датчиков */ }
};

class DecisionMaker {
  bool shouldStop(int distance) { /* только логика */ }
};

class MotorController {
  void stop() { /* только управление моторами */ }
};

2. Надежность и отказоустойчивость

Робот должен работать даже если:

  • Один датчик сломался
  • Батарея почти села
  • Получил неправильную команду

3. Простота тестирования

Можно проверить каждую часть отдельно:

  • Датчики → на столе
  • Логику → на компьютере
  • Моторы → без робота

Ключевые разделы архитектуры

Проблема: Как датчики “разговаривают” с мозгом?

Решение: Выбрать правильный “язык общения”:

  • I2C: Для многих датчиков на одной плате (например, IMU + датчик температуры)
  • UART: Для простого общения между платами (Arduino ↔ ESP32)
  • CAN: Для надежной связи в автомобилях и промышленности
  • Wi-Fi/BT: Для управления с телефона или связи с компьютером

Пример: Робот с камерой на Raspberry Pi и моторами на Arduino:

Камера (RPi) → Wi-Fi → Ноутбук (обработка)
Ноутбук → Serial → Arduino → Моторы

Проблема: Робот умирает через 10 минут работы.

Решение:

  1. Измерять потребление: Знать, сколько ест каждая часть
  2. Режимы сна: Выключать что можно, когда не нужно
  3. Умная зарядка: Не убивать батарею

Практика для школьного проекта:

  • Измерьте ток мультиметром: датчик, мотор, светодиод
  • Добавьте кнопку “сон”: робот просыпается только при нажатии
  • Сделайте индикатор заряда: мигает, когда батарея садится

Проблема: Робот завис и не реагирует.

Решение:

  • Watchdog таймер: Автоматическая перезагрузка при зависании
  • Проверка данных: “Если датчик показал 1000°C — это ошибка, игнорируем”
  • Резервные системы: Если основной датчик сломался, использовать запасной

Пример кода watchdog на Arduino:

#include <avr/wdt.h>  // Watchdog библиотека

void setup() {
  wdt_enable(WDTO_2S); // Перезагрузка через 2 секунды зависания
}

void loop() {
  wdt_reset(); // Сбрасываем таймер в каждой итерации
  // ... основной код ...
  // Если код зависнет дольше 2 секунд — перезагрузка
}

Проблема: Код превращается в спагетти, нельзя ничего изменить.

Решение: Использовать проверенные шаблоны:

FSM (Конечный автомат):

Состояния робота-уборщика:
[ИДЁТ] → [ВИЖУ ГРЯЗЬ] → [УБИРАЮ] → [ИДЁТ]
   ↑                                    ↓
   └────────── [БАТАРЕЯ СЕЛА] ←─────────┘

Pub-Sub (Издатель-подписчик):

Датчик расстояния ───[публикует]───> "расстояние: 30см"
Двигатель <──[подписан, получает]── и решает замедлиться

Практический пример: Архитектура робота-исследователя

Задача: Робот исследует комнату и строит карту

Архитектурное решение:

Слой 1: Железо (Hardware Layer)
├── Двигатели (2 мотора с энкодерами)
├── Датчики (УЗ-датчик спереди, ИК-датчики по бокам)
└── Вычислитель (Raspberry Pi 4)

Слой 2: Драйверы (Driver Layer)
├── Драйвер моторов (управляет скоростью через ШИМ)
├── Драйвер датчиков (читает значения, фильтрует шум)
└── Драйвер связи (отправляет данные на компьютер)

Слой 3: Логика (Logic Layer)
├── Навигация (решает, куда ехать)
├── Построение карты (запоминает, где был)
└── Избегание препятствий (объезжает стены)

Слой 4: Интерфейс (Interface Layer)
├── Веб-страница для управления
├── Логи (запись всех действий)
└── Экстренная остановка (красная кнопка)

Почему такая архитектура хороша:

  1. Можно тестировать слои отдельно

    • Драйверы → без робота
    • Логику → на компьютере
    • Интерфейс → с телефона
  2. Легко менять части

    • Заменить датчик → меняем только драйвер
    • Улучшить алгоритм → меняем только логику
  3. Понимает кто угодно

    • Четкое разделение: железо, драйверы, логика, интерфейс

Типичные ошибки в архитектуре

Ошибка 1: “Всё в одном файле”

robot.ino (1000 строк):
- Чтение 5 датчиков
- Управление 4 моторами
- Логика навигации
- Отправка данных по Wi-Fi
- Отображение на экране

Проблема: Нельзя ничего поменять, не сломав всё остальное.

Ошибка 2: “Нет резервных систем”

Робот едет по линии. Один ИК-датчик сломался.
Результат: Робот едет в стену.

Решение: Использовать 3-5 датчиков, считать среднее.

Ошибка 3: “Не думают о питании”

Крутой робот с камерой, лидаром, 8 моторами...
Работает от Power Bank 5V 2A.
Результат: Работает 15 минут.

Решение: Рассчитать потребление ДО начала сборки.


Проверь свою архитектуру

Вопросы для самопроверки:

  1. Могу ли я заменить один датчик, не переписывая весь код?
  2. Что сделает робот, если связь с компьютером прервется?
  3. Как я проверю, что моторы работают правильно, без всего робота?
  4. Сколько проработает робот от аккумулятора?
  5. Поймет ли другой человек мой код через месяц?

Если на все вопросы есть хорошие ответы — ваша архитектура в порядке!


Что дальше?

Разобрались с архитектурой? Теперь можно углубиться:

Совет: Прежде чем паять и программировать, нарисуйте архитектуру своего робота на бумаге. Покажите другу — поймет ли он? Если да — можно начинать делать.