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

Одной из самых увлекательных сторон работы с микроконтроллерами, лично для меня, является то, что вы можете создать свой собственный аппарат, управляемый по радиоканалу. Есть большое количество разных возможностей для удалённого управления устройствами. В этой же статье мы поговорим о том, как организовать такое управление с помощью микроконтроллера esp32.
В свою бытность, я также как и многие, прошёл путь по созданию разных устройств, базирующихся на модулях HC-05, HC-06:
/>
Источник картинки: www.microsin.net
Однако в данный момент, использование таких модулей представляется нецелесообразным, так как они обладают достаточно высокой ценой, позволяют управлять устройством только по Bluetooth и в то же время требуют наличия внешнего микроконтроллера.
Такая связка была бы целесообразной в начале 2010-х годов, но в настоящее время стоит использовать более современный подход. А если более конкретно, то в качестве микроконтроллера мы возьмём esp32, управлять которым будем с экрана своего смартфона.
Есть разные способы отправки управляющих команд, но, в нашем случае, так как мы рассматриваем способ создания управляемого в реальном времени устройства, то лучше всего использовать передачу команд по протоколу websockets.
Для чего это нужно, вкратце: «нажали на кнопку управления — машинка поехала, отпустили кнопку управления — машинка остановилась» (ну и ещё могут быть всякие плюшки, вроде ответов машинки, отправляемых нам).
Это могут быть не обязательно машинки, это может быть управление различными роботизированными устройствами, что может быть не менее увлекательным.
В этом примере мы разберём только способ передачи команд, реализацию же для конкретных исполнительных устройств, вы сможете разобрать самостоятельно, в зависимости от вашего устройства.
С точки зрения соединения, мы будем подключаться к микроконтроллеру по wifi, где точкой доступа будет выступать наш смартфон (то есть и пультом управления — он же, а управлять будем, соответственно, — машинкой). Поэтому изначально необходимо сконфигурировать и запустить точку доступа на смартфоне, после чего ввести в скетч параметры доступа к ней:
Далее запускаем асинхронный веб-сервер на 80 порту и создаём объект, который будет обрабатывать websocket-ы:
Далее нам необходимо создать веб-страницу, которая будет отображаться у пользователя. Эту страницу мы помещаем в массив index_html.
Как можно видеть, код содержит отдельные блоки, в частности, каскадную таблицу стилей, в которой определяются все шрифты, кнопки, на которые будет нажимать пользователь:
Там же отдельными классами прописываются кнопки:
Для обработки нажатий используется JavaScript код, в котором происходит настройка websocket-ов, а также прописывается реакция на происходящие события:
Кроме того, инициализируется обработчики нажатий кнопок:
и прописывается конкретный сценарий, который будет происходить при начале касания и его окончании (будет вызвана соответствующая функция):
Эта функция, соответственно, посылает определённое сообщение, при произошедшем событии:
Теперь нам нужно создать обработчик сообщений, который будет вызываться, при каждом получении нового сообщения. Как можно видеть, при каждом из событий происходит вывод дежурного сообщения в Serial и запись состояния строковой переменной state. Она нужна для прописывания в дальнейшем логики происходящего. Например: «если мы едем вперёд, и поступило сообщение на поворот влево, то машинка начинает плавно подруливать влево».
Именно здесь, чтобы понимать, что происходит в данный момент, и требуется считывать состояние переменной state:
Как можно видеть, я оставил возможность для прописывания логики событий, так как при каждой конкретной реализации могут происходить различные наборы событий.
Также нам потребуется настроить сервер, который будет отвечать за отслеживание событий клиента: вход в систему, выход из системы, получение данных, получение ошибки, ответ на ping:
Для инициализации протокола websockets создана специальная функция:
Далее, настроим сервер на прослушивание входящих GET-сообщений, и запустим его:
Как мы говорили уже ранее, в рамках нашей системы смартфон выступает в качестве точки доступа, а esp32 — в роли клиента. Запустим монитор COM порта, точку доступа на смартфоне и посмотрим, что из этого получится. Мы видим, что esp32 подключилась к смартфону и получила IP адрес, и отчёт вывелся в COM порт:

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

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

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


