Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

WiDC:Robot FPV controlado por Wi-Fi

Componentes y suministros

Arduino UNO
× 1
Espressif ESP8266 ESP-01
× 1
Arduino Proto Shield
× 1
Motor de CC con rueda
× 1
H-bridge
× 1

Aplicaciones y servicios en línea

Autodesk Fusion 360
Arduino IDE

Acerca de este proyecto

¿Qué tal usar un robot controlado a distancia para explorar sus alrededores, llegar a lugares inaccesibles, espiar, tomar fotografías, hacer películas o transmitir un video? ¡Este tutorial le mostrará cómo hacer un producto económico para todos esos propósitos!

Este tutorial es una mejora de mi tutorial anterior (https://www.instructables.com/id/Wi-fi-Controlled-FPV-Rover-Robot-with-Arduino-ESP8/), en el que presento un hogar más rápido robot hecho. Muestra cómo diseñar un robot de dos ruedas controlado de forma remota a través de una red Wi-Fi, utilizando dos motores de CC, un Arduino Uno y un módulo Wi-Fi ESP8266.

El robot se puede controlar desde un navegador de Internet normal, utilizando una interfaz diseñada en HTML. Se puede usar un teléfono inteligente Android para transmitir video y audio desde el robot a la interfaz de control.

Como en mi tutorial anterior, muestro cómo diseñar y construir un marco de bajo costo para un proyecto robótico, usando solo herramientas comunes (no se necesita impresora 3D, cortadora láser o enrutador CNC).

Uno podría notar que los componentes usados ​​aquí podrían no estar optimizados para su propósito. Se podría usar un NodeMCU en lugar de la combinación Arduino + ESP8266, por ejemplo. Una Rapsberry Pi con cámara reemplazaría al teléfono inteligente y también controlaría los motores. Incluso es posible utilizar un teléfono inteligente Android como el "cerebro" de su robot. Eso es cierto ...

Este tutorial se derivó de otro proyecto del que soy parte:Joy Robot (https://hackaday.io/project/12873-rob-da-alegria-joy-robot o https://www.hackster.io/igorF2/ robo-da-alegria-joy-robot-85e178), y aquí se utilizó el mismo hardware para simplificar. Se eligió un Arduino Uno porque es muy accesible y fácil de usar para todos, y queríamos diseñar un escudo simple para él. En nuestro proyecto original, también controlamos algunos servos y matrices LED, e interfaces con el ESP. En realidad, el teléfono inteligente es reemplazado por una tableta, que también ejecuta otras aplicaciones. Puede encontrar otros tutoriales relacionados con ese robot en los enlaces siguientes:

Control de matriz de LED con Arduino Uno:

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

Servomotores controlados por navegador Wi-Fi:

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

Esta guía puede adaptarse y cambiar su forma o interfaz de control para que se ajuste a sus necesidades.

En este otro tutorial, presento una forma de controlar un robot desde un teléfono inteligente usando la aplicación Blynk. Compruébalo:

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

Paso 1:herramientas

Se utilizaron las siguientes herramientas para la construcción de este prototipo:

Herramientas:

  • Sierra de mano (para cortar láminas acrílicas)
  • Destornillador (para colocar tornillos y tuercas)
  • Regla (para medir las dimensiones del modelo)
  • Cuchillo multiusos (para cortar la estructura y hacer agujeros)
  • Máquina perforadora (utilizada para perforar el acrílico para la instalación de los tornillos)
  • Papel de lija (para suavizar los bordes oxidados)
  • Soldador (para soldar terminales de motor)
  • Una computadora (para compilar y cargar código Arduino)

Estas herramientas se utilizaron para la producción de la estructura mecánica del robot, el montaje del robot y la conexión de componentes electrónicos. Algunas de las herramientas no son necesarias si elige comprar una estructura en lugar de construir la suya propia.

Incluso puede utilizar otros equipos (una impresora 3D o un cortador láser, por ejemplo), según las herramientas disponibles en su espacio de creación.

Paso 2:Estructura mecánica y materiales

Se utilizaron los siguientes materiales en la estructura mecánica:

Materiales mecánicos:

  • Lámina acrílica de 2 mm
  • Motorreductor DC con rueda (x2)
  • Rueda giratoria de 30 mm (x1)
  • Tornillos M2 x 10 mm (x5)
  • Tuercas M2 x 1,5 mm (x5)
  • Tornillos M3 x 10 mm (x9)
  • Tornillos M3 x 10 mm (x9)
  • Tornillos M3 x 40 mm (x4)
  • Tuercas M3 x 1,5 mm (x12)
  • Tornillos de 5/32 "x 1" (x4)
  • Tuercas de 5/32 "(x12)
  • Soporte universal para teléfono
  • Soporte en forma de "L" de ángulo de acero (30 x 30 mm) (x4)

Paso 3:componentes electrónicos

Los siguientes componentes electrónicos se utilizaron en este robot:

• Arduino Uno (comprar / comprar)

• ESP8266 (comprar)

• Protoshield (para una versión más compacta) o una placa de pruebas normal (comprar)

• Resistencia de 1 kohm (x2)

• Resistencia de 10 kohmios (x1)

• Motorreductor DC con rueda (x2) (comprar)

• Módulo puente H (comprar)

• Algunos cables de puente

• Banco de energía USB de 5 V

Puede encontrar todos los componentes en línea fácilmente en su tienda de comercio electrónico favorita.

Como se destacó en la introducción de este tutorial, la elección de los componentes se derivó de otro proyecto que diseñé y se puede optimizar utilizando un microcontrolador diferente, por ejemplo.

Paso 4:diseño de la estructura

Primero tuve que diseñar la estructura mecánica de mi robot. También puede comprar la estructura completa en línea si no desea construir su propia estructura personalizada (hay muchos kits robóticos disponibles en línea). En este caso, puede saltar al Paso 6. Para este tutorial, se diseñó un marco acrílico de bajo costo para la conexión de los motores y otros componentes. La estructura presentada en este tutorial fue diseñada en 3D usando el software Fusion 360 CAD y construida con herramientas comunes (no se necesita impresora 3D, cortadora láser o enrutador CNC). Puede utilizar los mismos principios que se describen a continuación para diseñar una estructura personalizada que se adapte a sus necesidades.

Primero tuve que hacer un modelo 3D de los componentes principales, para poder decidir la disposición de la estructura. Algunos de ellos se descargaron de GrabCAD Comunity Library ( https://grabcad.com/library ):

  • Arduino Uno (https://grabcad.com/library/arduino-uno-13)
  • Motor de engranajes (https://grabcad.com/library/bomotor-1)
  • Puente en H (https://grabcad.com/library/motor-driver-l9110-1)
  • Banco de energía (https://grabcad.com/library/power-bank-7)
  • Soporte universal para teléfono (https://grabcad.com/library/universal-phone-holder-for-the-gopro-accessories-1)

Los componentes electrónicos estaban dispuestos en un plano, de modo que pudiera averiguar la huella que necesitaba mi robot. Después de eso, tuve que elegir la posición de los motores y las ruedas para crear una estructura estable.

A partir de esas posiciones se diseñó la estructura principal, la cual está compuesta por tres placas (una placa base y dos placas laterales) que se conectan mediante unos soportes.

base.pdf base.svg

Paso 5:construcción y montaje de la estructura

La construcción de la estructura de la base se divide en los siguientes pasos: 1. Corte la base acrílica de acuerdo con las dimensiones del dibujo 2D: Esto se puede hacer con un cortador láser (si tiene acceso a uno) o, como en mi caso, con herramientas comunes.

Primero deberá transferir las dimensiones de su modelo a la lámina acrílica. Imprime tu dibujo 2D usando una impresora común en un papel adhesivo, luego corta el papel en las dimensiones adecuadas y aplica esa máscara en la superficie del acrílico. Con un cuchillo y con la ayuda de una regla o escala, corta el acrílico en lineas rectas. No necesitará cortar completamente la hoja, simplemente márquela para crear algunas pistas donde luego se cortará la pieza. Coloca el acrílico sobre una superficie plana, mantenlo en su lugar con unas abrazaderas y aplica un poco de presión hasta que la hoja se rompa en dos. Repita este proceso hasta que todos los cortes estén hechos. Después de eso, puede usar un papel de lija para suavizar los bordes ásperos. También puede utilizar una sierra de mano para cortar el acrílico. 2. Taladre los agujeros en las posiciones que se muestran en el dibujo 2D: Taladre los agujeros en las posiciones que se muestran en el dibujo 2D (indicado en la máscara) con una máquina perforadora. El acrílico es relativamente fácil de perforar. Entonces, si no desecha una máquina perforadora, puede perforar los agujeros manualmente con una herramienta afilada, como un cuchillo. También puede usarlo para agrandar agujeros pequeños para que se ajusten al tamaño de los tornillos. Quítese la mascarilla y su base estará lista.

3. Monte los componentes con tornillos y tuercas según el dibujo 3D: Monte los componentes con tornillos y tuercas de acuerdo con el video, y su estructura estará lista para funcionar. Los tornillos M3 se utilizan para la instalación de los soportes y motores DC. Se utilizaron tornillos M2 para la instalación de componentes electrónicos, mientras que los de 5/32 "se utilizan para la instalación de la rueda delantera y el clip del smartphone. Ahora tómate un descanso y empieza a montar el circuito en el siguiente paso ...

base.pdf

Paso 6:Montaje de la electrónica

El circuito propuesto aquí utiliza un Arduino Uno como controlador principal, que interactúa con un ESP8266 para la comunicación Wi-Fi. El Arduino controla los motores de CC mediante un circuito de conducción H-brige, que es capaz de controlar hasta dos motores, girando ellos independientemente en ambas direcciones.

Se utilizó un banco de energía para alimentar la electrónica, conectado directamente al puerto USB de Arduino. Esta es una manera fácil de alimentar su Arduino:fácil de cargar, se puede reemplazar fácilmente y proporciona un voltaje seguro de 5V.

Conecte todos los componentes de acuerdo con el esquema. Necesitará algunos cables de puente para conectar el módulo ESP8266, que no es compatible con protoboard, puentes en h y motores de CC. Puede usar un protoshield (para un circuito más compacto), una placa de pruebas ordinaria o diseñar su propio escudo Arduino.

Notará que el ESP8266-1 no es compatible con la placa de pruebas. Se conectará mediante algunos cables de puente, pero no se conectará a la estructura.

Conecte un cable USB a la placa de Arduino y continúe con el siguiente paso.

wiDC_Esquem_C3_A1tico.pdf wiDC.fzz wiDC_bb.pdf

Paso 7:Código Arduino

Instale el IDE de Arduino más reciente. No se necesitaba una biblioteca para la comunicación con el módulo ESP-8266 o el control de los motores.Verifique la velocidad en baudios de su ESP8266 y configúrelo correctamente en el código.Descargue el código Arduino (WiDC.ino) y reemplace el XXXXX por su enrutador wifi SSID y YYYYY por contraseña del enrutador. Conecte la placa Arduino al puerto USB de su computadora y cargue el código.

Conecte un cable USB a la placa de Arduino y continúe con el siguiente paso.

  // incluye bibliotecas # include  SoftwareSerial esp8266 (3, 2); // RX pin =3, TX pin =2 // definición de variables # define DEBUG true // muestra mensajes entre ESP8266 y Arduino en puerto serial state =5; // definir el estado inicial del robot (5 =stand-by) // definir los pines del motorconst int motor1Pin1 =5; const int motor1Pin2 =6; const int motor2Pin1 =9; const int motor2Pin2 =10; // definir la velocidad del motorint motorSpeed ​​=150; // velocidad del motor (PWM) // ***** // SETUP // ***** void setup () {// establecer modos de pin pinMode (motor1Pin1, OUTPUT); pinMode (motor1Pin2, SALIDA); pinMode (motor2Pin1, SALIDA); pinMode (motor2Pin2, SALIDA); // iniciar la comunicación Serial.begin (9600); esp8266.begin (9600); sendData ("AT + RST \ r \ n", 2000, DEPURACIÓN); // restablecer el módulo sendData ("AT + CWMODE =1 \ r \ n", 1000, DEBUG); // establecer el modo de estación sendData ("AT + CWJAP =\" XXXXX \ ", \" YYYYY \ "\ r \ n", 2000, DEBUG); // conecte la red wi-fi (reemplace XXXXX por el SSID de su enrutador Wi-Fi y YYYYY por el retraso de su contraseña (5000); // espere la conexión sendData ("AT + CIFSR \ r \ n", 1000, DEBUG); / / mostrar dirección IP sendData ("AT + CIPMUX =1 \ r \ n", 1000, DEBUG); // permitir múltiples conexiones sendData ("AT + CIPSERVER =1,80 \ r \ n", 1000, DEBUG); / / iniciar el servidor web en el puerto 80} // ********* // BUCLE PRINCIPAL // ********* void loop () {if (esp8266.available ()) // verificar datos entrantes {if (esp8266.find ("+ IPD,")) // si hay un mensaje {String msg; esp8266.find ("?"); // busque el mensaje msg =esp8266.readStringUntil ('' ); // leer el mensaje completo String command =msg.substring (0, 3); // primeros 3 caracteres =command Serial.println (command); // avanzar if (command =="cm1") {state =1;} // retroceder if (command =="cm2") {state =2;} // girar a la derecha if (command =="cm3") {state =3;} // girar a la izquierda if (command ==" cm4 ") {estado =4;} // no hacer nada if (comando ==" cm5 ") {estado =5;}}} // ESTADO 1:avanzar if (estado ==1) {analogWrite (m otor1Pin1, motorSpeed); digitalWrite (motor1Pin2, BAJO); analogWrite (motor2Pin1, motorSpeed); digitalWrite (motor2Pin2, BAJO); } // ESTADO 2:retroceder if (estado ==2) {digitalWrite (motor1Pin1, LOW); analogWrite (motor1Pin2, motorSpeed); digitalWrite (motor2Pin1, BAJO); analogWrite (motor2Pin2, motorSpeed); } // ESTADO 3:moverse a la derecha if (estado ==3) {analogWrite (motor1Pin1, motorSpeed); digitalWrite (motor1Pin2, BAJO); digitalWrite (motor2Pin1, BAJO); analogWrite (motor2Pin2, motorSpeed); } // ESTADO 4:moverse a la izquierda if (estado ==4) {digitalWrite (motor1Pin1, LOW); analogWrite (motor1Pin2, motorSpeed); analogWrite (motor2Pin1, motorSpeed); digitalWrite (motor2Pin2, BAJO); } // ESTADO 5:no hacer nada if (estado ==5) {digitalWrite (motor1Pin1, LOW); digitalWrite (motor1Pin2, BAJO); digitalWrite (motor2Pin1, BAJO); digitalWrite (motor2Pin2, BAJO); }} // ******************* // Funciones auxiliares // ******************* String sendData (Comando de cadena, tiempo de espera de int constante, depuración booleana) {Respuesta de cadena =""; esp8266.print (comando); tiempo int largo =millis (); while ((tiempo + tiempo de espera)> millis ()) {while (esp8266.available ()) {char c =esp8266.read (); respuesta + =c; }} if (debug) {Serial.print (respuesta); } respuesta de retorno;}  

Código explicado:

El código usa un puerto serial para la comunicación entre el Arduino y el ESP8266, y otro para la comunicación entre el Arduino y una computadora. Una vez que el Arduino Uno solo tiene un puerto serie, se utilizó la biblioteca SoftwareSeial para crear un puerto secundario, utilizando los pines digitales 2 y 3.

  // incluye bibliotecas # include  SoftwareSerial esp8266 (3, 2); // Pin RX =3, Pin TX =2  

Durante la configuración, ambas comunicaciones seriales deben iniciarse y su velocidad en baudios definida (una entre el Arduino y su monitor serial, y otra para que coincida con la velocidad ESP8266). Observe que mi ESP8266 se configuró en 9600 kbps. De forma predeterminada, la mayoría de estos módulos vienen a 115200 kbps, pero la biblioteca SoftwareSerial no puede funcionar a esa velocidad y tendrá que cambiar su velocidad en baudios. Para mí, 9600 kbps funcionó bien.

En este proyecto no utilicé una biblioteca específica para la comunicación con el módulo Wi-Fi. En su lugar, solo se utilizaron los siguientes comandos AT ordinarios (un conjunto de instrucciones definidas en el firmware predeterminado de ESP8266):

  • AT + RST:restablecer el módulo ESP8266
  • AT + CWMODE:configura el módulo en modo de estación o punto de acceso
  • AT + CWJAP:conecta una red Wi-Fi proporcionada por su SSID y contraseña
  • AT + CIPMUX:configurar el módulo para múltiples conexiones o una sola conexión
  • AT + CIPSERVER:inicia el servidor web en un puerto determinado // inicia la comunicación
  Serial.begin (9600); esp8266.begin (9600); sendData ("AT + RST \ r \ n", 2000, DEPURACIÓN); // restablecer el módulo sendData ("AT + CWMODE =1 \ r \ n", 1000, DEBUG); // establecer el modo de estación sendData ("AT + CWJAP =\" XXXXX \ ", \" YYYYY \ "\ r \ n", 2000, DEBUG); // conecte la red wi-fi (reemplace XXXXX por el SSID de su enrutador Wi-Fi y YYYYY por el retraso de su contraseña (5000); // espere la conexión sendData ("AT + CIFSR \ r \ n", 1000, DEBUG); / / mostrar dirección IP sendData ("AT + CIPMUX =1 \ r \ n", 1000, DEBUG); // permitir múltiples conexiones sendData ("AT + CIPSERVER =1,80 \ r \ n", 1000, DEBUG); / / iniciar servidor web en el puerto 80  

Se utiliza una función auxiliar (sendData) para enviar datos (de Arduino a ESP8266), leer y mostrar la respuesta en Serial Monitor.

  String sendData (String command, const int timeout, boolean debug) {String response =""; esp8266.print (comando); tiempo int largo =millis (); while ((tiempo + tiempo de espera)> millis ()) {while (esp8266.available ()) {char c =esp8266.read (); respuesta + =c; }} if (debug) {Serial.print (respuesta); } respuesta de retorno;}  

El uso del código anterior hace que Arduino reinicie el módulo, se una a una red, espere algún tiempo para la conexión, luego muestre su dirección IP e inicie un servidor web. Después de eso, se iniciará el bucle principal y el microcontrolador esperará los comandos.

  void loop () {if (esp8266.available ()) // verificar los datos entrantes {if (esp8266.find ("+ IPD,")) // si hay un mensaje {String msg; esp8266.find ("?"); // busca el mensaje msg =esp8266.readStringUntil (''); // leer el mensaje completo String command =msg.substring (0, 3); // primeros 3 caracteres =comando Serial.println (comando); // avanzar if (comando =="cm1") {estado =1; } // retroceder if (comando =="cm2") {estado =2; } // girar a la derecha if (comando =="cm3") {estado =3; } // girar a la izquierda if (comando =="cm4") {estado =4; } // no hacer nada si (comando =="cm5") {estado =5; }}}  

Se definieron cinco comandos posibles (cm1 a cm5). Siempre que el Arduino recibe uno de esos comandos, entra en uno de los cinco estados posibles (avanzando, retrocediendo, moviéndose a la derecha, moviéndose a la izquierda y en espera), y continúa en ese estado hasta que recibe un comando diferente.

Cada estado define las señales para los pines de los motores. Usé digitalWrite (pin, LOW) cuando quería establecer un pin en 0V y analogWrite (pin, motoSpeed) cuando quería activar un pin. El uso de analogWrite me permitió cambiar la velocidad del motor y hacer que el robot se moviera más lento.

  // ESTADO 1:avanzar if (state ==1) {analogWrite (motor1Pin1, motorSpeed); digitalWrite (motor1Pin2, BAJO); analogWrite (motor2Pin1, motorSpeed); digitalWrite (motor2Pin2, BAJO); } // ESTADO 2:retroceder if (estado ==2) {digitalWrite (motor1Pin1, LOW); analogWrite (motor1Pin2, motorSpeed); digitalWrite (motor2Pin1, BAJO); analogWrite (motor2Pin2, motorSpeed); } // ESTADO 3:moverse a la derecha if (estado ==3) {analogWrite (motor1Pin1, motorSpeed); digitalWrite (motor1Pin2, BAJO); digitalWrite (motor2Pin1, BAJO); analogWrite (motor2Pin2, motorSpeed); } // ESTADO 4:moverse a la izquierda if (estado ==4) {digitalWrite (motor1Pin1, LOW); analogWrite (motor1Pin2, motorSpeed); analogWrite (motor2Pin1, motorSpeed); digitalWrite (motor2Pin2, BAJO); } // ESTADO 5:no hacer nada if (estado ==5) {digitalWrite (motor1Pin1, LOW); digitalWrite (motor1Pin2, BAJO); digitalWrite (motor2Pin1, BAJO); digitalWrite (motor2Pin2, BAJO); }  

Observe que los motores funcionan entre 3 y 6V. Una vez que se usa una fuente de alimentación de 5 V, puede modular el voltaje promedio de los motores (usando PWM) entre 3 y 5 V, cambiando así su velocidad. No le permitirá controlar con precisión la velocidad del robot

WiDC.ino

Paso 8:Interfaz de control basada en web

Se diseñó una interfaz html para el control del robot, descargue interface.rar y extraiga todos los archivos a una carpeta determinada. Luego ábrelo en Firefox. Se utiliza un formulario de cuadro de texto en esa interfaz para ingresar las direcciones IP del módulo ESP y del servidor de video / audio (desde la aplicación Android IP Webcam). Hay una prueba pero, que hará que el robot gire hasta que se reciba otro comando. Las teclas de flecha del teclado se utilizan para mover el robot hacia adelante o hacia atrás, y para girar hacia la izquierda o hacia la derecha. Se utilizó un teléfono inteligente Android para transmitir el video y el audio del robot a la interfaz de control. Puede encontrar la aplicación en la tienda Google Play (https://play.google.com/store/apps/details?id=com.pas.webcam). Instálela y vaya al paso siguiente.

Explicación del código HTML:

La interfaz html tiene dos divisiones:una para audio y video (del servidor de cámara web IP de Android) y otra para los comandos.

La división de audio y video tiene una forma con un cuadro de texto y un botón. Se utiliza como entrada para especificar la dirección IP del servidor de la cámara web y cargarla. Viene con una dirección IP estándar (192.168.0.5), pero el uso puede ingresar una IP diferente. El video y el audio se cargan en objetos debajo del cuadro de texto.

  
Cámara web IP ( IP):

La otra división tiene otra forma con un cuadro de texto, para que el usuario pueda informar su dirección IP ESP8266.

  
Dirección IP de Arduino:

Mantenga presionadas las teclas de flecha del teclado para mover el robot

JavaScript se usa para manejar la interfaz y enviar datos al Arduino. Esos scripts se codifican en diferentes archivos y se agregan en el encabezado html.

      Interfaz de control      

Explicación de Javascript:

Se utiliza una función (readUrlAV) para leer la dirección IP del formulario html y cargarla en objetos de "video" y "audio".

  función readUrlAV (formulario) {TextVar =form.inputbox.value; VideoVar ="http://" + TextVar + ":8080 / video"; AudioVar ="http://" + TextVar + ":8080 / audio.opus"; document.getElementById ("video"). setAttribute ('datos', VideoVar); document.getElementById ("audio"). setAttribute ('datos', AudioVar);}  

El guión lee el teclado periódicamente, esperando que el usuario presione cualquier tecla. Si el usuario presiona cualquier tecla de flecha (izquierda ='37', arriba ='38', derecha ='39' o 'abajo' =40), envía un comando ("cm1" a "cm4") para una IP determinada habla a. Observe que hay una función de pestillo, que evita que el mismo comando se repita una y otra vez. Los datos se transferirán solo cuando se presione la tecla.

  var latch =false; document.onkeydown =checkKeyDown; función checkKeyDown (e) {e =e || window.event; if (e.keyCode =='38') {// flecha hacia arriba if (latch ==false) {TextVar =myform2.inputbox.value; ArduinoVar ="http://" + TextVar + ":80"; $ .get (ArduinoVar, {"cm1":1000}); {Conexión:cerrar}; pestillo =verdadero; }} else if (e.keyCode =='40') {// flecha hacia abajo if (latch ==false) {TextVar =myform2.inputbox.value; ArduinoVar ="http://" + TextVar + ":80"; $ .get (ArduinoVar, {"cm2":1000}); {Conexión:cerrar}; pestillo =verdadero; }} else if (e.keyCode =='37') {// flecha izquierda if (latch ==false) {TextVar =myform2.inputbox.value; ArduinoVar ="http://" + TextVar + ":80"; $ .get (ArduinoVar, {"cm3":1000}); {Conexión:cerrar}; pestillo =verdadero; }} else if (e.keyCode =='39') {// flecha derecha if (latch ==false) {TextVar =myform2.inputbox.value; ArduinoVar ="http://" + TextVar + ":80"; $ .get (ArduinoVar, {"cm4":1000}); {Conexión:cerrar}; pestillo =verdadero; }}}  

Cuando se suelta cualquier tecla de flecha, se ejecuta la función doNothing, que envía el comando "cm5" (detener los motores) y restablece el pestillo, lo que permite que la interfaz envíe diferentes comandos.

  document.onkeyup =checkKeyUp; función 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.

Código

  • código Arduino
  • Interface
Código 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
 Sin vista previa (solo descarga). 

Piezas y carcasas personalizadas

base_7JLgOpcox6.svg

Esquemas


Proceso de manufactura

  1. Robot Raspberry Pi controlado por Bluetooth
  2. Dados digitales Arduino
  3. Controlador de juego Arduino
  4. Robot seguidor de línea
  5. Robot controlado por voz
  6. MobBob:Robot Arduino DIY controlado por un teléfono inteligente Android
  7. Pixel Chaser Game
  8. Levitación electromagnética repulsiva Arduino
  9. Robot de piano controlado por Arduino:PiBot
  10. Robot asistente doméstico autónomo
  11. NeoMatrix Arduino Pong