Hallo zusammen,
heute möchte ich Ihnen kurz die Verwendung unseres ADS1115-Moduls zeigen. Für Arduino-Einsteiger bietet dieses Modul kaum einen Mehrwert. Benötigt man für sein Projekt mehr analoge Pins lohnt sich meist der Umstieg auf den nächst größeren Controller, der MEGA bietet Beispielsweise 16 analoge Eingänge. Wer für ein Projekt mehr als 16 analoge Pins benötigt gilt meistens nicht mehr als Anfänger :)
Für fortgeschrittene Benutzer lässt sich die Funktionalität des Moduls in einem kurzen Satz beschreiben: Ein 16-bit ADC mit PGA und I2C-Interface für bis zu 860/s.
Einsteigern möchte ich heute kurz die Funktionsweise des Moduls erklären und ein Anwendungsbeispiel zur Hand geben.
Was ist ein ADC?
ADC steht für AnalogDigitalConverter, auch A/D-Wandler oder Umsetzer genannt. Dieser ermöglicht es analoge Signale zu digitalen Signalen umzuwandeln. A/D-Umsetzer sind im Bereich der Elektronik unverzichtbar und so gut wie in jedem Elektrogerät vorhanden, so auch in Arduinos. Das Gegenstück hierzu wird DAU genannt. Es gibt viele Arten analoge Signale in digitale umzuwandeln, je nach tiefe handelt es sich dabei um sehr komplexe Prozesse und so sind diese Verfahren bis zum heutigen Tag noch immer Thema aktueller Forschungen im Bereich Elektrotechnik und Informatik.
Auflösung und Sample Rate
Für den Hobbybereich gibt es zwei relevante Werte um mit den Modulen arbeiten zu können, die Auflösung und die Abtastrate. Die Abtastrate bestimmt, wieviele Veränderungen des Signals erfasst werden können. Im Prinzip also der horizontale Abstand der gepunkteten Linien unten im Bild:
Die Auflösung kann als Anzahl möglicher Stufen verstanden werden und ist in der nächsten Abbildung als vertikaler Abstand der horizontalen Linien zu verstehen (x).
Was ist ein PGA?
PGA steht für Programmable Gain Amplifier was übersetzt soviel wie "programmierbarer Verstärker" heißt. Diese dienen primär als Operationsverstärker in der Messtechnik, wir verwenden diese Funktion des ADUs auf unseren Modulen nur recht selten, da unsere analogen Sensoren "out-of-the-box" für unsere Mikrocontroller lesbare Werte liefern.
Wieso I2C?
Über das I2C-Interface ist eine Kommunikation zwischen dem Modul (auch mehreren Modulen) und Mikrocontrollern mit nur zwei Datenleitungen möglich. Der Umgang mit dem I2C-Bus ist vor allem für Einsteiger empfehlenswert wenn auch nicht mehr Stand der Technik. Alle gängigen Mikrocontroller können über dieses Protokoll kommunizieren und der Umgang der Sensoren auf Modul-Ebene (mit Library) ist besonders leicht zu erlernen. Für fortgeschrittene Benutzer sei an der Stelle die alternativen I2S und CAN genannt.
Die Verdrahtung:
Sensor | ADS1117 | Mikrocontroller (NanoV3/D1 mini) |
VCC | VCC | VCC |
GND | GND | GND |
S | A0 | |
SDA | SDA (A4/D2) | |
SCL | SCL (A5/D1) |
Der heutige Versuchsaufbau wurde höchst konservativ gewählt:
Welche Library?
Da das Layout unseres ADS1115 zum Großteil mit dem Adafruit-Layout identisch ist können wir diese Library uneingeschränkt und ohne Anpassungen nutzen. Diese steht im Library-Manager der Arduino-IDE zur Verfügung:
Die oben zu sehende Library unterstütz auch die ADS1117 Module an unseren Arduinos sowie ESP8266-Boards.
Hier der Code:
#include <Wire.h> #include <Adafruit_ADS1015.h> Adafruit_ADS1115 ads; void setup(void) { Serial.begin(9600); Serial.println("Hello!"); Serial.println("Getting single-ended readings from AIN0..3"); Serial.println("ADC Range: +/- 6.144V (1 bit = 0.1875mV/ADS1115)"); ads.begin(); } void loop(void) { int16_t adc0, adc1, adc2, adc3; adc0 = ads.readADC_SingleEnded(0); // adc1 = ads.readADC_SingleEnded(1); // adc2 = ads.readADC_SingleEnded(2); // adc3 = ads.readADC_SingleEnded(3); Serial.print("AIN0: "); Serial.println(adc0); // Serial.print("AIN1: "); Serial.println(adc1); // Serial.print("AIN2: "); Serial.println(adc2); // Serial.print("AIN3: "); Serial.println(adc3); Serial.println(" "); delay(1000); }
Dieser wurde von uns am Nano, UNO und MEGA sowie auf unseren D1, Amica und LoLin Boards mit ESP8266-12E/F getestet, er sollte jedoch auch auf den ESP8266-01 funktionieren.
Bis zum nächsten Beitrag :)
14 comments
Manfred
Bei mir hatte das Programm oben micht funktioniert (die Module funktionierten nicht).
Nach langer suche fand ich den Fehler fand ich den Felhler:
in der 2. Zeile muß der Eintrag: #include gegen den Eintrag #include getauscht werden.
Danach funktionierte bei mir alles.
marculus
Hallo zusammen,
ich habe zwei Module bei ebay und amazon gekauft, leider kann ich beide nicht ansprechen.
i2cdetect -y 1 zeigt keine Adresse an. Bei einem anderen Modul (andere Hersteller) funktioniert es sofort.
Gibts es da tricks die Adresse anzusprechen?
Klaus
Auf meinem Modul befindet sich der Aufdruck “16 Bit I2C ADC+PGA ADS1115” und der Chip auf dem Modul hat die Bezeichnung “7A BOGI”.
Es scheinen fehlerhafte Module (mit geringerer Auflösung) verkauft zu werden.
Ich habe einfach ein anderes ADS1115 Modul verwendet, gleicher Aufdruck und Verkäufer und bekomme jetzt die versprochene Auflösung.
VG
Klaus
Hallo Sebastian, konntest du das Problem lösen?
Ich verwende einen ADS1115 (16 Bit), und bekomme ebenfalls nur eine 12 Bit Auflösung.
Die letzten Bits werden nicht genutzt.
Das bedeutet, die kleinste Messwertänderung erfolgt immer in 16er Schritten, also z.B. statt 7,8 µV gibt es nur eine Auflösung von 0,125mV (16x 7,8µV) .
VG
DD1UZ
@Sebastian: Handelt es sich hier wirklich um einen 1115 (16 bit) oder um einen 1015 (12 bit) ?
Sebastian
Hallo, ich verwende auch dieses Board. Ich habe folgendes Problem: Die Auflösung beträgt nicht 16bit sondern nur 12bit. Die letzten 4 Stellen des Low byte werden IMMER als 0000 zurückgegeben. Das ist unabhängig von der Einstelluing SPS, PGA und Single/Diff. Kann das jemand bestätigen? Habe alle verfügbaren Beispiele probiert… Vielen Dank!
Thomas
@Lutz (Juni 05, 2019): Default full scale = 6.144 V entsprechen Ausgabewert 32767 (15 bit, 1 bit für Vorzeichen) → 5 V ergeben Ausgabewert 26665.
Thomas
Ich muss noch zu meiner Frage schreiben, dass ich mit ArduinoIDE programmiere und die 3 bzw 4 ADS1115 an einem esp8266 nutzen möchte.
Vielen Dank
Thomas
Kannn mir jemand zeigen wie ich 3 oder 4 ADS1115 über I2C ansprechen kann? Die Adressen mit dem Adresspin einstellen ist kein Problem. Aber wie rufe ich die Werte der 12 bzw 16 Analogeingänge ab???
Lutz
Nachtrag:
Habe gelesen das im Bus 10K Widerstände sind
Ist das die Ursache und wenn ja wie kann der Bus ohne die aufgelötteten Widerstände Vverwendet werden???
mfg
Lutz
Lutz
Hallo habe die Schaltung aufgebaut aber bei 5V DC nur ca 26.600 bei 0 V Anzeige 0
Auch bei direkt 5 V keine höhere Auflösung
Frage müssen Interne Register eingestellt werden und wenn ja wie.
Habe das Datenblatt geladen aber alles englisch und das kann ich nicht
Wer kann mir helfen
mfg
Lutz
Patrick
Stimmt schon.
860 Samples pro Sekunde.
Willy
@joe: samples per second, also messungen pro sekunde.
Die 860 gelten aber nur, wenn nur ein Kanal der 4 benutzt wird. Sobald die anderen dazu kommen, geht es deutlich runter. Allein das umschalten der Kanäle dauert bis zu 10ms.
Die hier angegebene Libary hat noch den Nachteil, das sich die Anzahl noch einmal deutlich reduziert, wenn man mehr als einen ads1115 benutzt. Das ist aktuell mein problem, da ich eigentlich 4 gleichzeitig nutzen wollte. Bei 2 ads1115 komme ich mit tricks aber nur noch auf ca. 100 sps und das dann noch durch 8 Kanäle… Da brauch ich mit 16 Kanälen nicht versuchen.
Wem 12bit reichen, da gibt es noch den ads1015, der kann 3300sps, ist aber schlechter zu bekommen.
Eine bessere libary habe ich aber auch noch nicht gefunden.
joe
860 kbit/s ?