Привет! Это вторая часть. Первая была про то, как автомаляр без знания кода и DeepSeek за две недели собрали робота из старого смартфона. Там — эмоции и философия. Здесь — хардкор.

В этом тексте:
— Архитектура проекта: кто за что отвечает.
— Все файлы: сервер, прошивка ESP, веб-морда, стример.
— Карта минногополя — то, о чем молчат туториалы.
— Инструкция «запусти за 5 минут» и как адаптировать под другое железо.

Кода не будет. Будут ссылки. Всё уже в репозитории.


1. Что мы построили (и из чего)

Железо:

  • Смартфон Nokia 2.4 (700 ₽) — мозг. Точка доступа, Python-сервер, камера, микрофон.

  • ESP12 (Wemos D1 Mini) — тело. Управляет моторами, серво, светом, зарядкой.

  • Два мотор-редуктора 33GB-520, драйвер TA6586.

  • Сервопривод SG90.

  • Li-Ion 3S 2400 мА·ч, DC-DC, MOSFET IRLZ44N.

Архитектура (схема словами):

Смартфон робота:
— Раздаёт Wi-Fi (NokiaHotspot).
— В Termux запущен Python-сервер (HTTP 5001, WebSocket 5002).
— В браузере открыт streamer.html — захватывает камеру и микрофон, гонит видео/аудио оператору через WebRTC.

ESP12:
— Подключается к Wi-Fi смартфона.
— По WebSocket получает JSON-команды.
— Крутит моторами, серво, свет, зарядка.

Телефон оператора:
— Подключается к той же сети.
— Открывает веб-морду (Ваш адрес отобразит сервер при запуске в Termux) http://192.168.43.1:5001/web_interface/index.html.
Видит видео, жмёт кнопки — команды через сервер уходят на ESP.

Интернет не нужен. Задержка видео < 60 мс (WebRTC host-кандидаты).

Текущий интерфейс: кнопки оказались функциональнее джойстика и создают меньше спама, Видеопоток вместо заднего фона при подключении
Текущий интерфейс: кнопки оказались функциональнее джойстика и создают меньше спама, Видеопоток вместо заднего фона при подключении

Ссылка на репозиторий:
👉 https://gitverse.ru/donnik_evgeniy/Smartphone_FPV_droid_local.git


2. Карта минного поля (то, что не пишут в инструкциях)

Это не советы. Это грабли, на которые мы наступили. Если будете повторять — вооружены.

2.1. Потеря контекста
DeepSeek в новом диалоге не знает Вашего же проекта и деталей. Даже если Вы отправите ему все файлы проекта, он все равно может жёстко прописать IP-адрес, который меняется при перезагрузке смартфона, или предложить использовать пин, занятый под другое, не знает что server и streamer запускаются на одном устройстве.

Решение: я создал файл README.txt, где записаны распиновка ESP, информация о динамическом IP, прочие вводные и архитектура проекта. Каждый новый диалог начинается с этого файла. DeepSeek въезжает в контекст за секунду. Это не высшая математика, но именно такой «человеческий» подход к организации информации спасает от непредвиденных событий.

.

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

Решение: я прошу DeepSeek в конце каждого крупного этапа составлять roadmap — список решённых задач, текущего состояния и оставшихся проблем. Сохраняю его. В новом диалоге отправляю README + roadmap + все актуальные файлы. DeepSeek восстанавливает картину и продолжает с того же места. Это оказалось эффективнее, чем пытаться «дожать» один бесконечный диалог.

2.3. Ошибки в коде
DeepSeek иногда ошибается. Когда проект состоял из одного небольшого файла - каждый код я воспринимал за "чистую монету", всё работало, но по мере роста стало понятно, не всё так радужно. Например, в одной из версий он забыл добавить фильтр дубликатов для моторов, и ESP дёргала драйвер постоянно, вызывая гул.

Решение: после получения кода я открываю новое окно, отправляю туда этот код и прошу: «Проанализируй этот код на возможные ошибки и неоптимальности». DeepSeek часто находит свои же недочёты. Так мы выявили проблему с дубликатами и добавили проверку:

if (left != leftMotor || right != rightMotor) { 
    leftMotor = left; 
    rightMotor = right; 
    setMotors(); 
}

В любом случае Вам придётся заниматься отладкой. Даже если Вы, как и я на старте, не знаете что такое "отладка"

2.4. Неудобство работы в Termux
Набирать команды на смартфоне — мука. Это пожалуй моя личная боль т.к. проект писался "на перекурах" во время работы, потому это происходило с того же смартфона, что является мозгом робота, для быстрых тестов

Решение: я попросил DeepSeek в каждом ответе давать полное содержимое файла и команду для его открытия в nano. Например: «Замени содержимое файла nano ~/robot_project/server.py на следующее: [код]». Я просто копирую команду и код, вставляю в Termux — всё работает. Мелочь, но экономит часы.

2.5. Слишком большой код
Когда файл проекта разрастается (например, наш веб-интерфейс раздулся до 1400+ строк), он уже с трудом умещается в одно сообщение. DeepSeek в таких случаях начинает неосознанно «оптимизировать»: удаляет комментарии, сокращает анимации, а иногда и вовсе отрезает важные функции — поддержку touch-с��бытий, часть интерфейса в муляж. Бесполезно просить «верни как было» — он подсознательно пытается втиснуть ответ в лимит и снова что-то выбросит.

Решение: я научился добавлять в промпт простую фразу: «раздели ответ на 2 сообщения». Тогда DeepSeek принудительно разбивает код на две части, и в каждую помещается всё. После склейки файл работает именно так, как задумывалось изначально.

