Utilizzare ADC ADS1115 con Raspberry

In questo nuovo tutorial per Raspberry Pi ti mostrerò una soluzione per l’implementazione di un ADC (Analog to Digital Converter) su un computer Raspberry Pi in modo da leggere ed elaborare segnali analogici.

Il computer Raspberry Pi purtroppo non ha un convertitore analogico-digitale (ADC) interno e per questo motivo bisogna utilizzare un ADC esterno. Fortunatamente esistono dei chip economici, facili da collegare e ad utilizzare. Uno da tra questi è il chip ADS1115 della Texas Instruments. Si tratta di un ADC a 4 canali da 16 bit utilizzabile tramite il bus seriale I2C. L’ADS1115 richiede pochissimi componenti passivi per funzionare e può essere utilizzato in un range di alimentazione che va da 2.0V a 5.5V con un consumo di corrente di soli 150uA. Per maggiori dettagli ecco il datasheet.

Fortunatamente sul mercato esistono diverse breakout board utilizzabili facilmente per prototipazione. Alcune sono disponibili anche su Amazon, né elenco qualcuna di seguito:

Schema elettrico

Di seguito lo schema elettrico (preso da Adafruit) della breakout board.

Collegamenti

Come detto precedentemente, l’ADC ADS1115 può essere utilizzato tramite bus serial I2C del Raspberry Pi. Il bus I2C richiede solo due pin, denominati SDA e SCL, per il dialogo master-slave tra due devices. Sul Raspberry Pi è possibile trovare i due pin (SDA e SCL) sul connettore da 40pin. In particolare il GPIO 2 corrisponde a SDA e GPIO 3 a SCL.

Il collegamento tra l’ADC ADS1115 e Raspberry è molto semplice e richiede solo 4 cavi di collegamento. Infatti è sufficiente collegare i due pin I2C e quelli dell’alimentazione (3.3V):

ADS1115RASPBERRY PI
VDD3.3V
GNDGNG
SCLGPIO 3 (SCL)
SDAGPIO 2 (SDA)

Sul chip ADS1115 oltre ai pin di alimentazione, I2C e quelli dei 4 canali ADC, sono presenti anche un pin denominato ADDR, utilizzabile per settare l’indirizzo I2C del chip, e un pin ALERT utilizzabile come input (sul Raspberry) per conoscere l’esatto momento in cui si conclude la conversione di un segnale da analogico a digitale.

Codice Python

Il codice per il test del funzionamento è stato scritto in python ed è stata sfruttata la libreria scritta da Adafruit. Per maggiori informazioni ti consiglio di consultare la documentazione della libreria, in questo articolo mi limiterò solo a mostrati un codice di esempio per il test dei 4 canali dell’ADC.

Prima di proseguire con il codice, bisogna abilitare il bus I2C sul Raspberry e ad installare la libreria per ADS1115. Per i miei test ho utilizzato un Raspberry Pi 4 con sistema operativo RaspberryOS (ex Raspbian).

Abilitazione bus I2C

Per abilitare il bus I2C da terminale bisogna eseguire i seguenti passi:

sudo raspi-config

Dopodichè consiglio un riavvio del Raspberry.

Installazione libreria

Prima di installare la libreria Python conviene sempre aggiornare tutti i pacchetti con i classici comandi:

sudo apt update
sudo apt upgrade -y

La libreria è compatibile solo con Python 3, quindi assicurati di avere installato Python3. Dopodichè bisogna eseguire il seguente comando per l’installazione della libreria ads1115 di adafruit:

pip3 install adafruit-circuitpython-busdevice
sudo pip3 install adafruit-circuitpython-ads1x15

Dopo l’installazione crea un file Python (es: ads1115_test.py) inserendo le seguenti linee di codice:

import board
import busio
import adafruit_ads1x15.ads1015 as ADS
from adafruit_ads1x15.analog_in import AnalogIn
import time

# i2c configuration
i2c = busio.I2C(board.SCL, board.SDA)
# Create the ADC object using the I2C bus
ads = ADS.ADS1015(i2c)
# Create input on channel 0, 1, 2, 3
chan_1 = AnalogIn(ads, ADS.P0)
chan_2 = AnalogIn(ads, ADS.P1)
chan_3 = AnalogIn(ads, ADS.P2)
chan_4 = AnalogIn(ads, ADS.P3)

while True:
    print("CH0: %f CH1: %f CH2: %f CH3: %f" % (chan_1.voltage, chan_2.voltage, chan_3.voltage, chan_4.voltage))
    time.sleep(0.1)

Oppure puoi clonare la repository del codice che ho caricato su github con il comando da terminale:

git clone https://github.com/Gius-8/ads1115_raspberry.git

Ed infine eseguire il codice Python da terminale con il comando:

python3 ads1115_test.py

Verrà stampato il valore di tensione (da 0V a 3.3V) di ogni canale dell’ADC, come mostrato nell’immagine seguente.