<body>

Sitios web relacionados: PingBlog | Fotos

domingo, octubre 05, 2008

Sentilla: Agua y fuego



Estoy escribiendo una pequeña aplicación para Sentilla Labs. Comencé primero escribiendo una pequeña aplicación para calibrar el sensor (algo que no habia resuelto muy bien hace tiempo atrás). Lo cierto es que primero usted debe averiguar la temperatura del sitio del cual piensa sacar las medidas, usando quizas el termostato de su casa y luego corre esto desde Sentilla Works (el ide de Eclipse):

 1 package com.kodegeek.app.aguayfuego;
2
3 import static javax.measure.unit.SI.CELSIUS;
4
5 import javax.measure.quantity.Temperature;
6
7 import com.sentilla.system.Leds;
8 import com.sentilla.system.LedsDriver;
9 import com.sentilla.system.PropertyDriver;
10 import com.sentilla.system.Sensor;
11 import com.sentilla.system.SensorDriver;
12
13 /**
14 * Calibrate the sensor using a known value
15 * @author josevnz@kodegeek.com - http://kodegeek.com
16 */

17 public final class SensorCalibration {
18
19 /**
20 * Persist the calibration temperature to
be used by all the applications
21 * @throws InterruptedException
22 */

23 public static void motemain() throws InterruptedException {
24 Sensor <Temperature>tempSensor =
SensorDriver.create("temp", Temperature.class);
25 Leds leds = LedsDriver.create();
26 float calibratedTemp = 25.0f; //
Put here your known temperature

27 leds.toggle(1);
28 double delta = calibratedTemp -
tempSensor.read().doubleValue(CELSIUS);
29 PropertyDriver.create("aguayfuego_temp_init", 8)
.writeDouble(delta);
30 leds.toggle(0);
31 }
32 }


Guardamos el valor en la lína 49. Una vez que usted corra este programa (solamente hace falta si sospecha que la temperatura de su cuarto ha cambiado mucho) entonces puede comenzar a capturar las temperaturas de nuevo. Fijense en el detalle de como se envia la temperatura, más el "delta" el cual contiene el ajuste:
 1 package com.kodegeek.app.aguayfuego;
2
3 import static javax.measure.unit.SI.CELSIUS;
4 import javax.measure.quantity.Temperature;
5 import com.sentilla.net.Mac64Address;
6 import com.sentilla.net.Sender;
7 import com.sentilla.net.SenderDriver;
8 import com.sentilla.system.Leds;
9 import com.sentilla.system.LedsDriver;
10 import com.sentilla.system.PropertyDriver;
11 import com.sentilla.system.Sensor;
12 import com.sentilla.system.SensorDriver;
13
14 /**
15 * Simple class to capture temperature using
Sentilla JMote
16 * @author josevnz@kodegeek.com - http://kodegeek.com
17 */

18
19 public final class TemperatureCapture {
20 public static final int WAIT_TIME = 1000;
21
22 /**
23 * Get the temperature reading
24 * @throws InterruptedException
25 */

26 public static void motemain()
throws
InterruptedException {
27 Sensor <Temperature>tempSensor =
28 SensorDriver.create("temp", Temperature.class);
29 Leds leds = LedsDriver.create();
30 long id = Mac64Address.getLocalAddress().longValue();
31 Sender sender = SenderDriver.create("local");
32 short count = 0;
33 TempMessage datamsg = new TempMessage();
34 datamsg.moteId = id;
35 leds.toggle(0);
36 double delta =
PropertyDriver
.open("aguayfuego_temp_init").readDouble();
37 while(true) {
38 count++;
39 datamsg.count = count;
40 datamsg.tempCelcius =
tempSensor
.read().doubleValue(CELSIUS) + delta;
41 leds.toggle(1); // Show the user the sensor is alive
42 sender.send(datamsg);
43 Thread.sleep(WAIT_TIME);
44 }
45 }
46 }

La línea 36 lee el delta y la 40 lee la temperatura con la corrección. Después la transmitimos en la linea 42.

