Хостинг сайта на 8-битном микроконтроллере

17.05.2026 · 5 мин

Можно ли держать веб-сайт в интернете на микроконтроллере за доллар? Звучит как шутка, но один энтузиаст действительно заставил 8-битный AVR раздавать HTML — и это работает.

Железо: больше памяти, чем ожидаешь

Эксперимент построен на AVR64DD32 из линейки AVR DD от Microchip. Для микроконтроллера это внушительный запас ресурсов: 8 КБ SRAM, 64 КБ Flash и питание в широком диапазоне. Этого достаточно, чтобы не только исполнять код, но и держать простой сетевой стек.

Главная мысль здесь проста: даже очень скромный чип может оказаться не совсем «игрушкой», если у задачи минимальные требования к интерфейсу и логике.

Сетевое подключение: почему ethernet не подошёл

Классический Ethernet оказался слишком тяжёлым для такой платформы. Даже 10BASE-T требует высокой скорости и точной генерации сигнала, а периферия AVR DD для этого слишком медленная.

Вместо этого был выбран SLIP — старый, но рабочий способ передавать IP-пакеты поверх последовательного порта. Он оборачивает пакет байтами-ограничителями и экранирует служебные значения, чтобы кадры не слипались между собой.

На стороне Linux это поднимается стандартными утилитами: последовательный порт превращается в сетевой интерфейс, а дальше трафик можно маршрутизировать как обычный IP.

ПРИНЦИП РАБОТЫ SLIP
────────────────────────
┌───────────────┐
│  Данные IP    │
└───────────────┘
      │
      ▼
┌───────────────┐
│ Обрамление    │
│ C0 ... C0     │
└───────────────┘
      │
      ▼
┌───────────────┐
│ Экранирование │
│ C0 → DB DC    │
│ DB → DB DD    │
└───────────────┘
SLIP позволяет передавать IP-пакеты по обычной последовательной линии.

Сетевой стек: ip просто, tcp больно

IP оказался относительно простым: для ответа достаточно поменять местами адреса источника и назначения и обновить служебные поля.

TCP — уже совсем другая история. Здесь нужен контроль состояния соединения, окна передачи, повторная отправка потерянных пакетов и обработка множества краевых случаев. Именно TCP стал самой сложной частью проекта.

HTTP тоже не реализовали «по-взрослому»: микроконтроллер просто выдаёт заранее подготовленный ответ. Это нормально, если сайт фактически состоит из одной страницы.

АРХИТЕКТУРА СЕТЕВОГО СТЕКА НА MCU
──────────────────────────────────
┌───────────────┐
│ HTTP сервер   │
│ без маршрутов │
└───────┬───────┘
        ▼
┌───────────────┐
│ TCP           │
│ состояние     │
└───────┬───────┘
        ▼
┌───────────────┐
│ IP            │
│ swap src/dst  │
└───────┬───────┘
        ▼
┌───────────────┐
│ SLIP          │
│ encode/decode │
└───────┬───────┘
        ▼
┌───────────────┐
│ Serial TX/RX  │
└───────────────┘
Запрос проходит через несколько простых слоёв, прежде чем дойти до UART.

Публичный доступ: vpn вместо прямого адреса

Локальный сервер по UART сам по себе в интернет не виден, поэтому нужен внешний вход. Решение оказалось практичным: домашняя машина подключается к VPS через WireGuard, а уже VPS принимает запросы снаружи.

Дальше вступает в дело reverse proxy на Nginx: запросы по пути /mcu проксируются в туннель и попадают к микроконтроллеру. Так можно оставить основной сайт на VPS, не выставляя MCU наружу напрямую.

В итоге веб-запрос проходит длинный, но рабочий путь: интернет → VPS → WireGuard → домашний Linux → UART → микроконтроллер.

Что ограничивает систему больше всего?

Слабые места очевидны: всего 8 КБ RAM, 64 КБ Flash, ограниченная скорость последовательного интерфейса, отсутствие TLS и минималистичная реализация HTTP. Но для одной статической страницы этого достаточно.

Самое интересное не в том, что система может работать, а в том, насколько далеко можно увести идею «веб-сервер» от привычного железа, прежде чем она перестанет быть веб-сервером.

Выводы

Это хороший пример инженерного «зачем?», который всё же даёт полезные ответы.

Главная проблема чаще не в вычислениях, а в инфраструктуре вокруг них.

IDEA ──▶ DRAFT ──▶ REVIEW ──▶ PUBLISH
Путь от идеи до публикации.

Ссылки

Дмитрий Полухин — продуктовый дизайнер. Пишу про разработку, AI и дизайн интерфейсов. Обо мне, контакты и профили.