Convertisseur A/N

Après avoir utilisé une convertisseur 12 bits et un PC pendant quelques temps, j’ai commencé au cours du mois de juin 2014 la migration vers un ensemble basé sur un Raspberry Pi et un convertisseur ADS1115.

Je ne m’étendrai pas sur l’utilisation ou ce qu’est un Raspi. On trouve ça partout. La distribution utilisée est une classique Raspbian. Le convertisseurs ADC est interrogé via le bus I2C.

Le convertisseur

ads1115

Le câblage est très sommaire. 

Raspberry       ADS1115
GND           –>   GND
+ 5V           –>    VDD
SCL           –>    SCL
SDA          –>    SDA
                         ADRR     -> GND (dans ma config adresse 0x48 sur le bus I2C)
                         A0           -> pre-amp capteur 1
                         A1           -> pre-amp capteur 1
                         A2           -> pre-amp capteur 2
                         A3           -> pre-amp capteur 2

J’utilise un vieux bout de Pyton récupéré sur ce site où tout le démarrage y est bien expliqué : http://openlabtools.eng.cam.ac.uk/Resources/Datalog/RPi_ADS1115/

#print_adc_readings.py - 12/9/2013. Written by David Purdie as part of the openlabtools initiative
#Uses the adafruit python libraries to sample the ADS1115 at a user defined sampling frequency

from Adafruit_ADS1x15 import ADS1x15
import datetime
import time
import numpy as np

pga = 6144 # Set full-scale range of programable gain amplifier (page 13 of data sheet), change depending on the input voltage range
ADS1115 = 0x01 # Specify that the device being used is the ADS1115, for the ADS1015 used 0x00
adc = ADS1x15(ic=ADS1115) # Create instance of the class ADS1x15 called adc

# Function to print sampled values to the terminal
def logdata():

#print "sps value should be one of: 8, 16, 32, 64, 128, 250, 475, 860, otherwise the value will default to 250"

frequency = 40 # Get sampling frequency from user
sps = 100 # Get ads1115 sps value from the user
time1 = 3599 # Get how long to sample for from the user

period = 1.0 / frequency # Calculate sampling period

datapoints = int(time1*frequency) # Datapoints is the total number of samples to take, which must be an integer

startTime=time.time()
now = datetime.datetime.now() # Time of first sample
name = now.strftime("%Y%m%d-%H")
name = name +".txt"
t1=startTime # T1 is last sample time
t2=t1 # T2 is current time

for x in range (0,datapoints) : # Loop in which data is sampled
while (t2-t1 < period) : # Check if t2-t1 is less then sample period, if it is then update t2
t2=time.time() # and check again
t1+=period # Update last sample time by the sampling period

result = adc.readADCDifferential01( pga, sps)
result23 = adc.readADCDifferential23( pga, sps)
#print "%s %s\n" % ( result, result23) # Print sampled value and time to the terminal
writefile.write("%s %s\n" % ( result, result23))
# Call to logdata function
now = datetime.datetime.now() # Time of first sample
name = now.strftime("%Y%m%d-%H")
name = name +".txt"

writefile = open(name,'w',1024)
logdata()
writefile.close()

Les données issues de la conversion A/N sont stockées dans des fichiers d’une durée d’une heure de 144 000 échantillons (40/s). Les fichiers sont écrits sur un serveur via un montage NFS pour économiser la carte SD.
Il serait plus astucieux d’enregistrer les données dans un autre format que du texte(…) mais dans un premier temps et à titre d’essai ca fonctionne. 

Reste à afficher le résultat. On peut utiliser pour cela Gnuplot. C’est un exemple parmi d’autres. Gnuplot permet d’afficher une courbe mais ne permet pas de filtrage ou d’analyse. Pour ce faire j’utilise un logiciel TSOFT  http://seismologie.oma.be/TSOFT/tsoft.html publié par the Royal Observatory of Belgium.

Voici une sortie brute obtenue avec Gnuplot

gnuplot_ex

C’est évidement très sommaire, mais on voit qu’il se passe quelque chose 😉

La même à un moment plus calme

gnuplot_ex2

Les pics vers 6h, 6h33 et 06h37 sont des trains passant non loin.

To be continued…

Ancienne config

Le convertisseur analogique-numérique est bâti autour d’un MAX 186. Le montage est inspiré de celui utilisé pour le projet Radio-SkyPipe. Les données sont lues depuis un port parallèle d’un PC sous Linux.

Le MAX186 possède 8 entrées analogiques (pin 1 à 8) avec une résolution de 12 bits. La tension sur une entrée peut varier de 0 à 4096 mV.
Le schéma est ultra simple comme on le voit ci-dessous.

max186

Le code source du logiciel permettant d’utiliser le convertisseur. Sa compilation sous Linux ne pose aucun problème. Se référer au Readme inclus dans l’archive. Ce logiciel lit les valeurs de une ou plusieurs des entrées du MAX186 et les enregistre dans un fichier texte. Ci-dessous un exemple avec deux entrées.

1363816801 2167 2075
1363816801 2139 2073

Le début de la ligne est un timestamp Unix. Sa précision est de 1 seconde seulement. Donc si on demande une vitesse d’échantillonnage à 10 ech/s le timestamp sera le même pour 10 lignes consécutives. Il faudra donc prévoir un petit post traitement de cette valeur si on souhaite obtenir l’heure en dessous de la seconde. Ou plus élégant, modifier le source du programme pour obtenir une valeur en micro-seconde par exemple.