RC-лодка на ESP8266 NodeMCU

xoe7pqmltv02ncrknbn5zj64pfg.jpeg

Примерно полгода мне понадобилось, чтобы собрать такую лодку на дистанционном управлении.
Я расскажу про процесс разработки с самого начала: от лодки из потолочной плитки, гелевой ручки и консервной банки до модели из пластика, которую не стыдно подарить.
Если интересно, какие шишки мне пришлось набить, прошу под кат!


Осторожно! Под катом много картинок!


Тут можно сразу посмотреть, что получилось в итоге


Оглавление


  • Зачем?
  • Какой должна быть лодка?
  • Прототип дистанционного управления 1.0
  • Прототип дистанционного управления 2.0
  • Тестирование дальности приёма
  • Немного теории и материалов
  • Версия 1.x
  • Версия 2.x
  • Версия 3.x
  • UI клиента
  • Заключение


Зачем?

Ещё с детства у меня было особое желание собрать модель на дистанционном управлении.
Неважно, какую. Главное — собрать самому.

После знакомства с Arduino я начал смотреть другие контроллеры и наткнулся на ESP8266 NodeMCU. Прочитал про него и понял, что на его основе смогу осуществить задуманное.

Дело было в марте. У моего друга день рождения летом, и я решил, что за такой большой срок точно успею собрать лодку и подарить ему (спойлер: я опоздал на месяц).
Он любитель рек и озёр, так что выбор водного транспортного средства в качестве модели был очевиден.


Какой должна быть лодка?

Итак, я решил сделать лодку на дистанционном управлении.

Как я представлял себе готовую модель

Электронные компоненты:


  • ESP8266 NodeMCU;
  • сервопривод SG90 для руля (самый простой и дешёвый);
  • бесщёточный мотор (быстрый и мощный);
  • powerbank для питания мотора и контроллера (удобно заряжать и можно использовать не только для лодки);
  • 3 светодиода (удобно дебажить):
    • питание на контроллер,
    • подключение клиента к WebSocket серверу,
    • получение команды от клиента.

Материалы:


  • потолочная плитка в качестве основного материала корпуса (с ней легко работать, она недорогая и продаётся в любом строительном магазине);
  • эпоксидка или что-то подобное для укрепления корпуса в перспективе;
  • руль из жести (с материалом легко работать и он довольно надёжный);
  • дейдвуд из велосипедной спицы, пары подшипников и какой-то трубы (самый простой и дешёвый способ);
  • клеевой пистолет для скрепления всех деталей (потому что с клеевым пистолетом всё становится лучше).

Управлять лодкой я хотел со смартфона: удобно, ведь он всегда заряжен и под рукой.


Прототип дистанционного управления 1.0

Для начала собрал простой прототип машинки из LEGO, деталей от других поделок с Arduino и powerbank’а.

На ESP8266 NodeMCU я поднял:


  • Wi-Fi точку со статичным IP-адресом, куда можно подключиться со смартфона;
  • HTTP-сервер:
    • отдача HTML-страницы с 5 кнопками, чтобы можно было управлять машинкой;
    • API для управления машинкой от кнопок с HTML-страницы.

Схема подключения
Схема подключения

Первый прототип
Первый прототип

Отлично, оно работает!


Прототип дистанционного управления 2.0

Управлять кнопками не очень-то удобно, поэтому я переделал интерфейс и стал управлять прикосновениями к определёнными частям экрана.
При таком интерфейсе приходилось часто слать запросы серверу, поэтому я добавил WebSocket сервер на ESP8266 NodeMCU и передавал команды уже по установленному с сервером соединению.

Схема подключения
Схема подключения

Второй прототип
Второй прототип

Пример управления
Пример управления

Подробно про то, как собрать такую машинку, я писал тут.


Немного теории и материалов

Прежде чем перейти непосредственно к тексту про создание лодки, я должен вкратце рассказать, из чего она состоит.

78a99bb0d853a801342db7a16f87ec4f.png
Картинка взята тут

Основные части, про которые я буду говорить, выделены синим цветом:
1 — перо руля/руль,
2 — винт,
3 — дейдвуд,
4 — тут должна быть муфта,
5 — мотор.

Основные материалы, которыми я вдохновлялся и пользовался

Книги:

Больше всего нужного мне материла я нашёл в книге John Finch. «Advanced R/C boat modeling». Смотрел и другие, но зашла именно эта.

Cтатьи:

Видеокурс как сделать ракетный катер


Тестирование дальности приёма

Чтобы проверить, на какую дальность можно рассчитывать в управлении, собрал вот такую штуку:

vcjclohrb17nht1z6nu2gf_kfwk.jpeg

fqftsoremy7wufz9p0mcv0bhcjc.jpeg

На клиенте можно запустить ping/pong тест к WebSocket серверу с замером времени ответа.
В таблицу выводится количество запросов/ответов и перцентиль времени ответа.

Походив по парку при прямой видимости, понял, что приемлемая для меня связь между такой поделкой и моим смартфоном держится на расстоянии не более 27 метров (расстояние потом проверял по картам).
27 метров: 95 перцентиль ~ 48 миллисекунд, 99 перцентиль ~ 283 миллисекунды.

Интерфейс клиента для тестирования дальности приёма
Интерфейс клиента для тестирования дальности приёма

Вот тут можно взять код и провести эксперимент самому.

Версия 1.0
Электронные компоненты:


  • ESP8266 NodeMCU,
  • L298N,
  • Servo SG90,
  • щёточный двигатель TT130,
  • powerbank,
  • трёхцветный светодиод.

Материалы:


  • корпус из потолочной плитки,
  • руль из консервной банки,
  • дейдвуд из гелевой ручки и деревянной шпажки склеен клеевым пистолетом,
  • винт куплен на aliexpress.

Особенности версии:


  • руль расположен впритык к корпусу лодки;
  • угол основного вала относительно корпуса лодки довольно большой, и дейдвуд выходит под дном лодки;
  • дейдвуд нещадно протекает.

У меня была рабочая схема дистанционного управления, так что можно было заняться корпусом.

Чтобы собрать корпус лодки, я использовал чертежи из статьи Francisco Moliner
Распечатал их, склеил и вырезал из потолочной плитки.

ke7vg41g4ejy9yfr_h4fzttcijq.jpeg

Пока я собирал корпус и думал о том, из чего же делать дейдвуд, ко мне приехал бесщёточный двигатель A2212 1000KV.
По неопытности я заказал двигатель для коптеров:


  • крутится не только вал двигателя, а сам двигатель относительно основания (как его крепить на лодку?);
  • специфичный контроллер двигателя.

Я неделю промучился с этим двигателем.
У меня получилось запустить мотор, но при резком изменении напряжения (быстро повысил или понизил скорость) двигатель отключался и контроллер перезагружался.
Думаю, что это из-за небольшой мощности питательного элемента (powerbank).
В конце концов я решил отказаться от него в пользу более мощного щёточного двигателя.

Тщетно пытаюсь настроить стабильную работу мотора
Тщетно пытаюсь настроить стабильную работу мотора

Сборка идёт полным ходом
Сборка идёт полным ходом

Первый тестовый спуск на воду

Я понял, что у меня получится сделать хороший прототип, но он будет непрезентабельный.
Решил, что настала пора заказать 3D-принтер, который уже давно хотелось опробовать.

Версия 1.1
Особенности версии:


  • добавил крышу, чтобы в лодку сверху не могла попасть вода (всё равно заклеивал верх скотчем во время испытаний);
  • немного вынес руль от корпуса лодки, чтобы улучшить управление;
  • уменьшил угол наклона основного вала, чтобы увеличить мощность лодки;
  • дейдвуд из гелевой ручки, прута от зонта и технического масла (почти не протекает);
  • заменил L298N на L298N mini (размер меньше, в данной версии разницы особой не было);
  • скорость лодки не регулируется;
  • новый мотор R280 3–12v 5000–15000 rpm намного мощнее предыдущего.

Для управления скоростью мотора я использовал L298N, но при этом терял почти половину мощности.
Это особенность использования ШИМ или сама схема так сделана — точно не знаю.
Я решил отказаться от управления скоростью. В итоге использовал L298N, но без управления ШИМ, что дало большой прирост мощности мотора.


