Перейти к содержимому

Как сделать пульт управления для машинки своими руками

  • автор:

Пульт РУ для модели своими руками.

Радио управление и двигатели на ней стухли от влажности.
И вот руки добрались его оживить.
Задача:
— что бы все рулилось
— обратная телеметрия
— что бы сильнодешево.
За базу взял Ардуино Нано (130р) и радиомодули NRF24+ (150р). Экран .96″ (300р) (блин мелкий надо было 1.3″ брать).
От старого пульта не осталось ничего кроме пластика. Резисторы поменял на свои зафиксировав их макетной платой и приклеив к джойстику.

Пульт имеет пищалку. 2-х цветный светодиод. Умеет измерять и выводить на экран напряжение батареи. Умеет принимать от корабля его телеметрию и выводить на экран. Дальность связи до 1000м. Наличие устойчивой связи можно видеть на экране по напряжению батареи модели. Если обратной связи нет, значение будет нулевое (если модель не видит пульт более 1сек, то она останавливается). Частота обмена информацией модели с пультом 10 герц.
Радиомодули по совету друга были доработаны. Усилители на них шумят и их для увеличения дальности и отсутствия проблем необходимо экранировать.

для начала оборачиваем скотчем. Затем фольгой.

Фольгу припаиваем к земле разъема антенны.

Для отладки программного обеспечения пришлось собрать симулятор электроники корабля.

нано, nrf24+ и motor shild.

Сейчас находусь в ожидании двигателей для корабля из китая. Пульт завершен.

PS из того что пока не реализовано.
— режим калибровки пульта.
— добавление 3-х датчиков температуры в модель и вывод их в телеметрию (2 двигателя и радиатор платы их управления).
— софт для GPS и магнитометра на модели, что бы она при потери связи сама возвращалась на место запуска.
— автоматическая система борьбы за живучесть модели
— система антивандальная модели (китайцы у амеров сперли беспилотник, а мой будет лучше не трогать).
Схема спокойно читаема из софта, поэтому останавливаться на ней не буду.
yadi.sk/d/TiWUG4743E8LpH

Радиоуправляемая машинка для новичков или для самых маленьких)

Машинка на беспроводном управлении умет ездить вперед назад + повороты. Беспроводное управление построено на базе плат ардуино и модуля беспроводной связи nrf24l01. В движение приводиться китайским электродвигателем с редуктором (мощности которого достаточно чтобы тянуть не малый вес модельки но и еще достатотчно тяжелые предметы) Система поворотов построена на сервоприводе с металлическими шестернями. В качестве кузова использован китайский конструктор с незначительными доработками. Питается от 18650 3.7в.
Схема подключения и прошивка: yadi.sk/d/hsO-yK_i33cEG6
Подробней о сборке и деталях + испытания:

17 декабря 2016
Поделиться:

Комментарии 24

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

Оо такой конструктор сыну в Китае заказал. Должен скоро прийти.

дай пожалуйста ссылку если не сложно

Decool 3340 Technic Транспорт Hummer ВНЕДОРОЖНИК 470 Шт. ABS Пластик Строительный Блок Устанавливает Игрушки Для Детей Совместимы С Лепин.

дай пожалуйста ссылку если не сложно

Выбери та что на алиэкспресс

Оо такой конструктор сыну в Китае заказал. Должен скоро прийти.

думаю сын будет доволен классная штука)

Да я и сам любитель пособирать)))

Без машины

Как раз сегодня искал для двух двигателей (задний привод с дифом + рулевое) и случайно здесь наткнулся)
Спасибо за гайд, надо собрать)

Без машины

Дать поездить ребенку… И мотор нагреется и отклеится…

А еще очень странно организовано питание. Стоило бы взять три 18650 аккума, получить 12В. А для ардуины и остального понизить резисторными делителями. В стабилизированном напряжении там нет нужды.

Резисторы — это не серьезно. 12 В можно напрямую на ардуино подавать, если не ошибаюсь. Там стабилизатор на борту.