Для этого придётся использовать радиомодули nrf. Использование их совместно с esp32 таит свои трудности, в частности, придётся использовать видоизменённую библиотеку RF24, с целью дать возможность программе использовать программную реализацию SPI, вместо аппаратной. Об этом неплохо рассказано вот здесь.
Ну вот собственно и всё! Код для работы через websockets протестирован и работает. Остаётся только прописать свою реализацию, для нужного типа двигателя/лей.
BlockDuino
Подключив к своей Blockduino блютуз модуль и передав на нее данные с датчиков с моего таба, не смог удержаться, чтобы не попробовать прикрутить все это на какую-нибудь игрушку.
Написал для этой машинки небольшую програмку под arduino. Принцип программы прост, она получает из последовательного порта символьную строку с показаниями акселерометра в виде трех дробных чисел разделенных символом ‘;’ (cделаю отступление: для передачи с Android’а я использовал приложение под названием Amarino); затем разделяет эту строку еще на три группы символов ориентируясь по точке с запятой и затем выделяет из этих групп знак (минус, если наклон отрицателен) и по три первых цифры; потом эти цифры преобразует в число.
Управление машинкой с сотового телефона
Вот только что был у нас проект — подключение модуля Bluetooth к плате Марсоход. И плата Марсоход и модуль Bluetooth были установлены на машинке. Такая машинка ездила под управлением Scratch программы работающей на компьютере.
Сегодня мне пришла в голову мысль: «А почему бы не использовать сотовый телефон с Bluetooth , как пульт управления к машинке?»
Ну так вот, сделал:
Как я это делал — это конечно целая история.
У меня есть довольно старенький телефон. Не Android и не iPhone. Обычная Nokia с операционной системой Simbian OS v9.1. На телефоне есть Bluetooth и Java.
Значит нужно писать программу на Java. Честно говоря не могу похвастаться знанием этого языка программирования. Однако мы не привыкли отступать. Отправляемся в Google и Yandex. Наша задача найти и скачать среду программирования для Java для телефонов и какие нибудь готовые примеры для работы с Bluetooth .
Довольно быстро я вышел на страницу Оракла: http://www.oracle.com/technetwork/java/index-jsp-137162.html На этой странице есть ссылки на скачивание Java ME SDK и на скачивание Sun Java Wireless Toolkit. Я скачал оба. Честно говоря Java ME SDK мне не понравилась. Слишком там много всего не понятного. Хотя там прямо «среда разработки». Наверное сильная вещь, но долго разбираться. А вот Sun Java Wireless Toolkit мне понравился Он примитивный, как раз для моего уровня подходит. Там всего «3 кнопки» — создать проект, откомпилировать, запустить. Редактировать тексты не где — нет для этого среды. Использую внешний редактор — notepad.
С обоими средствами программирования идут какие-то примеры, в том числе и c использованием Bluetooth . Еще порылся в google.
В конце концов, взяв несколько разных примеров из интернета, кое как слепив их до кучи, получилась у меня программа. Не ручаюсь, что там все правильно (как я уже сказал, я не знаю языка Java, имею только общие представления). Основной критерий написания — компилятор не должен давать ошибок . Тем не менее, похоже программа работает.
Вы можете выкачать мою программу здесь:
В этом архиве и исходные тексты, проект для Sun Java Wireless Toolkit, и сами бинарные файлы. Раскройте архив, в папке BIN есть btctrl.jar и btctrl.jad файлы. Их нужно перенести на телефон и с них установить Java приложение.
Вам нужна машинка с платой Марсоход и модуле Bluetooth , как в том проекте.
Теперь все просто. Включаем машинку. Запускаем на телефоне программу. Программа ищет в округе устройства Bluetooth и показывает их список. Выбираем то устройство, про которое телефон пишет SerialPort. телефон спрашивает разрешение на подключение, соглашаемся и все — можно управлять машинкой. При нажатии на кнопки влево, вправо, вверх, вниз на экране телефона рисуется соответствующая направлению стрелка и наша машинка едет!
Приложение для управления р/у машинкой с Android устройств
Идея такая: сделать очень дешовую , простейшую в изготовлении машинку (робота) управляемого со смартфона на Android в кротчайшие сроки.

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