Делаем из смартфона websocket-пульт управления радиоуправляемой машинкой

Одной из самых увлекательных сторон работы с микроконтроллерами, лично для меня, является то, что вы можете создать свой собственный аппарат, управляемый по радиоканалу. Есть большое количество разных возможностей для удалённого управления устройствами. В этой же статье мы поговорим о том, как организовать такое управление с помощью микроконтроллера esp32.
В свою бытность, я также как и многие, прошёл путь по созданию разных устройств, базирующихся на модулях HC-05, HC-06:
Источник картинки: www.microsin.net
Однако в данный момент, использование таких модулей представляется нецелесообразным, так как они обладают достаточно высокой ценой, позволяют управлять устройством только по Bluetooth и в то же время требуют наличия внешнего микроконтроллера.
Такая связка была бы целесообразной в начале 2010-х годов, но в настоящее время стоит использовать более современный подход. А если более конкретно, то в качестве микроконтроллера мы возьмём esp32, управлять которым будем с экрана своего смартфона.
Есть разные способы отправки управляющих команд, но, в нашем случае, так как мы рассматриваем способ создания управляемого в реальном времени устройства, то лучше всего использовать передачу команд по протоколу websockets.
Для чего это нужно, вкратце: «нажали на кнопку управления — машинка поехала, отпустили кнопку управления — машинка остановилась» (ну и ещё могут быть всякие плюшки, вроде ответов машинки, отправляемых нам).
Это могут быть не обязательно машинки, это может быть управление различными роботизированными устройствами, что может быть не менее увлекательным.
В этом примере мы разберём только способ передачи команд, реализацию же для конкретных исполнительных устройств, вы сможете разобрать самостоятельно, в зависимости от вашего устройства.
С точки зрения соединения, мы будем подключаться к микроконтроллеру по wifi, где точкой доступа будет выступать наш смартфон (то есть и пультом управления — он же, а управлять будем, соответственно, — машинкой). Поэтому изначально необходимо сконфигурировать и запустить точку доступа на смартфоне, после чего ввести в скетч параметры доступа к ней:
// вставляем ниже SSID и пароль для своей WiFi-сети: const char* ssid = "сюда название сети"; const char* password = "сюда пароль";
Далее запускаем асинхронный веб-сервер на 80 порту и создаём объект, который будет обрабатывать websocket-ы:
AsyncWebServer server(80); AsyncWebSocket ws("/ws");
Далее нам необходимо создать веб-страницу, которая будет отображаться у пользователя. Эту страницу мы помещаем в массив index_html.
Как можно видеть, код содержит отдельные блоки, в частности, каскадную таблицу стилей, в которой определяются все шрифты, кнопки, на которые будет нажимать пользователь:
Вот такой кусок
html < font-family: Arial, Helvetica, sans-serif; text-align: center; >h1 < font-size: 1.8rem; color: white; >h2 < font-size: 1.5rem; font-weight: bold; color: #143642; >.topnav < overflow: hidden; background-color: #143642; >body < margin: 0; >.content < padding: 5 px; //30px; display: flex; justify-content: center; // margin: 0 auto; text-align: center; // margin-left: auto; // margin-right: auto; >.content2 < padding: 5 px; //30px; display: flex; justify-content: space-between; // // padding: px; //30px; // max-width: 400px; // margin: 0 auto; >.content3 < padding: 40 px; //30px; display: flex; justify-content: center; >.button1 < padding: 15px 50px; font-size: 24px; text-align: center; outline: none; color: #fff; background-color: #0f8b8d; border: none; border-radius: 5px; width: 670px; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -webkit-tap-highlight-color: rgba(0,0,0,0); >.button2 < padding: 15px 5px; font-size: 24px; text-align: center; outline: none; color: #fff; background-color: #0f8b8d; border: none; border-radius: 5px; width: 140px; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -webkit-tap-highlight-color: rgba(0,0,0,0); >/*.button:hover */ .button:active
Там же отдельными классами прописываются кнопки:
Для обработки нажатий используется JavaScript код, в котором происходит настройка websocket-ов, а также прописывается реакция на происходящие события:
var gateway = `ws://$/ws`; var websocket; window.addEventListener('load', onLoad); function initWebSocket() < console.log('Trying to open a WebSocket connection. '); websocket = new WebSocket(gateway); websocket.onopen = onOpen; websocket.onclose = onClose; websocket.onmessage = onMessage; >function onOpen(event) < console.log('Connection opened'); >function onClose(event) < console.log('Connection closed'); setTimeout(initWebSocket, 2000); >function onMessage(event) < var state; if (event.data == "1")< state = "ON"; >else < state = "OFF"; >document.getElementById('state').innerHTML = state; >
Кроме того, инициализируется обработчики нажатий кнопок:
function onLoad(event)
и прописывается конкретный сценарий, который будет происходить при начале касания и его окончании (будет вызвана соответствующая функция):
function initButton() < document.getElementById('button').addEventListener('touchstart', forward, false); document.getElementById('button').addEventListener('touchend', stopper, false); >function initButton2() < document.getElementById('button2').addEventListener('touchstart', left, false); document.getElementById('button2').addEventListener('touchend', stopper, false); function initButton3() < document.getElementById('button3').addEventListener('touchstart', right, false); document.getElementById('button3').addEventListener('touchend', stopper, false); >function initButton4()
Эта функция, соответственно, посылает определённое сообщение, при произошедшем событии:
function forward() < websocket.send('forward'); >function left() < websocket.send('left'); >function right() < websocket.send('right'); >function reverse() < websocket.send('reverse'); >function stopper()
Теперь нам нужно создать обработчик сообщений, который будет вызываться, при каждом получении нового сообщения. Как можно видеть, при каждом из событий происходит вывод дежурного сообщения в Serial и запись состояния строковой переменной state. Она нужна для прописывания в дальнейшем логики происходящего. Например: «если мы едем вперёд, и поступило сообщение на поворот влево, то машинка начинает плавно подруливать влево».
Именно здесь, чтобы понимать, что происходит в данный момент, и требуется считывать состояние переменной state:
Разбор websocket-сообщения
void handleWebSocketMessage(void *arg, uint8_t *data, size_t len) < // обрабатываем получаемые сообщения AwsFrameInfo *info = (AwsFrameInfo*)arg; if (info->final && info->index == 0 && info->len == len && info->opcode == WS_TEXT) < data[len] = 0; if (strcmp((char*)data, "forward") == 0) < ledState = !ledState; Serial.println("Forward"); // "Вперёд" state = "Forward"; //сюда вписать обработку для движения вперёд; >else if (strcmp((char*)data, "left") == 0) < ledState = !ledState; Serial.println("Left"); // "Влево" state = "Left"; //сюда вписать обработку для движения влево; >else if (strcmp((char*)data, "right") == 0) < ledState = !ledState; Serial.println("Right"); // "Вправо" state = "Right"; //сюда вписать обработку для движения вправо; >else if (strcmp((char*)data, "reverse") == 0) < ledState = !ledState; Serial.println("Reverse"); // "Назад" state = "Reverse"; //сюда вписать обработку для движения назад; >else if (strcmp((char*)data, "stop") == 0) < ledState = !ledState; Serial.println("Stop"); // "Стоп" state = "Stop"; //сюда вписать обработку для остановки; >> >
Как можно видеть, я оставил возможность для прописывания логики событий, так как при каждой конкретной реализации могут происходить различные наборы событий.
Также нам потребуется настроить сервер, который будет отвечать за отслеживание событий клиента: вход в систему, выход из системы, получение данных, получение ошибки, ответ на ping:
void onEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) < switch (type) < case WS_EVT_CONNECT: Serial.printf("WebSocket client #%u connected from %s\n", client->id(), client->remoteIP().toString().c_str()); break; case WS_EVT_DISCONNECT: Serial.printf("WebSocket client #%u disconnected\n", client->id()); break; case WS_EVT_DATA: handleWebSocketMessage(arg, data, len); break; case WS_EVT_PONG: case WS_EVT_ERROR: break; > >
Для инициализации протокола websockets создана специальная функция:
void initWebSocket()
Далее, настроим сервер на прослушивание входящих GET-сообщений, и запустим его:
// Route for root / web page server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)< request->send_P(200, "text/html", index_html, processor); >); // Start server server.begin();
Как мы говорили уже ранее, в рамках нашей системы смартфон выступает в качестве точки доступа, а esp32 — в роли клиента. Запустим монитор COM порта, точку доступа на смартфоне и посмотрим, что из этого получится. Мы видим, что esp32 подключилась к смартфону и получила IP адрес, и отчёт вывелся в COM порт:

Теперь, если мы попробуем обратиться со смартфона по данному адресу, — то мы увидим, как появится сообщение системы, что появился подключившийся websocket client. При каждом нажатии на кнопку, будет появляться соответствующее сообщение, при отпускании кнопки будет появляться сообщение “Stop”. При выключении точки доступа появится сообщение об отключении клиента:

В свою очередь, при загрузке, пульт управления будет таким:

Он выглядит несколько необычно, но это сделано умышленно, чтобы было удобно управлять, при удержании смартфона в горизонтальном положении.
Кстати сказать, при таком способе управления, мы будем ограничены дальностью действия wi-fi. Если же вам потребуется управлять устройством с больших расстояний, то нужно будет изменить схему подключения с такой:


Для этого придётся использовать радиомодули nrf. Использование их совместно с esp32 таит свои трудности, в частности, придётся использовать видоизменённую библиотеку RF24, с целью дать возможность программе использовать программную реализацию SPI, вместо аппаратной. Об этом неплохо рассказано вот здесь.
Ну вот собственно и всё! Код для работы через websockets протестирован и работает. Остаётся только прописать свою реализацию, для нужного типа двигателя/лей.

- arduino
- esp32
- дистанционное управление
- ruvds_статьи
Какое приложение на андроид, чтобы управлять машинками на РУ на частоте 2.4?
Всем привет. Работаю в магазине игрушек, все они китайские, машинки на радиоуправлении все на частоте 2,4gghz.
Часто пульты не работают, что в комплекте, а машинку проверить на работоспособность надо.
Какое универсальное приложение на Андроид посоветуете, чтобы можно было с телефона управлять машинкой? Несколько штук поставил на смарт — не работают.
Смартфон Xiaomi Mi 9
Частота совпадает с частотой Wi-Fi как я понял.
- Вопрос задан более двух лет назад
- 2527 просмотров
Игрушки-шпионы и гоночные машинки управляемые со смартфона!
Игрушечный автомобиль на дистанционном управлении для многих поколений мальчишек остается желанной мечтой. Никакая видеоигра не передаст ощущения того, что ты действительно можешь что-то физически контролировать, как это возможно с радиоуправляемой машинкой. Сегодня реализовать это все на практике стало еще проще благодаря мобильным технологиям.
Вступление
В этом обзоре мы решили рассмотреть интересную категорию компактных радиоуправляемых автомобилей и вездеходов. Такие игрушки всегда были весьма дорогим удовольствием, часто недоступным для многих покупателей. Однако сегодня появляется все больше устройств на дистанционном управлении, цена на которые существенно ниже, потому что в качестве пульта используется самый обыкновенный смартфон на Android или iOS.
Чтобы покупать модные гаджеты в США и отправлять покупки надежным способом в Россию, регистрируйтесь в Бандерольке. Вы получите адрес в штате Делавэр, на который будут поступать заказы. Со склада Бандерольки вы оформляете доставку в Россию до своего дома или в ближайший пункт ПВЗ.

