Erwin.Ried.cl / Desarrollos / Hardware /
Raspberry Pi+Mono: proyectos poderosos y económicos

Veamos cómo mover un pequeño proyecto desarrollado como aplicación de consola en VS 2012 .NET 4 en muy poco tiempo desde Windows a una placa de bajo coste como la súper popular Raspberry Pi. Revisaré también su rendimiento, consumo, detalles y temperaturas de la misma (17/04/2013 02:14 PM)


1) Introducción

Una persona necesitaba instalar en muchos vehículos de carga un aparato que tuviera un GPS, cámaras, sensores y un set de reglas con las cuales capturar una imagen y enviar correos por medio de 3g. En la actualidad, hacer proyectos así es fácil y entretenido tomando en cuenta que los componentes de hardware son cada vez más inteligentes y económicos.

Mi idea original para el prototipo claramente es una pequeña máquina con Windows. Compré por menos de 200 dólares una eBox, la cual se puede apreciar en el siguiente video:



La eBox 3350mx consume muy poco y corre Windows XP con facilidad. Gracias al filtro EWF del disco duro (se usa la SD en solo lectura, los cambios van a RAM y podemos capturar un estado en cualquier momento por si queremos guardar cosas más permanentemente) este dispositivo es sorprendentemente veloz.

El cliente sin embargo decidió comprar una opción más poderosa a un distribuidor chino, uno de los llamados "CARPUTER" o PC para vehículos. En este PC, la placa de control ATX contacto del vehículo gobierna el estado del pc, lo apaga o enciende en demanda. Pero esta máquina con 32 GB SSD, 2 GB de RAM y un Atom doble núcleo es un cañón gigante para matar moscas.


2) Raspberry Pi

Una oferta de RS Chile y Fayerwayer me hizo ordenar una Raspberry. La oferta no era mucho más económica que lo normal pero menos de 40 dólares en pesos chilenos con envío incluido incluso derrotaban a eBay en precio, lo cual explota el instinto consumista humano.

La placa en sí está genial, en unos segundos tienes Raspbian corriendo en tu LCD, puedes correr Quake 3 o usarlo de reproductor multimedia (para otras cosas, como navegar es bastante lenta). Consume poco, no tiene partes móviles y no genera mucho calor, ideal para usar en cualquier cosa.


3) Hardware de la Pi

La placa en sí está muy bien diseñada para mantener el precio bajo. No tener un reloj de tiempo real ni salida VGA no genera muchos problemas, e incluso yo personalmente quitaría la salida de audio análoga y el conector de video compuesto.

El único punto negro en el hardware de la Raspberry Pi no es la placa en sí, sino la cantidad de accesorios con sobreprecio que se ofrecen para ella. En particular, no entiendo por qué RS envía el aparato en una caja plástica que sólo es útil para su transporte. Hubiera preferido que la caja original tuviera algún diseño astuto extra que la hiciera útil.

De todas formas siempre se puede imprimir una solución:




4) Consumo, overclock y temperatura

Originalmente, el procesador de la placa está configurado a 700 Mhz. Podemos alterar esto en un rango desde los mismos 700 Mhz hasta 1 Ghz. Dada la opción, estuve revisando el consumo de la placa y su temperatura en tres rangos de overclock, tomando en cuenta un estado de relajo (cpu en 0%) y stress (cpu en 100%). Los datos son los siguientes:



Puede haber pérdidas producto del adaptador USB que utilicé (la medición no fue entre la placa y el puerto USB, sino que fue el consumo real del adaptador de 220V a 5V). La temperatura es reportada por el sensor interno del procesador.

Nota 1: El teclado y mouse utilizan aproximadamente 0.2 Watts extra en conjunto. Al conectar el cable de red se añade 0.3 Watts más. Todas las pruebas son con teclado, mouse y red conectadas.

Nota 2: La temperatura ambiente de la prueba era 19ºC, 37% de humedad ambiental.


5) Mono, Soft-float y Hard-float

La última versión de Raspbian, el sistema operativo de la Raspberry PI no funciona correctamente con mono. En realidad hay otras aplicaciones que tampoco funcionan bien por la implementación del manejo de los números con coma flotante. ¿En qué afecta esto?

A primera vista pareciera que todo funciona correctamente, sin embargo las fechas en particular manejadas por el objeto DateTime tienen raros valores:



En la imagen, los nombres de archivo supuestamente deberían tener el formato de AAAAMMDD-hhmmss_nombre.extensión y 0001 es claramente un año inválido, al igual que el resto de los valores. Pero como el problema es de tan bajo nivel, hay una serie de consecuencias que hacen inviable el uso de Mono en este estado.

