Controllo dei pin GPIO utilizzando un'API Web .NET Core 2 su un Raspberry Pi, utilizzando Windows 10 o Ubuntu

 C Programming >> Programmazione C >  >> Tags >> API
Controllo dei pin GPIO utilizzando un'API Web .NET Core 2 su un Raspberry Pi, utilizzando Windows 10 o Ubuntu

In precedenza ho scritto sulla creazione di un'API Web .NET Core 2 e sull'hosting su un Raspberry Pi 3, e questa volta espanderò questo lavoro per interagire con i livelli logici dei pin GPIO.

Questo è l'ultimo di una serie di post che aiuta gli sviluppatori a scrivere codice .NET Core 2 per interagire con l'hardware IoT, in un modo agnostico rispetto al sistema operativo del dispositivo. In precedenza ho scritto alcuni bit e pezzi su come modificare lo stato del pin GPIO con un'applicazione console, ma con un'API Web, ora possiamo controllare lo stato GPIO con le richieste HTTP Post. Quindi, con questa funzionalità, puoi immaginare come potremmo controllare un dispositivo fisico da qualcosa come un'applicazione browser o persino un'app HoloLens o Xbox.

Crea il progetto API Web per Raspberry Pi

Questo è facile:una volta che hai .NET Core 2 sul tuo computer, installa semplicemente il modello da Nuget usando il comando seguente:

dotnet new -i RaspberryPi.WebApi::*

Quindi scegli una cartella nel tuo ambiente di sviluppo per creare un nuovo progetto chiamato GpioSwitcherWebApio con il comando:

dotnet new piwebapi -n GpioSwitcherWebApi

A questo punto avrai tutto il codice necessario per eseguire un progetto API Web .NET Core 2 sul tuo Raspberry Pi.

Crea un controller per modificare lo stato del pin

Apriamo il nostro progetto e aggiungiamo una dipendenza dal progetto Bifröst:questo ci aiuta in un paio di modi. Possiamo scrivere lo stesso codice per indirizzare sia i dispositivi Ubuntu che Windows 10 IoT Core e c'è anche un'app Bifröst UWP che ci aiuta ad accedere all'hardware GPIO sui dispositivi Windows 10 IoT. Apri un prompt di Package Manager in Visual Studio 2017 e inserisci:

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

Se non stai utilizzando Visual Studio 2017, puoi semplicemente modificare il file GpioSwitcherWebApi.csproj e aggiungere i riferimenti ai pacchetti mostrati di seguito:

  <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>

Successivamente, possiamo modificare il ValuesController predefinito fornito con il progetto:ho rinominato il mio in PinsController.cs , che è un titolo più adatto all'azione che andremo a realizzare.

Voglio che il mio controller abbia tre azioni per i dispositivi Ubuntu o Windows IoT:

  • Ottieni() – un'azione HttpGet che restituisce un elenco di pin Gpio attualmente esportati e il loro stato corrente (alto/basso).
  • Ottieni(int pinId) – un'azione HttpGet che restituisce lo stato del pin Gpio con il numero pinId.
  • SwitchPin(int pinId, int status) – un'azione HttpPost che mi permette di selezionare un GpioPin con il numero pinId e impostalo su un valore di stato (che è 1 o 0, corrispondente ad alto o basso).

Le librerie Bifröst rendono molto semplice la configurazione del nostro controller per modificare gli stati dei pin GPIO.

Innanzitutto, dobbiamo creare un'istanza statica dell'oggetto GpioContoller, in modo da poter aggiungere una variabile membro privata e un costruttore di classe, come mostrato di seguito.

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

Successivamente, è necessario scrivere l'azione HttpGet che restituisce un elenco di pin Gpio attualmente esportati e il loro stato corrente. Il codice seguente mostra l'azione del controller che raggiunge questo obiettivo e restituisce un codice HTTP 200 OK.

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

Vogliamo anche essere in grado di trovare lo stato attuale di un pin Gpio passando il numero del pin al metodo HttpGet e possiamo farlo con il codice seguente.

[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());
}

Infine, il bit interessante – piuttosto che leggere i livelli logici dei pin, mi piacerebbe essere in grado di modificarli – penso che il verbo Http più logico da usare qui sia il verbo HttpPost, quindi posso pubblicare valori per il numero pin I voglio cambiare, e il livello in cui voglio cambiarlo, usando il codice qui sotto:

[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);
    }
}

Per vedere il file del controller completo già codificato, controllalo qui.

Se hai seguito correttamente i passaggi precedenti, dovresti essere in grado di creare l'applicazione WebAPI come di consueto (ad es. in Visual Studio 2017 usa Ctrl+Shift+B o da un terminale in VSCode, esegui la build dotnet comando.

Distribuzione sul tuo dispositivo Raspberry Pi

In precedenza ho scritto istruzioni dettagliate su come distribuire il codice su un Raspberry Pi 3 con Ubuntu 16.04 o Windows 10 IoT Core, quindi non ripeterò tutto qui:il modo più semplice per farlo è semplicemente eseguire il negli script di PowerShell che ho caricato su Github e li tratterò brevemente di seguito insieme ai parametri necessari per l'esecuzione di questi script.

