I2C für analoge Sensoren mit dem ADS1115

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 :)

 

 

 

 

8 Kommentare

Thomas

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

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

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

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

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

Patrick

Stimmt schon.
860 Samples pro Sekunde.

Willy

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

joe

>Ein 16-bit ADC mit PGA und I2C-Interface für bis zu 860/s.

860 kbit/s ?

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert