Welcome to Giovanni's Blog

PiFace Digital 2 - Una libreria Python alternativa e più performante

 | #InternetofThings#IoT#piface#piface digital 2#pifaceio#Programmazione#Python#raspberry#raspberrypi

Un saluto a tutti i lettori.

Alcune settimane fa ho avuto tra le mani un Raspberry Pi con modulo PiFace Digital 2, una scheda aggiuntiva collegata tramite interfaccia GPIO che consente al Raspberry di comunicare con relè, interruttori, input e output digitali. Il modulo PiFace Digital è facilmente programmabile in Python e consente ad esempio di collegare sensori, motori e luci che potranno essere controllati direttamente dal Raspberry. Dunque, se volete cimentarvi nel mondo IoT (Internet of Things), questo modulo è davvero interessante.

La documentazione ufficiale, contenente anche dei brevissimi esempi di programmazione in Python, è disponibile qui.

Gli sviluppatori del modulo PiFace Digital, hanno reso disponibile una libreria ufficiale in Python per poter mettere in comunicazione le nostre applicazioni con il modulo PiFace Digital. La libreria in questione si chiama pifacedigitalio, ed è sufficiente per gran parte degli scopi.

In molte delle applicazioni tuttavia, potrebbe essere necessario ricorrere a delle tecniche di polling, ovvero dei controlli ciclici sulle porte di input, in attesa di un cambiamento del loro stato. Purtroppo, per questo tipo di applicazioni la libreria ufficiale si è rivelata inefficiente, a causa dei tempi di lettura delle porte non proprio ottimali. Questo potrebbe portare, come nel mio caso, a dei comportamenti dell’applicazione che non sempre sono quelli desiderati, in particolar modo nel caso di applicazioni multithread (che vedremo come realizzare in un prossimo articolo).

Per ovviare a questo problema ho eseguito varie ricerche in rete prima di poter giungere alla soluzione, ovvero una diversa libreria, non ufficiale, creata appositamente per la realizzazione di polled applications. La libreria, realizzata dall’australiano Mark Blakeney, si chiama pifaceio, ed è disponibile su GitHub al seguente link: https://github.com/bulletmark/pifaceio

La libreria pifaceio offre quattro metodi principali che sono:

  1. read(): Restituisce un byte che corrisponde allo stato di tutte le 8 porte di input.
  2. write(): Scrive un byte, passato opzionalmente come parametro, aggiornando lo stato delle 8 porte di output. Se non si passa nessun byte come parametro, la funzione aggiorna le porte di output con i valori impostati in precedenza della chiamata alla funzione write_pin(), descritta in seguito.
  3. read_pin(pin): Chiamato dopo il metodo read(), restituisce lo stato aggiornato della specifica porta di input passata come parametro.
  4. write_pin(pin, state): Prende come parametri di input il numero di una porta di output e uno stato per essa. Per poter aggiornare effettivamente le porte è necessaria successivamente una chiamata al metodo write()

Di seguito è riportato un banalissimo esempio di una applicazione che tramite polling, alla pressione del pulsante 0 sulla scheda PiFace (collegato in parallelo alla porta di input 0), attiva la porta di output corrispondente al numero di volte che il tasto è stato premuto, fino ad un massimo di 7. Quando una porta di output è attiva, sulla scheda PiFace vedrete accendersi il led corrispondente. Per comodità, ho preferito definire all’interno della mia applicazione le funzioni read_pin() e write_pin(), le quali ogni volta richiamano automaticamente anche i metodi read() e write() della libreria pifaceio, in modo da evitare di doverli richiamare manualmente ogni volta.

#!/usr/bin/env python3

from time import sleep
import pifaceio

pfio = pifaceio.PiFace()

def read_pin(pin):
   pfio.read()
   return pfio.read_pin(pin)

def write_pin(pin, state):
   pfio.write_pin(pin, state)
   pfio.write()


pin_counter = 0
write_pin(pin_counter, 1)

while True:
   if read_pin(0):
      write_pin(pin_counter, 0)
      pin_counter += 1
      if pin_counter > 7:
         break
      write_pin(pin_counter, 1)
      sleep(0.5)

In una prossima guida mostrerò come realizzare un’applicazione che effettua polling contemporaneamente su differenti input per effettuare diverse operazioni.

About Giovanni De Costanzo

Photo of Giovanni De Costanzo

My name is Giovanni De Costanzo and I'm a Sr.Research Engineer at Malwarebytes. I'm a geek, passionate about all the tech world since early age.