PicoClaw на Arduino Uno Q

PicoClaw на Arduino Uno Q

Мода на ИИ-помощников, кажется, достигла пика. Даже далёкие от темы люди интересуются, что такое OpenClaw и как его установить. Более продвинутые пользователи покупают Mac Mini M4 — 16 Гб единой памяти и нейропроцессорные ядра позволяют запускать локальные модели, а устройство при этом тихое и энергоэффективное.

Ограничения OpenClaw

У OpenClaw есть не только преимущества, но и серьёзные недостатки. Речь не о безопасности, а о системных требованиях. Минимум — 2 Гб ОЗУ, рекомендуется 4 Гб. Плюс нужен как минимум 4-поточный CPU, иначе возможны проблемы с параллельными задачами.

На сцену выходят китайские разработчики из Sipeed — те самые, кто создал миниатюрный NanoKVM. «Подержите наше Tsingtao», — словно заявили они, представив PicoClaw: ИИ-ассистент, которому хватает 10 Мб ОЗУ и одноядерного CPU с частотой 600 МГц. Сегодня — тест этого чуда китайской инженерии на Arduino Uno Q.

Что такое PicoClaw

PicoClaw — это не альтернатива OpenClaw. Он не справляется со сложными сценариями, но идеален для простых задач. Может работать с локальными моделями, с моделями на удалённом ПК с GPU или напрямую с облачными сервисами вроде ChatGPT и Claude.

Проект создан в рамках экосистемы Sipeed, специализирующейся на дешёвых платах на архитектуре RISC-V. Например, LicheeRV Nano построен на SoC SOPHGO SG2002: два ядра RISC-V C906 (1 ГГц и 700 МГц), всего 256 Мб ОЗУ.

Такие ограничения исключают тяжёлые среды вроде Node.js. Вместо этого PicoClaw почти полностью написан на Go. Это резко снижает потребление памяти. Любопытно, что 95% кода сгенерировано ИИ, а platform-specific части доработаны вручную.

Например, в Makefile есть патч для сборки под MIPS: Go по умолчанию не ставит флаг EF_MIPS_NAN2008, а ядро Ingenic X2600 требует его. Патч вручную меняет 4 байта в e_flags — чисто для совместимости.

Оптимизации в основном стандартные: build tags для исключения тяжёлых зависимостей, флаги линковщика без таблицы символов и DWARF. Это сократило размер бинарника почти на треть. Сборщик мусора работает в штатном режиме — без нестандартных настроек.

PicoClaw — не конкурент OpenClaw, а «киллер-фича»: ИИ-ассистент на плате за 10 долларов. Поддерживаемые архитектуры впечатляют: Windows, Linux, macOS, FreeBSD, NetBSD, Android. Возможна даже установка на Nintendo Wii с NetBSD — интересно? Пишите в комментариях.

Установка и запуск

Arduino Uno Q работает под Debian, поэтому установка стандартна. На момент написания актуальна версия 0.2.1. Скачиваем пакет с GitHub и устанавливаем через dpkg.

Выполняем базовую настройку — аналог openclaw onboard. Или сразу редактируем конфиг, указав используемые модели и каналы связи: Slack, Telegram, IRC — для любителей ретрокомпьютинга.

Я выбрал локальную модель qwen3-4b-thinking-2507 через LM Studio. Запускаю сервер на домашнем ПК и указываю модель в двух местах конфига PicoClaw. Затем запускаю сам ассистент.

Отображение статуса

Uno Q — не просто одноплатник. У него есть MPU и MCU STM32U585, а также встроенная LED-матрица на 104 светодиода. Разрешение маленькое (8×13), но идея — отображать статус PicoClaw через анимации.

Где брать статус

У PicoClaw нет полноценного API для внешнего мониторинга. Есть только:

  • /health — жив/мертв;
  • /ready — готов/не готов.

А мне нужно отображать: «думает», «принимает», «отправляет», «свободен». Таких состояний в PicoClaw нет. Форкнуть и добавить /status — сложно и долго.

