Autor Tema: [PROYECTO] Controlar Arduino por Internet  (Leído 17040 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado fidodido

  • PIC12
  • **
  • Mensajes: 51
[PROYECTO] Controlar Arduino por Internet
« en: 06 de Junio de 2012, 07:28:55 »
Hola!!! Bueno pues quiero presentaros mi proyecto; lo que quiero conseguir es controlar mi Arduino (leer entradas, activar salidas, leer entradas analógicas......) a través de una pagina web embebida en el micro (que mas adelante intentaré que este embebida en la SD para tener mas espacio en el micro).

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

Logros hasta el momento

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

-Conseguir encender/apagar LEDs y leer entradas analógicas con conexión directa PC-Arduino.

-Conseguir encender/apagar LEDs y leer entradas analógicas conectando el Arduino a la misma red local que el PC y el movil y acceder desde los mismos, desde cualquier parte del edificio mientras haya conexión a la red local.

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

Materiales

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

En mi caso mis materiales básicos son los siguientes:

Arduino UNO:


Cable USB:


Ethernet Shield:


Cable RJ45:


LEDs: (para probar salidas)


----------------------------------------------------------------------------------------------------------------------------------------------------------------------

El código

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

Bien, pues el código lo saque de una pagina pero lo retoque un poco para que me funcionase, temas de IP, puerto y poco mas, aunque mas adelante le haré retoques mas profundos para añadir mas cosas a la pagina, pero por el momento, esto es lo que tengo:

Código: [Seleccionar]
// unicarlos.dyndns.org:88  (ip de mi router que se actualiza automaticamente)
// y funciona con la configuracion del router de abrir puerto e ip
// y se puedan encender y apagar leds (Pines digitales del 2 al 9).
// Pines 10,11,12 y 13 los usa para comunicarse con la ethernet

#include <SPI.h>
#include <String.h>
#include <Ethernet.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFF, 0xEE}; // direccion MAC de tu Ethernet
byte ip[] = { 192, 168, 1, 229 };  // ip que le pones dentro de tu red como fija y configurada en tu router
Server server(80);  //  88 puerto por el accedemos al servidor. Normalmente seria la 80

int dig[] =  {2,3,4,5,6,7,8,9}; // pines digitales a usar. No uso 0 y 1 que son de transmisin serie
                                // Tampoco uso el 10,11,12 y 13 ya que los uso para la ethernet
int digTotal = 8;  // Numero de pines a usar
int vdig[] = {0,0,0,0,0,0,0,0}; // valores iniciales (Tantos como pines usemos)
int pin;
int nivel;
String cad = String(100);

void setup()
{
  Ethernet.begin(mac, ip); // inicio la Ethernet
  server.begin();          // inicio el servidor
  Serial.begin(9600);      // inicio el serial monitor
  for (int i=0; i < digTotal; i++)
  {
    pinMode(dig[i], OUTPUT);   // inicializo los pines digitales como salida
    digitalWrite(dig[i],vdig[i]);  // los pongo a nivel bajo LOW=0
  }
}

void loop()
{
  cad = ""; // inicializo la cad donde almaceno los datos recibidos
  Client cliente = server.available();
  if (cliente)
  {
    while(cliente.connected())
    {
      if(cliente.available())
      {
        char c = cliente.read();
        cad = cad + c;
        Serial.print(c);

        if(c == '\n')
        {
          if (cad.lastIndexOf("dig") > -1) // si la variable cad contiene 'dig' hacer ...
          {
            pin = pinElegido(cad);
            int posicionPin;
            for (int i=0; i <digTotal; i++)
            {
              if (dig[i] == pin)
              {
                posicionPin = i;
                break;
              }
            }
            nivel = nivelElegido(cad);
            vdig[posicionPin] = nivel;
 
            Serial.print(pin);  // comprobamos que el pin elegido es el correcto
            Serial.println(" pin.   --  ");
            Serial.print(nivel); // comprobamos su nivel 0=LOW y 1=HIGH
            Serial.println(" nivel ");
            
            digitalWrite(pin, nivel);  // activamos o desactivamos el pin elegido
            
          }  // ... hasta aqui 'dig'
          
          if (cad.lastIndexOf("apaga") > -1)  // si la variable cad contiene 'apaga' ejecuta
          {                                    // la funcion apagaTodos()
            apagaTodos();
          }
          
          if (cad.lastIndexOf("encender") > -1) // si cad contiene 'encender' ejecuta
          {                                     // la funcion enciendeTodos()
            enciendeTodos();
          }
          // Comienza la transmision de datos desde el servidor al cliente
          cliente.println("HTTP/1.1 200 OK");
          cliente.println("Content-Type: text/html");
          cliente.println();

          for (int i=0; i < digTotal; i++)
          {
              cliente.print("Digital ");
              cliente.print(dig[i]);
              cliente.print(" ");
    
              if (vdig[i]==1)
              {
                cliente.println("<font color='green'>ON</font>");
                cliente.print("<form method=get><input type=hidden name=dig");
                cliente.print(dig[i]);
                cliente.print(" value=0><input type=submit value=OFF></form>");
              }
              if (vdig[i]==0)
              {
                cliente.println("<font color='grey'>OFF</font>");
               // cliente.println("<td>");
                cliente.print("<form method=get>");
                cliente.print("<input type=hidden name=dig");
                cliente.print(dig[i]);
                cliente.print(" value=1>");
                cliente.print("<input type=submit value=ON>");
                cliente.print("</form>");          
              }
          }          
          cliente.print("<form method=get><input type=hidden name=apaga");
          cliente.println(" value=1><input type=submit value=APAGA_TODOS></form>");
                
          cliente.println("<form method=get><input type=hidden name=encender");
          cliente.println(" value=1><input type=submit value=ENCENDER_TODOS></form>");
                
          cliente.stop();
        }
      }
    }
  }
}



//////////////  FUNCIONES /////////////////7
// Funcion: Extrae el pin del array cad (contiene la lectura de lo que el cliente devuelve)
int pinElegido(String cad)
{

    int pos_dig = cad.lastIndexOf("dig");
    int pos_igual = cad.lastIndexOf("=");
    String vpin1 = cad.charAt(pos_dig+3);
    String vpin2 = cad.charAt(pos_dig+4);
    if (vpin2 != '=')
    {
      vpin1 += vpin2;
    }
    
    int pinElegido = vpin1.toInt();
    return pinElegido;
}
// Funcion: Extrae en nivel de la cadena cad
int nivelElegido(String cad)
{
  int pos_igual =  cad.lastIndexOf("=");
  String v = cad.charAt(pos_igual+1);
  if (v == 0) return 0;
  if (v == 1) return 1;
}
// Funcion para apagar todos los leds al tiempo
void apagaTodos()
{
  for (int i=0; i < digTotal; i ++)
  {
    vdig[i] = 0;
    digitalWrite(dig[i], vdig[i]);
  }
}
// Funcion para encender todos los leds al tiempo
void enciendeTodos()
{
  for (int i=0; i < digTotal; i ++)
  {
    vdig[i] = 1;
    digitalWrite(dig[i], vdig[i]);
  }
}


Por el momento solo hice pruebas conectándolo al PC directamente y probando desde ahí y conectándolo a la red local y probando desde el PC, por el momento todo bien, me falta configurar router y poco mas y luego empezarían las pruebas para intentar conectarse desde internet.



----------------------------------------------------------------------------------------------------------------------------------------------------------------------

Problemas

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

Bien, pues como todo proyecto, este no esta libre de problemas, iré actualizando esta parte según me vayan surgiendo, por el momento me surgen los siguientes:


RED LOCAL:

-A veces al acceder a la pagina se queda colgada o sólo aparecen la mitad de los botones, nose si será problema de que es una página demasiado pesada para el micro, más adelante, cuándo consiga acceder desde internet intentaré meter la página en la tarjeta SD (ya que el ethernet shield tiene soporte para ello) y acceder a ella para cojer la página.

-En mi casa (ya que hago pruebas en el trabajo y en casa) consegui que comunicase la placa con el portátil, incluso acceder a la página y apagar/encender LEDs, pero pasado medio minuto o menos se queda colgado todo y tengo que quitarle alimentación a la placa para que vuelva a funcionar, sin embargo en el trabajo me funciona todo bien, tanto la conexión directa Arduino-PC como conexión Arduino-PC (e incluso arduino móvil) estando el Arduino conectado a la red local de la empresa.

-La lectura de las entradas analógicas no es constante, es decir, hay que refrescar la página para saber su valor.


Saludos y espero que os guste :).


