Scheda acquisizione dati: 4 canali 12/16 bit per Raspberry

scheda acquisizione datiUn'altra! Dopo quella ad 1 canale e 12bit, ho realizzato un'altra scheda di acquisizione dati, decisamente più fornita; il tutto ruota attorno a due moduli (ADS1x15) venduti da Adafruit (in Italia da Robot Italy) che mettono a disposizione 4 ingressi single ended, campionabili da 128SPS a 3300kSPS con risoluzione di 12 o 16 bit, a seconda del modello; la comunicazione avviene tramite bus I2C (quindi sono facilmente collegabili anche ad un semplicissimo microcontrollore). Il modulo è praticamente pronto, l'unica aggiunta necessaria a chi desidera collegarlo al Raspberry è di 2 fet e 4 resistenze per adattare le tensioni, visto che gli I/O del RasPI accettano al massimo 3.3V e la scheda viene alimentata a 5V (in teoria sarebbe alimentabile anche a 3.3V, ma con 5 il range di tensioni in ingresso è maggiore). Questo è lo schema, davvero essenziale:

scheda acquisizione datiCosì semplice che per una volta, non ho perso tempo a stirare ed incidere un PCB ma ho realizzato tutto su millefori, in un'oretta scarsa. In ogni caso il layout  finale del PCB sarebbe stato:

scheda acquisizione datiI file *.sch e .*brd per Eagle sono qua; ed ora un ingrandimento della scheda realizzata, in cui si nota che tutti i componenti sono già presenti sul modulo (come il condensatore di filtro tra Vdd e Gnd):

scheda acquisizione datiNon resta che vedere se funziona... Innanzitutto il Raspberry andrà preparato all'utilizzo del bus I2C; mi risparmio di descrivere la procedura, spiegata molto meglio a questo link. Su GitHub è disponibile già pronta una libreria che riduce notevolmente la quantità di codice da scrivere per leggere qualche misura; copiati i files nella cartella \home\pi , si può cominciare a scrivere il programma:

#!/usr/bin/python

import time, signal, sys
from Adafruit_ADS1x15 import ADS1x15

def signal_handler(signal, frame):
print 'You pressed Ctrl+C!'
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
#print 'Press Ctrl+C to exit'

ADS1015 = 0x00  # 12-bit ADC
ADS1115 = 0x01    # 16-bit ADC

# Initialise the ADC using the default mode (use default I2C address)
# Set this to ADS1015 or ADS1115 depending on the ADC you are using!
adc = ADS1x15(ic=ADS1015)

# Read channels 0 in single-ended mode, +/-4.096V, 250sps

volts_0 = adc.readADCSingleEnded(0, 1024, 860) / 1000
volts_1 = adc.readADCSingleEnded(1, 4096, 860) / 1000
volts_2 = adc.readADCSingleEnded(2, 4096, 250) / 1000
volts_3 = adc.readADCSingleEnded(3, 4096, 250) / 1000

print "%.6f" % (volts_3)
print "%.6f" % (volts_2)
print "%.6f" % (volts_1)
print "%.6f" % (volts_0)

scheda acquisizione datiQuesto listato, il più semplice possibile, altro non fa che effettuare una lettura dei 4 canali e stampare a video i risultati. I 3 valori all'interno della funzione adc.readADCSingleEnded, sono rispettivamente il numero del canale, il range della grandezza in ingresso e la frequenza di campionamento. Ciò detto è possibile "looppare"  lettura e stampa a video, salvare i dati in un csv, metterli in real time su un grafico, e magari regolare il duty cycle di un pwm in base ai dati...