TODOPIC
Otros Microcontroladores / Dispositivos programables => Microcontroladores ARM => Mensaje iniciado 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... :(
// 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;
}
-
Hola splasma2,
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.
-
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::
<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:
<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>
-
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!!
-
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.
-
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!!
-
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)
-
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!!
-
Bueno, ya consegui otro mbed :-/ (el anterior se me quemo, snif).
Cuidalo más, por favor!!! :8} :D :D
Compraste uno?
-
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!!
-
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!
-
"el q no llora no mama" jeje.
Gran refrán y aplicable en el 100% de los casos.
Enhorabuena por conseguir otro, gera.
-
:-/ :-/ me alegro Gera, ahora a experimentar con el :-/ :-/ tratalo como si fuera tu querida mujer :D :D
-
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!!
-
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??
-
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:
-
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!!
-
Splasma, estuve probando el server pero no compila, me tira el siguiente error:
"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!!
-
Idea del precio que lo pago tenes??
-
Bravo por Android! ;D
-
Splasma, estuve probando el server pero no compila, me tira el siguiente error:
"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">
-
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
-
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!!
-
¿ Que error te da ?
Y si, el codigo está escrito para que el control de las salidas se haga usando solo RPC.
Saludos