giovedì 12 febbraio 2015

TUTORIAL RASPBERRY PI - PARTE III

Terza parte del nostro tutorial dedicato a Raspberry Pi. Dopo aver conosciuto la scheda e configurato il Sistema Operativo, vediamo come utilizzare le librerie di input/output disponibili per questo device e quali linguaggi di programmazione abbiamo a disposizione.



Prima di iniziare

Per iniziare dobbiamo procurarci tutto il necessario per effettuare le nostre prove:

  • Raspberyy Pi B+
  • Breadboard
  • Cavi per collegamento
  • Resistenze da 330Ω e 10KΩ
  • Diodo LED
  • Interruttore a pressione
I componenti utilizzati sono relativi allo starter kit presentato nel primo articolo di questo tutorial. Ogni schema di collegamento presente in questo articolo è stato realizzato tramite il software open source Fritzing.

Raspberry pinout

Ogni modello di Raspberry Pi possiede una serie di pin utilizzabili per molti scopi (alimentazione elettrica, ingressi, uscite, comunicazione seriale...). Di seguito una immagine relativa al pinout del modello di Raspberry Pi B+ (fonte http://www.raspberrypi-spy.co.uk/):

Accendi la lampadina, Spegni la lampadina

Come possiamo vedere dall'immagine sottostante abbiamo collegato il settimo pin della scheda (GPIO4) al diodo LED in serie alla resistenza da 330Ω; tralasciando le nozioni di elettronica di base il nostro scopo è accendere il diodo LED, per limitare la corrente nel circuito è necessario avere in serie la resistenza. A livello di programmazione è necessario configurare GPIO4 (pin 7) come uscita e successivamente programmare il livello logico di uscita.


Come linguaggio di programmazione utilizzeremo inizialmente Python. Per utilizzare le funzionalità GPIO della scheda è necessario eseguire il comando python con diritti di amministrazione:
sudo python

Adesso è necessario importare la libreria GPIO quindi configurare il pin 7 come uscita. 
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7,GPIO.OUT)

Adesso possiamo "giocare" ad accendere e spegnere il nostro LED tramite i comandi:
GPIO.output(7,True)
GPIO.output(7,False)


Ingressi

Torniamo alla "noiosa" teoria dell'Elettronica di base. Ingenuamente si potrebbe pensare che per collegare un ingresso, analogamente come una uscita, basta collegare l'alimentazione in serie ad una resistenza per poi acquisire il livello logico ma NON è così.

Quando un pin GPIO viene impostato come "input", il suo livello di tensione è indefinito. Per rilevare un ingresso è necessario collegarlo sempre ad un riferimento logico di tensione sia alta che bassa. Esistono due modi di collegare un ingresso: Normalmente Aperto (NO) e Normalmente Chiuso (NC), Entrambe le tipologie di collegamento si ottengono con i cosiddetti circuiti Pull-Up e Pull-Down.

Vediamo come utilizzare questo tipo di circuiti per "leggere" la pressione di un pulsante con la board:


Non solo uscite ma anche ingressi

Modifichiamo il nostro schema elettrico inserendo un interruttore:

Facciamo un piccolo programmino che a seconda dell'input del PIN 11 accende il LED collegato alla uscita del PIN 07:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7,GPIO.OUT)
GPIO.setup(11,GPIO.IN)
while(1):
   GPIO.output(7,GPIO.input(11))


Il circuito realizzato è di tipo NC: se non premuto il valore booleano è vero (true).

Pull-Up e Pull-Down interne

Come in tutti i moderni micro controllori esiste la possibilità di configurare un pin di I/O con resistenze di Pull-Down/Pull-Up internamente senza bisogno di aggiungere hardware come abbiamo appena fatto, in questo modo il circuito viene così modificato:

Le modifiche che dovremo apportare al nostro precedente programma si limiteranno al seguente codice:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7,GPIO.OUT)
GPIO.setup(11,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
while(1):
   GPIO.output(7,GPIO.input(11))

Raspberry Pi e Java

Personalmente gradisco l'immediatezza del linguaggio di programmazione Python, ma lo trovo poco adatto alla mia natura preferendo il linguaggio Java per questo genere di applicazioni. Dopo il completo supporto di Oracle alla piattaforma Raspberry Pi è stata sviluppata sia una JVM che una libreria per sfruttare le funzionalità GPIO con Java chiamata PI4J.

Creiamo brevemente un piccolo programma equivalente all'ultimo realizzato in python (il pinout a cui si fa riferimento è leggermente modificato rispetto al board come specificato qui):
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalInput;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.PinPullResistance;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;

[...]

GpioController gpio = GpioFactory.getInstance();
GpioPinDigitalOutput led = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_07,PinState.LOW);
GpioPinDigitalInput button = gpio.provisionDigitalInputPin(RaspiPin.GPIO_00,PinPullResistance.PULL_DOWN);
while(true){
    led.setState(button.getState());
    Thread.sleep(100);
}

Questa soluzione ricalca precisamente quella adottata in python, tuttavia un linguaggio come Java si sposa più ad un approccio asincrono utilizzando un ascoltatore di eventi:
[...]
final GpioController gpio = GpioFactory.getInstance();
final GpioPinDigitalOutput led = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_07, PinState.LOW);
final GpioPinDigitalInput button = gpio.provisionDigitalInputPin(RaspiPin.GPIO_00, PinPullResistance.PULL_DOWN);
button.addListener(new GpioPinListenerDigital() {

    @Override
    public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent gpdsce) {
        led.setState(button.getState());
    }
});
while (true) {
    Thread.sleep(100);
}

Nessun commento:

Posta un commento