Решение: читать stdout. Туда выводятся строки вроде Processing message from, LLM response, Routed message, Published outbound response. Перенаправляю stdout в файл и пишу простой HTTP-сервер, который отслеживает эти строки и выдаёт нужный статус.

Добавил сброс статуса через 4 секунды — иначе он «залипает».

Встроенная LED-матрица

Матрица: 8 строк × 13 столбцов. Управление — через библиотеку Arduino_LED_Matrix. Инициализация в скетче стандартна.

Создаю пять анимаций:

  1. Thinking — «эффект матрицы» (пиксели бегут вниз);
  2. Receiving — антенна со сходящимися волнами;
  3. Sending — антенна с расходящимися волнами;
  4. Ready — статичное изображение краба;
  5. Clear — пустой экран.

Сначала пробовал шестерёнку для «думает» — на таком разрешении неразборчиво. «Матрица» смотрится лучше.

Анимации — это последовательность кадров. Для антенны использовал одни и те же кадры (ant0–ant5), но в разном порядке — экономия кода.

MPU и MCU: как передавать статус

Связь между MPU (Linux) и MCU (STM32U585) — через UART. MCU использует Serial1, Linux — /dev/ttyS0. Прямой полнодуплексный канал.

Поверх UART — RPC-протокол на основе MsgPack (бинарный аналог JSON). При компиляции скетчей подтягиваются библиотеки MsgPack, ArxContainer, ArxTypeTraits — для сериализации.

Самый сложный слой — arduino-router. Он работает на MPU как демон, держит /dev/ttyS0 открытым и выступает брокером между Python-кодом (на MPU) и скетчами (на MCU). Без него не было бы мультиплексирования: несколько Python-процессов не смогли бы делить UART.

Router также обеспечивает устойчивость к перезапускам контейнеров. Иначе каждый рестарт требовал бы повторного handshaking с MCU.

Плюс — независимость от языка. Хотите писать не на Python, а на другом ЯП? Реализуйте MsgPack-клиент к роутеру. MCU всё равно — он общается по RPC.

Контейнеры и сеть

App Lab запускает приложения в Docker-контейнерах. А PicoClaw и сервер статусов — на хосте. Проблема: при обновлении App Lab может измениться IP-адрес шлюза. Хардкодить — плохо.

Решение: скрипт автоопределения IP через /proc/net/route. Читаем маршрут по умолчанию, извлекаем шлюз, конвертируем из hex. Если ошибка — fallback на 172.17.0.1 (стандартный Docker bridge).

Теперь соединение устойчиво к смене адресов.

Сборка воедино

Финальный пайплайн:

  • Запуск PicoClaw;
  • Запуск сервера статусов;
  • Перенаправление логов;
  • Отправка статуса на MCU через роутер.

Создан скрипт start_picoclaw.sh с поддержкой запуска и остановки:

#!/bin/bash
stop_all() {
  echo "Останавливаем..."
  pkill -f "picoclaw gateway" 2>/dev/null
  pkill -f state_server.py 2>/dev/null
  pkill -f "tee /home/arduino/picoclaw.log" 2>/dev/null
  echo "Готово"
}
start_all() {
  picoclaw gateway 2>&1 | tee /home/arduino/picoclaw.log &
  python3 /home/arduino/state_server.py &
  echo "Всё запущено"
}
case "$1" in
  stop) stop_all ;;
  *) start_all ;;
esac

Добавил автозапуск через cron:

@reboot sleep 10 && /home/arduino/start_picoclaw.sh

Теперь после включения питания через 10 секунд запускаются PicoClaw и сервер статусов.

Заключение

Этот эксперимент показал, насколько эффективным может быть лёгкий ИИ-ассистент. PicoClaw — отличная альтернатива OpenClaw для простых задач. Пишу ему в Telegram, он обращается к локальной модели или в облако, выбирает решение и возвращает ответ.

Всё это работает быстро, бесшумно и с низким энергопотреблением. А LED-матрица позволяет с первого взгляда понять, занят ли помощник — можно ли задать вопрос или попросить выполнить действие, например, создать файл.

А вы пробовали PicoClaw? Делитесь впечатлениями в комментариях.

Читать оригинал