Questa pagina l'ho scritta molto tempo fa e contiene materiale obsoleto
L'uso è sconsigliato e non posso più fornire alcun supporto
Il contenuto di questa pagina è da rivedere in quanto con le versioni attuali di Raspbian la frequenza di clock SPI all'accensione è 125 MHz, quindi inadatta per l'uso con i circuiti indicati. Non esistono metodi standard per impostare la frequenza del clock.
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
Le osservazioni:
Il ritardo introdotto tra l'attivazione di CE e l'effettivo inizio della comunicazione (latenza) potrebbe avere un impatto negativo:
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.
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...
Si tratta di un potenziometro digitale doppio. Lo schema:
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Ω:
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.
Prima di creazione di questa pagina: luglio 2013
Ultima modifica: 31 marzo 2018
Raspberry Pi: note di hardware - Versione 1.31 - Luglio
2019
Copyright 2013-2019, Vincenzo Villa (https://www.vincenzov.net)
Quest'opera è stata rilasciata con licenza Creative Commons | Attribuzione-Condividi allo stesso modo 3.0 Unported.