Mayo de 2017

Volumen 32, número 5

Internet de las cosas: trabajar con Raspberry Pi y Windows 10

Por Bruno Sonnino

Aunque hace mucho tiempo que trabajo con software, nunca he interactuado con hardware directamente. He desarrollado una gran cantidad de software que funciona junto al hardware, pero nunca había trabajado con una placa física con el control total de lo que estaba haciendo. Por lo tanto, cuando pude trabajar con Raspberry Pi, especialmente con Windows 10 y Visual Studio, no dejé escapar la oportunidad.

Raspberry Pi, versiones 2 y 3, puede usar Windows 10 como sistema operativo (aunque no es la versión completa, permite ejecutar aplicaciones para la Plataforma universal de Windows [UWP] a fin de controlar sus dispositivos). Este es un equipo económico (puede conseguir uno por menos de 35 USD) con unas grandes prestaciones. El modelo Raspberry Pi 3 incluye un procesador ARM Quad-Core de 64 bits, vídeo HDMI, redes Ethernet y Wi-Fi, Bluetooth y cuatro puertos USB. Sin duda alguna, puede hacer muchas cosas con él.

Hardware

Para empezar, puede usar la placa de Raspberry Pi sola, pero en cierto modo es restrictiva. El uso de la placa solamente equivale a desarrollar para un equipo o un smartphone. También debe usar algún hardware adicional. Algunos fabricantes han creado kits para complementarlo: prototipos de placas, resistencias, indicadores LED, potenciómetros, sensores y una tarjeta de memoria. Puede adquirir una funda para el equipo, pero no es necesario, ya que deberá mantenerlo abierto para realizar las conexiones.

Conocer el hardware

Una vez que tenga la placa y el kit, llegó el momento de conocer el hardware. Para empezar, debería explorar el dispositivo Raspberry Pi y ver qué puede ofrecerle. En la Figura 1 se muestra la placa.

Raspberry Pi 3 modelo B con GPIO
Figura 1 Raspberry Pi 3 modelo B con GPIO

En el lado derecho de la placa de la Figura 1, puede observar los cuatro puertos USB (1) y el conector Ethernet (2). En la parte inferior, de izquierda a derecha, tiene la toma de alimentación miniUSB (3), el conector de vídeo HDMI (4), el puerto de la cámara (5) y la salida de sonido (6). En el lado izquierdo de la placa, tiene la ranura de la tarjeta microSD (7) y un conector para una pantalla LCD (8). También puede ver el adaptador de Wi-Fi y Bluetooth (9). En el centro de la placa, puede ver el procesador (10) y la controladora de red (11). En la parte superior, tiene el bloque de entrada/salida de uso general (GPIO) (12), donde se realizan todas las conexiones. Cada pin tiene una finalidad distinta, como puede ver en la parte superior de la figura.

El dispositivo Raspberry Pi usa dos voltajes: 5 V y 3,3 V. Los pines negros son para la conexión a masa y los amarillos son los pines GPIO que usará para la programación. Observe que la numeración de los pines no está ordenada. Por tanto, salvo que tenga una memoria perfecta, tenga cerca un diagrama como ese (tiene uno a su disposición en bit.ly/1WcBUS2).

El segundo paso es estudiar el kit. No explicaré todo el contenido, porque puede cambiar mucho según el fabricante (o según lo que pretenda adquirir). Para este proyecto, necesitará una placa de pruebas, tres indicadores LED, resistencias e hilos. Para obtener más información sobre estos componentes y sobre cómo interactuar con ellos, vea la columna de Frank La Vigne de abril de 2016 "Modern Apps - Writing UWP Apps for the Internet of Things" (Aplicaciones modernas: escribir aplicaciones para UWP para Internet de las cosas) en msdn.com/magazine/mt694090.

Montaje del primer circuito

Si conoce la placa y estos sencillos componentes, puede montar el primer circuito. Por lo general, el programa "Hola mundo" para un sistema como este es el que hace parpadear el indicador LED. Para simplificarlo al máximo, empezará creando un circuito que encienda el indicador LED sin que parpadee. Para ello, no necesita ningún tipo de programa. Solo tiene que comprender el circuito que va a construir.

Si conecta el indicador LED directamente al pin de 3,3 V del equipo Raspberry Pi, es probable que queme el indicador LED, ya que no soportará el paso de la corriente. Si usa la ley de Ohm (V = R*I), deberá agregar una resistencia de 220 Ω (rojo/rojo/negro) al circuito. Si no tiene ninguna resistencia de 220 Ω disponible, puede usar una más grande (con una resistencia mayor, el circuito tiene menos corriente y no se daña el indicador LED). La resistencia no puede ser mucho mayor, ya que el indicador LED no se encenderá si la corriente es demasiado baja. En mi caso, empleé una de 330 Ω sin ningún problema.

