Icono del sitio Programando a medianoche

Plataformas de hardware

Hace un tiempo estuve viendo distintas plataformas de hardware para hacer dispositivos programados por nosotros que puedan tomar información del exterior (como temperatura, humedad, voltaje, etc.) y mostrarla al usuario, y me llevé una sorpresa al ver que existen muchas placas de desarrollo, con distintos microcontroladores y especificaciones técnicas, que nos permiten hacer esto, y la mayoría a un bajo costo. Por esto mismo se me ocurrió hacer este artículo contando un poco lo que encontré (al menos de los productos más conocidos por mí).

Arduino (www.arduino.cc)

Arduino es una plataforma de hardware libre (Open Hardware), basado en un microcontrolador Atmel AVR[i], en particular el ATmega8, ATmega 168, ATmega328 y el ATmega1280, con varios puertos digitales y analógicos de entrada y salida, a través de los cuales podemos leer información del medio ambiente utilizando diversos sensores (de temperatura, humedad, luminosidad, magnetismo, corriente, coordenadas de un gps, etc.), mostrar información o notificaciones (usando LEDs, displays LCD, parlantes, etc.) o hasta interactuar con el usuario (botones, joysticks, etc.).

Es la plataforma de hardware libre más difundida, con más componentes (sensores, botones, displays, etc) y más usada, por ser libre, su sencillez y su muy bajo costo.

Esta plataforma viene en varios “sabores”, para que podamos elegir la que se ajuste mejor a nuestro proyecto, pudiendo diferir cada una en tamaño, memoria, velocidad del procesador, cantidad de puertos, etc. A continuación muestro un listado de las placas disponibles al momento de escribir este artículo, donde cada procesador y cada placa tienen links a su fabricante para ver las especificaciones:

Placa Arduino Procesador Velocidad Voltaje Flash kB EEPROM kB

SRAM kB

Puertos digitales con PWM Entradas analógicas Otros puertos Tamaño
Uno ATmega328P

16 MHz

5 V

32

1

2

14

6

6

68.6 mm × 53.3 mm

Nano ATmega168 o ATmega328

16 MHz

5 V 16/32 0.5/1 1/2

14

6

8

43.18 mm × 18.54 mm

Micro ATmega32u4

16 MHz

5 V

32

1

2.5

20

7

12

Mega2560 ATmega2560

16 MHz

5 V

256

4

8

54

14

16

101.6 mm × 53.3 mm

Mega ATmega1280

16 MHz

5 V

128

4

8

54

14

16

101.6 mm × 53.3 mm

LilyPad ATmega168V o ATmega328V

8 MHz

2.7-5.5 V

16

0.5

1

14

6

6

51 mm ⌀

Leonardo Atmega32u4

16 MHz

5 V

32

1

2

14

6

12

68.6 mm × 53.3 mm

Fio ATmega328P

8 MHz

3.3 V

32

1

2

14

6

8

66.0 mm × 27.9 mm

Ethernet ATmega328

16 MHz

5 V

32

1

2

14

4

6

Wiznet Ethernet

Duemilanove ATmega168/328P

16 MHz

5 V

16/32

0.5/1

1/2

14

6

6

68.6 mm × 53.3 mm

Due AT91SAM3X8E

84 MHz

3.3 V

512

0

96

54

12

12

2 DAC

101.6 mm × 53.3 mm

Diecimila ATmega168

16 MHz

5 V

16

0.5

1

14

6

6

68.6 mm × 53.3 mm

BT ATmega328

16 MHz

5 V

32

1

2

14

4

6

Bluegiga WT11 Bluetooth

ADK ATmega2560

16 MHz

5 V

256

4

8

54

14

16

MAX3421E

101.6 mm × 53.3 mm

Host USB

Esplora ATmega32u4

16 MHz

5 V

32

1

2.5

0

0

0

Joystick analógico
4 Botones
Potenciómetro
Micrófono
Sensor de luz
Sensor de temperatura
Acelerómetro
Buzzer
LED RGB
2 puertos TinkerKit de entrada y 2 de salida
Conector para display TFT

A algunas de estas placas se les pueden acoplar “shields”, que son otras placas que se conectan encima de Arduino para extender sus capacidades, como conexión Ethernet, WiFi, GPRS o matrices de LEDs. A su vez la mayoría de estas placas permiten volver a conectarle otro shield encima para seguir expandiendo las capacidades de nuestra plataforma. En las siguientes página se pueden encontrar listas con algunos shields: Arduino and Arduino-Compatible Hardware y Arduino Shield List.

Notarán que la placa Esplora, que salió hace unos días, posee puertos TinkerKit. Estos puertos nos permiten conectar distintos dispositivos (sensores o actuadores) a nuestro Arduino de forma muy sencilla y sin preocuparnos por los pines. Esta idea es la misma que vamos a ver más adelante con .NET Gadgeteer y netduino go, pero en este caso la placa puede no traer de forma nativa los puertos para los Tinker (hasta hoy sólo la Arduino Espora trae estos puertos) pero con un simple shield le podemos agregar esta facilidad.

Esta plataforma se programa con el lenguaje Arduino (del que hablaré en mi próximo artículo) y su sintaxis es muy sencilla. Como ejemplo a continuación muestro un programa al estilo “hola mundo”, el cual enciende y apaga un LED que ya trae la placa conectado al pin 13 de la salida digital:

void setup() {
	// Inicializo el pin 13 como de "salida"
	pinMode(13, OUTPUT);
}

void loop() {
	// Enciendo el LED
	digitalWrite(13, HIGH);
	// Espero un segundo
	delay(1000);
	// Apago el LED
	digitalWrite(13, LOW);
	// Espero un segundo
	delay(1000);
}

Netduino (www.netduino.com)

Esta es la plataforma de Microsoft para programación de microcontroladores, la cual fue desarrollada por Secret Lab LLC, basándose en la idea de Arduino.

Básicamente tomaron un procesador de Atmel (el mismo fabricante que los procesadores de Arduino) de 32 bits y 48 MHz y desarrollaron una placa compatible con Arduino junto con el .NET Micro Framework, que es, ni más ni menos, una versión muy reducida del framework de .NET que todos conocemos. Esta idea permite acercar a los desarrolladores de .NET (que no somos pocos) al mundo de la programación de microcontroladores utilizando una placa compatible con todos los sensores y dispositivos que ya existen para Arduino.

La programación se hace con Visual Studio 2010 (incluso se puede usar la versión Express, que es gratuita) y es muy fácil comenzar. Acá les paso el código de un programa que, al igual que el que mostré de Arduino, enciende y apaga el LED de la placa:

//Creo un objeto que referencia el LED
OutputPort led = new OutputPort(Pins.ONBOARD_LED, false);
While (true)
{
	// Enciendo el LED
	led.Write(true);
	// Espero un segundo
	Thread.Sleep(1000);
	// Apago el LED
	led.Write(false);
	// Espero un segundo
	Thread.Sleep(1000);
}

Esta placa es más potente que la de Arduino (y más aun las que salieron después, como la netduino plus 2), pero hay que tener en cuenta que, al programar en un lenguaje de más alto nivel (como C# ó VB.NET de Netduino contra C ó C++ de Arduino) se necesitará más memoria y ciclos de procesador para nuestro código.

Al momento de escribir este artículo existían estas versiones de Netduino disponibles en el mercado:

Placa Netduino

Procesador

Velocidad

Voltaje

ROM
kB

RAM
kB

Puertos digitales

con
PWM

Entradas analógicas

Otros puertos

Tamaño

netduino Atmel SAM7X

48 MHz

7.5 V

128

60

14

4

6

71 mm × 53.3 mm

netduino plus 2 STMicro STM32F4

168 MHz

7.5 V

384

100+

14

6

6

I2c
Micro SD
Ethernet

71 mm × 53.3 mm

netduino go STMicro STM32F4

168 MHz

7.5 V

384

100+

8 puertos gobus

68.6 mm × 53.3 mm

Notarán que la última placa de la lista, la netduino go, no tiene puertos de entradas/salida, esto es debido a que tiene 8 conectores para distintos dispositivos compatibles con .NET Gadgeteer (otra plataforma, de la cual hablo en el siguiente punto) a través de los cuales virtualiza los puertos.

Quisiera comentar que, aunque no a la misma velocidad de Arduino, esta plataforma está creciendo mucho y hay varios proyectos alrededor de ella como, por ejemplo, el PIX-6T4, una “pequeña” consola de videojuegos basada en netduino, con dos joysticks, una matrix de LEDs de 8×8, lector de tarjetas SD, parlante y otras cosas interesantes ya montados en la placa.

.NET Gadgeteer (www.netmf.com/gadgeteer)

Esta plataforma, que fue lanzada en 2011, está basada en la idea de poder conectar de forma muy sencilla distintos dispositivos a nuestra placa base, sin necesidad de pensar en resistencias, consumo de los componentes ni nada por estilo, o sea, más o menos como un “lego para desarrolladores”. Al momento esta plataforma posee muchos dispositivos en el mercado: display, cámaras, interfaces de red, lectores/grabadores de tarjetas, joysticks, bluetooth, etc.

Otro tema a tener en cuenta es que esta plataforma tiene 100% código manejado, el cual puede descargarse desde http://gadgeteer.codeplex.com/.

Al usar código manejado se programa, obviamente, con Visual Studio 2010 en cualquier versión, inclusive la Express.

Las placas más comunes de esta plataforma se detallan a continuación, aunque al ser un proyecto Open Source (si, este también) cualquier fabricante puede hacer su propia placa y venderla, incluso nosotros.

Placa Gadgeteer

Procesador

Velocidad

Voltaje

Flash
Mb

RAM
Mb

Sockets
.NET Gadgeteer

GHI Electronics Fez Spider Mainboard ARM7

72 MHz

3.3 V

4.5

16

14

GHI Electronics Fez Hydra Mainboard AT91SAMRL ARM9

200 MHz (aunque el procesador soporta 240 MHz)

7.5 V

4

16

14

Sytech NANO Mainboard Freescale ARM920T

200 MHz

3.3 V

8

8

Cada placa, además de las especificaciones que copié en la tabla anterior, posee variadas características, por ejemplo, soporte para I2C, SPI, FAT16/32, protocolo PPP, controlador para pantallas touch, etc. Para una descripción detallada del soporte de cada placa recomiendo ver la especificación de cada una (el nombre de cada placa tiene un link a la misma).

A diferencia de las dos plataformas anteriores, para poder grabar nuestros programas en el hardware y debugearlos, necesitaremos otra placa, llamada USB Client, conectada entre nuestra PC y el .NET Gadgeteer.

A continuación copio el código de un programa para esta plataforma que, de igual manera que lo hicimos en las dos anteriores, enciende y apaga un LED cada un segundo:

bool IsLedOn = true;
void ProgramStarted()
{
	//Creo un timer para que se ejecute cada un segundo
	Gadgeteer.Timer timer = new GT.Timer(1000);
	//Le asigno un delegado
	timer.Tick += new GT.Timer.TickEventHandler(timer_Tick);
	//Inicio el timer
	timer.Start();
}

void timer_Tick(Gadgeteer.Timer timer)
{
	//Enciendo o apagado el led, dependiendo del valor de la variable
	Mainboard.SetDebugLED(IsLedOn);
	//Cambio el estado de la variable
	IsLedOn = !IsLedOn;
}

Raspberry PI (www.raspberrypi.org)

Esta placa fue creada por la “Fundación Raspberry Pi” del Reino Unido para estimular la enseñanza de las ciencias de la computación en las escuelas. Su salida a la venta fue a principios de este año, 2012, con un total de 10.000 placas fabricadas en China y Taiwan.

Esta placa se diferencia en mucho a las anteriores, para empezar ya viene con puertos HDMI, RCA (para conectarlo a una TV) y USB (al que se le puede conectar un teclado o mouse), GPU compatible con OpenGL ES 2.0 y OpenVG que puede decodificar video con calidad blue-ray (H.264/MPEG-4 AVC) a 40MBits/s y soporta resoluciones desde 640 × 350 hasta 1920 × 1200, procesador ARM1176JZFS de 700 MHz, audio, slot para tarjetas SD / MMC / SDIO y, lo que hace la mayor diferencia, viene con Linux, más específicamente con Raspbian, una versión derivada de Debian, aunque le podemos instalar la distribución que queramos, inclusive Android.

O sea, es una computadora que podemos programar e instalarle el software que deseemos, pero al ser tan chica (mide más o menos como una tarjeta de crédito) podemos usarla para proyectos embebidos, donde necesitemos un dispositivo programable que no sea un PC, por ejemplo, para hacer un home media.

Al momento hay sólo dos versiones, muy parecidas:

Placa Raspberry Pi

SoC

Procesador

GPU

Velocidad

Voltaje

Consumo

RAM
MB

Puertos

Tamaño

Modelo A

Broadcom BCM2835

ARM1176JZF-S

Broadcom VideoCore IV

700 MHz

5 V

2.5 W

256

USB
Card Slot
RCA
HDMI
Audio

85.60mm × 53.98mm

Modelo B

Broadcom BCM2835

ARM1176JZF-S

Broadcom VideoCore IV

700 MHz

5 V

3.5 W

512

USB x 2
Ethernet
Card Slot
RCA
HDMI
Audio

85.60mm × 53.98mm

Aunque la velocidad del procesador es de 700MHz, las últimas versiones del firmware permiten hacer un overclock para llegar a velocidades de hasta 1000MHz.

Para esta plataforma no voy a copiar el código de un programa de ejemplo, ya que dependerá el lenguaje en el que queramos hacerlo, el cual podría ser C, C++, Java, C#, gracias al proyecto Mono, o incluso BASIC, gracias al proyecto SpecBAS.

Conclusión

Existen otras plataformas como Freaduino (basado y compatible con en el Arduino Duemilanove), Seeduino (también compatible con Arduino), AMICUS 18 (que es muy parecido a Arduino pero con un procesador PIC 18F25K20 de 64MHz y el compilador Proton BASIC), Stellaris LaunchPad (de Texas Instruments), ODROID-U2 (que salió hace unas semanas y posee un procesador ARM Cortex-A9 con cuatro núcleos de 1.7GHz con acelerador gráfico y mide la mitad de una tarjeta de crédito) y muchos otros, pero mi intensión en este artículo era que conocieran las placas más usadas y accesibles del momento.

De las anteriormente mencionadas, cada una es mejor para distintos propósitos, pero para hacer un balance voy a contar lo que, a mi punto de vista, son los pros y contras de ellas.

Arduino
Netduino
.NET Gadgeteer
Raspberry Pi

Espero que este resumen les sea de utilidad.

¡A armar sus proyectos y suerte!

[i] Los AVR son una familia de microcontroladores RISC del fabricante estadounidense Atmel. La arquitectura de los AVR fue concebida por dos estudiantes en el Norwegian Institute of Technology, y posteriormente refinada y desarrollada en Atmel Norway, la empresa subsidiaria de Atmel, fundada por los dos arquitectos del chip. Cuenta con bastantes aficionados debido a su diseño simple y la facilidad de programación (Wikipedia).

Salir de la versión móvil