Первый спуск на воду

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

Спустя десять минут, используя несколько веток, склеенных скотчем в одну большую, мы смогли достать пострадавшую из воды.
Вот первые фото лодки, но уже после того заплыва:

Не самый чистый пруд Питера
Не самый чистый пруд Питера

Хорошо видно, как расположены руль и винт
Хорошо видно, как расположены руль и винт

Видно, как водоросли намотались на вал
Видно, как водоросли намотались на вал

Лодка всё ещё немного протекала, поэтому пришлось искать место течи.

Cинюю жижицу отлично видно на белом фоне
Cинюю жижицу отлично видно на белом фоне

Версия 1.2
Особенности версии:


  • установил защиту для винта от водорослей,
  • увеличил площадь пера руля,
  • сменил пруд.

Очищенная от грязи лодка выглядит намного лучше
Очищенная от грязи лодка выглядит намного лучше

Увеличена площадь руля
Увеличена площадь руля

Добавлена защита от водорослей
Добавлена защита от водорослей

Первый удачный спуск на воду:

Версия 1.3
Особенности версии:


  • длина лодки уменьшена в полтора раза.

Внезапно я понял, что на лодку уйдет много пластика, поэтому решил сделать её немного короче.
Чтобы посмотреть, как будет выглядеть укороченная версия, переделал уже имеющийся корпус.

Версия 2.0
Электронные компоненты:


  • ESP8266 NodeMCU,
  • L298N,
  • Servo SG90,
  • щёточный двигатель R370 3–12v 10000–41000 rpm,
  • powerbank,
  • трёхцветный светодиод.

Материалы:


  • корпус из потолочной плитки;
  • руль из пластика;
  • дейдвуд из пластика, прута от зонта и подшипников.

Особенности версии:


  • смоделировал и распечатал руль, дейдвуд и муфту;
  • использовал новый мотор R370 3–12v 10000–41000 rpm;
  • вынес винт и руль дальше от лодки;
  • собрал корпус с новыми габаритами;
  • убрал защиту для винта от водорослей.

Приехал 3D-принтер!

Посылка из Китая пришла в отличном состоянии
Посылка из Китая пришла в отличном состоянии

Процесс сборки затянулся примерно на 6 часов
Процесс сборки затянулся примерно на 6 часов

Пробная печать
Пробная печать

Печать дейдвуда и муфты
Печать дейдвуда и муфты

4hxq2hrv3imwiojgxoxoqbkephy.jpeg

Новый корпус выглядел аккуратно
Новый корпус выглядел аккуратно

Отлично работает!

Но было непонятно, что делать с отверстием, в которое попадает вода:

plup9mxumy0ajssgcclfnaosmac.jpeg

tqhwcr-j_ecdqo8_ail1pdyesko.jpeg

Версия 3.0
Электронные компоненты:


  • ESP8266 NodeMCU,
  • L298N,
  • Servo SG90,
  • щёточный двигатель R370 3–12v 10000–41000 rpm,
  • powerbank,
  • 3 светодиода.

Материалы:


  • корпус из пластика;
  • руль из пластика;
  • дейдвуд из пластика, прута от зонта и технического масла.

Особенности версии:


  • весь корпус из пластика.

До этого работал только в Компас 3D для моделирования несложных моделей, но принципы во Fusion360 примерно те же.
Пришлось несколько выходных позаниматься, чтобы понять, как оптимально строить такие модели.
Спустя пару недель первая пригодная версия модели корпуса лодки была готова!

nrvampjubdhlareh6lyjp2flvcm.png

l_ua9ssufq2q1twzo6ifnlikixo.png

8cazg57fru7oq7et-bxgpcuvmh4.png

7krtb71teiy7tkxzj8x-i962pew.png

Разделил корпус на несколько частей и начал печатать.
Не особо разбирался с настройками печати, поэтому качество не очень.

xpm3n-pzqy8lyvdcqncq78mvske.jpeg

Нос лодки
Нос лодки

cqjzsigqwu7lwj0r_smfltlh-im.jpeg

Корма лодки
Корма лодки

upwp3nvab0i__intcng89cg2gmg.jpeg

Верх лодки
Верх лодки

Процесс сборки корпуса
Процесс сборки корпуса

4zj5n0uonchg0neskbqsw6mljja.jpeg

Готовый корпус
Готовый корпус

Также смоделировал и распечатал руль.
Решил проблему с отверстием для управления пером руля (видно на фото). В результате вода почти перестала попадать через него внутрь лодки.

Одна из финальных версий
Одна из финальных версий

qsax7lkrf5rh9pcbzf8yotwxaci.jpeg

lasdohgxt0sjtkv8esplbgamr0w.jpeg

r3wj9g6znf8t1-gxae8lovkj6ay.jpeg

Один трёхцветный светодиод заменил на 3 разных
Один трёхцветный светодиод заменил на 3 разных

Новый мотор периодически не включался с первого раза, и это ооочень раздражало и расстраивало.
Решил, что это опять связано с мощностью питательного элемента (powerbank), поэтому экспериментировал с обычными батарейками АА. С ними вроде стало получше.

Эксперимент с батарейками AA
Эксперимент с батарейками AA

Внезапно понял, что, скорее всего, у меня в powerbank’е стоит несколько аккумуляторов и я могу их соединить так, как нужно мне.
Разобрал powerbank иии… нет, там всего один элемент…

Всего один элемент в powerbank
Всего один элемент в powerbank

Решил, что нужно заказать аккумуляторы.

Версия 3.1
Особенности версии:


  • вместо powerbank’a установлены 4 аккумулятора 18650 (2 для контроллера и 2 для мотора);
  • смоделированы и распечатаны отсеки для аккумуляторов;
  • мотор начал работать стабильно.

Наконец-то!

Отсеки для новых аккумуляторов:
cxqkhacay4rhc5yavh3vigxvr8s.png

fz_lxtjshzsssjsj6usj5nhduha.jpeg

Контакты по-прежнему из консервных банок
Контакты по-прежнему из консервных банок

npexhzzfjj6w4a_q6ohghs50_tm.jpeg

Отсеки вклеены в лодку
Отсеки вклеены в лодку

Версия 3.2
Особенности версии:


  • вал в дейдвуде заменён на велосипедную спицу (больше диаметр и длина).

quewezj3hbcifmn46xt-btso5gi.jpeg

va5sxi641uiabtzr6mhl8s3j-yq.jpeg

Нельзя просто так взять и заменить уже вклеенный дейдвуд
Нельзя просто так взять и заменить уже вклеенный дейдвуд

Версия 3.3
Особенности версии:


  • переделал муфту на более гибкий вариант;
  • обратно поставил L298N, он должен выдерживать бОльшие токи.

Часть гибкой муфты
Часть гибкой муфты

r4v8mhpo4h0u17mx9nrru1mgmvi.jpeg

am8flvmji534uhgsg4oyigjnnos.jpeg

Полный комплект новой версии
Полный комплект новой версии

2llwbkuvmumkaqljvjy_rl6-auu.jpeg

Весь корпус и основные детали из пластика!
Весь корпус и основные детали из пластика!

Первый спуск на воду версии 3.x

При реальных испытаниях стало понятно, что дистанция, на которой держится хорошая связь между смартфоном и лодкой, примерно в три раза меньше, чем при тестах (27 метров против ~10 метров).
Несколько раз соединение с лодкой терялось на середине пруда, и нам приходилось ждать, пока ветерок подтолкнёт её к одному из берегов, где к ней снова можно было подключиться и начать управлять.
После таких казусов был введён параметр Emergency timeout, который можно настроить на клиенте (по умолчанию — 4 минуты). Он передаётся серверу с каждой командой. Если за этот таймаут лодке не приходили команды, то она начинала неспешно двигаться вперёд, в закат. На небольшом пруду это была отличная стратегия. В море такой таймаут лучше убрать)

Вспомнил, что отказался от бесщёточного двигателя как раз из-за слабых питательных элементов.
Попробовал подключить их к аккумуляторам 18650, и всё заработало как надо!
Из-за того, что бесщёточный двигатель предназначен для коптера, то просто так горизонтально установить его не получится (крутится весь двигатель, кроме основания).
Поэтому смоделировал и напечатал подложку для него.

ao2cp9vlw_hqzgnmazvqbt-y8jq.jpeg

Первая версия подложки
Первая версия подложки

Подложка подошла идеально
Подложка подошла идеально

Первая версия подложки для двигателя отлично подходила к нему, но плохо вписывалась в корпус лодки, так что пришлось ещё немного поэкспериментировать с её формой.

Спустя 2–3 распечатанных модели наконец-то получилось сделать подложку, которая хорошо помещалась внутри лодки и не мешала работе двигателя.

8l0b6jotnxntbmlc1tgd5l2gfvu.png

Весь вал в сборке от мотора до винта
Весь вал в сборке от мотора до винта

Версия 3.4
Особенности версии:


  • установлен бесщёточный двигатель A2212 1000KV,
  • смоделирована и распечатана подложка для двигателя.

Вклеил двигатель и тестировал его отдельно
Вклеил двигатель и тестировал его отдельно

Полный комплект новой версии
Полный комплект новой версии

hgkn61hxwtgxxf4mnvi_ki71l2s.jpeg

Собранная версия
Собранная версия

Взвесил лодку в полной комплектации:
В полной комплектации лодка весит 626 грамм
В полной комплектации лодка весит 626 грамм

Версия 3.5
Особенности версии:


  • проклеил верх резинками, чтобы крышка прилегала плотно;
  • добавил ещё два отверстия для винтов в крышке, опять-таки, чтобы она прилегала плотно;
  • проклеил места креплений мотора и аккумуляторов суперклеем.

pet7s470wiym6wihq14frgs2vr0.jpeg

Проклеил верх резинками
Проклеил верх резинками

Финальный вариант:

yribaxw0sv4es6ufk1wbn_0jk14.jpeg

cn7l7jsi9qo8k1v8kboqzdcmpwm.jpeg

9gdpvx95klkkbr3xhftjhbuvjjy.jpeg

Финальное видео версии 3.5


UI клиента

t8w3tjwvrad5wvlpt6wvyhc5xpm.jpeg
При свёрнутом меню настроек для управления доступна почти вся область экрана

Настройки:


  • Auto move (on/off) — во включённом состоянии скорость не регулируется и задаётся в параметре Speed.
  • Speed (%) — используется в связке с параметром Auto move.
  • Move interval (ms) — интервал, через который будут отправляться команды с клиента. Мы не можем отправлять команды очень редко: тогда управление лодки будет происходить с большой задержкой. Очень маленькую задержку мы ставить тоже не можем, потому что контроллер не будет успевать обрабатывать запросы. По умолчанию — 50 миллисекунд.
  • Move timeout (ms) — интервал, через который лодка поймёт, что новые команды ей больше не приходят. Некоторые команды доходят до контроллера с задержкой, то есть между командами есть паузы больше, чем в параметре Move interval. Чтобы движение при этом оставалось плавным, был введён параметр Move timeout. Лодка будет выполнять последнюю команду Move timeout миллисекунд. По умолчанию — 600 миллисекунд.
  • Emergency timeout (ms) — если за таймаут не приходят команды, то лодка начинает неспешно двигаться вперёд. По умолчанию — 4 минуты.
  • Debug (on/off) — включение дебага, при котором отображаются подробные ошибки подключения и все команды.

Все таймауты отправляются серверу в каждой команде, поэтому настроить их можно в любой момент.

Управление направлением
Управление направлением

Управление скоростью
Управление скоростью


Итоги

Весь процесс растянулся примерно на полгода. Дорабатывать и улучшать модель можно было бы ещё очень долго. Я решил остановиться на достигнутом результате.

Другу подарок понравился, так что я доволен вдвойне)

8yiugs39fr3_wx1xpnkhh-jflz8.jpeg

xpxydqbfe_peexp3rmyflf7l1pw.jpeg

Исходники 3D-моделей и кода лодки тут.
Исходники кода тестов дальности тут.

Спасибо за внимание!

P.S. Большое спасибо моей девушке за поддержку и ведение фото- и видеоотчетов.

© Habrahabr.ru