KY-053 Analog Digital Converter
Per entsprechenden Befehlen auf den I2C-Bus können auf bis zu 4 Eingängen analoge Spannungswerte mit bis zu 16-Bit Genauigkeit gemessen werden.
- Arduino
- Raspberry Pi
- Raspberry Pi Pico
- Micro:Bit
Per entsprechenden Befehlen auf dem I2C-Bus können auf bis zu 4 Eingängen analoge Spannungswerte mit bis zu 16-Bit Genauigkeit gemessen werden. Das Messergebnis wird kodiert auf den I2C-Bus ausgegeben.
Technische Daten
Schnittstelle | I2C |
ADC-Kanäle | 4 |
Auflösung pro Kanal | 16 Bit |
Programmierbare Abtastrate | 8 bis 860 SPS |
Betriebsspannung | 2 V bis 5,5 V |
Analogeingangsspannung | 0 V bis Betriebsspannung |
I2C Logikspannung | 0 V bis 5,5 V |
I2C Adresse | 0x48 bis 0x4B |
Typischer Betriebsstrom | 150μA |
Änderung der I2C Adresse
Dieser Analog zu Digital Wandler (oder in kurz ADC) besitzt nicht nur eine I2C Adresse. Hierbei handelt es sich um einen ADC welcher 4 verschiedene I2C Adressen besitzen kann. Diese können frei gewählt werden aber im weiteren verlauf wird die Standard Adresse 0x48 benutzt.
In der folgenden Tabelle können Sie alle möglichen Adressen einsehen und auch wie diese zu erreichen sind. Hierbei ist hauptsächlich zu beachten das der ADDR Pin des ADC verantwortlich ist für die Änderung der Adresse.
Von | Zu | Adresse |
---|---|---|
ADDR Pin | GND Pin | 0x48 |
ADDR Pin | VDD Pin | 0x49 |
ADDR Pin | SDA Pin | 0x4A |
ADDR Pin | SCL Pin | 0x4B |
Pin Belegung
Codebeispiel Arduino
Anschlussbelegung Arduino
Arduino | Sensor |
---|---|
5 V | +V |
GND | GND |
Pin A5 | SCL |
Pin A4 | SDA |
- | ADDR |
- | ALRT |
- | A0 |
- | A1 |
- | A2 |
- | A3 |
Die Arduino-Boards verfügen bereits über einen integrierten 10 Bit-ADC mit 6 Kanälen. Werden weitere Kanäle, oder eine höhere Genauigkeit, benötigt, so kann der Arduino mit Hilfe des KY-053 Analog Digital Converter Moduls um 4 ADC Kanäle mit 16-Bit Genauigkeit erweitert werden.
Zur Ansteuerung empfehlen wir die Verwendung der ADS1X15 Biblitohek, die von Adafruit unter der BSD-Lizenz veröffentlicht wurde.
Das unten stehende Beispiel basiert auf dieser Library. Hierzu empfehlen wir diese herunterzuladen, zu entpacken und im Arduino-Library-Ordner, welcher sich standardmäßig unter (C:\Benutzer[Benutzername]\Dokumente\Arduino\libraries) befindet, zu kopieren, damit diese für das Codebeispiel und folgende Projekte zur Verfügung steht. Alternativ ist die Library auch im unten stehenden Download-Paket enthalten.
#include <Adafruit_ADS1X15.h>
#include <math.h>
// ADS1115-Modul ist initialisiert - alle weiteren Operationen mit
// dem ADC können mit Hilfe des "ads"-Objekts ausgeführt werden.
Adafruit_ADS1115 ads;
void setup (void)
{
Serial.begin (9600);
Serial.println ("Werte der analogen Eingänge des ADS1115 (A0..A3) werden ausgelesen und ausgegeben");
Serial.println ("ADC Range: +/- 6.144V (1 bit = 0.1875mV)");
// Dieses Modul verfügt über Signalverstärker an seinen Analogeingängen,
// deren Verstärkung in den unten stehenden Bereichen per Software konfiguriert werden kann.
// Dies ist erforderlich, wenn ein bestimmter Spannungsbereich als Messergebnis
// erwartet wird und somit eine höhere Auflösung des Signals erhält.
// ADS1115
// -------
// ads.setGain (GAIN_TWOTHIRDS); // 2 / 3x gain +/- 6.144V 1 bit = 0.1875mV
// ads.setGain (GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 0.125mV
// ads.setGain (GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 0.0625mV
// ads.setGain (GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.03125mV
// ads.setGain (GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.015625mV
// ads.setGain (GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.0078125mV
ads.begin ();
}
void loop (void)
{
uint16_t adc0, adc1, adc2, adc3;
float voltage0, voltage1, voltage2, voltage3;
float gain_conversion_factor;
// Der Befehl "ads.readADC_SingleEnded (0)" ist der eigentliche Vorgang, der die Messung im ADC startet.
// Die "0" als Variable für diese Funktion definiert den verwendeten Kanal, der gemessen werden soll.
// Soll z.B. der dritte Kanal gemessen werden, muss die "0" durch die "3" ersetzt werden.
adc0 = ads.readADC_SingleEnded (0);
adc1 = ads.readADC_SingleEnded (1);
adc2 = ads.readADC_SingleEnded (2);
adc3 = ads.readADC_SingleEnded (3);
// Umrechnung der aufgezeichneten Werte in eine Spannung
voltage0 = ads.computeVolts(adc0);
voltage1 = ads.computeVolts(adc1);
voltage2 = ads.computeVolts(adc2);
voltage3 = ads.computeVolts(adc3);
// Ausgabe der Werte auf der seriellen Schnittstelle
Serial.print ("Analog input 0:"); Serial.print (voltage0); Serial.println (" V");
Serial.print ("Analog input 1:"); Serial.print (voltage1); Serial.println (" V");
Serial.print ("Analog input 2:"); Serial.print (voltage2); Serial.println (" V");
Serial.print ("Analog input 3:"); Serial.print (voltage3); Serial.println (" V");
Serial.println ("------------------------");
delay (1000);
}
Beispielprogramm Download
Per entsprechenden Befehlen auf dem I2C-Bus können auf bis zu 4 Eingängen analoge Spannungswerte mit bis zu 16-Bit Genauigkeit gemessen werden. Das Messergebnis wird kodiert auf den I2C-Bus ausgegeben.
Technische Daten
Schnittstelle | I2C |
ADC-Kanäle | 4 |
Auflösung pro Kanal | 16 Bit |
Programmierbare Abtastrate | 8 bis 860 SPS |
Betriebsspannung | 2 V bis 5,5 V |
Analogeingangsspannung | 0 V bis Betriebsspannung |
I2C Logikspannung | 0 V bis 5,5 V |
I2C Adresse | 0x48 bis 0x4B |
Typischer Betriebsstrom | 150μA |
Änderung der I2C Adresse
Dieser Analog zu Digital Wandler (oder in kurz ADC) besitzt nicht nur eine I2C Adresse. Hierbei handelt es sich um einen ADC welcher 4 verschiedene I2C Adressen besitzen kann. Diese können frei gewählt werden aber im weiteren verlauf wird die Standard Adresse 0x48 benutzt.
In der folgenden Tabelle können Sie alle möglichen Adressen einsehen und auch wie diese zu erreichen sind. Hierbei ist hauptsächlich zu beachten das der ADDR Pin des ADC verantwortlich ist für die Änderung der Adresse.
Von | Zu | Adresse |
---|---|---|
ADDR Pin | GND Pin | 0x48 |
ADDR Pin | VDD Pin | 0x49 |
ADDR Pin | SDA Pin | 0x4A |
ADDR Pin | SCL Pin | 0x4B |
Pin Belegung
Codebeispiel Raspberry Pi
Anschlussbelegung Raspberry Pi
Raspberry Pi | Sensor |
---|---|
3,3 V [Pin 1] | +V |
GND [Pin 6] | GND |
GPIO 3 [Pin 5] | SCL |
GPIO 2 [Pin 3] | SDA |
- | ADDR |
- | ALRT |
- | A0 |
- | A1 |
- | A2 |
- | A3 |
Der Raspberry Pi besitzt im Gegensatz zum Arduino weder analoge Eingänge, noch einen integrierten Analog-Digital Converter. Dies schränkt den Raspberry Pi bei der Verwendung von analogen Sensoren ein. Um dennoch analoge Sensoren am Raspberry Pi verwenden zu können, kann der Raspberry Pi um unser KY-053 Analog Digital Converter Modul um 4 ADC Kanäle mit 16-Bit Genauigkeit erweitert werden.
Das Programm nutzt zur Ansteuerung des ADS1115 ADC die entsprechenden ADS1x15 und I2C Python-Libraries von Adafruit. Diese wurden unter dem folgenden Link Adafruit_CircuitPython_ADS1x15 unter der MIT-Lizenz veröffentlicht. Die benötigten Libraries sind nicht im unteren Download-Paket enthalten.
Zunächst müssen Sie I2C auf Ihren Raspberry Pi aktivieren. Um die Konfiguration zu öffnen, geben Sie den folgenden Befehl ein:
sudo raspi-config
Wählen Sie dort 3 Interface Options → I4 I2C aus und aktivieren Sie die I2C-Schnittstelle. Sie haben nun erfolgreich I2C aktiviert. Der Analog-Digital Wandler ist jetzt unter der I2C-Adresse 0x48 erreichbar, welche bei diesem Sensor standardmäßig gesetzt ist. Die I2C Adresse wird anders sein, wenn Sie diese bereits konfiguriert haben sollten, bevor Sie Ihren Raspberry Pi konfiguriert haben.
Installieren Sie nun pip3 mit dem folgendem Befehl:
sudo apt-get install python3-pip
Als nächstes muss die virtuelle Umgebung eingerichtet werden. Geben Sie dazu die folgenden Befehle ein:
mkdir dein_projekt
cd dein_projekt
python -m venv --system-site-packages env
source env/bin/activate
Mit dem folgenden Befehlen laden Sie sich die adafruit-circuitpython-ads1x15 Bibliothek herunter und installieren sie.
pip3 install adafruit-circuitpython-ads1x15
Nachdem Sie die Bibliothek heruntergeladen haben, brauchen Sie nur mit folgendem Befehl...
nano ADS1115.py
...eine neue Datei auf Ihrem Raspberry Pi zu erstellen und dann den folgenden Code in die so eben erstellt Datei kopieren.
import time
import board
import busio
import adafruit_ads1x15.ads1115 as ADS
from adafruit_ads1x15.analog_in import AnalogIn
# Create the I2C bus
i2c = busio.I2C(board.SCL, board.SDA)
# Create the ADC object using the I2C bus
ads = ADS.ADS1115(i2c)
# Create single-ended input on channels
chan0 = AnalogIn(ads, ADS.P0)
chan1 = AnalogIn(ads, ADS.P1)
chan2 = AnalogIn(ads, ADS.P2)
chan3 = AnalogIn(ads, ADS.P3)
while True:
print("channel 0: ","{:>5}\t{:>5.3f}".format(chan0.value, chan0.voltage))
print("channel 1: ","{:>5}\t{:>5.3f}".format(chan1.value, chan1.voltage))
print("channel 2: ","{:>5}\t{:>5.3f}".format(chan2.value, chan2.voltage))
print("channel 3: ","{:>5}\t{:>5.3f}".format(chan3.value, chan3.voltage))
print("---------------------------------------------------")
time.sleep(1)
Beispielprogramm Download
Zu starten mit dem Befehl
sudo python3 KY053.py
Erweiterte ADS1115 Funktionen
Die in den oben dargestellten Codebeispielen verwendete ADS1115-Funktion wird als "Single Ended Conversion" bezeichnet und bedeutet, dass eine Messung an dem ausgewählten Einzelkanal in Bezug auf Masse durchgeführt wird.
Neben dieser Art der Messung verfügt der ADS1115 ADC z.B. auch über eine Differenzmessfunktion, so dass eine Differenzspannung zwischen zwei Eingängen gemessen wird (z.B. Spannung zwischen A0 und A1). Neben der einseitigen Messung kann auch eine Komparatorfunktion aktiviert werden, die erst bei Überschreiten einer Spannungsschwelle ein Messergebnis liefert.
Diese und andere Funktionen, wie z.B. die Änderung der Abtastrate, werden in den Adafruit-Bibliotheken zur Konfiguration programmiert - siehe die Adafruit-Bibliotheksdokumentation für Details.
Per entsprechenden Befehlen auf dem I2C-Bus können auf bis zu 4 Eingängen analoge Spannungswerte mit bis zu 16-Bit Genauigkeit gemessen werden. Das Messergebnis wird kodiert auf den I2C-Bus ausgegeben.
Technische Daten
Schnittstelle | I2C |
ADC-Kanäle | 4 |
Auflösung pro Kanal | 16 Bit |
Programmierbare Abtastrate | 8 bis 860 SPS |
Betriebsspannung | 2 V bis 5,5 V |
Analogeingangsspannung | 0 V bis Betriebsspannung |
I2C Logikspannung | 0 V bis 5,5 V |
I2C Adresse | 0x48 bis 0x4B |
Typischer Betriebsstrom | 150μA |
Änderung der I2C Adresse
Dieser Analog zu Digital Wandler (oder in kurz ADC) besitzt nicht nur eine I2C Adresse. Hierbei handelt es sich um einen ADC welcher 4 verschiedene I2C Adressen besitzen kann. Diese können frei gewählt werden aber im weiteren verlauf wird die Standard Adresse 0x48 benutzt.
In der folgenden Tabelle können Sie alle möglichen Adressen einsehen und auch wie diese zu erreichen sind. Hierbei ist hauptsächlich zu beachten das der ADDR Pin des ADC verantwortlich ist für die Änderung der Adresse.
Von | Zu | Adresse |
---|---|---|
ADDR Pin | GND Pin | 0x48 |
ADDR Pin | VDD Pin | 0x49 |
ADDR Pin | SDA Pin | 0x4A |
ADDR Pin | SCL Pin | 0x4B |
Pin Belegung
Codebeispiel Micro:Bit
Anschlussbelegung Micro:Bit
Micro:Bit | Sensor |
---|---|
3,3 V | +V |
GND | GND |
Pin 19 | SCL |
Pin 20 | SDA |
- | ADDR |
- | ALRT |
- | A0 |
- | A1 |
- | A2 |
- | A3 |
Der Micro:Bit verfügt bereits über einen integrierten 10-Bit ADC. Werden weitere Kanäle oder eine höhere Genauigkeit benötigt, so kann der Micro:Bit mit Hilfe des KY-053 Analog Digital Converter Moduls um 4 ADC Kanäle mit 16-Bit Genauigkeit erweitert werden.
Zur Ansteuerung empfehlen wir die Verwendung der pxt-ads1115 Biblitohek, die von uns unter der MIT-Lizenz veröffentlicht wurde.
Die Bibliothek können Sie hinzufügen, indem Sie auf der Makecode Seite auf Erweiterungen klicken und dort dann ADS1115 in der Suchleiste eingeben. Nachdem Sie das getan haben, müssen Sie nur noch auf die Erweiterung klicken, um diese automatisch für ihr aktuelles Projekt hinzuzufügen.
Beispielprogramm Download
Per entsprechenden Befehlen auf dem I2C-Bus können auf bis zu 4 Eingängen analoge Spannungswerte mit bis zu 16-Bit Genauigkeit gemessen werden. Das Messergebnis wird kodiert auf den I2C-Bus ausgegeben.
Technische Daten
Schnittstelle | I2C |
ADC-Kanäle | 4 |
Auflösung pro Kanal | 16 Bit |
Programmierbare Abtastrate | 8 bis 860 SPS |
Betriebsspannung | 2 V bis 5,5 V |
Analogeingangsspannung | 0 V bis Betriebsspannung |
I2C Logikspannung | 0 V bis 5,5 V |
I2C Adresse (Per Jumper Konfigurierbar) | 0x48 bis 0x4B |
Typischer Betriebsstrom | 150μA |
Änderung der I2C Adresse
Dieser Analog zu Digital Wandler (oder in kurz ADC) besitzt nicht nur eine I2C Adresse. Hierbei handelt es sich um einen ADC welcher 4 verschiedene I2C Adressen besitzen kann. Diese können frei gewählt werden aber im weiteren verlauf wird die Standard Adresse 0x48 benutzt.
In der folgenden Tabelle können Sie alle möglichen Adressen einsehen und auch wie diese zu erreichen sind. Hierbei ist hauptsächlich zu beachten das der ADDR Pin des ADC verantwortlich ist für die Änderung der Adresse.
Von | Zu | Adresse |
---|---|---|
ADDR Pin | GND Pin | 0x48 |
ADDR Pin | VDD Pin | 0x49 |
ADDR Pin | SDA Pin | 0x4A |
ADDR Pin | SCL Pin | 0x4B |
Pin Belegung
Codebeispiel Raspberry Pi Pico
Anschlussbelegung Raspberry Pi Pico
Raspberry Pi Pico | Sensor |
---|---|
3,3 V | +V |
GND | GND |
GPIO1 | SCL |
GPIO0 | SDA |
- | ADDR |
- | ALRT |
- | A0 |
- | A1 |
- | A2 |
- | A3 |
Der Raspberry Pi Pico verfügt bereits über einen integrierten 12-Bit ADC. Werden weitere Kanäle oder eine höhere Genauigkeit benötigt, so kann der Raspberry Pi Pico mit Hilfe des KY-053 Analog Digital Converter Moduls um 4 ADC Kanäle mit 16-Bit Genauigkeit erweitert werden.
Zur Ansteuerung empfehlen wir die Verwendung der ADS1115-Micropython Biblitohek, die von uns unter der MIT-Lizenz veröffentlicht wurde.
Dieses Codebeispiel liest Kanal 0 und gibt die gelesenen Daten als Analogwert und als berechnete Spannung zurück.
# Bibliotheken laden
import machine
import ADS1115
import sys
from time import sleep
# Variablen Initialisierung
chan = 0
if __name__ == '__main__':
try:
# Initialisierung des ADC
ADS1115.init(0x48, 3, 4, False)
print("start")
while True:
# Ausgabe der Daten von Kanal 0 des ADC
print(ADS1115.read(chan))
# Ausgabe der Ausgelesenen und umgerechneten Daten von Kanal 0 des ADC
print(str(ADS1115.raw_to_v(ADS1115.read(chan))) + " V")
sleep(1)
except KeyboardInterrupt:
sys.exit()