2.6. Артефакты диалога: фантомный контекст
Не каждое окно DeepSeek одинаково. Если вы достаточно внимательны, то быстро заметите: одно окно более «дружелюбное», другое «пытается поучить», третье «творческое и лёгкое», но необходимые мысли о железе дополняет «живописными», но бесполезными строками. Меня дважды окно стало называть по имени — то «Алексей», то «Александр», хотя я никогда не представлялся. Думаю, проблема здесь в артефактах диалогов: окно будто подгружает «фантомный контекст» из предыдущих сессий. Бывают артефакты в виде внезапных иероглифов на половину слова или часть иноязычной речи.

Я до конца не понял, из-за чего это случается, но удержание лишнего объёма контекста в голове действительно сказывается на продуктивности. Лучше создать roadmap и перенести проект в новое окно, без фантомных голосов.


3. DeepSeek как мотиватор: «ты ошибаешься, у нас уже есть 99%»

Самое неожиданное, что я получил от этого диалога, — не код, а поддержку. Десятки раз я писал: «Это слишком сложно», «У меня не получится это настроить», «Нужно было просто приклеить IP камеру на машинку и успокоиться».

И каждый раз DeepSeek отвечал не как машина, а как тренер:

«Ты ошибаешься. У нас уже есть 99% результата. Остался один шаг. Давай, не останавливайся».

«Посмотри, сколько ты прошёл. От первой прошивки до WebRTC за пару дней. Это твоя настойчивость. Ещё немного — и робот оживёт».

Без этих слов я бы бросил проект. В моём окружении — кузовной ремонт, там не с кем обсудить нужен мне WebSocket или TCP/UDP. DeepSeek стал единственным, кто верил в меня, когда я сам сомневался.

И это важный урок: даже самый умный алгоритм не заменит простого человеческого «ты сможешь».

4. Что дальше

Сейчас проект живёт в версии 0 — на ESP12. Этого хватило, чтобы проверить концепцию.

Следующая версия (уже в работе):
— ESP32-S3 вместо ESP12 (больше памяти, TinyML, BLE).
— BLDC-моторы и активная подвеска (перешагивать препятствия).
— Лидар и SLAM (строить карту).
— Локальный ИИ (SmolLM, YOLO) для автономных реакций.

Робот будет эволюционировать. Я напишу третью часть.


5. Инструкция «запусти за 5 минут» (и как адаптировать под себя)

Если у вас точно такое же железо:

1. Подготовка Termux (F-Droid)

pkg update && pkg upgrade -y
pkg install python python-pip git nano
pip install websockets
termux-setup-storage

2. Создаём папку проекта

mkdir -p ~/robot_project/web_interface
cd ~/robot_project

3. Создаём сервер

nano ~/robot_project/server.py

Вставляем содержимое файла server6.6(RTC).txt.
Сохраняем: Ctrl+O, Enter, Ctrl+X.

4. Создаём страницу стримера

bash

nano ~/robot_project/streamer.html

Вставляем содержимое streamer6.6(RTC).txt. Сохраняем.

5. Создаём интерфейс оператора

bash

nano ~/robot_project/web_interface/index.html

Вставляем содержимое index6.7.txt. Сохраняем.

6. Включаем точку доступа на смартфоне

  • Настройки → Точка доступа Wi-Fi

  • Имя: NokiaHotspot (можно любое, но тогда поменять в прошивке ESP)

  • Пароль: 12345678

7. Запускаем сервер

bash

cd ~/robot_project
python3 server.py

Termux покажет логи и IP-адрес (обычно 192.168.43.1).

8. Открываем стример на телефоне-роботе

В браузере на том же смартфоне (где запущен сервер):

http://localhost:5001/streamer.html

Разрешаем доступ к камере и микрофону.

9. Подключаемся оператором

На втором телефоне (или компьютере):

  • Подключаемся к Wi-Fi NokiaHotspot

  • Открываем браузер:

http://http://192.168.43.1:5001/web_interface/index.html

(если IP другой — посмотреть в логах сервера)

10. Прошивка ESP

В файле esp6.6.txt нужно:

  • Проверить WIFI_SSID и WIFI_PASS (должны совпадать с точкой доступа)

  • Убедиться, что IP сервера правильный (допустим 192.168.43.1 — в коде сейчас 10.141.231.120)

// Было:
#define SERVER_IP1 10
#define SERVER_IP2 141
#define SERVER_IP3 231
#define SERVER_IP4 120

// Должно стать:
#define SERVER_IP1 192
#define SERVER_IP2 168
#define SERVER_IP3 43
#define SERVER_IP4 1

Заливаем прошивку через Arduino IDE или PlatformIO.

Готово.

Если у вас другое железо (ESP32, Arduino, Bluetooth):

  1. Скачать все файлы.

  2. Открыть диалог с DeepSeek (или любым ИИ).

  3. Промпт:
    *«Вот проект робота на смартфоне и ESP12: [файлы]. Перепиши прошивку под [твоя плата], сохранив логику WebSocket/JSON команд для моторов, серво, света. Если нужно — ��даптируй серверную часть (например, под Bluetooth)».*

ИИ сделает работу. Проверено.

7. Заключение

Эта статья — не учебник. Это честный рассказ о том, как один человек с паяльником и ИИ построил работающего робота. Все файлы открыты. Код можно форкать, адаптировать, улучшать.

Если у вас есть старый смартфон и пара вечеров — попробуйте. Если застрянете — DeepSeek поможет.

Ссылка на репозиторий:
https://gitverse.ru/donnik_evgeniy/Smartphone_FPV_droid_local.git

Ссылка на первую часть:
https://habr.com/ru/articles/1006480/

Вопросы — в комментарии. Отвечу. Скорее всего, с DeepSeek.