Привет, Хабр!
Вы когда-нибудь мечтали о роботе, который не просто выполняет команды «едь прямо» или «поверни налево», а может обидеться на вас за глупый вопрос или радостно подмигнуть, увидев кота? Я тоже. И решил, что хватит мечтать — пора собирать.

В этой статье я расскажу, как за пару вечеров собрал "гипер-интерактивного" робота, используя Arduino Uno Q, немного Python-магии и Google Gemini Robotics API. У него нет рук, нет ног, но есть колеса, матричное лицо и, самое главное, — характер.
Идея: "Мозг" и "Мышцы"
Главная проблема DIY-роботов — вычислительная мощность. Arduino отлично крутит моторами, но "думать" ей нечем. Raspberry Pi умеет думать, но с real-time управлением железом там свои нюансы.
Я пошел по пути разделения ответственности:
MPU (Main Processing Unit): Мощный "мозг" на Python (ноутбук или в будущем Raspberry Pi), который видит, слышит и общается с LLM (Large Language Model).
MCU (Microcontroller Unit): "Мышцы" на Arduino, которые дергают сервоприводами, светят светодиодами и следят за датчиками.
Железо: Из чего же сделаны наши мальчишки?
Сборка получилась максимально доступной (ну, почти):
Arduino Uno Q : Звезда шоу. Встроенная LED-матрица 12x8 — это киллер-фича для создания "лица" робота без лишних проводов.
Шасси: Классическая двухколесная платформа (differential drive).
Сервоприводы: 2 штуки постоянного вращения (Continuous Rotation).
Глаза: 2 красных светодиода (потому что робот должен выглядеть немного зловеще, правда?). Подключены к пинам 2 и 3.
Сенсоры: Аналоговый датчик расстояния (чтобы не врезаться в стены, пока мечтает о захвате мира).
Периферия: USB-вебкамера, микрофон и колонка (подключены к "мозгу").
Схема подключения проста как пробка:
graph TD
Python[Python Brain] <-->|USB Serial| Arduino
Arduino --> LeftMotor[Левый мотор D5]
Arduino --> RightMotor[Правый мотор D6]
Arduino --> Eyes[Глаза D2, D3]
Arduino --> Matrix[Матрица 12x8]
Софт: Оживляем Франкенштейна
1. Arduino (C++)
Код для микроконтроллера занимается тем, что парсит команды от Python и управляет железом. Самое интересное тут — это эмоции.
Благодаря библиотеке Arduino_LED_Matrix, мы можем рисовать на встроенной матрице R4. Я определил несколько "кадров" для эмоций:
Neutral (Спокойствие)
Happy (Счастье)
Sad (Грусть)
Angry (Гнев — любимая эмоция моего робота)
Surprised (Удивление)
Команда от Python приходит в формате: L90;R90;E1;Y11.
L/R: Скорость моторов (90 — стоп).E: ID эмоции.Y: Состояние глаз (11 — оба горят, 10 — левый горит, и т.д.).
2. Python (The Brain)
Тут живет магия. Мы используем Google Gemini Robotics ER 1.5 Preview. Это не просто чат-бот, это мультимодальная модель, которая может "видеть" картинки и понимать контекст.
Самое важное — это System Prompt. Мы должны объяснить модели, кто она такая и как управлять своим телом.
self.system_prompt = """
You are a robot assistant with two wheels and NO arms.
You have an LED matrix for a face and two extra LEDs for eyes.
You must respond in valid JSON format ONLY.
The JSON schema is:
{
"speech": "text to speak",
"left_motor": int (-100 to 100),
"right_motor": int (-100 to 100),
"emotion": "neutral" | "happy" | "sad" | "angry" | "surprised",
"eyes": {"left": bool, "right": bool}
}
"""
Заметьте, мы не пишем if text == "hello": smile(). Мы даем модели полную свободу. Если она решит, что ваша шутка смешная, она вернет emotion: "happy". Если вы ее оскорбите — emotion: "angry" и, возможно, left_motor: 100 (таранный удар).
Как это работает в жизни
Цикл работы робота выглядит так:
Слушаем: Распознаем речь через
speech_recognition.Смотрим: Делаем снимок с веб-камеры.
Думаем: Отправляем текст + картинку + данные сенсоров в Gemini.
Действуем: Получаем JSON, парсим его и шлем команды на Arduino.
Говорим: Озвучиваем ответ через
pyttsx3.
Пример диалога:
Я: "Привет! Как настроение?" Робот (JSON от Gemini):
{
"speech": "Привет! Системы в норме, настроение боевое.",
"emotion": "happy",
"eyes": { "left": true, "right": true },
"left_motor": 0,
"right_motor": 0
}
На матрице загорается смайлик, глаза светятся.
Я: "Помигай глазами!" Робот:
{
"speech": "Пожалуйста. Бип-буп.",
"emotion": "neutral",
"eyes": {"left": false, "right": true},
...
}
Один глаз гаснет, робот подмигивает.
Грабли, на которые я наступил
Питание сервоприводов: Никогда, слышите, НИКОГДА не питайте моторы от 5V пина Arduino. Я поплатился часами отладки "почему оно перезагружается при повороте". Только внешнее питание!
JSON Hallucinations: Иногда LLM забывает закрыть скобку или добавляет лишний текст. Пришлось добавить
try-exceptи очистку от markdown-тегов.Задержки: Обработка картинки и запрос к API занимают время (1-2 секунды). Для real-time гонок не пойдет, но для вдумчивого собеседника — вполне.
Итоги
Проект получился живым. Это не просто машинка на радиоуправлении, это сущность, которая понимает, что происходит вокруг. Добавление эмоций через LED-матрицу и глаза кардинально меняет восприятие устройства. Оно кажется... живым?
Что дальше?
Добавление манипулятора (руки!), чтобы он мог не только смотреть, но и трогать.
SLAM навигация.
Код проекта открыт (ну, лежит у меня в папке), так что дерзайте! Роботы — это весело. Особенно когда они умеют злиться.
https://github.com/msveshnikov/arduino
P.S. Если робот начнет просить коды запуска ядерных ракет, я его отключу. Обещаю.