Привет! Это вторая часть. Первая была про то, как автомаляр без знания кода и 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):
Скачать все файлы.
Открыть диалог с DeepSeek (или любым ИИ).
Промпт:
*«Вот проект робота на смартфоне и ESP12: [файлы]. Перепиши прошивку под [твоя плата], сохранив логику WebSocket/JSON команд для моторов, серво, света. Если нужно — ��даптируй серверную часть (например, под Bluetooth)».*
ИИ сделает работу. Проверено.
7. Заключение
Эта статья — не учебник. Это честный рассказ о том, как один человек с паяльником и ИИ построил работающего робота. Все файлы открыты. Код можно форкать, адаптировать, улучшать.
Если у вас есть старый смартфон и пара вечеров — попробуйте. Если застрянете — DeepSeek поможет.
Ссылка на репозиторий:
https://gitverse.ru/donnik_evgeniy/Smartphone_FPV_droid_local.git
Ссылка на первую часть:
https://habr.com/ru/articles/1006480/
Вопросы — в комментарии. Отвечу. Скорее всего, с DeepSeek.