И если маленький автомобиль оснащен лишь простой возможностью передвижения, то продвинутые вездеходы несут на борту беспроводную ИК-камеру ночного видения, передающую потоковое видео на экран устройства и ведущую фото/видеосъемку. Также, они поддерживают голосовую связь на расстоянии и прочие интересные функции.
Что нужно знать
Есть ряд моментов, которые стоит учитывать при покупке игрушки, а именно: экономичность потребления энергии, тип элемента питания (встроенный аккумулятор или батарейки), дальность контроля по радиочастотному каналу (для Bluetooth — до 10 м, для Wi-fi — до 50-100 м), скорость движения. Проблема игрушек на батарейках в том, что элементы питания необходимо регулярно заменять, либо же сразу покупать дорогие перезаряжаемые. К тому же, такие батарейки (NiMH и NiCD) придется держать на зарядке длительное время, а еще они подвержены «эффекту памяти» — потере емкости в случае нарушения рекомендованного режима зарядки. Для маленьких радиоуправляемых машин идеальным вариантом является наличие в стандартной комплектации литий-ионного аккумуляторного блока с подзарядкой от компьютера.
Выбор моделей для покупки
Помимо продаж через официальные магазины и сети дистрибьюторов, многие производители предлагают свою продукцию по выгодной цене на ]]> Амазоне ]]> , ведь именно эта интернет-площадка славится огромным притоком посетителей и всячески пытается поддерживать высокий уровень обслуживания (чего стоит один только ]]> Amazon Prime ]]> — подробнее о нем в нашей статье). Благодаря многочисленным отзывам посетителей, легко сделать выводы о качестве продукции того или иного бренда. В процессе самостоятельного поиска машинок и вездеходов с управлением на Android и iOS вы увидите достаточно много негативных откликов покупателей. Пользователи сетуют на многочисленные недостатки радиоуправляемых моделей. По этой причине мы сделали свою подборку товаров от проверенных производителей: ]]> ZenWheels ]]> , ]]> Silverlit ]]> , ]]> Happy Cow ]]> , ]]> Midea Tech ]]> , ]]> Brookstone ]]> .
One ZenWheels Micro Rc Car
Канадская компания ]]> ZenWheels ]]> занимается созданием миниатюрных машин с Bluetooth-управлением. Как это ни удивительно, но их товары по вкусу далеко не только детям! Суть в том, что в подвижном гаджете установлено реечное рулевое управление, которое, в свою очередь, обеспечивает плавность езды и высокую маневренность. Более того, в крошечных автомобилях работают поворотники, фары, звуковое оповещение (в том числе сигнализация). Такие приятные детали выделяют One ZenWheels Micro Rc Car среди аналогичных радиоуправляемых машинок.
Для управления машинкой достаточно скачать бесплатное приложение с официального сайта. К слову, ZenWheels разработали весьма удачный беспроводной протокол для контроля за функциями игрушки. В стандартной комплектации есть также 10 небольших конусов-препятствий для тренировки маневров любой сложности.

]]> Купить One ZenWheels Micro Rc Car на Амазоне за 89.99$ ]]>
Silverlit Ferrari Enzo
Silverlit — еще один отменный производитель гаджетов с управлением по Bluetooth для iPhone, iPod и iPad. Спорткар Silverlit Ferrari Enzo — это точная копия машины, выполненная по лицензии автогиганта Ferrari в масштабе 1:50. Нужно отметить прекрасное управление с помощью iOS-приложения, в котором программная оболочка повторяет своим дизайном приборную панель настоящего автомобиля.
Благодаря акселерометру управление и ускорение дается легче на интуитивном уровне, что также повышает маневренность машины.

]]> Купить Silverlit Ferrari Enzo на Амазоне за 61.99$ ]]>
Silverlit 86068 Car Kit Porsche
Еще одна интересная радиоуправляемая модель машины — точная копия Porsche 911 Carrera в масштабе 1:16. Благодаря датчику столкновений в игрушке и эффекту вибрации мобильного устройства, гонки будут ощущаться намного динамичнее. У модели работают фары, «аварийка». Нужное освещение включается автоматически в зависимости от направления. Для большей реалистичности разработчики внедрили звуковое сопровождение для мобильных устройств Apple (шум мотора).
]]> Купить Silverlit 86068 Car Kit Porsche на Амазоне за 43$ ]]>
i-Spy Tank
Это небольшой шпионский вездеход с управлением на «яблочных» устройствах от компании ]]> Happy Cow ]]> . Радиоуправляемая модель умеет транслировать потоковое изображение со звуком прямо на экран мобильного телефона или планшета, которое при помощи софта можно записать. Для этого на башне установлена поворотная камера, меняющая не только горизонтальный, но и вертикальный ракурс.
Режим ночного видения позволяет рассматривать предметы в темноте. Явное преимущество i-Spy Tank — это реализация беспроводного управления по Wi-Fi (4-канальность), так что радиус действия сигнала варьируется от 70 м на открытом пространстве, и до 35 м в помещении с учетом стен. Акселерометр смартфона обеспечивает реалистичное рулевое управление. Питается вездеход шестью аккумуляторными батарейками типа AA (в комплект не входят), которых достаточно для 80 минут активной эксплуатации.

]]> Купить i-Spy Tank на Амазоне за 79.99$ ]]>
Rover 2.0 App-Controlled Wireless Spy Tank
Это модель вездехода от ]]> Brookstone ]]> очень похожа на предыдущую, ведь совмещает те же самые функции и решает аналогичные задачи. С Rover 2.0 шпионские видеосъемки будут интересней, ведь в отличие от i-Spy Tank тут установлена широкоугольная поворотная видеокамера с улучшенным ночным видением.

Программное обеспечение для iOS и Android открывает множество функций, в том числе онлайн-трансляцию на смартфон/планшет, моментальную загрузку отснятого контента в социальные сети.
В комплекте идут 6 батареек AA, которых должно хватить лишь на первое время.
]]> Купить Rover 2.0 на Амазоне за 119.99$
Итог
Мир цифровых гаджетов не перестает удивлять. Игрушки с дистанционным управлением на смартфоне или планшете порадуют не только ребенка, но и позволят развлечься взрослым в скучной офисной обстановке. Если вы любите скоростные гонки, обратите внимание на продукты ZenWheels и Silverlit, тогда как вездеход с видеокамерой— настоящая находка для шпионов!
Ну вот и все, регистрируйтесь на нашем сайте и покупайте современные игрушки в США, ведь это просто и выгодно!
Приложение для управления р/у машинкой с Android устройств
Идея такая: сделать очень дешовую , простейшую в изготовлении машинку (робота) управляемого со смартфона на Android в кротчайшие сроки.

Идея в том чтобы заменить радиопередатчик пульта и радиоприемник машинки на андроид устройства которые дадут возможность управлять машинкой через интернет с видеотрансляцией в реальном времени( не портя саму игрушку расширить ее функционал)
Как я это сделал?
С пульта управления сделал отводку к 3.5 Jack — записал звуковые файлы через пк и сделал примитивную программу для воспроизведения их на планшете.
На плате приемника тоже припаял 3.5 jack который подключен к планшету.Все!

Не хватает только самого приложения.
Если кто в силах помочь разработать приложение или просто поддержать проект вы можете написать в теме 4pda
