Windows 10 IoT GPIO Tutorial

Codice sorgente su repository GitHub
https://github.com/emanbuc/Win10_IOT_Samples

La presenza dell’interfaccia GPIO su Rasberry permette di interagire con sensori e attuatori. Windows 10 IoT mette a disposizione degli sviluppatori la API Windows.Devices.Gpio che permette di

  • leggere il valore alto o basso di un pin di ingresso
  • impostare il valore alto o basso di un pint di uscita
  • registrare un “event handler” per chiamare una funzione quando il valore di un pin cambia da alto a basso oppure da basso ad alto

Oltre alle funzioni base di ingressi/uscite digitali alcuni pin possono essere utilizzati anche come porte SPI, UART e I2C.

rp2_pinout
Raspberry 2/3 model B GPIO pinmap

Nel progetto sperimentale  Win10 IoT Samples vengono utilizzate tutte le funzioni principali del GPIO controller e ci sono esempi di utilizzo corretto di input e output digitali.

Ingresso digitale collegato ad un Pulsante

Configurazione di un input:

 resetBtnInput = gpio.OpenPin(RESET_BTN_PIN);
 resetBtnInput.SetDriveMode(GpioPinDriveMode.InputPullUp);

Nel caso di un pulsante (o anche ad esempio un contatto magnetico, un interruttore …) è fondamentale utilizzare una resistenza di pull-up (o pull-down) collegata al pin.

Un spiegazione sintetica dell concetto di pull-up/pull-down si trova nella documentazione di Arduino. Nel caso di Raspberry è possibile configurare il pin in modalità Pull-up o Pull-down anche senza aggiungere resistenze esterne.

Lettura del valore

  GpioPinValue resetBtnPinValue = resetBtnInput.Read();
 if (resetBtnPinValue== GpioPinValue.Low)
 {
    //reset event counter when reset button is pushed
    pirEventCounter = 0;
    UpdateEventCounterGui();
 }

Uscita digitale

configurazione del pin:

ledOutput = gpio.OpenPin(LED_PIN);
ledOutput.SetDriveMode(GpioPinDriveMode.Output);
ledOutput.Write(GpioPinValue.Low);

Impostazione del valore “alto” (+3,3V con scheda Raspberry)

ledOutput.Write(GpioPinValue.High);

Monitoraggio Valore con Event Handler

Configurazione del pin

 pirInput = gpio.OpenPin(PIR_PIN);
 pirInput.SetDriveMode(GpioPinDriveMode.Input);
 pirInput.ValueChanged += PirInput_ValueChanged;

Event Handler

private void PirInput_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs args)
 {
 
 //Update state
 if (args.Edge == GpioPinEdge.RisingEdge)
 {
    pirSensorActive = true;
    pirEventCounter++;
 }
 else
 {
   pirSensorActive = false;
 }

 // Report the change to the GUI (async)
 var task = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
 {
    if (pirSensorActive)
    {
      PirStatus.Fill = redBrush;
    }
   else
   {
    PirStatus.Fill = grayBrush;
   }
 });

}

L’aggiornamento dell’interfaccia grafica non deve mai essere eseguito all’interno dell’event handler. Ad esempio può essere gestito avviando un altro thread asincrono.

Altri esempi si trovano anche nel repository GitHub di Microsoft.

 

Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...