Il Raspberry Pi dispone di un port di I/O digitale (GPIO), che gli consente di comunicare con il mondo esterno (sensori, attuatori ecc.)
Il GPIO è accessibile mediante un connettore maschio (riferimento sullo stampato "P1") da 26 pin, passo 100mil, disposti su due linee da 13 pin ciascuna.
Lo schema del connettore è riportato di seguito e si riferisce alla revisione attualmente in commercio (la n. 2):
Fonte: http://telpar.altervista.org/
• Pin fisici e pin virtuali
Una prima distinzione che bisogna fare è fra "pin fisici" e "pin virtuali".
I primi seguono la numerazione fisica del connettore, secondo la seguente convenzione: guardando il connettore dall'alto, in modo che la tacchetta di riferimento si trovi in basso a sinistra, il pin 1 è quello che si trova in corrispondenza della tacchetta stessa, il pin2, non si trova alla destra del pin 1, ma sulla linea opposta, di fronte, come riportato nell'immagine successiva:
Fonte: http://www.panu.it/raspberry/
Quindi, la convenzione "fisica" prevede che i pin inferiori siano numerati dispari: 1, 3, 5, ... , 25, mentre quelli superiori vengano numerati pari: 2, 4, 6, ... , 26
I pin virtuali, invece, sono numeri o nomi, usati per identificare i pin fisici nella programmazione o nell'accesso dalla shell.
Un esempio di convenzione virtuale è la numerazione dei pin adottata da WiringPI, una libreria C (e per altri linguaggi), che consente di programmare il Raspberry con una sintassi semplificata, simile a quella di Arduino.
I pin WiringPi sono riportati nell'immagine di sopra cerchiati di colore rosso; come si può vedere si usano 17 numeri (da 0 a 16) per identificare i pin di I/O; ad esempio il pin fisico 11, corrisponderà al pin virtuale 0 (secondo WiringPi) e al pin virtuale 17 (secondo la convenzione del produttore del chip).
La convenzione WiringPI ha un vantaggio non indifferente: è indipendente dalle revisioni delle schede (rev.1 e rev.2), quindi non occorre ridefinire i numeri dei pin nei sorgenti.
• Livelli di tensione e di corrente
I pin GPIO2 e GPIO3 sono internamente collegati a una resistenza di pull-up da 1,8kΩ (linee SDA/SCL della comunicazione I2C).
La massima corrente prelevabile dai pin di alimentazione 3,3V è 50mA, mentre dai rami +5V è 300mA (per la rev.2).
I valori di tensione nominali associati al livello alto e al livello basso sono, rispettivamente, 3,3V e 0V.
I circuiti interni non prevedono alcuna protezione per tensioni superiori a 3,3V, quindi, nel caso si debba applicare a un ingresso del GPIO una tensione superiore (es. 5V TTL) occorrerà utilizzare dei convertitori di livello (transistor, buffer/line driver ecc.), partitori di tensione o zener, per portare la tensione nell'intorno dei 3,3V (i livelli di tensione in ingresso sono: VIH > = 1,3V e VIL < = 0,8V)
Le impostazioni di default, infine, limitano la massima corrente a 8mA per pin, valore massimo che garantisce la corretta interpretazione del livello logico alto.
La rev.2 monta anche un secondo connettore (riferimento P5) che prevede altri 4 pin GPIO, nel caso i 17 pin del connettore P1 non fossero sufficienti.
Risorse consultate e strumenti utilizzati:
- http://elinux.org/RPi_Low-level_peripherals
- http://www.scribd.com/doc/101830961/GPIO-Pads-Control2
- http://www.thebox.myzen.co.uk/Raspberry/Understanding_Outputs.html
- http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf (DS del SoC)
- FidoCadJ