Finalmente el cliente que lee los valores de los sensores (Esta es una aplicación común y silvestre de Java):
 1 package com.kodegeek.app.aguayfuego;
2
3 import java.io.IOException;
4 import java.util.Map;
5 import java.util.concurrent.ConcurrentHashMap;
6 import java.util.logging.Level;
7 import java.util.logging.Logger;
8 import com.sentilla.host.client.HostClient;
9 import com.sentilla.net.Receiver;
10 import com.sentilla.net.ReceiverDriver;
11
12 /**
13 * Simple command line client that collects
the temperature readings of
14 * all the motes in the wireless network.
15 * @author josevnz@kodegeek.com - http://kodegeek.com
16 */

17 public final class TemperatureClient {
18
19 private TemperatureClient() {};
20
21 private static final Logger log =
Logger.getLogger(TemperatureClient.class.getName());
22
23 static {
24 log.setLevel(Level.INFO);
25 }
26
27 private static final int MOTE_WAIT = 3000;
28
29 /**
30 * Helper class that captures the temperature
comming from the sensor
31 * @author josevnz
32 */

33 class TemperatureCaptureHelper {
34 public final Map <Long, TempMessage>sensorMap;
35
36 /**
37 * Parametric constructor
38 * @param sensorMap Map to store all the captured temperatures
39 */

40 public TemperatureCaptureHelper(Map <Long, TempMessage>sensorMap) {
41 this.sensorMap = sensorMap;
42 }
43
44 public void capture() {
45
46 // Connect to the Sentilla server
47 HostClient client = new HostClient();
48 try {
49 client.connect();
50 log.log(Level.INFO,
String.format("Connected to sensor gateway at %s,
capturing temperatures"
,
client.getHost()));
51 Receiver receiver =
ReceiverDriver.create(TempMessage.class);
52 while(true) {
53 receiver.setReceive()
.submit().block(MOTE_WAIT);
54 if (receiver.isDone()) {
55 TempMessage tmsg
= receiver.getData();
56 sensorMap
.put(tmsg.moteId, tmsg);
57 log.log(Level.INFO,
String
.format("Update from sensor id: %s, %.3f",
tmsg.moteId, tmsg.tempCelcius));
58 } else {
59 log.log(Level.INFO, "No update");
60 }
61 }
62 } catch (IOException ioExp) {
63 log.log(Level.SEVERE,
"Severe error, response will be dropped"
, ioExp);
64 } finally {
65 try {
66 if (client != null)
67 client.disconnect();
68 } catch (IOException ioExp) {
69 log.log(Level.SEVERE,
"Error while closing sensor connection", ioExp);
70 }
71 }
72 }
73 }
74
75 /**
76 * Collect the statistics from all the motes
77 * @param args Unused
78 */

79 public static void main(String[] args) throws Throwable {
80 log.log(Level.INFO, "Starting TemperatureService");
81 final TemperatureClient instance = new TemperatureClient();
82 try {
83 final Map <Long, TempMessage>temperatures
= new ConcurrentHashMap<Long, TempMessage>();
84 TemperatureCaptureHelper helper =
instance
.new TemperatureCaptureHelper(temperatures);
85 helper.capture();
86 } catch (Throwable throwbl) {
87 log.log(Level.SEVERE,
"Fatal error, no recover possible"
, throwbl);
88 throw throwbl;
89 }
90 }
91 }

Una vez resuelto esto puedo comenzar con la nueva aplicación. El código no está disponible en CVS, en algún momento colocaré todo para que se lo bajen. Mientras tanto les dejo esto para que se entretengan :)

Buscar en otros sitios:

Blogalaxia:, , , ,
Technorati:, , , ,
To2blogs:, , , ,
Del.icio.us:, , , ,

Etiquetas: , , , ,

viernes, septiembre 05, 2008

Sentilla Perk: La experiencia Mac OSX

Perk from Sentilla
Al fin, puedo programar mi Perk desde OSX

Esta semana me decidí a instalar OSX Leopard en la Laptop de mi esposa Veronica y en mi computadora de escritorio; La experiencia fué simplemente indolora (no recuerdo que ninguna actualización de Windows o Linux halla ido tan bien). La razón de la actualización tuvo más que ver con el hecho de que necesito utilizar Java 6 es OSX y no tengo tiempo para jugar con OpenJDK.

Con este cambio ahora puedo bajarme también el Kit Perk de Sentilla para OSX, el cual fué liberado recientemente (Agosto 22).

¿Las instrucciones de instalación? Sencillas:

Mac OS X Distribution of Sentilla Work
-----------------------------------

Version: 1.1.1 for Mac OS X

Tested on Mac OS X 10.4.11 and 10.5.4. Please see the release notes in SentillaWork/docs for more complete installation instructions and limitations.

Prerequisites:
- Mac OS X Tiger or Leopard
- Java 1.5 or higher

To install:
1. Install prerequisites.
2. Untar the archive
3. cd into the resulting directory.
4. Run "sudo ./install.sh".

To run the Sentilla Host Server:
1. Run the hostserver with "./sentilla-hostserver".
2. The server can be shut down using it's PID: kill -9 `cat log/hostserver.pid`

To run the SentillaWork IDE:
1. Run the IDE with "./sentilla-work".

To uninstall:
1. Run "sudo ./uninstall.sh".
2. Delete the Sentilla directory and tar file.

This is NOT free software. Please see the included LICENSE.txt file for
licensing information.
Aunque por otro lado, hubiera sido mucho mejor hacer un paquete (.app), ¿no es así?. Dejando esa queja de un lado, me decidí a revisar el instalador (install.sh), buscando la parte en la cual instalan un manejador de dispositivos USB compatible con el Gateway:

if [ -e /System/Library/Extensions/FTDIUSBSerialDriver.kext ]; then
echo "FTDI VCP driver found; moving to /System/Library/Extensions.disabled"
if [ ! -e /System/Library/Extensions.disabled ]; then mkdir /System/Library/Extensions.disabled; fi
mv /System/Library/Extensions/FTDIUSBSerialDriver.kext /System/Library/Extensions.disabled/
echo "Please restart your system and run install.sh again."
exit 1
fi

Ajá, aquí esta la vaina. Se ve sencillo, así que puedo dejar que el script haga el daño. Sin embargo (y en un acto de precaución raro en mi) me decidí también leerme la documentación en PDF especifica para OSX.

Ahh, bueno, resulta que la versión de Mac tiene cosas que no funcionan como en la versión de Windows, sin embargo no son tan importantes. Pero me molesto que cuando traté de instalar una aplicación desde Sentilla Eclipse, me dió el siguiente error:

5:31:25: Exception at node 00:12:75:00:11:e4:2d:75: BIN num: abd13878CLASS num: 54
at : BIN num: abd13878; methodNum: 292; pc: 665
at : BIN num: abd13878; methodNum: 172; pc: 34
at : BIN num: 722bd3fd; methodNum: 671; pc: 18
at : BIN num: 722bd3fd; methodNum: 839; pc: 48
at : BIN num: 722bd3fd; methodNum: 664; pc: 41
La versión de OS X pareciera hecha a los trancazos; El programa que se usa para correr el servidor de sentilla es super sencillo, sin embargo no tiene manera de matar al demonio (lo tiene que hacer usted con 'kill').

No estoy muy impresionado, vamos a ver que tan lejos llego el el foro de soporte de Sentilla.

Buscar en otros sitios:

Blogalaxia:, , ,
Technorati:, , ,
To2blogs:, , ,
Del.icio.us:, , ,

Etiquetas: , , ,

sábado, junio 28, 2008

Generando gráficos de temperatura en Swing

Sentilla Swing temperature display - Time Series
Ahora usted puede saber la temperatura de la sala de mi casa :)


Bueno, seguí jugando con Sentilla Perk y Swing; Esta vez terminé de acomodar al cliente gráfico que muestra los datos en una tabla, al mismo tiempo que genera gráficos de temperatura capturados por cada sensor (código fuente aquí).

Aún tengo un par de problemas:
  • No he calibrado los sensores, uno de ellos siempre mide en el rango de las 20 grados Celcius mientras que el otro está en los 30.
  • JFreeChart me tiene confundido con la gráfica, tengo un problema extraño de refrescamiento de pantalla.
Sentilla Swing temperature display - raw data in table
No es perfecto, pero los resultados son interesantes


Sin embargo no me tomó mucho tiempo montar esto, y cada vez se pone más divertido. Voy a preguntar a otros desarrolladores más expertos en el foro de Sentilla a ver que tal :)


Buscar en otros sitios:

Blogalaxia:, , , ,
Technorati:, , , ,
To2blogs:, , , ,
Del.icio.us:, , , ,

Etiquetas: , , , ,

miércoles, junio 11, 2008

Midiendo la temperatura con Sentilla: Un cliente gráfico

Bueno, no tengo mucho tiempo para escribir estos días (la semana ha estado muy movida en el área de finanzas), así que les traigo una pequeña pieza de código en la cual capturo la temperatura de los sensores de Sentilla (sí, código viejo) para ponerla de inmediato en un cliente escrito en Swing, el cual utiliza un TableModel el cual dispara las actualizaciones usando un Thread que corre en paralelo.

Sin embargo la noticia principal es que este blog se va de vacaciones, por dos meses. Así es, se me ha presentado una oportunidad para la cual tengo que enfocar todos mis esfuerzos si quiero salga bien.

Si, cero Facebook, cero Google reader con mis RSS, cero blog, cero distracciones. Como dicen por acá "do or die" :)

Así que no se desesperen, comenten mucho y escriban correos (yo les prometo responder) y sobre todo, no se preocupen por el blog, este no va a desaparecer ;)

Se despide por los momentos,

- José, "KodeGeek"

Buscar en otros sitios:

Blogalaxia:, , ,
Technorati:, , ,
To2blogs:, , ,
Del.icio.us:, , ,

Etiquetas: , , ,

viernes, junio 06, 2008

Sentilla tiene soporte para OSX y Linux Ubuntu

Ya sacaron el beta. Del foro oficial de Sentilla:


NEW! Sentilla Work (Beta) for Mac and Linux

Downloads of the Beta release of Sentilla Work for both Mac OS X and Ubuntu Linux are now available for current Perk customers at the following URLs:

  • Sentilla Work (Beta) for Linux
  • Sentilla Work (Beta) for Mac OS X

Go to the URL for your OS of choice and login as

XXXXXX

and use the password

ZZZZZZZZ

After you download the release to your computer and expand the files, refer to the Release Notes included with the builds for installation instructions (page 10) and important notices. You do not need to reinstall mote firmware for this release; your current Perk firmware will work on both the Mac OS X and Linux platforms.

Note that you cannot install firmware with the Mac OS X release.
Christine at Sentilla
Los instalaré en algún momento el fin de semana, vamos a ver que tal se porta.

Buscar en otros sitios:

Blogalaxia:, , , ,
Technorati:, , , ,
To2blogs:, , , ,
Del.icio.us:, , , ,

Etiquetas: , , , ,

lunes, mayo 26, 2008

KodeGeek @ Sentilla Blog

Wow, the Sentilla folks noticed my video on YouTube with the mote and they wrote a nice summary about it.

I promise to write more posts in English on the near future :)

Other links of interest:

Blogalaxia:, ,
Technorati:, ,
To2blogs:, ,
Del.icio.us:, ,

Etiquetas: , ,

sábado, mayo 24, 2008

Extendiendo el alcance de Sentilla: Escribiendo un cliente y servidor TCP/IP

Bueno, juego un poquito más con Sentilla. Como ustedes recordaran de un articulo anterior, yo ya tenia un pequeño hola mundo corriendo en la máquina que tiene el Gateway de Sentilla y los sensores, el principal problema es que el "Gateway" (la parte que va conectada a al puerto USB) solamente funciona bajo Windows (prometen que Linux y OSX saldran pronto), así que me senté a escribir un cliente y servidor con UDP.

El articulo completo está en el blog de la Cara Oscura del Desarollo de Software.

Espero les guste, ya les traeré otros juguetes en próximos artículos.

Buscar en otros sitios:

Blogalaxia:, , , , ,
Technorati:, , , , ,
To2blogs:, , , , ,
Del.icio.us:, , , , ,

Etiquetas: , , , , ,

viernes, mayo 23, 2008

Más Java y Hardware: Arduino

Desde que empecé a jugar con Sentilla no he hecho otra cosa más que buscar que otras herramientas existen para programar con Java en hardware de pocos recursos. Lo último que me encontré es esta tarjeta llamada Arduino, la cual viene con su software Open Source.

Por cierto, si tienen tiempo les recomiendo que se compren el libro Make Things Talk. Bien interesante, el nivel técnico requerido no es tan complejo y las aplicaciones son super entretenidas.

Buscar en otros sitios:
Blogalaxia:, , ,
Technorati:, , ,
To2blogs:, , ,
Del.icio.us:, , ,

Etiquetas: , , ,

domingo, mayo 18, 2008

Como medir temperatura desde Java, usando Perk

Running the client app to listen to the motes from Eclipse
El código de captura es bien sencillo


¿Recuerdan como les prometí que iba a jugar con Sentilla Perk? Hoy comencé con una sencilla aplicación la cual mide la temperatura usando los dos sensores (llamados "Motes") para luego transmitirla a la laptop la cual tiene instalado el "Gateway" que habla el protocolo CC420 en el puerto USB.



Después de leer los ejemplos, la guia de programador y el API me conseguí que es muy fácil recolectar datos con los sensores. El código que hace la captura es el siguiente (este código es instalado desde la máquina que corre el servidor Perk en todos los motes):
     Sender sender = SenderDriver.create("local");
short count = 0;
TempMessage datamsg = new TempMessage();
datamsg.moteId = id;
while(true) {
count++;
leds.toggle(count);
// Play with the leds

datamsg.count = count;
datamsg.temperature = tempSensor.read();
// Read the temperature

sender.send(datamsg);
Thread.sleep(WAIT_TIME);
}

Y en la Laptop en donde estoy corriendo el servidor me limito a capturar la información enviada por los sensores para mostrarla por pantalla (código):

 
client = new HostClient();
client.connect();
Receiver receiver =
ReceiverDriver
.create(TempMessage.class);
while(true) {
receiver.setReceive().submit().block(500);
if (receiver.isDone()) {
TempMessage msg = receiver.getData();
log.log(Level.INFO, String.format(
"Mote ID: %d, Count: %d, Temperature: %fC\n",
msg.moteId,
msg.count,
msg.temperature.doubleValue(CELSIUS)));
}
}
Sencillo hasta ahora, ¿no es así?

Pienso hacer una interfaz para poder mostrar esta información en Internet, esten pendientes. Por ahora los dejo con un video en el que se ve como corre el cliente que recibe los datos de los sensores:



Buscar en otros sitios:

Blogalaxia:, , , ,
Technorati:, , , ,
To2blogs:, , , ,
Del.icio.us:, , , ,

Etiquetas: , , , ,

martes, mayo 13, 2008

Pervasive computing with Sentilla Perk

Perk from Sentilla
No es Sun Spot, es Perk Sentilla (mire lo pequeño que es comparado con mi pluma)


Para quienes visitan este blog, quizas recuerden que yo tenia tiempo salivando por un Sun Spot; El problema: el precio, $700+ por el pecho.

No tengo tanto dinero como para gastarlo en uno de estos juguetes, sin embargo la gente de Sentilla sacó una versión un poco más limitada (pero con interés comercial) llamada Perk, la cual costo solamente $199 en JavaOne.

Asi que si, decidí jugar un poco con Perk :)

Mi única queja personal del Perk es que el software de desarrollo solamente se instala bajo Windows y solamente soportan Eclipse (no tan malo, ya que yo lo se usar bien).

Aún no he empezado, pero ya corrí por algunos de los ejemplos y tengo varias ideas de lo que quiero hacer.

¡Dominación mundial! :)

Buscar en otros sitios:

Blogalaxia:, , ,
Technorati:, , ,
To2blogs:, , ,
Del.icio.us:, , ,

Etiquetas: , , ,