Control de pines GPIO usando .NET Core 2 WebAPI en una Raspberry Pi, usando Windows 10 o Ubuntu

 C Programming >> Programación C >  >> Tags >> API
Control de pines GPIO usando .NET Core 2 WebAPI en una Raspberry Pi, usando Windows 10 o Ubuntu

Anteriormente, escribí sobre la creación de una API web .NET Core 2 y su alojamiento en una Raspberry Pi 3, y esta vez ampliaré este trabajo para interactuar con los niveles lógicos de pines de GPIO.

Esta es la última de una serie de publicaciones que ayudan a los desarrolladores a escribir código .NET Core 2 para interactuar con el hardware de IoT, de una manera independiente del sistema operativo del dispositivo. He escrito algunos fragmentos sobre cómo cambiar el estado del pin GPIO con una aplicación de consola anteriormente, pero con una WebAPI, ahora podemos controlar el estado GPIO con solicitudes HTTP Post. Entonces, con esta capacidad, puede imaginar cómo podríamos controlar un dispositivo físico desde algo como una aplicación de navegador, o incluso una aplicación de HoloLens o Xbox.

Cree el proyecto Web API para Raspberry Pi

Este bit es fácil:una vez que tenga .NET Core 2 en su máquina, simplemente instale la plantilla de Nuget usando el siguiente comando:

dotnet new -i RaspberryPi.WebApi::*

Y luego elija una carpeta en su entorno de desarrollo para crear un nuevo proyecto llamado GpioSwitcherWebApio con el comando:

dotnet new piwebapi -n GpioSwitcherWebApi

En este punto, tendrá todo el código que necesita para ejecutar un proyecto de API web .NET Core 2 en su Raspberry Pi.

Cree un controlador para cambiar el estado del pin

Abramos nuestro proyecto y agreguemos una dependencia en el proyecto Bifröst; esto nos ayuda de varias maneras. Podemos escribir el mismo código para dispositivos Ubuntu y Windows 10 IoT Core, y también hay una aplicación Bifröst UWP que nos ayuda a acceder al hardware GPIO en dispositivos Windows 10 IoT. Abra un indicador del Administrador de paquetes en Visual Studio 2017 e ingrese:

Install-Package Bifrost.Devices.Gpio.Core -Version 0.0.1
Install-Package Bifrost.Devices.Gpio.Abstractions -Version 0.0.1
Install-Package Bifrost.Devices.Gpio -Version 0.0.2

Si no está utilizando Visual Studio 2017, puede modificar el archivo GpioSwitcherWebApi.csproj y agregar las referencias del paquete que se muestran a continuación:

  <ItemGroup>
    <PackageReference Include="Bifrost.Devices.Gpio" Version="0.0.2" />
    <PackageReference Include="Bifrost.Devices.Gpio.Abstractions" Version="0.0.1" />
    <PackageReference Include="Bifrost.Devices.Gpio.Core" Version="0.0.1" />
    <PackageReference Include="Microsoft.AspNetCore" Version="2.0.0-preview1-*" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.0.0-preview1-*" />
    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="2.0.0-preview1-*" />
  ItemGroup>

A continuación, podemos editar el ValuesController predeterminado que viene con el proyecto; he cambiado el nombre del mío para que sea PinsController.cs , que es un título más adecuado a la acción que vamos a realizar.

Quiero que mi controlador tenga tres acciones para dispositivos Ubuntu o Windows IoT:

  • Obtener() – una acción HttpGet que devuelve una lista de pines Gpio que se exportan actualmente y su estado actual (alto/bajo).
  • Obtener (identificador pin int) – una acción HttpGet que devuelve el estado del pin Gpio con el número pinId.
  • SwitchPin(int pinId, int status) – una acción HttpPost que me permite seleccionar un GpioPin con el número pinId y configúrelo en un valor de estado (que es 1 o 0, correspondiente a alto o bajo).

Las bibliotecas de Bifröst hacen que configurar nuestro controlador para modificar los estados de los pines GPIO sea muy fácil.

Primero, necesitamos instanciar una instancia estática del objeto GpioContoller, para que podamos agregar una variable miembro privada y un constructor de clase, como se muestra a continuación.

private IGpioController gpioController;
 
public PinsController()
{
    Console.WriteLine("In controller - instantiating GpioController instance");
    gpioController = GpioController.Instance;
}

A continuación, debemos escribir la acción HttpGet que devuelve una lista de pines Gpio que se exportan actualmente y su estado actual. El siguiente código muestra la acción del controlador que logra esto y devuelve un código Http 200 OK.

[HttpGet]
public IActionResult Get()
{
    Console.WriteLine("About to list pin statuses.");
    return Ok(gpioController.Pins);
}

También queremos poder encontrar el estado actual de un pin de Gpio pasando el número de pin al método HttpGet, y podemos hacerlo con el siguiente código.

[HttpGet("{pinId}")]
public IActionResult Get(int pinId)
{
    GpioPinValue pinStatus;
 
    Console.WriteLine("About to get pin status.");
    var pin = gpioController.OpenPin(pinId);
 
    pinStatus = pin.Read();
 
    Console.WriteLine("Returning pin status.");
    return Ok(pinStatus.ToString());
}

Finalmente, lo interesante, en lugar de solo leer los niveles lógicos de los pines, me gustaría poder modificarlos, creo que el verbo Http más lógico para usar aquí es el verbo HttpPost, por lo que puedo publicar valores para el número pin I. quiero cambiar, y el nivel al que quiero cambiarlo, usando el siguiente código:

[HttpPost]
public void SwitchPin(int pinId, int status)
{
    Console.WriteLine("About to change pin status.");
    var pin = gpioController.OpenPin(pinId);
 
    pin.SetDriveMode(GpioPinDriveMode.Output);
 
    if (status == 1)
    {
        Console.WriteLine("Going on");
        pin.Write(GpioPinValue.High);
    }
    else
    {
        Console.WriteLine("Going off");
        pin.Write(GpioPinValue.Low);
    }
}

Para ver el archivo completo del controlador ya codificado, échale un vistazo aquí.