Para ver la apariencia del montaje en la placa de pruebas, consulte la Figura 2. La imagen se creó con un programa de código abierto denominado "Fritzing", que se puede descargar de fritzing.org.

Circuito montado
Figura 2 Circuito montado

Después de montar el circuito (lo que debería realizarse con la fuente de alimentación de Raspberry Pi apagada para no quemar ningún componente), conecte la fuente de alimentación. Si se monta correctamente, el indicador LED debería encenderse. Si el indicador LED no se enciende, compruebe si colocó sus polos correctamente: el polo positivo (hilo largo) y la conexión al pin de 3,3 V de Raspberry Pi deben estar en la misma línea horizontal. El polo negativo y la resistencia (en este caso, no existe polarización) deben estar en la misma línea. El segundo hilo de la resistencia debe conectarse a la línea que va al terminal de tierra de Raspberry Pi. Si todo es correcto, compruebe si el indicador LED está quemado y reemplácelo por uno nuevo. Cuando el indicador LED se encienda, puede proceder al siguiente paso: crear un programa que controle el indicador LED.

Instalación y uso de Windows 10

Hasta ahora, no necesitaba un sistema operativo porque no tenía que programar el equipo Raspberry Pi, pero necesitará algo de programación para continuar con la exploración. Para eso, usará Windows 10. Puede descargar e instalar Windows 10 para Raspberry Pi sin ningún costo y, aunque no es exactamente la misma versión que se ejecuta en los equipos de escritorio y las tabletas, permite ejecutar programas para UWP sin ningún cambio.

El primer paso es descargar e instalar Windows 10 en la tarjeta SD. Para ello, descargue e instale la herramienta Panel de Windows 10 IoT Core, que se encuentra en bit.ly/2lPXrRc.

Para instalar Windows 10 en el equipo Raspberry Pi, debe tener una tarjeta microSD compatible con 8 GB como mínimo. A continuación, seleccione la opción "Configurar un nuevo dispositivo" en el panel para descargar e instalar Windows 10 en la tarjeta SD. Debe tener alguna manera de escribir en esta tarjeta en su equipo. Si no tiene ningún lector de tarjetas disponible, puede adquirir un lector de tarjetas USB.

Seleccione el tipo de dispositivo, el sistema operativo y la unidad donde se encuentra la tarjeta SD. Asigne un nombre al equipo y seleccione una contraseña de administrador. Haga clic en la casilla para aceptar los términos de licencia y, luego, en el botón Instalar. Después de descargar los datos y grabarlos en la tarjeta, tendrá Windows 10 instalado y listo para usar. Quítela del lector de tarjetas del equipo y colóquela en la ranura del equipo Raspberry Pi. Conéctela a la red mediante un cable Ethernet o por Wi-Fi si usa un equipo Raspberry Pi 3 o 2 con una llave Wi-Fi. Encienda el dispositivo.

Después de arrancar Windows 10, puede ver el dispositivo conectado en Mis dispositivos en el Panel de Windows IoT Core.

Puede abrir Device Portal en el explorador mediante la dirección IP que se muestra para el dispositivo conectado, en el puerto 8080. En mi caso, puedo abrirlo con la dirección http://192.168.1.199:8080. Le pedirá la contraseña de administrador que configuró antes para abrir el portal, como se muestra en la Figura 3.

Device Portal
Figura 3 Device Portal

Aquí, puede configurar el dispositivo y comprobar las aplicaciones instaladas, y consultar el rendimiento y el almacenamiento. La última opción, Remote (Remoto), permite habilitar el control remoto del dispositivo. Esta opción resulta útil si el dispositivo no tiene ningún monitor conectado, ya que puede controlarlo de manera remota desde el equipo. Marque la casilla con la etiqueta "Enable Windows IoT Remote Server" (Habilitar Windows IoT Remote Server) para habilitar el control remoto en el dispositivo y descargar la aplicación de control remoto de Windows 10 desde la Tienda.

Después de instalar y ejecutar la aplicación Windows IoT Remote Control, puede controlar el dispositivo e interactuar con él de manera remota.

Ahora, puede empezar a desarrollar para Raspberry Pi mediante Windows 10.

Desarrollo para Raspberry Pi mediante Visual Studio