Distribuzione su Ubuntu 16.04

  • Assicurati di aver installato PuTTY sulla tua macchina di sviluppo.
  • Ottieni l'indirizzo IP del tuo Raspberry Pi 3 (il mio è 192.168.1.110 )
  • Ottieni il nome utente con cui hai effettuato l'accesso (l'impostazione predefinita è ubuntu ).
  • Ottieni il percorso in cui desideri distribuire la tua WebAPI (il mio è /home/ubuntu/GpioWebAPI )

Utilizzando lo script ospitato qui, esegui il comando in PowerShell:

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

I binari WebAPI verranno compilati e pubblicati per un sistema operativo Ubuntu, quindi copiati sul tuo Raspberry Pi.

Distribuzione in Windows 10 IoT Core

Questo è un po' più complesso:devi distribuire la tua WebAPI e anche distribuire l'app Bifröst UWP (è necessaria l'app Bifröst UWP su Windows per consentire all'app .NET Core 2 di leggere e modificare i livelli logici dei pin GPIO) .

In primo luogo, distribuisci l'applicazione API Web

  • Ottieni l'indirizzo IP del tuo Raspberry Pi 3 (il mio è 192.168.1.125 )
  • Il nome dell'applicazione Web API, che per me è GpioSwitcherWebApi .

Utilizzando lo script seguente (puoi ottenerne una copia da qui), esegui il comando per creare la directory di destinazione e aggiungi una regola del firewall:

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

Ora esegui lo script seguente (puoi ottenerne una copia da qui), che copia i binari sul tuo Raspberry Pi 3.

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

Quindi, distribuisci Bifröst Windows Device Bridge

Come distribuire questa app UWP è descritto in dettaglio qui, ma è solo una distribuzione di app UWP standard. Puoi scaricare il codice da qui, caricarlo in Visual Studio Community 2017 e distribuirlo sul tuo Raspberry Pi 3 che ospita Windows 10 IoT Core.

Avvia il server Web Kestrel per avviare l'API Web

Questo è semplice: per un Raspberry Pi che ospita Ubuntu 16.04, utilizzo PuTTY ed eseguo:

sudo /home/ubuntu/GpioWebApi/GpioSwitcherWebApi

E per un Raspberry Pi che ospita Windows 10 IoT Core, utilizzo PowerShell, accedo alla posizione in cui è stata distribuita l'app ed eseguo:

.\GpioSwitcherWebApi.exe

Il server web si avvierà dopo pochi secondi ed è pronto per il test.

Test della nostra API Web modificando i livelli logici dei pin GPIO

Possiamo testarlo molto facilmente inviando richieste HttpGet o HttpPost al nostro server web. Proviamolo per il Pin 26 sul nostro Raspberry Pi:ho collegato un LED tra il Pin 26 e la massa.

Per il mio Raspberry Pi di Windows 10, posso semplicemente accedere all'indirizzo:

http://192.168.1.125:5000/api/pins

Questo restituirà un elenco JSON di pin e livelli logici (probabilmente è un elenco vuoto se non l'hai mai eseguito prima).

Per attivare un pin, utilizziamo un plug-in di Firefox come HttpRequester.

  • Per l'URL, inserisci l'URL sopra (http://192.168.1.125:5000/api/pins).
  • Seleziona la scheda "Parametri" (come mostrato di seguito) e aggiungi le coppie nome-valore di:
    • IDPin =26
    • stato =1
  • Ora fai clic sul pulsante "POST"

Il sito risponde con uno stato HTTP di 200 OK e il livello logico del pin GPIO 26.

Il livello logico è 1, il che significa che il LED bianco collegato al pin 26 si accenderà.

Se vogliamo trovare lo stato del Pin 26 ora, possiamo leggerlo con una richiesta HTTP get di:

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

Come mostrato di seguito, c'è una richiesta GET che restituisce uno stato di 200 OK e un valore di testo Alto, che è quello che ci aspettiamo dato che abbiamo appena attivato il pin.

Infine emettiamo solo una richiesta HTTP Get senza l'ID pin specificato per ottenere tutti gli stati:ancora una volta riceviamo un codice 200 OK e un oggetto JSON che elenca il pin GPIO aperto e il suo stato.

Per testare Ubuntu il processo è identico tranne per il fatto che ho dovuto sostituire l'indirizzo IP del mio Ubuntu Raspberry Pi (che è 192.168.1.110). Ripetendo il processo sopra si accende il LED arancione collegato a Ubuntu Raspberry Pi (vedi sotto)

Conclusione

Per questa volta è tutto:abbiamo visto come accedere ai pin GPIO da un'API Web .NET Core 2 e distribuire tale applicazione su un Raspberry Pi 3 con Windows 10 IoT Core o Ubuntu 16.04. Questa tecnica ci consente di utilizzare le funzionalità di Raspberry Pi da una più ampia varietà di interfacce rispetto a una semplice console, quindi potremmo utilizzare un browser o persino un'app HoloLens o Xbox.

Su di me: Posto regolarmente su .NET:se sei interessato, seguimi su Twitter o dai un'occhiata ai miei post precedenti qui. Grazie!