Seleccionar página

Mover Un Servomotor Por Internet Con Arduino Ethernet Shield

por | Dic 19, 2014 | Tutoriales de Arduino

Mover Servomotor Arduino Internet

Hace un tiempo publiqué un post en el que te explicaba paso a paso cómo utilizar el shield de Ethernet de tu Arduino para crear un servidor web y utilizarlo en tus proyectos domóticos (si todavía no lo has visto, te lo dejo aquí). En este post quiero dar un paso más allá mostrándote un ejemplo con el que podrás mover un servomotor por Internet.

Como te acabo de comentar, este post se va a centrar en cómo mover un servomotor. Sin embargo, el objetivo es que aprendas a enlazar el código generado por tu Arduino con la web de forma que puedas realizar acciones (como pulsar un botón) y tu placa de Arduino detecte esos eventos y, en consecuencia, realice una acción.

Cómo Conseguir Que Arduino Detecte Eventos En La Web

Corrígeme si me equivoco pero no creo que tu problema sea precisamente mover el servomotor. Si es así, no dudes en dejar tu comentario porque en esta entrada me voy a enfocar en la parte web (sí, lo del servomotor era solo una excusa smile ).

Existen varias formas de conseguir que tu Arduino detecte dichos eventos. En esta ocasión te voy a hablar de la más sencilla de todas: hacerlo a través de la petición HTTP.

Modificar La URL Y Leerla En Arduino

Ante todo, discúlpame si ves que mis términos no son los más precisos pero en este momento me interesa más que entiendas bien lo que debes hacer que utilizar los tecnicismos adecuados.

Te voy a poner todos los pasos a seguir para que “te hagas a la idea” del procedimiento que tienes que llevar a cabo:

  1. Configuras un botón (o el elemento HTML que prefieras) de tal forma que cuando lo pulses se modifique la URL de tu web. No te preocupes, no te vas a salir de tu página. Es “algo así” como cuando accedes a un post de EducaChip, donde sigues viendo el www.educachip.com pero además ves algo tipo /post-en-cuestion/. Es ese “post-en-cuestion” lo que vas a modificar.
  2. Guardas la URL modificada en una variable de tipo string.
  3. Recorres tu variable “en busca” de esa modificación y la lees.
  4. En función de la modificación realizada (esto es, tu nueva URL), puedes modificar el valor de un pin de tu Arduino Ethernet Shield o, en definitiva, ejecutar el código que desees.

Como ves, se trata de un método un poco “sucio”. Sin embargo, también es eficaz y (sobre todo) fácil smile

Código De Ejemplo

Si leíste el post anterior, estoy seguro de que todo esto te parecerá sencillo (estoy escribiendo para un experto en redes ¡no hay duda! smile ) así que, a diferencia de mis otros tutoriales, voy a evitar “soltarte todo el rollo” pasando directamente al código.

He comprimido un poco el HTML (que es prácticamente el mismo que el del post anterior) e intentado separar las “partes a cambiar” para que, en caso de que quieras modificarlo y adaptarlo más a tus gustos o las necesidades de tu proyecto, lo tengas un poco más fácil.

Una cosa más: ¡No te olvides de modificar los puertos, IP, etc. para que tu proyecto funcione correctamente!

/* EducaChip – Cómo Mover Un Servomotor Por Internet Con Arduino Ethernet Shield */
/* www.educachip.com */

//Se añaden las librerías necesarias.
#include <SPI.h>
#include <Ethernet.h>
#include <Servo.h>

//Se determina el MAC de Arduino (Puedes dejar este por defecto).
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

//Se añaden los atributos de red necesarios asignada a tu placa (deberás modificarlo en función de la IP,
//en función de la IP local,puerta de enlace y máscara de red que estés utilizando.
//En general, solo deberías tener que cambiar la IP y el gateway.
IPAddress ip(192,168,1,177);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);