Para desarrollar para Raspberry Pi mediante Visual Studio, debe asegurarse de tener las herramientas instaladas. Para comprobarlo, seleccione "Instalación personalizada" y consulte Herramientas de desarrollo de aplicaciones universales de Windows en la selección de Características.

Después de hacerlo, tendrá las herramientas instaladas y podrá comenzar a desarrollar para Raspberry Pi mediante Windows 10. Cree un nuevo proyecto y seleccione la aplicación para UWP "En blanco".

De este modo, se creará una aplicación vacía y creará una aplicación que muestre el nombre de la máquina actual en la pantalla principal. En Main­Page.xaml, agregue el código siguiente:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
  <TextBlock FontSize="32" x:Name="MachineText"
    HorizontalAlignment="Center"
    VerticalAlignment="Center"/>
</Grid>

Luego, en MainPage.xaml.cs, inserte este código para obtener y mostrar el nombre de la máquina:

public MainPage()
  this.InitializeComponent();
  Windows.Security.ExchangeActiveSyncProvisioning.EasClientDeviceInformation eas =
    new Windows.Security.ExchangeActiveSyncProvisioning.EasClientDeviceInformation();
  MachineText.Text = eas.FriendlyName;
}

Si ejecuta esta aplicación en la máquina local, se mostrará una ventana con el nombre de la máquina.

A continuación, ejecute el equipo Raspberry Pi. En el menú desplegable Solution Platform (Plataforma de solución), seleccione ARM y, en el menú desplegable Dispositivo, seleccione Máquina remota. Se abre un cuadro de diálogo donde se puede seleccionar la máquina remota.

Seleccione el dispositivo Raspberry Pi y ejecute la aplicación. La aplicación se implementará en el dispositivo Raspberry Pi y podrá observar cómo se ejecuta en la ventana de control remoto. Observe que el nombre de la máquina que se muestra en la ventana debería coincidir con el que estableció al formatear la tarjeta SD y donde instaló Windows 10.

Puede depurar esta aplicación igual que las aplicaciones locales: establecer puntos de interrupción, analizar variables, etc. Si finaliza la aplicación en Visual Studio, verá que esta se cierra y aparece la pantalla principal en el dispositivo Raspberry Pi. Si se dirige al portal del explorador, verá que la aplicación permanece instalada y se puede ejecutar mediante el botón Ejecutar, como se muestra en la Figura 4.

Portal de aplicaciones mostrando la aplicación instalada
Figura 4 Portal de aplicaciones mostrando la aplicación instalada

Aluciné con el nivel de compatibilidad logrado con las aplicaciones para UWP. Para mostrar el potencial, usaré una aplicación que no se creó para Raspberry Pi. Usaré la aplicación de ejemplo del kit de herramientas de la comunidad de UWP, un kit de herramientas de componentes desarrollado por Microsoft y por la comunidad, que sin duda vale la pena consultar en bit.ly/2b1PAJY.

Si descarga el paquete y lo compila, puede implementarlo en el dispositivo Raspberry Pi y ejecutarlo (sí, puede ejecutar el programa del mismo modo que lo haría en un equipo de escritorio). Por cierto, debería intentar usar los controles del dispositivo. Funcionan bien.

Interacción con la placa

Una vez que se estén ejecutando los programas, debe comenzar a interactuar con la placa. Creará un controlador de semáforo. Tendrá tres indicadores LED (rojo, amarillo y verde), cada uno de los cuales puede tener una regulación de tiempo diferente.

Para hacer funcionar los indicadores LED de la placa, debe obtener el controlador GPIO, abrir el pin que quiere controlar y ajustarlo del modo deseado. En la Figura 1, se observa que el octavo pin del bloque GPIO (segunda fila) es el pin 22. Usará los pines 22, 9 y 19. El circuito resultante será como el de la Figura 5.

Circuito de semáforo
Figura 5 Circuito de semáforo

Con este circuito preparado, cree una nueva aplicación para UWP vacía. En MainPage.xaml, inserte el código que se muestra en la Figura 6.

Figura 6 Código XAML de la página principal con un semáforo

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
  <Border BorderBrush="Black" BorderThickness="3" HorizontalAlignment="Center"
      VerticalAlignment="Center" CornerRadius="5">
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
      <Ellipse Width="50" Height="50" Fill="Red" Opacity="0.5"
        Margin="20,20,20,10" x:Name="RedLed" Stroke="Black"
        StrokeThickness="1"/>
      <Ellipse Width="50" Height="50" Fill="Yellow" Opacity="0.5"
        Margin="20,10,20,10" x:Name="YellowLed" Stroke="Black"
        StrokeThickness="1"/>
      <Ellipse Width="50" Height="50" Fill="LimeGreen" Opacity="0.5"
         Margin="20,10,20,20" x:Name="GreenLed" Stroke="Black"
         StrokeThickness="1"/>
    </StackPanel>
  </Border>