PD: a ver si a la tarde/noche subo el vídeo del proyecto funcionando en la red local.
PD2: iré actualizando el hilo a medida que vaya consiguiendo avances.
« Última modificación: 07 de Junio de 2012, 05:34:24 por fidodido »

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: [PROYECTO] Controlar Arduino por Internet
« Respuesta #1 en: 06 de Junio de 2012, 18:04:44 »
Hola!!! Bueno pues quiero presentaros mi proyecto; lo que quiero conseguir es controlar mi Arduino (leer entradas, activar salidas, leer entradas analógicas......) a través de una pagina web embebida en el micro (que mas adelante intentaré que este embebida en la SD para tener mas espacio en el micro).


Empiezo por lo básico:

Materiales: En mi caso mis materiales básicos son los siguientes:

Arduino UNO:


Cable USB:


Ethernet Shield:


Cable RJ45:


LEDs: (para probar salidas)



El código: Bien, pues el código lo saque de una pagina pero lo retoque un poco para que me funcionase, temas de IP, puerto y poco mas, aunque mas adelante le haré retoques mas profundos para añadir mas cosas a la pagina, pero por el momento, esto es lo que tengo:


Por el momento solo hice pruebas conectándolo al PC directamente y probando desde ahí y conectándolo a la red local y probando desde el PC, por el momento todo bien, me falta configurar router y poco mas y luego empezarían las pruebas para intentar conectarse desde internet.



Saludos y espero que os guste :).


PD: a ver si a la tarde/noche subo el vídeo del proyecto funcionando en la red local.
PD2: iré actualizando el hilo a medida que vaya consiguiendo avances.



Elegante tocayo! hace rato quiero comprarme un arduino de estos. ¿Que IDE estas utilizando?

Desconectado fidodido

  • PIC12
  • **
  • Mensajes: 51
Re: [PROYECTO] Controlar Arduino por Internet
« Respuesta #2 en: 06 de Junio de 2012, 18:59:41 »
jajaja gracias :)


Pues el IDE de arduino, el propio que tienen en la pagina web, y la verdad es una buena inversión, si lo vas a cojer te aconsejo que lo compres por ebay ya que al ser open source todas las copias funcionan igual que el original, o sino en la pagina buyincoins que también los tienen baratos. Cualquier duda me comentas y yo te digo.


Por cierto, a ver si subo el vídeo del proyecto funcionando en una red local.



Saludos

Desconectado Anrafel

  • PIC10
  • *
  • Mensajes: 2
Re: [PROYECTO] Controlar Arduino por Internet
« Respuesta #3 en: 27 de Octubre de 2012, 01:23:39 »
Hola Fidodido, deseo felicitarte esta muy bueno tu proyecto y gracias por compartirlo con la comunidad.
Me gustaría saber como sigue tu proyecto? Lograste superar tus inconvenientes?
Yo también tengo uan tarjeta arduino UNO R3 en la cual he realizado cosas pequeñas (encender y controlar intesidad de led, controlar servomotores, acelerómetros de 3 ejes, etc) y el martes me llega la tarjeta ethernet con la cual tengo pensado experimentar de ahora en adelante.
Por eso me ha encantado este proyecto que has armado, a ver si me comentas como va y si puedo colaborar en algo con mucho gusto :)

Saludos desde Perú.


 

anything