Salta la barra di navigazione [1] - Vai alla barra di navigazione [3] - Scrivimi una mail [4]

Rapsberry Pi: SPI con Bash 

Raspberry Pi - Note di hardware - Sommario - Novità - Tutorial - Progetti - Risorse - Non solo elettronica

Raspberry possiede un bus SPI (Serial Peripheral Interface) accessibile all'utente. Questa interfaccia seriale permette di collegare numerosi circuiti integrati adatti ad interagire col mondo reale. Internet è ricca di materiale su questo bus (per esempio: http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus) e quindi non verrà qui descritto.

Rapsberry Pi: SPI con Bash 

In estrema sintesi, rispetto ad I2C, ha le seguenti caratteristiche:

I pin utilizzati dal bus SPI sono disponibili sul connettore GPIO.

Configurare Raspberry Pi

Innanzitutto occorre verificare che il kernel sia configurato per usare l'hardware SPI. Se usate una versione di Raspbian decentemente aggiornata i moduli relativi sono già presenti nell'installazione standard, anche se potrebbero non essere attivati.

Il modo più semplice per farlo è attraverso il programma di configurazione

vv@vvrpi ~ $ sudo raspi-config

Dopo il riavvio, dovrebbero essere presenti i due device corrispondenti, con i corretti permessi:

pi@raspberrypi:~ $ ls -hl /dev/spi*

crw-rw---- 1 root spi 153, 0 Sep 21 17:05 /dev/spidev0.0
crw-rw---- 1 root spi 153, 1 Sep 21 17:05 /dev/spidev0.1

Il gruppo spi dovrebbe già contenere l'utente pi:

pi@raspberrypi:~ $ groups
pi adm dialout cdrom sudo audio video plugdev games users input netdev gpio i2c spi

Altrimenti:

pi@raspberrypi:~ $ sudo addgroup spi
pi@raspberrypi:~ $ usermod -a -G spi pi

Solo se ci sono problemi (tipicamente con sistemi non aggiornati o addirittura pre-jessie) potrebbe essere utile fare alcune ulteriori verifiche:

Verificare che il file /etc/modprobe.d/raspi-blacklist.conf (file peraltro non sempre presente) non vieti l'uso dei moduli necessari. Per far ciò, come root occorre commentare o cancellare le linea seguenti, se esistenti:

#blacklist spi-bcm2708
#blacklist spi_bcm2835

Se avete fatto questa modifica occorre riavviare.

Per verificare il caricamento del modulo spi:

pi@raspberrypi:~ $ lsmod
Module      Size Used by
[...]
spi_bcm2835 8032 0

oppure

pi@raspberrypi:~ $ lsmod
Module         Size Used by
spidev         5224 0
spi_bcm2708    4816 0
[...]

Occorre inoltre abilitare i componenti del gruppo spi a leggere e scrivere. Per fare ciò esistono due strade:

La prima è da fare ri-percorrere ogni riavvio, cambiando manualmente i permessi al file /dev/spidev0.*:

root@vvrpi:/home/vv# chown :spi /dev/spidev0.*
root@vvrpi:/home/vv# chmod g+rw /dev/spidev0.*
root@vvrpi:/home/vv# ls -l /dev/spidev0.*
crw-rw---- 1 root spi 153, 0 Jan 1 1970 /dev/spidev0.0
crw-rw---- 1 root spi 153, 1 Jan 1 1970 /dev/spidev0.1

Ovviamente è possibile automatizzare tale sequenza ed inserire i comandi per esempio in /etc/rc.local.

chown :spi /dev/spidev0.*
chmod g+rw /dev/spidev0.*

La strada alternativa è usare udev, creando un opportuno file (per esempio /lib/udev/rules.d/60-spi.rules) con contenuto:

KERNEL=="spidev0.*", GROUP="spi", MODE="0660"

Trasmissione

In Raspbian non esiste al momento uno strumento di supporto utilizzabile direttamente da Bash. L'unica possibilità sembra essere quella di inviare una sequenza di byte verso il file /dev/spidev0.x per trasmettere i dati con le impostazioni di default. L'immagine seguente è stata ottenuta con il comando:

vv@vvrpi ~ $ echo -en '\xF0\x55' > /dev/spidev0.0

Scrittura di due byte

Le osservazioni:

Il ritardo introdotto tra l'attivazione di CE e l'effettivo inizio della comunicazione (latenza) potrebbe avere un impatto negativo:

Il jotter

Un esempio: MCP4822

MCP4822 è un doppio convertitore digitale analogico a 12 bit, capace di generare tensioni tra 0 e 2.048 V. Per i dettagli potete consultare il foglio tecnico.

Lo schema di collegamento è piuttosto semplice: è sufficiente collegare i pin dell'interfaccia SPI e alimentare il circuito. L'unica avvertenza è collegare il pin LDAC a massa per rendere immediato l'aggiornamento dell'uscita. Per semplicità non sono stati disegnati i condensatori di disaccoppiamento tra massa e alimentazione, certamente utili, ma non strettamente indispensabili per le finalità qui illustrate.

Collegare  in DAC a Raspberry Pi

Attenzione! Anche se questo circuito integrato può funzionare senza problemi a 5 V, il Raspberry Pi verrebbe irrimediabilmente danneggiato usando tale tensione di alimentazione (non sono state ovviamente fatte verifiche...).

Scorrendo il foglio tecnico si legge che per impostare una tensione di uscita è necessario scrivere 16 bit, cioè due byte. In breve e senza entrare nei dettagli occorre mandare la seguente sequenza di bit:

A/B  x  1  1  D11  D10  D9  D8  D7  D6 D5  D4  D3  D2 D1 D0

Due esempi:

Il codice è di conseguenza:

vv@vvrpi ~ $ echo -en '\x3F\xFF' > /dev/spidev0.1
vv@vvrpi ~ $ echo -en '\xB8\x00' > /dev/spidev0.1

Ovviamente per verificare il funzionamento occorre misurare con un multimetro le tensioni tra le uscita OUTA massa oppure tra OUTB e massa; il comando funzionerebbe esattamente allo stesso modo anche senza alcun convertitore collegato...

Un altro esempio: AD8402

Si tratta di un potenziometro digitale doppio. Lo schema:

AD8402 connesso a Raspberry Pi

Dal punto di vista funzionale il circuito si comporta come una coppia di potenziometri meccanici da 10 kΩ connessi tra massa e alimentazione attraverso due resistenze da 1 kΩ:

Doppio potenziometro

Ovviamente in questo caso non occorre ruotare alcun albero, ma trasmettere una stringa di bit, formata da 10 bit, come descritto nel foglio tecnico:

La difficoltà (apparente) risiede nel fatto che possono essere trasmessi solo gruppi di 8 bit. Per questo utilizzeremo due byte: i sei bit in eccesso dovranno essere i primi ad essere trasmessi; essi saranno ignorati in quanto verranno mandati in uscita al registro a scorrimento del potenziometro e si "perderanno nel nulla".

Due esempi (supponendo di porre i bit irrilevanti a 0):

Il codice è di conseguenza:

vv@vvrpi ~ $ echo -en '\x01\x80' > /dev/spidev0.0
vv@vvrpi ~ $ echo -en '\x00\x00' > /dev/spidev0.0

 

Non viene qui proposto alcun esempio di lettura dal bus SPI in quanto con Bash non è possibile andare oltre la generazione dei segnali. O, forse, non sono semplicemente stato in grado di farlo... Per fortuna esiste il C.

Ultima modifica di questa pagina: 21 settembre 2016


Raspberry Pi - Note di hardware

Vedi anche: Il taccuino tecnico


Licenza "Creative Commons" - Attribuzione-Condividi allo stesso modo 3.0 Unported


EN - Pagina principale - Sommario - Accessibilità - Note legali e privacy policy - Posta elettronica

XHTML 1.0 Strict - CSS 3