Без машины

«не серьезно» это как понимать?
Пластиковый конструктор и мотор на термоклее разве более серьезно?)))
Не вижу смысла в повышалках. Сервам наплевать на стабильность напряжения.

А вот насчёт нано — горят они от 12 вполне успешно (хотя это в авто, там до 14, поэтому могу ошибаться)
Да и вообще, что может быть проще и надёжнее двух резисторов? Сделал два одинаковых плеча — вот и готово питание наны из 12в в 6в. Какие видите минусы?

Про делитель на резисторах. Проще — согласен. На счет надежности — сомневаюсь. Делитель хорошо работает при статичной нагрузке. А ардуино и серва (она же не от 12 В работает, а от 5В или 6В) — это уже активная нагрузка и меняющаяся. Делитель на резисторах будет менять коэффициент деления, если, конечно, ток через делитель не будет больше, чем на нагрузку (ардуино, серва). Но вообще, если только ардуино (мало потребляет) питать через делитель, то работать скорее всего будет, но о надежности в подобном решении я бы говорить не стал. К тому же на сегодняшний день линейный стабилизатор не так уж и много стоит и при этом будет уверенность в постоянстве напряжения.

Без машины

Согласен с каждым доводом)))
Я имел ввиду — как мне кажется, разумнее использовать то, что проще, легче, дешевле и быстрее.
Конкретнее — если бы это был не самодвижущийся экипаж из детского конструктора, а модель с фрезерованной алюминиевый рамой, полноценной подвеской и тп, то и подход должен был бы быть соответствующим, бескомпромиссным.
Есть предложение, что автор просто не знает, что можно сделать на делителях.

Кроме того, питать самый мощный потребитель повышалкой — как-то странно, вместо использования номинальной для потребителя напруги и ее понижения для остальных маломощных

Пульт РУ своими руками.

Радио управление и двигатели на ней стухли от влажности.
И вот руки добрались его оживить.
Задача:
— что бы все рулилось
— обратная телеметрия
— что бы сильнодешево.
За базу взял Ардуино Нано (130р) и радиомодули NRF24+ (150р). Экран .96″ (300р) (блин мелкий надо было 1.3″ брать).
От старого пульта не осталось ничего кроме пластика. Резисторы поменял на свои зафиксировав их макетной платой и приклеив к джойстику.

Пульт имеет пищалку. 2-х цветный светодиод. Умеет измерять и выводить на экран напряжение батареи. Умеет принимать от корабля его телеметрию и выводить на экран. Дальность связи до 1000м. Наличие устойчивой связи можно видеть на экране по напряжению батареи модели. Если обратной связи нет, значение нулевое (если модель не видит пульт более 1сек, то она останавливается). Частота обмена информацией модели с пультом 10 герц.
Радиомодули по совету друга были доработаны. Усилители на них шумят и их для увеличения дальности и отсутствия проблем необходимо экранировать. И повесить емкость на питание. Емкость это единственное, что осталось от старой электроники.

для начала оборачиваем скотчем. Затем фольгой.

Фольгу припаиваем к земле разьема антенны.

Для отладки програмного обеспечения пришлось собрать симулятор электроники корабля.

нано, nrf24+ и motor shild.

Сейчас находусь в ожидании двигателей для корабля из китая. Пульт завершен.

PS из того что пока не реализовано.
— режим калибровки пульта.
— добавление 3-х датчиков температуры в модель и вывод их в телеметрию (2 двигателя и радиатор платы их управления).
— софт для GPS и магнитометра на модели, что бы она при потери связи сама возвращалась на место запуска.
— автоматическая система борьбы за живучесть модели
— система антивандальная модели (китайцы у амеров сперли беспилотник, а мой будет лучше не трогать).
Схема спокойно читаема из софта, поэтому останавливаться на ней не буду.
yadi.sk/d/TiWUG4743E8LpH

Делаем из смартфона 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_статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *