TODOPIC

Otros Microcontroladores / Dispositivos programables => Microcontroladores ARM => Mensaje iniciado por: splasma2 en 09 de Enero de 2011, 07:47:25

Título: Mini servidor web con mbed
Publicado por: splasma2 en 09 de Enero de 2011, 07:47:25
Hola de nuevo, os cuento mi primera experiencia con la placa mbed ( mbed.org ),  una placa ARM que tiene el entorno de desarrollo en la nube , lo que permite usar y compartir multitud de librerias super-utiles.

Y eso es lo que yo he hecho, usar la libreria Ethernet + TCP/IP( si, la placa soporta conexión de red)  y una libreria de servidor Web disponible ( todo en C++) , de forma que hacer un mini-servidor web que atiende a comandos básicos , como enceder o apagar los leds de la placa via web, ha sido tan fácil como el código que os pongo abajo, bueno hay una pequeña trampa, como la complejidad del código en la placa es mínima, he tenido que meter un poco de  Javascript en la página que devuelve el mini-servidor, pero tampoco ha sido complicado ... Lo he probado desde un portatil con  Windows, un móvil android y un Iphone y los comandos remotos funcionan perfectamente en los tres casos.

Los comandos se activan desde código javascript de la página, porque mbed implementa un mecanismo de invocacion remota llamado RPC ( original  :)) que puede ejecutarse desde el mini-servidor web que ejecutamos en la placa, por ejemplo para encender el led1, se puede hacer con la siguiente URL:
http::/ip-del-mini-server/led1/write 1.

 Ahora solo queda usar las salidas digitales de la placa para activar/desactivar por ejemplo reles, y estamos a un paso de un control web domotico, ah,  RPC permite también acceder a ports de entrada, port analogicos o cosas más compejas como dispositivos I2C, USB, etc... todo se puede presentar como una sencilla URL  :lol: :lol:

El código que hay que cargar en la placa es este , con tiempo os pondre el código de la pagina html...

Una pega importante, para poder compilar y acceder al entorno de desarrollo ( en la nube) hay que tener una placa mbed... :(

Código: [Seleccionar]
// Mini-servidor WEB en mbed
// para uso domotico.
//
// MBC (splasma) 2011

#include "mbed.h"
#include "TextLCD.h"
#include "EthernetNetIf.h"
#include "HTTPServer.h"
#include "RPCVariable.h"

EthernetNetIf eth; 
HTTPServer svr;

TextLCD lcd(p21, p22, p23, p24, p25, p26,TextLCD::LCD16x2); // rs, e, d4-d7

DigitalOut led1(LED1, "led1");
DigitalOut led2(LED2, "led2");
DigitalOut led3(LED3, "led3");
DigitalOut led4(LED4, "led4");

LocalFileSystem fs("webfs");

int Ticks = 0;
//Attach variable to an RPCVariable Object
RPCVariable<int> rpc_i(&Ticks, "ticks");

int main() {
  Base::add_rpc_class<DigitalOut>();

  lcd.cls();
  lcd.printf("Setting up...\n");

  EthernetErr ethErr = eth.setup(10000);
 
  if(ethErr)
  {
    lcd.printf("Error %d.\n", ethErr);
    return -1;
  }
  lcd.printf("Setup OK\n");
  IpAddr ethIp = eth.getIp();
  lcd.printf("IP :%d.%d.%d.%d\n", ethIp[0], ethIp[1], ethIp[2], ethIp[3]);
  const char* hwAddr = eth.getHwAddr();
  //lcd.printf("MAC:%02x:%02x:%02x:%02x:%02x:%02x\n",
  // hwAddr[0], hwAddr[1], hwAddr[2],
  // hwAddr[3], hwAddr[4], hwAddr[5]);


  FSHandler::mount("/webfs", "/files"); //Mount /webfs path on /files web path
  FSHandler::mount("/webfs", "/"); //Mount /webfs path on web root path
 
  svr.addHandler<SimpleHandler>("/hello");
  svr.addHandler<RPCHandler>("/rpc");
  svr.addHandler<FSHandler>("/files");
  svr.addHandler<FSHandler>("/"); //Default handler
 
  svr.bind(80);
 
   Timer tm;
  tm.start();
  //Listen indefinitely
  while(true)
  {
    Net::poll();
    if(tm.read()>.5)
    {
      led1=!led1; //Show that we are alive
      tm.start();
      if (led1) Ticks++;
    }
  }
 
  return 0;
}
Título: Re: Mini servidor web con mbed
Publicado por: c4_esp_VR en 11 de Enero de 2011, 12:28:23
Hola splasma2,

Citar
Una pega importante, para poder compilar y acceder al entorno de desarrollo ( en la nube) hay que tener una placa mbed... Sad

Puedes hacerlo off-line desde el MDK-ARM.

Aquí tienes un tuto de como hacerlo.

Porting an mbed Project to MDK-ARM (http://www.keil.com/appnotes/docs/apnt_207.asp)

Por otro lado podrías poner el circuito o esquemático aparte del código del javascript, muy buen tuto de iniciación  :-/ :-/ :-/

Un saludete y gracias compi.
Título: Re: Mini servidor web con mbed
Publicado por: splasma2 en 13 de Enero de 2011, 17:27:19
Os pongo la página HTML con el código Javascript (x.x.x.x es la dirección publica a usar), es la primera , está poco desarrollada... :oops::

Código: [Seleccionar]
<html>
<head>
<title>MBED Webhome</title>
<!--META HTTP-EQUIV="REFRESH" CONTENT="5">


<SCRIPT TYPE="text/javascript">

function getHTTPObject() {
var xhr = false;
  try {
      xhr = new XMLHttpRequest();
    } catch(e) {
      try {
xhr = new ActiveXObject("Msxml2.XMLHTTP");
}
      catch (e2) {
        try {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
        catch (e) {}
    }
  }
return xhr;
}
var http = getHTTPObject();


function getTS()
{
var res = null;
 
http.open("GET", "http://x.x.x.x/rpc/ticks/read", false);   

http.send();
res = http.responseText;
var min = res % 3600;
var horas = res / 3600;
document.getElementById("counter").innerHTML = parseInt(horas) + " horas, " + parseInt(min/60) + " minutos y " + (min%60) + " segundos.";

}

function getTemp()
{
var res = null;
 
http.open("GET", "http://x.x.x.x/rpc/temperature/run", false);   

http.send();
res = http.responseText;
document.getElementById("temperatura").innerHTML = res;

}

function getStatus()
{
var res = null;
 
http.open("GET", "http://x.x.x.x/rpc/led2/read", false);   

http.send();
res = http.responseText;

changeColor('Luz1',res);

http.open("GET", "http://x.x.x.x/rpc/led3/read", false);   

http.send();
res = http.responseText;

changeColor('Luz2',res);

}

function cambiarEstado(element,estado)
{

if (estado == 0)
  http.open("GET", "http://x.x.x.x/rpc/" + element + "/write 0", true);
else
http.open("GET", "http://x.x.x.x/rpc/" + element + "/write 1", true);
  http.send(null);
}

function changeColor(element,estado){
if (estado == 1)
document. getElementById(element).style.color = "blue";
else
document. getElementById(element).style.color = "red";
}


</SCRIPT>




</head>


<body 
    BACKGROUND="water003.jpg"
    BGCOLOR="#FFFFFF"
    TEXT="#000000"
    LINK="#0000FF"
    VLINK="#FF66FF"
    ALINK="#FF0000"
    onload="getTS();getTemp();getStatus();">


<div style="text-align: center;">
<span style="background-color: rgb(255, 255, 255); font-size: 18pt;">WEB HOME</span><br />
</div>
<div style="text-align: center;">
<span style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 205);">MI CASA</span><br />
<br/>
Llevo encendido:&nbsp;
<div id="counter"> -- </div>
<br/>
<br/>
Temperatura: <div id="temperatura"> -- </div>
<br/>
<br/>

<table style="text-align: center; border-collapse: collapse; width: 50%;">
<tbody>
<tr>
<td width="20%"><STRONG ID="Luz1">LUZ 1</STRONG></td>
<td width="10% style="" rowspan="1">
<BUTTON TYPE=SUBMIT ID="Luz1On" onClick="changeColor('Luz1',1);cambiarEstado('led2',1)">
<STRONG>Encender</STRONG></BUTTON>
</td>
<td width="10% style="" rowspan="1">
<BUTTON TYPE=SUBMIT ID="Luz1Off" onClick="changeColor('Luz1',0);cambiarEstado('led2',0)">
<STRONG>Apagar</STRONG></BUTTON>
</td>
</tr>
<tr>
<td width="20%"><STRONG ID="Luz2">LUZ 2</STRONG></td>
<td width="10% style="" rowspan="1">
<BUTTON TYPE=SUBMIT ID="Luz1On" onClick="changeColor('Luz2',1);cambiarEstado('led3',1)">
<STRONG>Encender</STRONG></BUTTON>
</td>
<td width="10% style="" rowspan="1">
<BUTTON TYPE=SUBMIT ID="Luz1Off" onClick="changeColor('Luz2',0);cambiarEstado('led3',0)">
<STRONG>Apagar</STRONG></BUTTON>
</td>
</tr>
</tbody>
</table>
</body>
</html>
Título: Re: Mini servidor web con mbed
Publicado por: gera en 13 de Enero de 2011, 18:34:49
Hola!! Yo tambien hice andar un mini webserver con el mbed. Tuve q desarmar una placa de red por el tema de los magneticos y eso. Mas adelante cuando tenga un tiempito les muestro como :wink:
El problema es q el webserver es muy estatico. Yo tenia ganas de hacer algo mas dinamico para poder mostrar y modificar variables a traves del sitio web. Cuando tenga algo lo publico.
saludos!!
Título: Re: Mini servidor web con mbed
Publicado por: splasma2 en 13 de Enero de 2011, 18:52:53
Gera , me alegro de no estar solo  :mrgreen: :mrgreen:

Para hacer lo que comentas yo uso las librerias RPC de mbed, en el código que he publicado está incluida la forma de controlar los leds de la placa ( salidas) y también como leer la temperatura que da un LM35 conectado a una entrada analogica y el tiempo (ticks) que lleva la placa encendida, a todo se accede desde la pagina web de forma fácil gracias al RPC.
Título: Re: Mini servidor web con mbed
Publicado por: gera en 13 de Enero de 2011, 19:38:51
Q buen dato!! Estuve buscando en el sitio de mbed sobre un webserver dinamico y no encontre nada q me convenciera. Pero esto q me decis esta muy bueno!! Ya voy a hacer unas pruebas a ver q tal :wink:
gracias!!
Título: Re: Mini servidor web con mbed
Publicado por: splasma2 en 15 de Enero de 2011, 20:58:29

He hecho una aplicación Android para acceder al mini-webserver , os pongo una imagen de como va quedando:

(http://img696.imageshack.us/img696/6449/micasaandroid.png)
Título: Re: Mini servidor web con mbed
Publicado por: gera en 29 de Enero de 2011, 21:09:59
Bueno, ya consegui otro mbed  :-/ (el anterior se me quemo, snif). Asiq ya me voy a poner a probar este webserver, se lo ve muy interesante :wink:
saludos!!
Título: Re: Mini servidor web con mbed
Publicado por: Suky en 29 de Enero de 2011, 21:12:32
Bueno, ya consegui otro mbed  :-/ (el anterior se me quemo, snif).

Cuidalo más, por favor!!!  :8}   :D :D


Compraste uno?
Título: Re: Mini servidor web con mbed
Publicado por: gera en 29 de Enero de 2011, 21:25:27
Si, prometo cuidarlo jeje. Ya consegui integrados aisladores para cuando trabaje con potencia.
En realidad tuve muchisima suerte. El primer mbed me lo mandaron gratis porq era para un concurso, y estuve trabajando en mi robot equilibrista. Cuando se me quemo, les mande un mail explicando lo que paso, y les mostre como iba mi proyecto. Como les gusto, me dijeron q me iban a mandar otro para que lo finalice, pero q lo cuide jaja.
La verdad que no me imagine q me iban a mandar otro. Todo gracias a mi viejo que me dijio "el q no llora no mama" jeje.

Saludos!!
Título: Re: Mini servidor web con mbed
Publicado por: Suky en 29 de Enero de 2011, 21:50:30
Si, prometo cuidarlo jeje. Ya consegui integrados aisladores para cuando trabaje con potencia.
En realidad tuve muchisima suerte. El primer mbed me lo mandaron gratis porq era para un concurso, y estuve trabajando en mi robot equilibrista. Cuando se me quemo, les mande un mail explicando lo que paso, y les mostre como iba mi proyecto. Como les gusto, me dijeron q me iban a mandar otro para que lo finalice, pero q lo cuide jaja.
La verdad que no me imagine q me iban a mandar otro. Todo gracias a mi viejo que me dijio "el q no llora no mama" jeje.

Saludos!!

Increíble!! Bueno, felicitaciones por el regalo bis, y grande el viejo!  :)


Saludos!
Título: Re: Mini servidor web con mbed
Publicado por: Nocturno en 30 de Enero de 2011, 04:29:18
"el q no llora no mama" jeje.


Gran refrán y aplicable en el 100% de los casos.

Enhorabuena por conseguir otro, gera.
Título: Re: Mini servidor web con mbed
Publicado por: stk500 en 30 de Enero de 2011, 07:12:18
 :-/ :-/ me alegro Gera, ahora a experimentar con el  :-/ :-/ tratalo como si fuera tu querida mujer  :D :D
Título: Re: Mini servidor web con mbed
Publicado por: gera en 30 de Enero de 2011, 12:55:09
Jeje, muchas gracias. Y pierdan cuidado que lo voy a cuidar como oro!!
La verdad que ahora me da miedo volver a usarlo en el robot a pesar de los aisladores que consegui. Por ahora me voy a poner a jugar un poco con el webserver jeje.
Saludos!!
Título: Re: Mini servidor web con mbed
Publicado por: MGLSOFT en 30 de Enero de 2011, 13:14:26
Jeje, muchas gracias. Y pierdan cuidado que lo voy a cuidar como oro!!
La verdad que ahora me da miedo volver a usarlo en el robot a pesar de los aisladores que consegui. Por ahora me voy a poner a jugar un poco con el webserver jeje.
Saludos!!
Donde conseguiste el mbed en Argentina??
Título: Re: Mini servidor web con mbed
Publicado por: Suky en 30 de Enero de 2011, 13:31:33
Jeje, muchas gracias. Y pierdan cuidado que lo voy a cuidar como oro!!
La verdad que ahora me da miedo volver a usarlo en el robot a pesar de los aisladores que consegui. Por ahora me voy a poner a jugar un poco con el webserver jeje.
Saludos!!
Donde conseguiste el mbed en Argentina??

Si, prometo cuidarlo jeje. Ya consegui integrados aisladores para cuando trabaje con potencia.
En realidad tuve muchisima suerte. El primer mbed me lo mandaron gratis porq era para un concurso, y estuve trabajando en mi robot equilibrista. Cuando se me quemo, les mande un mail explicando lo que paso, y les mostre como iba mi proyecto. Como les gusto, me dijeron q me iban a mandar otro para que lo finalice, pero q lo cuide jaja.
La verdad que no me imagine q me iban a mandar otro. Todo gracias a mi viejo que me dijio "el q no llora no mama" jeje.

Saludos!!

 :mrgreen:
Título: Re: Mini servidor web con mbed
Publicado por: gera en 30 de Enero de 2011, 16:48:07
Jeje, muchas gracias. Y pierdan cuidado que lo voy a cuidar como oro!!
La verdad que ahora me da miedo volver a usarlo en el robot a pesar de los aisladores que consegui. Por ahora me voy a poner a jugar un poco con el webserver jeje.
Saludos!!
Donde conseguiste el mbed en Argentina??

Me lo mandaron gratis para participar en un concurso. Pero un amigo que lo compro lo encargo a electrocomponentes.
saludos!!
Título: Re: Mini servidor web con mbed
Publicado por: gera en 30 de Enero de 2011, 17:04:31
Splasma, estuve probando el server pero no compila, me tira el siguiente error:

Código: [Seleccionar]
"Class "EthernetNetIf" has no member "getHwAddr" (E135) <a href="#" onClick="window.open('/cookbook/Compiler-Error-135');">(more info)</a>" in file "/HTTPServerExample.cpp"
Inclui la ultima version de la libreria EthernetNetIf en el proyecto, pero sigue tirando ese error. Sabes q puede ser?
Saludos!!

EDIT:
Bueno, ya lo solucione borrando esa linea jeje. El ejemplo ya esta funcionando a la perfeccion!! :D excelente trabajo Splasma!!
Habra alguna forma de usar AJAX o algo parecido para no tener q estar recargando la pagina para actualizar las variables??
Ya me voy a poner a jugar un rato con esto a ver que se puede hacer :wink:
saludos!!
Título: Re: Mini servidor web con mbed
Publicado por: MGLSOFT en 30 de Enero de 2011, 20:15:54
Idea del precio que lo pago tenes??
Título: Re: Mini servidor web con mbed
Publicado por: J1M en 31 de Enero de 2011, 05:48:08
Bravo por Android! ;D
Título: Re: Mini servidor web con mbed
Publicado por: splasma2 en 31 de Enero de 2011, 05:57:26
Splasma, estuve probando el server pero no compila, me tira el siguiente error:

Código: [Seleccionar]
"Class "EthernetNetIf" has no member "getHwAddr" (E135) <a href="#" onClick="window.open('/cookbook/Compiler-Error-135');">(more info)</a>" in file "/HTTPServerExample.cpp"
Inclui la ultima version de la libreria EthernetNetIf en el proyecto, pero sigue tirando ese error. Sabes q puede ser?
Saludos!!

EDIT:
Bueno, ya lo solucione borrando esa linea jeje. El ejemplo ya esta funcionando a la perfeccion!! :D excelente trabajo Splasma!!
Habra alguna forma de usar AJAX o algo parecido para no tener q estar recargando la pagina para actualizar las variables??
Ya me voy a poner a jugar un rato con esto a ver que se puede hacer :wink:
saludos!!

Enhorabuena Gera, la verdad es que hay recorrido con esta plaquita y el mini webserver... hay que felicitar a la gente de mbed... :P

Para conseguir la recarga automatica de la página, descomenta la siguiente linea:

<!--META HTTP-EQUIV="REFRESH" CONTENT="5">
Título: Re: Mini servidor web con mbed
Publicado por: gera en 31 de Enero de 2011, 14:30:36
Idea del precio que lo pago tenes??

Hmm me mataste. Tendrias q comunicarte con electrocomponentes. Y si no en sparkfun tambien lo tienen a un precio razonable, solo q con el envio se pone aspero :S
Título: Re: Mini servidor web con mbed
Publicado por: Billy en 03 de Diciembre de 2012, 06:12:36
Que tal!!
Disculpa intente compilar tu progama pero me marca errores, intento controlas una salida digital por internet.
Tambien, si me pertimtes preguntar la forma en que cambias el estado de la variable "led" (http::/ip-del-mini-server/led1/write 1)
es solo para la RPC o se puede utilizar para alguna otra??

de ante mano gracias!!
Título: Re: Mini servidor web con mbed
Publicado por: splasma2 en 14 de Diciembre de 2012, 15:00:18
¿ Que error te da ?

Y si, el codigo está escrito para que el control de las salidas se haga usando solo RPC.

Saludos