Si siguió los pasos anteriores correctamente, debería poder compilar la aplicación WebAPI de la forma habitual (por ejemplo, en Visual Studio 2017 use Ctrl+Shift+B , o desde una terminal en VSCode, ejecute la compilación dotnet comando.

Implementación en su dispositivo Raspberry Pi

Anteriormente escribí instrucciones paso a paso sobre cómo implementar código en una Raspberry Pi 3 con Ubuntu 16.04 o Windows 10 IoT Core, por lo que no repetiré todo eso aquí; la forma más fácil de hacerlo es simplemente ejecutar el en los scripts de PowerShell que he subido a Github, y los cubro brevemente a continuación junto con los parámetros que estos scripts necesitan para ejecutarse.

Implementación en Ubuntu 16.04

  • Asegúrese de tener PuTTY instalado en su máquina de desarrollo.
  • Obtenga la dirección IP de su Raspberry Pi 3 (la mía es 192.168.1.110 )
  • Obtenga el nombre de usuario con el que inició sesión (el valor predeterminado es ubuntu ).
  • Obtenga la ruta en la que desea implementar su WebAPI (la mía es /home/ubuntu/GpioWebAPI )

Con el script alojado aquí, ejecute el comando en PowerShell:

.\deploy-ubuntu.ps1 -ip 192.168.1.110 -username ubuntu -destination /home/ubuntu/GpioWebAPI

Los archivos binarios de WebAPI se compilarán y publicarán para un sistema operativo Ubuntu y luego se copiarán en su Raspberry Pi.

Implementación en Windows 10 IoT Core

Esto es un poco más complejo:debe implementar su WebAPI y también implementar la aplicación Bifröst UWP (necesita la aplicación Bifröst UWP en Windows para permitir que su aplicación .NET Core 2 lea y cambie los niveles lógicos de sus pines GPIO) .

Primero, implemente la aplicación Web API

  • Obtenga la dirección IP de su Raspberry Pi 3 (la mía es 192.168.1.125 )
  • El nombre de la aplicación Web API, que para mí es GpioSwitcherWebApi .

Usando la secuencia de comandos a continuación (puede obtener una copia desde aquí), ejecute el comando para crear el directorio de destino y agregue una regla de firewall:

.\setup-windows.ps1 -ip 192.168.1.125 -applicationName GpioSwitcherWebApi

Ahora ejecute el siguiente script (puede obtener una copia aquí), que copia los archivos binarios en su Raspberry Pi 3.

.\deploy-windows.ps1 -ip 192.168.1.125 -applicationName GpioSwitcherWebApi

A continuación, implemente Bifröst Windows Device Bridge

Aquí se describe en detalle cómo implementar esta aplicación para UWP, pero es solo una implementación estándar de la aplicación para UWP. Puede descargar el código desde aquí, cargarlo en Visual Studio Community 2017 e implementarlo en su Raspberry Pi 3 que aloja Windows 10 IoT Core.

Inicie el servidor web Kestrel para iniciar la API web

Esto es sencillo: para una Raspberry Pi que aloja Ubuntu 16.04, hago ssh usando PuTTY y ejecuto:

sudo /home/ubuntu/GpioWebApi/GpioSwitcherWebApi

Y para una Raspberry Pi que aloja Windows 10 IoT Core, entro usando PowerShell, navego hasta donde se implementó la aplicación y ejecuto:

.\GpioSwitcherWebApi.exe

El servidor web se iniciará después de unos segundos y estará listo para probar.

Probando nuestra API web cambiando los niveles lógicos de los pines GPIO

Podemos probar esto muy fácilmente enviando solicitudes HttpGet o HttpPost a nuestro servidor web. Probemos esto para el pin 26 en nuestra Raspberry Pi:conecté un LED entre el pin 26 y tierra.

Para mi Raspberry Pi de Windows 10, solo puedo buscar la dirección:

http://192.168.1.125:5000/api/pines

Esto devolverá una lista JSON de pines y niveles lógicos (probablemente sea una lista vacía si no ha ejecutado esto antes).

Para activar un pin, usemos un complemento de Firefox como HttpRequester.

  • Para la URL, ingrese la URL anterior (http://192.168.1.125:5000/api/pins).
  • Seleccione la pestaña "Parámetros" (como se muestra a continuación) y agregue pares de nombre-valor de:
    • IdPin =26
    • estado =1
  • Ahora haga clic en el botón "POST"

El sitio responde con un estado HTTP de 200 OK y el nivel lógico del pin GPIO 26.

El nivel lógico es 1, lo que significa que el LED blanco conectado al pin 26 se encenderá.

Si queremos encontrar el estado del Pin 26 ahora, podemos leerlo con una solicitud de obtención HTTP de:

http://192.168.1.125:5000/api/pins/26

Como se muestra a continuación, hay una solicitud GET que devuelve un estado de 200 OK y un valor de texto de Alto, que es lo que esperamos ya que acabamos de activar el pin.

Finalmente, emitamos una solicitud HTTP Get sin especificar un ID de pin para obtener todos los estados; nuevamente recibimos un código 200 OK y un objeto JSON que enumera el pin GPIO abierto y su estado.

Para probar Ubuntu, el proceso es idéntico excepto que tuve que sustituir la dirección IP de mi Ubuntu Raspberry Pi (que es 192.168.1.110). Al repetir el proceso anterior, se enciende el LED naranja conectado a Ubuntu Raspberry Pi (ver más abajo)

Conclusión

Eso es todo por ahora:hemos visto cómo acceder a los pines GPIO desde una API web .NET Core 2 e implementar esa aplicación en una Raspberry Pi 3 con Windows 10 IoT Core o Ubuntu 16.04. Esta técnica nos permite usar las capacidades de Raspberry Pi desde una variedad más amplia de interfaces que solo una consola, por lo que podríamos usar un navegador o incluso una aplicación de HoloLens o Xbox.

Sobre mí: Regularmente publico sobre .NET; si está interesado, síganos en Twitter o eche un vistazo a mis publicaciones anteriores aquí. ¡Gracias!