Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

WiDC:управляемый Wi-Fi робот FPV

Компоненты и расходные материалы

Arduino UNO
× 1
Espressif ESP8266 ESP-01
× 1
Arduino Proto Shield
× 1
Двигатель постоянного тока с колесом
× 1
H-мост
× 1

Приложения и онлайн-сервисы

Autodesk Fusion 360
IDE Arduino

Об этом проекте

Как насчет использования робота с дистанционным управлением для изучения вашего окружения, достижения труднодоступных мест, шпионажа, фотографирования, создания фильмов или трансляции видео? Из этого туториала Вы узнаете, как сделать незаменимое для всех этих целей!

Это руководство является улучшением моего предыдущего руководства (https://www.instructables.com/id/Wi-fi-Controlled-FPV-Rover-Robot-with-Arduino-ESP8/), в котором я представляю более быстрый домашний сделал робот. В нем показано, как создать двухколесного робота с дистанционным управлением по сети Wi-Fi, используя два двигателя постоянного тока, Arduino Uno и модуль Wi-Fi ESP8266.

Роботом можно управлять из обычного интернет-браузера с помощью интерфейса, разработанного в формате HTML. Смартфон Android может использоваться для трансляции видео и звука с робота на интерфейс управления.

Как и в предыдущем уроке, я показываю, как спроектировать и построить недорогую раму для роботизированного проекта, используя обычные инструменты (3D-принтер, лазерный резак или фрезерный станок с ЧПУ не нужны).

Можно заметить, что используемые здесь компоненты могут быть не оптимизированы для его целей. Например, NodeMCU можно использовать вместо комбинации Arduino + ESP8266. Rapsberry Pi с камерой заменит смартфон и также будет управлять двигателями. Можно даже использовать Android-смартфон в качестве «мозга» для своего робота. Это правда ...

Это руководство создано на основе другого проекта, в котором я участвую:Joy Robot (https://hackaday.io/project/12873-rob-da-alegria-joy-robot или https://www.hackster.io/igorF2/). robo-da-alegria-joy-robot-85e178), и для простоты здесь использовалось то же оборудование. Был выбран Arduino Uno, потому что он очень доступен и прост в использовании для всех, и мы хотели разработать для него простой щит. В нашем исходном проекте мы также управляем некоторыми сервоприводами и светодиодными матрицами, а также взаимодействуем с ESP. Смартфон фактически заменен планшетом, на котором работают и другие приложения. Вы можете найти другие руководства, связанные с этим роботом, по ссылкам ниже:

Управление массивом светодиодных матриц с помощью Arduino Uno:

https://www.instructables.com/id/Controlling-a-LED-Matrix-Array-With-Arduino-Uno/

Сервомоторы, управляемые через браузер через Wi-Fi:

https://www.instructables.com/id/Wi-Servo-Wi-fi-Browser-Controlled-Servomotors-with/

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

В этом уроке я представляю способ управления роботом со смартфона с помощью приложения Blynk! Проверить это:

https://www.hackster.io/igorF2/wi-fi-controlled-robot-using-wemos-d1-esp8266-and-blynk-464198

Шаг 1. Инструменты

Для создания этого прототипа использовались следующие инструменты:

Инструменты:

  • Ручная пила (для резки акриловых листов)
  • Отвертка (для установки болтов и гаек)
  • Линейка (для измерения размеров модели)
  • Универсальный нож (для разрезания конструкции и проделывания отверстий)
  • Сверлильный станок (используется для сверления акрила для установки шурупов)
  • Наждачная бумага (для сглаживания скругленных краев)
  • Паяльник (для пайки клемм двигателя)
  • Компьютер (для компиляции и загрузки кода Arduino)

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

Вы можете даже использовать другое оборудование (например, 3D-принтер или лазерный резак), в зависимости от инструментов, доступных в вашем производственном пространстве.

Шаг 2. Механическая структура и материалы

В механической конструкции были использованы следующие материалы:

Механические материалы:

  • акриловый лист толщиной 2 мм.
  • Редукторный двигатель постоянного тока с колесом (2 шт.)
  • Колесо рицинуса 30 мм (1 шт.)
  • Винты M2 x 10 мм (x5)
  • Гайки M2 x 1,5 мм (x5)
  • Винты M3 x 10 мм (x9)
  • Винты M3 x 10 мм (x9)
  • Винты M3 x 40 мм (x4)
  • Гайки M3 x 1,5 мм (x12)
  • Винты 5/32 "x 1" (x4)
  • Гайки 5/32 дюйма (12 шт.)
  • Универсальный держатель для телефона
  • Стальной уголок L-образный кронштейн (30 x 30 мм) (x4)

Шаг 3. Электронные компоненты

В этом роботе использовались следующие электронные компоненты:

• Arduino Uno (покупка / покупка)

• ESP8266 (купить)

• Protoshield (для более компактной версии) или обычный макет (купить)

• резистор 1 кОм (x2)

• резистор 10 кОм (x1)

• Редукторный двигатель постоянного тока с колесом (2 шт.) (Купить)

• Модуль H-bridge (купить)

• Несколько перемычек

• Внешний аккумулятор USB 5 В

Вы можете легко найти все компоненты онлайн в своем любимом интернет-магазине.

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

Шаг 4:Проектирование структуры

Сначала мне нужно было спроектировать механическую структуру моего робота. Вы также можете купить полную структуру в Интернете, если не хотите создавать свою собственную структуру (в Интернете доступно множество роботизированных комплектов). В этом случае вы можете перейти к шагу 6. ​​Для этого урока была разработана недорогая акриловая рама для крепления двигателей и других компонентов. Структура, представленная в этом руководстве, была спроектирована в 3D с использованием программного обеспечения Fusion 360 CAD и построена с помощью обычных инструментов (не требуется 3D-принтер, лазерный резак или фрезерный станок с ЧПУ). Вы можете использовать те же принципы, которые описаны ниже, для создания собственной структуры, которая соответствует вашим потребностям.

Сначала мне нужно было сделать 3D-модель основных компонентов, чтобы определиться с расположением конструкции. Некоторые из них были загружены из библиотеки сообщества GrabCAD ( https://grabcad.com/library ):

  • Arduino Uno (https://grabcad.com/library/arduino-uno-13)
  • Мотор-редуктор (https://grabcad.com/library/bomotor-1)
  • H-мост (https://grabcad.com/library/motor-driver-l9110-1)
  • Внешний аккумулятор (https://grabcad.com/library/power-bank-7)
  • Универсальный держатель для телефона (https://grabcad.com/library/universal-phone-holder-for-the-gopro-accessories-1)

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

На основе этих положений была спроектирована основная конструкция, которая состоит из трех пластин (опорная пластина и две боковые пластины), которые соединяются с помощью некоторых скоб.

base.pdf base.svg

Шаг 5:Построение и сборка конструкции

Возведение конструкции основания делится на следующие этапы: 1. Вырежьте акриловую основу в соответствии с размерами на 2D-чертеже: Это можно сделать с помощью лазерного резака (если он у вас есть) или, как в моем случае, с помощью обычных инструментов.

Сначала вам нужно перенести размеры вашей модели на акриловый лист. Распечатайте свой 2D-чертеж на обычном принтере на клейкой бумаге, затем вырежьте бумагу подходящего размера и нанесите эту маску на поверхность акрила. С помощью универсального ножа и с помощью линейки или шкалы разрежьте акрил. прямые линии. Вам не нужно будет прорезать лист полностью, просто сделайте надрез по нему, чтобы создать несколько дорожек, где кусок будет позже разрезан. Поместите акрил на плоскую поверхность, удерживайте его зажимами и надавите, пока лист не расколется на две части. Повторяйте этот процесс, пока не будут сделаны все разрезы. После этого вы можете использовать наждачную бумагу, чтобы сгладить неровности. Вы также можете использовать ручную пилу, чтобы разрезать акрил. 2. Просверлите отверстия в местах, показанных на 2D-чертеже: Просверлите отверстия в положениях, показанных на 2D-чертеже (обозначенных на маске), с помощью сверлильного станка. Акрил относительно легко сверлить. Поэтому, если вы не выбрасываете сверлильный станок, вы можете просверлить отверстия вручную с помощью острого инструмента, например, канцелярского ножа. Вы также можете использовать его для увеличения небольших отверстий до размеров винтов. Снимите маску, и ваша база будет готова.

3. Закрепите компоненты винтами и гайками в соответствии с трехмерным чертежом: Закрепите компоненты винтами и гайками согласно видео, и ваша конструкция будет готова к работе. Винты M3 используются для установки кронштейнов и двигателей постоянного тока. Винты M2 использовались для установки электронных компонентов, а винты 5/32 "- для установки переднего колеса и зажима для смартфона. Теперь сделайте перерыв и приступайте к сборке схемы на следующем этапе ...

base.pdf

Шаг 6:Сборка электроники

Предлагаемая здесь схема использует Arduino Uno в качестве основного контроллера, который взаимодействует с ESP8266 для связи Wi-Fi. Arduino управляет двигателями постоянного тока с помощью схемы управления H-brige, которая может управлять двумя двигателями, вращающимися. их независимо в обоих направлениях.

Блок питания использовался для питания электроники, подключенной напрямую к USB-порту Arduino. Это простой способ запитать Arduino:легко заряжать, легко заменять и обеспечивает безопасное напряжение 5 В.

Соедините все компоненты согласно схеме. Вам понадобятся перемычки для подключения модуля ESP8266, который не подходит для прототипов, h-мостов и двигателей постоянного тока. Вы можете использовать протощит (для более компактной схемы), обычную макетную плату или разработать свой собственный щит для Arduino.

Вы заметите, что ESP8266-1 не поддерживает макетную плату. Он будет подключен с помощью нескольких перемычек, но не будет прикреплен к конструкции.

Подключите USB-кабель к плате Arduino и переходите к следующему шагу.

wiDC_Esquem_C3_A1tico.pdf wiDC.fzz wiDC_bb.pdf

Шаг 7. Код Arduino

Установите последнюю версию Arduino IDE. Библиотеки не требовались для связи с модулем ESP-8266 или управления двигателями. Пожалуйста, проверьте скорость передачи ESP8266 и правильно установите ее в коде. Загрузите код Arduino (WiDC.ino) и замените XXXXX на SSID вашего Wi-Fi роутера и ГГГГГ по паролю роутера. Подключите плату Arduino к USB-порту компьютера и загрузите код.

Подключите USB-кабель к плате Arduino и переходите к следующему шагу.

  // подключаем библиотеки # include  SoftwareSerial esp8266 (3, 2); // RX pin =3, TX pin =2 // определение переменных # define DEBUG true // показ сообщений между ESP8266 и Arduino в последовательном порту int state =5; // определение начального состояния робота (5 =режим ожидания) // определение выводов двигателя const int motor1Pin1 =5; const int motor1Pin2 =6; const int motor2Pin1 =9; const int motor2Pin2 =10; // определение скорости двигателяint motorSpeed ​​=150; // скорость двигателя (ШИМ) // ***** // НАСТРОЙКА // ***** void setup () {// установка режимов вывода pinMode (motor1Pin1, OUTPUT); pinMode (motor1Pin2, ВЫХОД); pinMode (motor2Pin1, ВЫХОД); pinMode (motor2Pin2, ВЫХОД); // запускаем связь Serial.begin (9600); esp8266.begin (9600); sendData ("AT + RST \ r \ n", 2000, ОТЛАДКА); // сбросить модуль sendData ("AT + CWMODE =1 \ r \ n", 1000, DEBUG); // установить режим станции sendData ("AT + CWJAP =\" XXXXX \ ", \" YYYYY \ "\ r \ n", 2000, DEBUG); // подключаемся к сети Wi-Fi (замените XXXXX на SSID вашего Wi-Fi роутера, а YYYYY на его пароль delay (5000); // ждем подключения sendData ("AT + CIFSR \ r \ n", 1000, DEBUG); / / показать IP-адрес sendData ("AT + CIPMUX =1 \ r \ n", 1000, DEBUG); // разрешить несколько подключений sendData ("AT + CIPSERVER =1,80 \ r \ n", 1000, DEBUG); / / запустить веб-сервер на порту 80} // ********* // ГЛАВНЫЙ ЦИКЛ // ********* void loop () {if (esp8266.available ()) // проверить входящие данные {if (esp8266.find ("+ IPD,")) // если есть сообщение {String msg; esp8266.find ("?"); // ищем сообщение msg =esp8266.readStringUntil ('' ); // читать все сообщение String command =msg.substring (0, 3); // первые 3 символа =command Serial.println (command); // двигаться вперед if (command =="cm1") {state =1;} // двигаться назад if (command =="cm2") {state =2;} // повернуть направо if (command =="cm3") {state =3;} // повернуть налево if (command ==" cm4 ") {state =4;} // ничего не делаем if (command ==" cm5 ") {state =5;}}} // СОСТОЯНИЕ 1:двигаться вперед if (state ==1) {analogWrite (m otor1Pin1, motorSpeed); digitalWrite (motor1Pin2, LOW); analogWrite (motor2Pin1, motorSpeed); digitalWrite (motor2Pin2, LOW); } // СОСТОЯНИЕ 2:движение назад if (state ==2) {digitalWrite (motor1Pin1, LOW); analogWrite (motor1Pin2, motorSpeed); digitalWrite (motor2Pin1, LOW); analogWrite (motor2Pin2, motorSpeed); } // СОСТОЯНИЕ 3:движение вправо if (state ==3) {analogWrite (motor1Pin1, motorSpeed); digitalWrite (motor1Pin2, LOW); digitalWrite (motor2Pin1, LOW); analogWrite (motor2Pin2, motorSpeed); } // СОСТОЯНИЕ 4:двигаться влево if (state ==4) {digitalWrite (motor1Pin1, LOW); analogWrite (motor1Pin2, motorSpeed); analogWrite (motor2Pin1, motorSpeed); digitalWrite (motor2Pin2, LOW); } // СОСТОЯНИЕ 5:ничего не делать if (state ==5) {digitalWrite (motor1Pin1, LOW); digitalWrite (motor1Pin2, LOW); digitalWrite (motor2Pin1, LOW); digitalWrite (motor2Pin2, LOW); }} // ******************* // Вспомогательные функции // ******************* String sendData (Строковая команда, время ожидания const int, логическая отладка) {String response =""; esp8266.print (команда); long int time =миллис (); в то время как ((время + тайм-аут)> миллис ()) {в то время как (esp8266.available ()) {char c =esp8266.read (); ответ + =c; }} если (отладка) {Serial.print (ответ); } вернуть ответ;}  

Объяснение кода:

Код использует один последовательный порт для связи между Arduino и ESP8266, а другой - для связи между Arduino и компьютером. Когда у Arduino Uno был только один последовательный порт, библиотека SoftwareSeial использовалась для создания вторичного порта с использованием цифровых контактов 2 и 3.

  // подключаем библиотеки # include  SoftwareSerial esp8266 (3, 2); // Вывод RX =3, вывод TX =2  

Во время настройки должны быть запущены обе последовательные коммуникации и определена их скорость передачи (одна между Arduino и вашим последовательным монитором, а другая - для соответствия скорости ESP8266). Обратите внимание, что мой ESP8266 был установлен на 9600 кбит / с. По умолчанию большинство этих модулей имеют скорость 115200 кбит / с, но библиотека SoftwareSerial не может работать с такой скоростью, и вам придется изменить ее скорость передачи. У меня 9600 кбит / с работали нормально.

В этом проекте я не использовал специальную библиотеку для связи с модулем Wi-Fi. Вместо этого использовались только следующие обычные AT-команды (набор инструкций, определенных в прошивке ESP8266 по умолчанию):

  • AT + RST:сброс модуля ESP8266
  • AT + CWMODE:установить модуль в режим станции или точки доступа.
  • AT + CWJAP:подключите сеть Wi-Fi, заданную ее SSID и паролем.
  • AT + CIPMUX:установить модуль для нескольких подключений или одного подключения
  • AT + CIPSERVER:запускает веб-сервер на заданном порту // запуск связи
  Serial.begin (9600); esp8266.begin (9600); sendData ("AT + RST \ r \ n", 2000, ОТЛАДКА); // сбросить модуль sendData ("AT + CWMODE =1 \ r \ n", 1000, DEBUG); // установить режим станции sendData ("AT + CWJAP =\" XXXXX \ ", \" YYYYY \ "\ r \ n", 2000, DEBUG); // подключаемся к сети Wi-Fi (замените XXXXX на SSID вашего Wi-Fi роутера, а YYYYY на его пароль delay (5000); // ждем подключения sendData ("AT + CIFSR \ r \ n", 1000, DEBUG); / / показать IP-адрес sendData ("AT + CIPMUX =1 \ r \ n", 1000, DEBUG); // разрешить несколько подключений sendData ("AT + CIPSERVER =1,80 \ r \ n", 1000, DEBUG); / / запустить веб-сервер на порту 80  

Дополнительная функция (sendData) используется для отправки данных (от Arduino к ESP8266), чтения и отображения ответа на Serial Monitor.

  String sendData (строковая команда, время ожидания const int, логическая отладка) {String response =""; esp8266.print (команда); long int time =миллис (); в то время как ((время + тайм-аут)> миллис ()) {в то время как (esp8266.available ()) {char c =esp8266.read (); ответ + =c; }} если (отладка) {Serial.print (ответ); } вернуть ответ;}  

Использование приведенного выше кода заставляет Arduino перезагружать модуль, присоединяться к сети, ждать какое-то время для соединения, затем показывает свой IP-адрес и запускает веб-сервер. После этого будет запущен основной цикл, и микроконтроллер будет ждать команд.

  void loop () {if (esp8266.available ()) // проверять входящие данные {if (esp8266.find ("+ IPD,")) // если есть сообщение {String msg; esp8266.find ("?"); // ищем сообщение msg =esp8266.readStringUntil (''); // читать все сообщение String command =msg.substring (0, 3); // первые 3 символа =команда Serial.println (command); // двигаться вперед if (command =="cm1") {state =1; } // двигаться назад if (command =="cm2") {state =2; } // повернуть направо if (command =="cm3") {state =3; } // повернуть налево if (command =="cm4") {state =4; } // ничего не делаем if (command =="cm5") {state =5; }}}  

Были определены пять возможных команд (от cm1 до cm5). Каждый раз, когда Arduino получает одну из этих команд, он входит в одно из пяти возможных состояний (движение вперед, движение назад, движение вправо, движение влево и ожидание) и продолжает работу в этом состоянии, пока не получит другую команду.

Каждое состояние определяет сигналы для выводов двигателей. Я использовал digitalWrite (pin, LOW), когда я хотел установить для вывода значение 0 В, и analogWrite (pin, motoSpeed), когда хотел включить вывод. Использование analogWrite позволило мне изменить скорость двигателя и заставить робота двигаться медленнее.

  // СОСТОЯНИЕ 1:двигаться вперед if (state ==1) {analogWrite (motor1Pin1, motorSpeed); digitalWrite (motor1Pin2, LOW); analogWrite (motor2Pin1, motorSpeed); digitalWrite (motor2Pin2, LOW); } // СОСТОЯНИЕ 2:движение назад if (state ==2) {digitalWrite (motor1Pin1, LOW); analogWrite (motor1Pin2, motorSpeed); digitalWrite (motor2Pin1, LOW); analogWrite (motor2Pin2, motorSpeed); } // СОСТОЯНИЕ 3:движение вправо if (state ==3) {analogWrite (motor1Pin1, motorSpeed); digitalWrite (motor1Pin2, LOW); digitalWrite (motor2Pin1, LOW); analogWrite (motor2Pin2, motorSpeed); } // СОСТОЯНИЕ 4:двигаться влево if (state ==4) {digitalWrite (motor1Pin1, LOW); analogWrite (motor1Pin2, motorSpeed); analogWrite (motor2Pin1, motorSpeed); digitalWrite (motor2Pin2, LOW); } // СОСТОЯНИЕ 5:ничего не делать if (state ==5) {digitalWrite (motor1Pin1, LOW); digitalWrite (motor1Pin2, LOW); digitalWrite (motor2Pin1, LOW); digitalWrite (motor2Pin2, LOW); }  

Обратите внимание, что двигатели работают от 3 до 6 В. После использования источника питания 5 В вы можете изменять среднее напряжение двигателя (с помощью ШИМ) от 3 до 5 В, тем самым изменяя его скорость. Это не позволит вам точно контролировать скорость робота

WiDC.ino

Шаг 8:веб-интерфейс управления

Для управления роботом был разработан интерфейс html. Загрузите interface.rar и распакуйте все файлы в заданную папку. Затем откройте его в Firefox. В этом интерфейсе используется текстовое поле для ввода IP-адресов модуля ESP и видео / аудиосервера (из приложения Android IP Webcam). Есть тест но, который заставит робота вращаться, пока не будет получена другая команда. Клавиши со стрелками на клавиатуре используются для перемещения робота вперед или назад, а также для вращения влево или вправо. Смартфон Android использовался для трансляции видео и звука с робота на интерфейс управления. Вы можете найти приложение в магазине Google Play (https://play.google.com/store/apps/details?id=com.pas.webcam). Установите его и переходите к следующему шагу.

Объяснение кода HTML:

Интерфейс html имеет два раздела:одно для аудио и видео (с сервера Android IP Webcam) и одно для команд.

Разделение аудио и видео имеет форму с текстовым полем на кнопке. Он используется в качестве входных данных для указания IP-адреса сервера веб-камеры и его загрузки. Он поставляется со стандартным IP-адресом (192.168.0.5), но пользователь может ввести другой IP-адрес. Видео и аудио загружаются в объекты под текстовым полем.

  
IP-веб-камера ( IP):

Другой раздел имеет другую форму с текстовым полем, чтобы пользователь мог сообщить свой IP-адрес ESP8266.

  
IP-адрес Arduino:

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

JavaScript используется для работы с интерфейсом и отправки данных в Arduino. Эти сценарии закодированы в разных файлах и добавлены в заголовок html.

      Интерфейс управления      

Объяснение Javascript:

Функция (readUrlAV) используется для чтения IP-адреса из HTML-формы и загрузки их в объекты «видео» и «аудио».

  function readUrlAV (form) {TextVar =form.inputbox.value; VideoVar ="http://" + TextVar + ":8080 / видео"; AudioVar ="http://" + TextVar + ":8080 / audio.opus"; document.getElementById ("видео"). setAttribute ('данные', VideoVar); document.getElementById ("audio"). setAttribute ('data', AudioVar);}  

Сценарий периодически считывает клавиатуру, заставляя пользователя нажать любую клавишу. Если пользователь нажимает любую клавишу со стрелкой (left ='37', up ='38', right ='39' или 'down' =40), он отправляет команду (от «cm1» до «cm4») для данного IP-адреса. адрес. Обратите внимание на функцию защелки, которая позволяет избежать повторения одной и той же команды снова и снова. Данные будут переданы только при нажатии клавиши.

  var latch =false; document.onkeydown =checkKeyDown; function checkKeyDown (e) {e =e || window.event; if (e.keyCode =='38') {// стрелка вверх if (latch ==false) {TextVar =myform2.inputbox.value; ArduinoVar ="http://" + TextVar + ":80"; $ .get (ArduinoVar, {"cm1":1000}); {Подключение:закрыть}; защелка =правда; }} else if (e.keyCode =='40') {// стрелка вниз if (latch ==false) {TextVar =myform2.inputbox.value; ArduinoVar ="http://" + TextVar + ":80"; $ .get (ArduinoVar, {"cm2":1000}); {Подключение:закрыть}; защелка =правда; }} else if (e.keyCode =='37') {// стрелка влево if (latch ==false) {TextVar =myform2.inputbox.value; ArduinoVar ="http://" + TextVar + ":80"; $ .get (ArduinoVar, {"cm3":1000}); {Подключение:закрыть}; защелка =правда; }} else if (e.keyCode =='39') {// стрелка вправо if (latch ==false) {TextVar =myform2.inputbox.value; ArduinoVar ="http://" + TextVar + ":80"; $ .get (ArduinoVar, {"cm4":1000}); {Подключение:закрыть}; защелка =правда; }}}  

При отпускании любой клавиши со стрелкой выполняется функция doNothing, которая отправляет команду «cm5» (остановка двигателей) и сбрасывает защелку, позволяя интерфейсу отправлять разные команды.

  document.onkeyup =checkKeyUp; функция checkKeyUp (e) {e =e || window.event; if ((e.keyCode =='38')||(e.keyCode =='40')||(e.keyCode =='37')||(e.keyCode =='39')) { setTimeout(doNothing, 200); }}function doNothing(){ TextVar =myform2.inputbox.value; ArduinoVar ="http://" + TextVar + ":80"; $.get( ArduinoVar, { "cm5":1000 }); {Connection:close}; latch =false;}  
interface.rar

Step 9:Usage

When the Arduino is restarted, it will try to connect your wi-fi network automatically. Use the Serial Monitor to check if the connection was successfull, and to obtain which IP was assigned to your ESP-8266 by your router. Open the html file in an internet browser (Firefox) and inform this IP address in the textbox.You might also user other means to find out which IP address you router assigned to your device. Disconnect the the Arduino Uno from your computer and connect it to the power bank. Wait for it to connect again. Launch IP Webcam app in the smartphone attached to the robot. Type the video/audio IP on your control interface and connect to the server and you'll be ready to go. You might need to reduce the resolution of the video in the app to reduce the delay between during the transmission. Click and hold the arrow buttons of your keyboar to rotate the robot or move it forward/backward and have fun exploring your environment.

Notice that robot runs on open loop. This way, it's quite difficult to make it move straight forward. Small difference between the motors, aligment, etc. will cause cumulative deviations.

The robot start moving when it receives a given command ("cm1" to "cm4"), and keep that state until a different command is received ("cm1" to "cm5"). Sometimes the ESP8266 loses some messages, and that might cause some trouble. If, for instance, a "cm5" command is lost, the robot will keed moving even after any arrow key was released. I'm still dealing with this problem. Feel free to change the way the commands are interpreted to avoid this kind of problem.

Код

  • Код Arduino
  • Interface
Код Arduino Arduino
//include libraries#include SoftwareSerial esp8266(3, 2); //RX pin =3, TX pin =2//definition of variables#define DEBUG true //show messages between ESP8266 and Arduino in serial portint state =5; //define initial state of the robot (5 =stand-by)//define motor pinsconst int motor1Pin1 =5;const int motor1Pin2 =6;const int motor2Pin1 =9;const int motor2Pin2 =10;//define motor speedint motorSpeed =150; //motor speed (PWM)//*****//SETUP//*****void setup(){ //set pin modes pinMode(motor1Pin1, OUTPUT); pinMode(motor1Pin2, OUTPUT); pinMode(motor2Pin1, OUTPUT); pinMode(motor2Pin2, OUTPUT); //start communication Serial.begin(9600); esp8266.begin(9600); sendData("AT+RST\r\n", 2000, DEBUG); //reset module sendData("AT+CWMODE=1\r\n", 1000, DEBUG); //set station mode sendData("AT+CWJAP=\"XXXXX\",\"YYYYY\"\r\n", 2000, DEBUG); //connect wi-fi network (replace XXXXX by your Wi-Fi router SSID and YYYYY by its password delay(5000); //wait for connection sendData("AT+CIFSR\r\n", 1000, DEBUG); //show IP address sendData("AT+CIPMUX=1\r\n", 1000, DEBUG); //allow multiple connections sendData("AT+CIPSERVER=1,80\r\n", 1000, DEBUG); // start web server on port 80}//*********//MAIN LOOP//*********void loop(){ if (esp8266.available()) //verify incoming data { if (esp8266.find("+IPD,")) //if there is a message { String msg; esp8266.find("?"); //look for the message msg =esp8266.readStringUntil(' '); //read whole message String command =msg.substring(0, 3); //first 3 characters =command Serial.println(command); //move forward if(command =="cm1") { state =1; } //move backward if(command =="cm2") { state =2; } //turn right if(command =="cm3") { state =3; } //turn left if(command =="cm4") { state =4; } //do nothing if(command =="cm5") { state =5; } } } //STATE 1:move forward if (state ==1) { analogWrite(motor1Pin1, motorSpeed); digitalWrite(motor1Pin2, LOW); analogWrite(motor2Pin1, motorSpeed); digitalWrite(motor2Pin2, LOW); } //STATE 2:move backward if (state ==2) { digitalWrite(motor1Pin1, LOW); analogWrite(motor1Pin2, motorSpeed); digitalWrite(motor2Pin1, LOW); analogWrite(motor2Pin2, motorSpeed); } //STATE 3:move right if (state ==3) { analogWrite(motor1Pin1, motorSpeed); digitalWrite(motor1Pin2, LOW); digitalWrite(motor2Pin1, LOW); analogWrite(motor2Pin2, motorSpeed); } //STATE 4:move left if (state ==4) { digitalWrite(motor1Pin1, LOW); analogWrite(motor1Pin2, motorSpeed); analogWrite(motor2Pin1, motorSpeed); digitalWrite(motor2Pin2, LOW); } //STATE 5:do nothing if (state ==5) { digitalWrite(motor1Pin1, LOW); digitalWrite(motor1Pin2, LOW); digitalWrite(motor2Pin1, LOW); digitalWrite(motor2Pin2, LOW); } }//*******************//Auxiliary functions//*******************String sendData(String command, const int timeout, boolean debug){ String response =""; esp8266.print(command); long int time =millis(); while ( (time + timeout)> millis()) { while (esp8266.available()) { char c =esp8266.read(); response +=c; } } if (debug) { Serial.print(response); } return response;}
InterfaceHTML
 Нет предварительного просмотра (только загрузка). 

Изготовленные на заказ детали и корпуса

base_7JLgOpcox6.svg

Схема


Производственный процесс

  1. Робот Raspberry Pi, управляемый через Bluetooth
  2. Цифровые игральные кости Arduino
  3. Игровой контроллер Arduino
  4. Робот-последователь линии
  5. Робот, управляемый речью
  6. MobBob:самостоятельный робот Arduino, управляемый смартфоном Android
  7. Игра Pixel Chaser
  8. Отталкивающая электромагнитная левитация Arduino
  9. Робот-пианино, управляемый Arduino:PiBot
  10. Автономный домашний робот-помощник