Aggiunta di un ADC al tuo Raspberry Pi: cosa devi sapere
Punti chiave
- Raspberry Pi non dispone di ingresso analogico, ma puoi aggiungere ADC esterni per convertire le tensioni dal mondo reale in forma digitale per la registrazione, la manipolazione e il controllo.
- Le opzioni ADC più diffuse includono MCP3004/MCP3008 per un compromesso tra velocità e precisione o ADS111x per letture a 16 bit a una frequenza di campionamento più lenta.
- L’ADS1115 di Adafruit è un’opzione semplice con un amplificatore di guadagno programmabile (PGA) che consente di rilevare piccole differenze di tensione e regolare il guadagno durante il programma. Collegarlo con Raspberry Pi utilizzando I2C è semplice.
Fuori dagli schemi, il Raspberry Pi non ha un ingresso analogico. Ciò lo pone in una posizione di svantaggio rispetto alle schede basate su microcontrollore come Arduino.
Ma non disperare: ci sono molte opzioni da considerare. Diventa subito operativo con Raspberry Pi e un ADC esterno.
Perché aggiungere input?
Il mondo reale è pieno di fenomeni che, se si dispone dei circuiti giusti, possono essere facilmente descritti utilizzando una tensione. Ottieni quelle tensioni in forma digitale e puoi registrarle, manipolarle e usarle per controllare altri parametri e dispositivi.
Potresti voler monitorare l’umidità del terreno, la temperatura della serra o il peso del tuo criceto. Potresti voler aggiungere un controllo del volume al tuo Pi, costruire un intero banco di fader o progettare un joystick da zero. Le possibilità sono, più o meno, illimitate.
Opzioni per gli ADC
Quindi, quale ADC è il migliore per i principianti?
Tra le opzioni più popolari e semplici ci sono i chip MCP3004 (e MCP3008 ) di Microchip. Otterrai quattro (o otto) canali da 10 bit ciascuno, che possono leggere fino a 200 kSPS. D’altro canto ci sono i dispositivi ADS111x della Texas Instruments, che leggono 16 bit a 860 SPS. Quindi, c’è un compromesso tra velocità e precisione (e, naturalmente, prezzo).
Molti microcontrollori sono dotati di ADC integrati. L’ATMega che trovi sull’Arduino medio offrirà diversi canali a 10 bit, oltre a tutto il resto. Questo è ciò che consente ad Arduino di fornire ingressi analogici dove il Raspberry Pi non può. Se hai già un Arduino coinvolto nella tua configurazione e 10 bit sono una fedeltà sufficiente, allora questo potrebbe essere il modo più semplice da percorrere.
Qui lo faremo semplice, con un ADS1115 di Adafruit.
Cos’è un amplificatore a guadagno programmabile?
Questo chip è dotato di alcune funzionalità interessanti, incluso un amplificatore di guadagno programmabile (PGA). Ciò ti consentirà di impostare digitalmente l’intervallo di valori desiderato, fino a una frazione di volt. Con il numero di valori che possono rappresentare 16 bit, ciò consentirà di rilevare differenze di pochi microvolt.
Il vantaggio qui è che puoi modificare il guadagno a metà del programma. Altri chip, come l’MCP3004, adottano un approccio diverso; sono dotati di un pin extra, al quale è possibile fornire una tensione di riferimento.
Che dire del multiplexing?
Un multiplexer (o mux) è un interruttore che consente di leggere molti ingressi utilizzando un singolo ADC. Se il tuo chip ADC è dotato di molti pin di ingresso, è in corso un multiplexing interno. Il mux dell’ADS1115 consente quattro ingressi, che è possibile selezionare tramite i registri interni.
Trattare con i registri
L’ADS1115 fornisce queste opzioni e alcune altre ancora. Puoi gestire il multiplexer, regolare il guadagno, attivare il comparatore integrato, modificare la frequenza di campionamento e mettere il dispositivo in modalità di sospensione a basso consumo, il tutto ruotando alcuni interruttori.
Ma dove sono quegli interruttori? Si trovano all’interno del pacchetto, sotto forma di piccolissimi bit di memoria chiamati registri . Per attivare una determinata funzionalità, è sufficiente impostare il bit pertinente su 1 anziché su 0.
Osservando la scheda tecnica dell’ADS111x , scoprirai che questi modelli sono dotati di quattro registri, inclusi i registri di configurazione che regolano il comportamento del dispositivo.
Ad esempio, i bit da 14 a 12 controllano il multiplexer. Utilizzando questi tre bit è possibile selezionare tra otto configurazioni. Quello che ti servirà qui è “100”, che darà la differenza tra input zero e terra. I bit da 7 a 5, invece, governano la frequenza di campionamento. Se desideri il massimo di 860 campioni al secondo, puoi impostarli su “111”.
Una volta che sai quali opzioni impostare, avrai due byte da inviare all’ADC. Se in seguito desideri impostare un singolo bit qua o là, puoi gestirli individualmente utilizzando gli operatori bit a bit.
Ecco dove potrebbe creare confusione. In questo caso, il binario non rappresenta un valore, ma i valori dei singoli interruttori. Potresti esprimere queste variabili come un grande numero, in decimale o in esadecimale. Ma se vuoi evitare mal di testa, dovresti attenersi alla versione binaria, che è più facile da leggere.
Cablaggio
Puoi collegare questo dispositivo direttamente alla breadboard. L’ingresso di tensione positiva accetterà ovunque tra 2 e 5,5 V, il che significa che il canale da 3,3 V sul Raspberry Pi funzionerà bene.
Collega gli ingressi SDA e SCL alle controparti sull’RPi e fai le stesse cose con terra e 3,3 V. Prendi un potenziometro tra la terra e le linee di tensione e inserisci il cavo centrale nel primo ingresso dell’ADC. Questo è tutto ciò che ti serve per iniziare!
Trattare con I2C
Diversi ADC funzionano tramite protocolli diversi. Nel caso del nostro ADS1115, utilizzeremo I2C .
L’esempio seguente interagirà con l’ADC utilizzando Python. Ma prima di farlo, dovrai configurarlo. Le versioni recenti del sistema operativo Raspberry Pi lo hanno reso molto semplice. Vai su Preferenze > Configurazione Raspberry Pi . Quindi, dalla scheda Interfacce , attiva I2C .
Per verificare che tutto funzioni, apri un terminale ed esegui:
sudo i2cdetect -y 1
Questo comando produrrà una griglia. Supponendo che tutto funzioni e che tu lo abbia collegato correttamente, vedrai apparire un nuovo valore nella griglia. Questo è l’indirizzo del tuo ADC. Tieni presente che si tratta di un valore esadecimale, quindi devi prefissarlo con “0x” quando lo usi nel codice seguente. Qui è 0x48 :
Una volta ottenuto l’indirizzo, puoi utilizzare la libreria SMBus per inviare comandi I2C. Avrai a che fare con due metodi qui. Il primo è write_word_data() , che accetta tre argomenti: l’indirizzo del dispositivo, il registro su cui stai scrivendo e il valore che vuoi scrivere.
Puoi abbellire un po’ il risultato e poi stamparlo. Prima di tornare all’inizio del loop, inserisci un breve ritardo. Ciò ti garantirà di non essere sopraffatto dai dati.
from smbus import SMBusimport timeaddr = 0x48bus = SMBus(1)# set the registers for readingCONFIGREG = 1CONVERSIONREG = 0# set the address register to point to the config register# write to the config registersbus.write_word_data(addr, CONFIGREG, (0b00000100 << 8 | 0b10000010)) # define the top of the rangeTOP = 26300while True: # read the register b = bus.read_word_data(addr, CONVERSIONREG) # swap the two bytes b = ((b & 0xFF) << 8) | ((b >> 8) & 0xFF) # subtract half the range to set ground to zero b -= 0x8000 # divide the result by the range to give us a value between zero and one b /= TOP # cap at one b = min(b, 1) # bottom is zero b = max(b, 0) # two decimal places b = round(b, 2) print(b) time.sleep(.01)
Hai quasi finito. Mappa l’intervallo di valori che ottieni su quello che preferisci, quindi troncare al numero desiderato di cifre decimali. È possibile personalizzare la funzione di stampa in modo da stampare un nuovo valore solo quando è diverso dall’ultimo valore.
Affrontare il rumore
Ora, a meno che la tua configurazione non sia super, super pulita e ordinata, noterai del rumore. Questo è lo svantaggio intrinseco dell’utilizzo di 16 bit anziché solo di dieci: quel piccolo rumore sarà più percepibile.
Collegando l’ingresso adiacente (ingresso 1) a terra e cambiando la modalità in modo da confrontare gli ingressi uno e due, puoi ottenere risultati molto più stabili. Potresti anche sostituire quei lunghi cavi jumper che raccolgono il rumore con quelli più piccoli e aggiungere alcuni condensatori già che ci sei. Anche il valore del tuo potenziometro può fare la differenza.
Ci sono anche opzioni software. Potresti creare una media mobile o semplicemente ignorare piccole modifiche. Lo svantaggio è che il codice aggiuntivo imporrà un costo computazionale. Se scrivi istruzioni condizionali in un linguaggio di alto livello come Python e prendi migliaia di campioni ogni secondo, questi costi aumenteranno rapidamente.
Vai oltre con molti possibili passaggi successivi
Effettuare letture tramite I2C è piuttosto semplice e lo stesso vale in gran parte per altri metodi, come SPI. Sebbene possa sembrare che ci siano grandi differenze tra le opzioni ADC disponibili, la verità è che una volta che ne hai fatto funzionare una, è facile applicare le conoscenze alle altre.
Quindi, perché non andare oltre? Collega più potenziometri insieme o prova a leggere la luce, il suono o la temperatura. Espandi il controller che hai appena realizzato e crea una configurazione Raspberry Pi davvero pratica!
Lascia un commento