</Grid>

Verá el semáforo, tanto en la placa como en la pantalla. Así, también puede ver qué sucede a través de la pantalla remota. El código fuente de MainPage.xaml.cs se muestra en la Figura 7.

Figura 7 Código fuente para encender las luces del semáforo con los intervalos especificados

private int _currentLight;
private DispatcherTimer _timer;
private int[] _pinNumbers = new[] { 22, 9, 19 };
private GpioPin[] _pins = new GpioPin[3];
public MainPage()
{
  this.InitializeComponent();
  if (InitGPIO())
    InitTimer();
}
private void InitTimer()
{
  var intervals = new[] { 6000, 2000, 6000 };
  var lights = new[] { RedLed, YellowLed, GreenLed };
  _currentLight = 2;
  _timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(500) };
  _timer.Tick += (s, e) =>
  {
    _timer.Stop();
    lights[_currentLight].Opacity = 0.5;
    _pins[_currentLight].Write(GpioPinValue.High);
    _currentLight = _currentLight == 2 ? 0 : _currentLight + 1;
    lights[_currentLight].Opacity = 1.0;
    _pins[_currentLight].Write(GpioPinValue.Low);
    _timer.Interval = TimeSpan.FromMilliseconds(intervals[_currentLight]);
    _timer.Start();
  };
  _timer.Start();
}

Para ejecutar este código, debe agregar una referencia a las extensiones de IoT. Haga clic con el botón derecho en el nodo Referencias del Explorador de soluciones, haga clic en Agregar referencias y, después, diríjase a Extensiones y agregue Windows IoT Extensions for UWP.

Cree un temporizador que encienda cada indicador LED con el intervalo establecido en la matriz de intervalos (en su caso, 6 s, 2 s y 6 s). Los puntos suspensivos de la pantalla tienen la opacidad establecida en 0,5, por lo que aparecen atenuados y cada uno de ellos se establecerá en 1 cuando la luz esté encendida. El temporizador solo se ajustará si puede establecer el GPIO para la placa, en la función InitGPIO, como se muestra en la Figura 8.

Figura 8 Código para inicializar el GPIO y establecer los pines de los indicadores LED para la salida

private bool InitGPIO()
{
  var gpio = GpioController.GetDefault();
  if (gpio == null)
    return false;
  for (int i = 0; i < 3; i++)
  {
    _pins[i] = gpio.OpenPin(_pinNumbers[i]);
    _pins[i].Write(GpioPinValue.High);
    _pins[i].SetDriveMode(GpioPinDriveMode.Output);
  }
  return true;
}

Abra los tres pines de la salida y establézcalos en Alto para que los indicadores LED estén apagados. Si se establece un pin en Bajo, la corriente fluye por el circuito y el indicador LED se enciende. Al ejecutar el programa, verá una pantalla con un semáforo, donde las luces se encienden y apagan como si fuese real. La placa tendrá el aspecto que se muestra en la Figura 9.

Placa de semáforo con el programa en ejecución
Figura 9 Placa de semáforo con el programa en ejecución

Resumen

Como puede ver, es fácil crear programas que interactúen con Raspberry Pi. Si conoce la programación de Windows 10, ya tiene los conocimientos que necesita para programar un dispositivo Raspberry Pi (sí, interactuar con la placa es otra historia, pero ya tiene medio camino hecho). Puede crear sus programas del mismo modo que crea cualquier programa de Windows 10 (de hecho, los programas para UWP se ejecutan exactamente igual en el dispositivo Raspberry Pi). La única diferencia es que tiene el controlador GPIO para establecer y obtener datos. Si quiere ampliar sus conocimientos y probar otros proyectos, tiene muchos ejemplos para realizar pruebas en bit.ly/2llecFZ. Con esta información, tendrá multitud de oportunidades y podrá combinar componentes de hardware de grandes prestaciones con software productivo de alta calidad. Es una combinación imbatible.


Bruno Sonnino es MVP de Microsoft desde 2007. Es desarrollador, consultor y autor de numerosos libros y artículos sobre el desarrollo de Windows. Puede seguirle en Twitter: @bsonnino o leer su blog en blogs.msmvps.com/bsonnino.

Gracias al siguiente experto técnico de Microsoft por revisar este artículo: Rachel Appel