//Se determina la comunicación a través del puerto deseado. (Generalmente se suele
//utilizar el puerto 80. Si te da problemas puedes probar con el 5600 pero recuerda
//haber abierto este puerto en tu Router).
EthernetServer server(80);

//Se declara el servomotor que se va a utilizar.
Servo Servomotor;

//Se crea la variable que contendrá la posición actual del servo y se inicializa a 0.
int P_Servo=0;

void setup() {

//Se inicia la comunicación con los valores adecuados.
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();

//Se determina el pin al que está asociada la señal de control del servo.
Servomotor.attach(6);

}

void loop() {

//Se actua cuando se recibe una petición (se accede a la web a través del navegador).
EthernetClient client = server.available();
if (client) {

boolean currentLineIsBlank = true;

//Se crea una variable de tipo String que almacenará el contenido de la petición HTTP.
String Contenido_Peticion=“”;

while (client.connected()) {
if (client.available()) {
//Se almacena el contenido de la petición HTTP.
char c = client.read();
Serial.write(c);
Contenido_Peticion.concat(c);

//Se buscan las partes de la cadena de texto correspondientes a la acción a ejecutar
//y se almacena su posición en la cadena.
int Indice_CadenaHTTP = Contenido_Peticion.indexOf(“Servo=”);

//Se busca el estado de la posición del servomotor y se actúa en consecuencia.
//Se añade la condición de que no se producza ningún efecto si se alcanza el límite
//de la posición del servomotor.
if(Contenido_Peticion.substring(Indice_CadenaHTTP)==“Servo=1” && P_Servo<180){
//Se incrementa actualiza la posición del servomotor (se incrementa).
P_Servo=P_Servo + 20;
//Se procede a mover el servomotor a la posición adecuada.
Servomotor.write(P_Servo);
}
if(Contenido_Peticion.substring(Indice_CadenaHTTP)==“Servo=0” && P_Servo>0){
//Se incrementa actualiza la posición del servomotor (se reduce).
P_Servo=P_Servo – 20;
//Se procede a mover el servomotor a la posición adecuada.
Servomotor.write(P_Servo);
}

//Una vez se ha terminado de leer la petición HTTP se procede a mandar la información
//(Se crea la web).
if (c == ‘\n’ && currentLineIsBlank) {

client.println(“HTTP/1.1 200 OK”);
client.println(“Content-Type: text/html”);
client.println();
client.println(“<html lang=’es’><head><meta charset=’UTF-8′><title>”);
client.println(“Control De Un Servomotor A Través De Internet – EducaChip”);
client.println(“</title><link href=’http://fonts.googleapis.com/css?family=Roboto:300|Playfair+Display:400′”);
client.println(“rel=’stylesheet’ type=’text/css’/><link rel=’stylesheet'”);
client.println(“href=’http://static.tumblr.com/pjglohe/2qinf00ga/estilos.min.css’>”);
client.println(“</head><body><div class=’page-wrap’><header class=’header’>”);
client.println(“<h1>Control De Un Servomotor A Través De Internet – EducaChip</h1>”);
client.println(“<div class=’educachip’><span>Realizado por </span>”);
client.println(“<a href=’http://www.educachip.com’ target=’_blank’>EducaChip</a></div>”);
client.println(“</header><section class=’content-wrap’><div class=’device’>”);
client.println(“<div class=’device-name’><h2>SERVOMOTOR</h2></div><div class=’forms’>”);

/* INICIO DEL CÓDIGO CORRESPONDIENTE A LA ACCIÓN DE LOS BOTONES */
client.println(“<form onClick=location.href=’./?Servo=1\’ class=’transition button on’>”);
client.println(“<input type=’button’ value=’AVANZAR’/>”);
client.println(“</form></div><div class=’forms’>”);
client.println(“<form onClick=location.href=’./?Servo=0\’ class=’transition button off’>”);
client.println(“<input type=’button’ value=’RETROCEDER’/>”);
/* FIN DEL CÓDIGO CORRESPONDIENTE A LA ACCIÓN DE LOS BOTONES */

client.println(“</form></div></div></section></div></body></html>”);

break;
}
if (c == ‘\n’) {

currentLineIsBlank = true;
}
else if (c != ‘\r’) {

currentLineIsBlank = false;
}
}
}
//Se utiliza un delay para dar tiempo a que actue la configuración.
delay(1);

client.stop();
}
}

Se acabó. La verdad, estoy tan acostumbrado a escribirte parrafadas que se me hace raro terminar tan pronto… sad aunque lo mismo tú hasta lo agradeces ¿No?

Como siempre te digo al despedirme, espero que te decidas a compartir este post (¡de verdad, +1 si compartes smile !), a suscribirte al blog y a dejar tu comentario.

Un abrazo y… te leo en los comentarios smile

Actualmente me dedico, entre otras cosas, a crear contenidos sobre Arduino y otros dispositivos eléctricos. Me encanta todo lo relacionado con el “Universo Maker”.

Siempre estoy activo en los comentarios. Si tienes cualquier pregunta, no dudes en dejármela en los comentarios. Intentaré responderte lo antes posible… Un abrazo smile

Enrique Romero,

Autor del post.

¿No quieres perderte nada? ¡Suscríbete!

28 Comentarios

  1. Ante todo, enhorabuena por el proyecto (me ha funcionado al 100% y eso motiva muchísimo) y por la amena y concisa forma de explicarlo. Pero se me plantea una duda: ¿Es posible pasar un parámetro desde HTML a Arduino tal y como lo escribamos, como haríamos un un input de un form, por ejemplo? En caso afirmativo, como supongo, ¿como se haría?. Gracias de antemano y un saludo.

    Responder
    • Buenas Jalito,

      La verdad es que no soy ningún experto en estos temas, pero creo que podrías hacerlo con javascript.

      Un saludo, Enrique.

      Responder
  2. Esto es una pasada! Mil Gracias!!!

    Responder
    • Me alegro de que te haya gustado Sergio. smile

      Responder
  3. muy buen aporte.
    yo quiero usar el modulo ethernet para cambiar unas variables desde Internet.
    en este caso tengo botones para mover las variables de 0 a 24 pero por medio de la web no se como hacerle. agradecería que me aconsejaras un poco sobre el tema.

    Responder
    • Buenas Luis Fernando,

      La idea es que asocies la presión de los botones al cambio de valor en las variables. Fíjate en la parte del código relativa a los botones y edítala para que te cuadre.

      Un saludo, Enrique.

      Responder
  4. Muy genial tu trabajo, me gustaría que me comentaras o mejor dicho si me ayudas con un ejemplo de que en vez de apretar “avanzar” y “retroceder” se cambiara a “activar” que haga una función tal que cuando aprete “Activar” solo se active unos segundos y que se desactive( al activar que llege a 180º y que al desactivar llege a 0º) si es posible me mandas un correo muchas gracias, Saludos.

    Responder
    • Buenas Andrés,

      Para modificar los botones basta con que elimines el que te sobra, centres el que te queda (si quieres ese resultado estético) y le cambies el nombre en el código asociado al botón que quedes.

      Respecto a lo de que se desactive automáticamente, puedes modificar en el código el valor que te proporciona pulsar el botón pasado el tiempo que te interesa y refrescar la página.

      Un saludo, Enrique.

      Responder
  5. hola he modificado un poco el codigo que muestras de ejemplo para que salgan 4 botones en pantalla pero ocurre que solo funcionan de dos en dos, es decir
    si pongo cuatro botones no mandan la accion a arduino pero si pongo solo dos no importa cuales sean y manda las ordenes..
    Cual sera mi problema este es mi codigo:

    client.println(“”);
    client.println(“”);
    client.println(“”);
    client.println(“”);
    client.println(“”);
    client.println(“”);

    client.println(“”);
    client.println(“”);
    client.println(“”);
    client.println(“”);
    client.println(“”);

    Responder
    • Buenas César,

      Te falta ajustar los índices de las cadenas HTTP para darle funcionalidad a los botones que has creado.

      Un saludo, Enrique.

      Responder
  6. Que tal.
    Al presionar cualquiera de los botones hace la acción de mover el servo sin embargo es coso si lo presionara 2 veces por que se mueve 2 tantos por vez, sabras por que pasa esto?

    Responder
    • Buenas Josue,

      Puede que esté habiendo algún tipo de efecto rebote o que el ángulo que deseas variar sea demasiado pequeño para ese servo.

      Un saludo, Enrique.

      Responder
  7. Muchas gracias por tus tutoriales!
    Muy concisos!
    Buena solución y para usar HTML como interfaz web para comunicarse con arduino!

    Igual podrías explicar mejor en este proyecto como recaba la información web el shield de Ethernet.
    Por lo que leo en los comentarios no parece quedar claro que la parte del código referente a los actuadores (servo en el ejemplo) es:

    int Indice_CadenaHTTP = Contenido_Peticion.indexOf(“Servo=”);
    if(Contenido_Peticion.substring(Indice_CadenaHTTP)==”Servo=1″ && P_Servo0){
    //Se incrementa actualiza la posición del servomotor (se reduce).
    P_Servo=P_Servo – 20;
    //Se procede a mover el servomotor a la posición adecuada.
    Servomotor.write(P_Servo);
    }
    if(Contenido_Peticion.substring(Indice_CadenaHTTP)==”Servo=0″ && P_Servo>0){
    //Se incrementa actualiza la posición del servomotor (se reduce).
    P_Servo=P_Servo – 20;
    //Se procede a mover el servomotor a la posición adecuada.
    Servomotor.write(P_Servo);
    }

    Donde “Contenido_Peticion.indexOf(“Servo=”);” Devuelve 1 o 0 según el botón activado ya que envía por HTML al cliente y “Contenido_Peticion.substring(Indice_CadenaHTTP)” Devuelve la cadena concatenada “Servo=1″ó”Servo=0” que habia sido leída de la variable “EthernetClient cliente”:
    char c = client.read();
    Serial.write(c);
    Contenido_Peticion.concat(c);

    Dicha variable almacena “?Servo=1” al activar el botón o bien “?Servo=0” al desactivarlo.

    Saludos y gracias Enrique!

    Responder
  8. Hola, solo queria felicitarte, estoy con un proyecto de domotica y tu blog me parece estupendo, aún no he probado nada (porque estoy recavando infrmación) pero me parece genial como te explicas.

    Sigue así y muchas gracias!

    Responder
    • Muchas gracias por los ánimos, Jon. smile Te leo en los comentarios.

      Responder
  9. Enrique buenas tardes! crees que me puedas ayudar, hice un programa de monitoreo de temperatura a traves de una web, con maximos minimos, y cuando se pasa de esos valores manda un email y todo se guarda en una microsd, ahora lo que necesito hacer es modificar los maximos minimos y los correos a donde se van a enviar las alertas desde el servidor web html, para no tener que estar compilando cada ves que quiera hacer un cambio

    Responder
    • Buenas Carlos,

      Ya tienes la respuesta en el otro comentario. De nuevo discúlpame por la tardanza.

      Un saludo.

      Responder
  10. Buenas,

    Y si en una página web utilizásemos con jquery o submits el mismo formulario ¿se pasarían los valores de las variables pasadas como parámetros?

    Un saludo y enhorabuena por el blog.

    Responder
    • Buenas Diego,

      No he probado nada de JavaScript… aun, pero supongo que no debería haber problema. No deja de ser una página web como cualquier otra.

      Un saludo, Enrique.

      Responder
  11. genial,

    Responder
  12. hola segui los pasos de esta pagina para un proyecto ,pero tengo problemas para cambiar la ubicacion de los botones es que al agregar mas botones estos aparecen debajo de los anteriores, pero deseo ponerlos uno alado del otro para que no sea tan largo la pagina, el detalle es que como tengo 10 botones estos se distribuyen de a 2 botones por fila

    Responder
    • Buenas Jesús,

      Para que la ubicación, colores, tamaños… de los botones que de como tú quieras, tienes que realizar los cambios con HTML y CSS.

      Un saludo, Enrique.

      Responder
  13. Excelentes explicaciones amigo, muchas felicidades, tengo una gran duda, es posible , yo quiero encender un led con un solo boton y que este se apague en una cantidad “x” de segundos sin necesidad de presionar otro boton que modifique la url como dices tu aqui (disculpa si no uso algunas palabras mas adecuadas soy novato en esto), solo que por ejemplo yo presiono el boton de encendido se modifica la url, y se enciende mi led y lo doy un delay de 5 segundos por ejemplo y le doy la instruccion de que se apague, solo que al refrescar la pagina sigue estando la url modificada y por lo tanto el led se vuelve a encender y asi sucesivamente, mi pregunta es , ¿como puedo hacer para que despues de esos 5 segundos la url vuela a como estaba antes de presionar el boton de encendido y que esta se modificara? y asi lograr con esto que el led ya no se vuelva a encender , hasta que claro vuelva a presionar el boton, ¿es posible esto?¿ o hay otros metodos no se con la string que pudiera hacer? Agradeceria demasiado la respuesta.

    Felicidades por su pagina es excelente wink

    Responder
    • Buenas Miguel Angel,

      puedes utilizar la idea de un botón monoestable, es decir, dentro del conjunto de instrucciones que se ejecutan cuando se pulsa un botón añades tanto el código para encenderlo como para apagarlo tras unos segundos.

      Un saludo, Enrique.

      Responder
      • Gracias por la respuesta, y mas o menos como seria eso?

        Esta parte de mi codigo es la que hace cambiar la url al presionar el boton
        cliente.println(“”);

        y asi lo estoy encendiendo.

        if(c==’\n’ && lineaenblanco) //Si la petición HTTP ha finalizado
        {
        int LED = readString.indexOf(“CG=”);
        if(readString.substring(LED,LED+5)==”CG=ON”) {
        digitalWrite(PIN_LED,HIGH);
        delay (5000);
        digitalWrite(PIN_LED,LOW);

        Solamente que en mi url sigue apareciendo el “CC=ON” que aparecio cuando presione el boton . y por lo tanto el programa vuelve a prender el led y asi sucesivamente. ¿Como podria hacer para quitar ese CC=ON de la url si necesidad de presionar otro boton que me la cambie?

        Insisto soy algo novato en esto , y no se si mis preguntas puedan ser algo tontas :S

      • Buenas Miguel Angel,

        Estás tratando de apagar el LED mediante la placa en lugar de mediante la página. Donde debes editarlo es en la página, es decir, en el código correspondiente a la acción de los botones. El código está establecido para que cuando pulses un botón se cambie el estado de la página al valor de ese botón. Tú debes modificarlo para que se cambie el estado de la página y luego vuelva al estado anterior.

        Un saludo, Enrique.

  14. Lo he probado y está genial. Muy útil para comenzar a probar ha realizar cosas con arduino desde internet!!
    Ahora a seguir trasteando con el código… Gracias!

    Responder
    • Buenas Manuel,

      Me alegro de que te haya sido de utilidad. smile

      Un saludo, Enrique.

      Responder

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Mover Un Servomotor Por Internet Con Arduino Ethernet Shield was last modified: diciembre 14th, 2016 by Enrique
Share This

¿Me ayudas?

Hey! Espero que te esté gustando el artículo. ¿Me ayudarías compartiéndolo con tus amigos? Un pequeño paso para ti, un gran paso para EducaChip. :) ¡Gracias!