RC-лодка на ESP8266 NodeMCU
Примерно полгода мне понадобилось, чтобы собрать такую лодку на дистанционном управлении.
Я расскажу про процесс разработки с самого начала: от лодки из потолочной плитки, гелевой ручки и консервной банки до модели из пластика, которую не стыдно подарить.
Если интересно, какие шишки мне пришлось набить, прошу под кат!
Осторожно! Под катом много картинок!
Оглавление
- Зачем?
- Какой должна быть лодка?
- Прототип дистанционного управления 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 и передавал команды уже по установленному с сервером соединению.
Схема подключения
Второй прототип
Пример управления
Подробно про то, как собрать такую машинку, я писал тут.
Немного теории и материалов
Прежде чем перейти непосредственно к тексту про создание лодки, я должен вкратце рассказать, из чего она состоит.
Картинка взята тут
Основные части, про которые я буду говорить, выделены синим цветом:
1 — перо руля/руль,
2 — винт,
3 — дейдвуд,
4 — тут должна быть муфта,
5 — мотор.
Основные материалы, которыми я вдохновлялся и пользовался
Книги:
Больше всего нужного мне материла я нашёл в книге John Finch. «Advanced R/C boat modeling». Смотрел и другие, но зашла именно эта.
Cтатьи:
Видеокурс как сделать ракетный катер
Тестирование дальности приёма
Чтобы проверить, на какую дальность можно рассчитывать в управлении, собрал вот такую штуку:
На клиенте можно запустить ping/pong
тест к WebSocket серверу с замером времени ответа.
В таблицу выводится количество запросов/ответов и перцентиль времени ответа.
Походив по парку при прямой видимости, понял, что приемлемая для меня связь между такой поделкой и моим смартфоном держится на расстоянии не более 27 метров (расстояние потом проверял по картам).
27 метров: 95 перцентиль ~ 48 миллисекунд, 99 перцентиль ~ 283 миллисекунды.
Интерфейс клиента для тестирования дальности приёма
Вот тут можно взять код и провести эксперимент самому.
Версия 1.0
Электронные компоненты:
- ESP8266 NodeMCU,
- L298N,
- Servo SG90,
- щёточный двигатель TT130,
- powerbank,
- трёхцветный светодиод.
Материалы:
- корпус из потолочной плитки,
- руль из консервной банки,
- дейдвуд из гелевой ручки и деревянной шпажки склеен клеевым пистолетом,
- винт куплен на aliexpress.
Особенности версии:
- руль расположен впритык к корпусу лодки;
- угол основного вала относительно корпуса лодки довольно большой, и дейдвуд выходит под дном лодки;
- дейдвуд нещадно протекает.
У меня была рабочая схема дистанционного управления, так что можно было заняться корпусом.
Чтобы собрать корпус лодки, я использовал чертежи из статьи Francisco Moliner
Распечатал их, склеил и вырезал из потолочной плитки.
Пока я собирал корпус и думал о том, из чего же делать дейдвуд, ко мне приехал бесщёточный двигатель A2212 1000KV.
По неопытности я заказал двигатель для коптеров:
- крутится не только вал двигателя, а сам двигатель относительно основания (как его крепить на лодку?);
- специфичный контроллер двигателя.
Я неделю промучился с этим двигателем.
У меня получилось запустить мотор, но при резком изменении напряжения (быстро повысил или понизил скорость) двигатель отключался и контроллер перезагружался.
Думаю, что это из-за небольшой мощности питательного элемента (powerbank).
В конце концов я решил отказаться от него в пользу более мощного щёточного двигателя.
Тщетно пытаюсь настроить стабильную работу мотора
Сборка идёт полным ходом
Первый тестовый спуск на воду
Я понял, что у меня получится сделать хороший прототип, но он будет непрезентабельный.
Решил, что настала пора заказать 3D-принтер, который уже давно хотелось опробовать.
Версия 1.1
Особенности версии:
- добавил крышу, чтобы в лодку сверху не могла попасть вода (всё равно заклеивал верх скотчем во время испытаний);
- немного вынес руль от корпуса лодки, чтобы улучшить управление;
- уменьшил угол наклона основного вала, чтобы увеличить мощность лодки;
- дейдвуд из гелевой ручки, прута от зонта и технического масла (почти не протекает);
- заменил L298N на L298N mini (размер меньше, в данной версии разницы особой не было);
- скорость лодки не регулируется;
- новый мотор R280 3–12v 5000–15000 rpm намного мощнее предыдущего.
Для управления скоростью мотора я использовал L298N, но при этом терял почти половину мощности.
Это особенность использования ШИМ или сама схема так сделана — точно не знаю.
Я решил отказаться от управления скоростью. В итоге использовал L298N, но без управления ШИМ, что дало большой прирост мощности мотора.
Первый спуск на воду
К сожалению, я выбрал самый близкий, но очень заросший пруд.
Проплыв всего полтора метра, лодка намотала водоросли на вал винта и перестала слушаться управления.
Спустя десять минут, используя несколько веток, склеенных скотчем в одну большую, мы смогли достать пострадавшую из воды.
Вот первые фото лодки, но уже после того заплыва:
Не самый чистый пруд Питера
Хорошо видно, как расположены руль и винт
Видно, как водоросли намотались на вал
Лодка всё ещё немного протекала, поэтому пришлось искать место течи.
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 часов
Пробная печать
Печать дейдвуда и муфты
Новый корпус выглядел аккуратно
Отлично работает!
Но было непонятно, что делать с отверстием, в которое попадает вода:
Версия 3.0
Электронные компоненты:
- ESP8266 NodeMCU,
- L298N,
- Servo SG90,
- щёточный двигатель R370 3–12v 10000–41000 rpm,
- powerbank,
- 3 светодиода.
Материалы:
- корпус из пластика;
- руль из пластика;
- дейдвуд из пластика, прута от зонта и технического масла.
Особенности версии:
- весь корпус из пластика.
До этого работал только в Компас 3D
для моделирования несложных моделей, но принципы во Fusion360
примерно те же.
Пришлось несколько выходных позаниматься, чтобы понять, как оптимально строить такие модели.
Спустя пару недель первая пригодная версия модели корпуса лодки была готова!
Разделил корпус на несколько частей и начал печатать.
Не особо разбирался с настройками печати, поэтому качество не очень.
Нос лодки
Корма лодки
Верх лодки
Процесс сборки корпуса
Готовый корпус
Также смоделировал и распечатал руль.
Решил проблему с отверстием для управления пером руля (видно на фото). В результате вода почти перестала попадать через него внутрь лодки.
Одна из финальных версий
Один трёхцветный светодиод заменил на 3 разных
Новый мотор периодически не включался с первого раза, и это ооочень раздражало и расстраивало.
Решил, что это опять связано с мощностью питательного элемента (powerbank), поэтому экспериментировал с обычными батарейками АА. С ними вроде стало получше.
Эксперимент с батарейками AA
Внезапно понял, что, скорее всего, у меня в powerbank’е стоит несколько аккумуляторов и я могу их соединить так, как нужно мне.
Разобрал powerbank иии… нет, там всего один элемент…
Всего один элемент в powerbank
Решил, что нужно заказать аккумуляторы.
Версия 3.1
Особенности версии:
- вместо powerbank’a установлены 4 аккумулятора 18650 (2 для контроллера и 2 для мотора);
- смоделированы и распечатаны отсеки для аккумуляторов;
- мотор начал работать стабильно.
Наконец-то!
Отсеки для новых аккумуляторов:
Контакты по-прежнему из консервных банок
Отсеки вклеены в лодку
Версия 3.2
Особенности версии:
- вал в дейдвуде заменён на велосипедную спицу (больше диаметр и длина).
Нельзя просто так взять и заменить уже вклеенный дейдвуд
Версия 3.3
Особенности версии:
- переделал муфту на более гибкий вариант;
- обратно поставил L298N, он должен выдерживать бОльшие токи.
Часть гибкой муфты
Полный комплект новой версии
Весь корпус и основные детали из пластика!
Первый спуск на воду версии 3.x
При реальных испытаниях стало понятно, что дистанция, на которой держится хорошая связь между смартфоном и лодкой, примерно в три раза меньше, чем при тестах (27 метров против ~10 метров).
Несколько раз соединение с лодкой терялось на середине пруда, и нам приходилось ждать, пока ветерок подтолкнёт её к одному из берегов, где к ней снова можно было подключиться и начать управлять.
После таких казусов был введён параметр Emergency timeout, который можно настроить на клиенте (по умолчанию — 4 минуты). Он передаётся серверу с каждой командой. Если за этот таймаут лодке не приходили команды, то она начинала неспешно двигаться вперёд, в закат. На небольшом пруду это была отличная стратегия. В море такой таймаут лучше убрать)
Вспомнил, что отказался от бесщёточного двигателя как раз из-за слабых питательных элементов.
Попробовал подключить их к аккумуляторам 18650, и всё заработало как надо!
Из-за того, что бесщёточный двигатель предназначен для коптера, то просто так горизонтально установить его не получится (крутится весь двигатель, кроме основания).
Поэтому смоделировал и напечатал подложку для него.
Первая версия подложки
Подложка подошла идеально
Первая версия подложки для двигателя отлично подходила к нему, но плохо вписывалась в корпус лодки, так что пришлось ещё немного поэкспериментировать с её формой.
Спустя 2–3 распечатанных модели наконец-то получилось сделать подложку, которая хорошо помещалась внутри лодки и не мешала работе двигателя.
Весь вал в сборке от мотора до винта
Версия 3.4
Особенности версии:
- установлен бесщёточный двигатель A2212 1000KV,
- смоделирована и распечатана подложка для двигателя.
Вклеил двигатель и тестировал его отдельно
Полный комплект новой версии
Собранная версия
Взвесил лодку в полной комплектации:
В полной комплектации лодка весит 626 грамм
Версия 3.5
Особенности версии:
- проклеил верх резинками, чтобы крышка прилегала плотно;
- добавил ещё два отверстия для винтов в крышке, опять-таки, чтобы она прилегала плотно;
- проклеил места креплений мотора и аккумуляторов суперклеем.
Проклеил верх резинками
Финальный вариант:
Финальное видео версии 3.5
UI клиента
При свёрнутом меню настроек для управления доступна почти вся область экрана
Настройки:
- 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) — включение дебага, при котором отображаются подробные ошибки подключения и все команды.
Все таймауты отправляются серверу в каждой команде, поэтому настроить их можно в любой момент.
Управление направлением
Управление скоростью
Итоги
Весь процесс растянулся примерно на полгода. Дорабатывать и улучшать модель можно было бы ещё очень долго. Я решил остановиться на достигнутом результате.
Другу подарок понравился, так что я доволен вдвойне)
Исходники 3D-моделей и кода лодки тут.
Исходники кода тестов дальности тут.
Спасибо за внимание!
P.S. Большое спасибо моей девушке за поддержку и ведение фото- и видеоотчетов.