Hay una versión que maneja los números con coma flotante por medio de software, lo que es mucho más lento pero evita problemas. Lamentablemente y como informan en http://www.raspberrypi.org/archives/3534 hay algunas nuevas placas que en vez de tener RAM Samsung tienen un chip Hynix el cual es incompatible con la versión vieja de Raspbian que permitía utilizar mono de forma normal.

Felizmente el usuario OtherCrashOverride compiló la versión 2.11.4 de Mono para funcionar en la última versión de Raspbian y aunque es experimental funciona perfectamente:





6) Algunos cambios necesarios en la aplicación

La aplicación lee sensores por medio de un Arduino y decodifica posición y velocidad de un GPS. Ambas acciones usan el puerto serie de una forma muy sencilla:

Código:
sensors = new SerialPort(settings.IniReadValue("sensors", "comport"),
  int.Parse(settings.IniReadValue("sensors", "bauds")));
sensors.DataReceived += sensors_DataReceived;



Ahora bien, los settings utilizan dos funciones de Kernel32, las cuales claramente no están presentes en Mono:

Código:
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section,string key,string val,string
filePath);

[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section,string 
  key,string def,StringBuilder retVal,int size,string filePath);


Sin embargo, esto tiene una solución sencilla, escribir la lectura (incluso de forma primitiva, pues es realizada sólo una vez). Los archivos ini tienen la siguiente estructura/sintaxis clásica:

Código:
[sección]
Nombre=valor
;comentario


La forma implementación genérica más simple entonces convierte nuestra función:

Código:
public string IniReadValue(string Section,string Key)
{
  var temp = new StringBuilder(255);
  GetPrivateProfileString(Section,Key,String.Empty,temp,255,this.path);
  return temp.ToString();
}


en la siguiente:

Código:
public string IniReadValue(string Section,string Key)
{
#if __MonoCS__
var d = false;
  foreach (var l in File.ReadAllLines(path))
  {
    if (d)
    {
      if (l.StartsWith(Key))
          return l.Substring(Key.Length + 1);
    }
    else
    {
      if (l == "[" + Section + "]")
          d = true;
    }
  }
  return "";
#else

  var temp = new StringBuilder(255);
  GetPrivateProfileString(Section,Key,String.Empty,temp,255,this.path);
  return temp.ToString();
#endif
}


Ahora, según la documentación de Mono los puertos tienen ciertas limitaciones. En particular, es importante considerar que no hay eventos para recepción de datos.

Entonces, para recibir los datos, usamos un Timer:

Código:
#if __MonoCS__
  receiveSerialData = new Timer(manualReceiveSerialData, null, 1000, 100);
#endif


Es menos elegante, pero no hay otra opción dadas las limitantes del SerialPort. La función manualReceiveSerialData es una llamada a las dos funciones que antes eran llamadas por los eventos del puerto:

Código:
private static void manualReceiveSerialData (object state)
{
  sensors_DataReceived(sensors, null);
  gps_DataReceived(gps, null);
}


Con estas modificaciones, los sensores, el GPS y la descarga de imágenes desde las cámaras funcionan totalmente sin inconvenientes:



Al final un último pequeño cambio, en Visual Studio es usual utilizar:

Código:
Application.Run();


Para mantener activa la aplicación en espera por eventos, evitando el uso de Application simplemente usamos:

Código:
do {} while (true);



7) Conclusiones

De forma muy sencilla logramos probar cómodamente probar la aplicación en Visual Studio y luego pasarla a una placa de extremo bajo costo manteniendo la funcionalidad casi completa requiriendo solo pequeños cambios.

En conclusión, la experiencia con este juguete es bastante agradable, el único factor ácido del asunto es que la gran demanda de la placa hace irreal el precio de la misma, precio que la hizo famosa inicialmente. Por cierto, personalmente no puedo alegar en este asunto pues la conseguí con envío incluido al equivalente de 43 dólares americanos gracias al cupón de FayerWayer lo que hace cualquier crítica inválida para la utilidad que entrega este aparato.

Haga clic sobre una de las estrellas para calificar este artículo.

Opiniones y comentarios (Escribir un nuevo comentario)
como podemos hablar, te tengo una propuesta. saludos
Escrito por Cristian (20/08/2013 11:05 PM)
Estimado quiero controlar un invernadero (agua y ventilación) que me recomiendas... Cristian info@setenta.cl
Escrito por Cristian (20/08/2013 10:07 PM)
Si son solo esas dos cosas, yo usaría simplemente un arduino o lo más económico que encuentres, y un par de modulos con relés
Escrito por Erwin Ried (20/08/2013 10:16 PM)

Copyright © 2013 por Erwin Ried.