Forum: Mikrocontroller und Digitale Elektronik Analoge Signale mit ADS1115 über Arduino lesen


von t800w (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
Ich habe bei meinem ARDUINO UNO eine analge Porterweiterung duch einen 
ADS1115, diesen habe ich wie in Bild 01 angeschlossen.

(Quelle: 
http://henrysbench.capnfatz.com/henrys-bench/arduino-voltage-measurements/arduino-ads1115-module-getting-started-tutorial/)

Jedoch habe ich die beiden SCL und SDA jeweils mit einem 10 kOhm Pull-Up 
Wiederstand versehen. Dazu mein ARDUINO-Code:


#include <Wire.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads(0x48);
float Voltage = 0.0;

void setup(void)
{
  Serial.begin(9600);
  ads.begin();
}

void loop(void)
{
  int16_t adc0;  // we read from the ADC, we have a sixteen bit integer 
as a result

  adc0 = ads.readADC_SingleEnded(0);
  Voltage = (adc0 * 0.1875)/1000;

  Serial.print("AIN0: ");
  Serial.print(adc0);
  Serial.print("\tVoltage: ");
  Serial.println(Voltage, 7);
  Serial.println();

  delay(1000);
}


Lade ich den Sketch jedoch hoch, dann "friert" der Arduino ein. Ziehe 
ich aber das SCL-Kabel aus dem Arduino heraus, dann beginnt er wieder zu 
messen, aber logischer keinen realistischen Wert.
Ich vermute, dass sich ein Konflikt im Arduino bildet, sodass er 
praktisch überfordert ist, ist aber nur eine  Vermutung

von Wolfgang (Gast)


Lesenswert?

t800w schrieb:
> Lade ich den Sketch jedoch hoch, dann "friert" der Arduino ein. Ziehe
> ich aber das SCL-Kabel aus dem Arduino heraus, dann beginnt er wieder zu
> messen, aber logischer keinen realistischen Wert.

Das er wieder anfängt zu messen, ist wohl nur dem Umstand geschuldet, 
dass im Programm nicht als Fehler abgefangen ist, wenn der ADC nicht 
antwortet.

Hast du die Ruhepegel auf den I2C-Leitungen überprüft?

Hast du mit dem I2C-Scanner geprüft, ob dein ADC sich überhaupt auf dem 
I2C-Bus ansprechen läßt?
http://playground.arduino.cc/Main/I2cScanner

von STM8-C-Anfänger (Gast)


Lesenswert?

Nimm mal bitte probeweise die beiden pullup-Widerstände weg. Der ADS1115 
hat welche drauf, glaub ich.

von t800w (Gast)


Lesenswert?

@ Wolfgang

Ich habe den Sketch von dieser Seite
http://playground.arduino.cc/Main/I2cScanner getestet, dabei steht im 
Serial Monitor nur "Scanning...", heißt das, dass sich der ADS1115 nicht 
ansprechen lässt?

von t800w (Gast)


Lesenswert?

@ STM8-C-Anfänger

macht keinen Unterschied, trotzdem dasselbe Resultat

von Wolfgang (Gast)


Lesenswert?

t800w schrieb:
> ... heißt das, dass sich der ADS1115 nicht ansprechen lässt?

Ja.

STM8-C-Anfänger schrieb:
> Nimm mal bitte probeweise die beiden pullup-Widerstände weg.

Wozu. Ob 10kΩ mehr oder weniger die Busleitung hoch ziehen, darf die 
Kommunikation bei unkritischen Leitungslängen nicht beeinflussen.

von t800w (Gast)


Lesenswert?

Wolfgang schrieb:
> t800w schrieb:
>> ... heißt das, dass sich der ADS1115 nicht ansprechen lässt?
>
> Ja.


Wie sollte ich jetzt am besten vorgehen?

von Wolfgang (Gast)


Lesenswert?

t800w schrieb:
> Wie sollte ich jetzt am besten vorgehen?

1) Schaltungsaufbau nochmal überprüfen
2) Anderen Baustein mit I2C-Schnittstelle auf den Bus hängen und prüfen, 
ob der vom Scanner gefunden wird.

Welchen Ruhepegel misst du auf SCL?

3) Sichtkontrolle/Ohmmeter am ADS1115-Modul, ob eine Lötbrücke die 
SCL-Leitung festhält.
4) Oszi/Logikanalysator anschließen und gucken, was auf dem Bus los ist.

von PittyJ (Gast)


Lesenswert?

Ich nehme immer ein Oszilloskop. Dann kann man schauen, was wirklich 
gesendet wird und wie die Pegel wirklich sind.
Denn nur, wenn man die Fakten kennt, kann man den Fehler entgegen 
steuern. Alles andere ist nur Stochern im Nebel.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

t800w schrieb:
> Lade ich den Sketch jedoch hoch, dann "friert" der Arduino ein. Ziehe
> ich aber das SCL-Kabel aus dem Arduino heraus, dann beginnt er wieder zu
> messen, aber logischer keinen realistischen Wert.

 Die beiden Kabel (SDA und SCL) probeweise miteinander tauschen ?

von Wolfgang (Gast)


Lesenswert?

Marc V. schrieb:
> Die beiden Kabel (SDA und SCL) probeweise miteinander tauschen ?

Klasse Idee. Tauscht du bei einem Netzteil auch probeweise mal Netz- und 
Niederspannungsseite?

Leitungen richtig anschließen - und fertig.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Wolfgang schrieb:
> Klasse Idee. Tauscht du bei einem Netzteil auch probeweise mal Netz- und
> Niederspannungsseite?

 Das hat miteinander genausoviel gemeinsam wie dein IQ mit meinem.

 Entweder meldet sich der TO überhaupt nicht mehr oder es kommt
 irgendeine unplausible Erklärung warum es nicht funktioniert hat.

 O.00001% Möglichkeit, dass eine Post kommt in welcher TO zugibt, dass:
  a) SCL und SDA irgendwie miteinander oder mit GND verbunden sind.
  b) SCL und SDA irgendwie vertauscht sind.

: Bearbeitet durch User
von Rudi808 (Gast)


Lesenswert?

Hallo ich habe genau das gleiche Problem ich will einen Kraftsensor 
auslesen und habe alles genau gleich angeschlossen wie du jedoch habe 
ich A3 des 1115 auf VCC gelegt und A0 auf den Kraftsensor wie hast du 
das Problem gelöst?

von Falk B. (falk)


Lesenswert?

Rudi808 schrieb:
> Hallo ich habe genau das gleiche Problem ich will einen Kraftsensor
> auslesen und habe alles genau gleich angeschlossen wie du jedoch habe
> ich A3 des 1115 auf VCC gelegt und A0 auf den Kraftsensor wie hast du
> das Problem gelöst?

Betreibe eine systematische Fehlersuche.

Betriebspannung prüfen
Verbindungen zwischen uC und ADC prüfen
I2C Scanner nutzen und I2C Adresse finden
I2C Protokoll schrittweise testen, zuerst einfache Register lesen und 
schreiben

von bingo (Gast)


Lesenswert?

10K als Pullup ist für I2C viel zu hoch, bei 5 Volt sollten es 1k8 - 2k2 
sein, bei 3.3 Volt 1k2 - 1k5. Die I2C Schnittstelle ist durch einen 
Strom definiert, höhere Widerstanände können funktionieren, müssen aber 
nicht. Bei Problemen immer mit den Oszi kontrollieren, wie die Pegel und 
Flanken aussehen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

bingo schrieb:
> 10K als Pullup ist für I2C viel zu hoch
Das hängt aber sehr von der Geschwindikeit ab.
https://electronics.stackexchange.com/questions/385926/why-does-putting-resistors-between-vcc-sda-vcc-scl-in-i2c-result-in-a-square-w

Die niederohmigen Widerstände sind besonders dann nötig, wenn viele 
Teilnehmer am Bus hängen und deshalb der Pullup die offenen Leitungen 
nicht mehr schnell genug "hochbekommt".
Hier hat aber der Slave 10k und parallel dazu wird noch der 30k Pullup 
eingeschaltet und es sind nur 2 Teilnehmer am Bus, sodass das 
normalerweise schon funktioniert. Sonst hätten das die Burschen bei 
Adafruit schon angepasst, wenn sie laufend Reklamationen bekommen.

> Bei Problemen immer mit den Oszi kontrollieren, wie die Pegel und
> Flanken aussehen.
Das Problem ist, dass viele meinen, ein Oszilloskop sei nicht nötig. Und 
dann quasi "bei Nacht im Nebel ohne Licht nach Gehör" fahren. Kann 
funktionieren, kann schief gehen. Man weiß es nicht.

Rudi808 schrieb:
> Hallo ich habe genau das gleiche Problem ich will einen Kraftsensor
> auslesen und habe alles genau gleich angeschlossen wie du jedoch habe
> ich A3 des 1115 auf VCC gelegt und A0 auf den Kraftsensor wie hast du
> das Problem gelöst?
Und das alles ohne Punkt und Komma? Wenn deine Fehlersuche ähnlich 
strukturiert ist, dann sehe ich schwarz.

> habe alles genau gleich angeschlossen wie du jedoch habe
> ich A3 des 1115 auf VCC gelegt und A0 auf den Kraftsensor
Soso, "alles genau gleich"...

> A0 auf den Kraftsensor
Dir ist bewusst, was der A0 Anschluss macht?
Und dass du deine Software anpassen musst, wenn du die Adresse änderst.

> jedoch habe ich A3 des 1115 auf VCC gelegt und A0 auf den Kraftsensor
Warum? Wie viele Teilnehmer hast du auf dem Bus?

1. Zeichne mal einen Schaltplan von deinem Aufbau und allen Beteiligten.
2. Zeige das fehlerhafte Programm.
3. Beschreibe das erwartete und das beobachtete Verhalten.

von Falk B. (falk)


Lesenswert?

Lothar M. schrieb:
>> A0 auf den Kraftsensor
> Dir ist bewusst, was der A0 Anschluss macht?

Ist es DIR bewußt?
A0 ist bei dem Board ein Analogeingang . . . ;-)

von Wolfgang (Gast)


Lesenswert?

bingo schrieb:
> 10K als Pullup ist für I2C viel zu hoch, bei 5 Volt sollten es 1k8 - 2k2
> sein, bei 3.3 Volt 1k2 - 1k5. Die I2C Schnittstelle ist durch einen
> Strom definiert ...

Was erzählst du da für einen Unsinn.
I2C ist keine Stromschnittstelle. Wie soll die bei einem Bus 
funktionieren? Die Empfangsseite wertet die Spannung aus, sonst müsste 
jeder Empfänger einen Shunt besitzen und Wegweiser für den Strom 
aufgestellt werden.
Ob 10kΩ zu hoch ist, hängt von der Kapazität und der 
Übertragungsgeschwindigkeit ab.
Philips hat in der AN10216-01 (I²C Manual) für den Pull-Up im 5V-System 
einen Wert von typisch 2kΩ .. 10kΩ angegeben (Slide 31 auf S.13) - und 
die sollten es eigentlich gewusst haben.
https://www.nxp.com/docs/en/application-note/AN10216.pdf

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Falk B. schrieb:
> Ist es DIR bewußt?
Nein, mangels Schaltplan...  ;-)

> A0 ist bei dem Board ein Analogeingang . . . ;-)
Blöd, sowas. Ich habe mich von dem "Schaltplan" ganz oben täuschen 
lassen und war der Meinung, das wäre dank des festen 3V3 Pegels ein 
Adresseingang auf '1'.

von Einer K. (Gast)


Lesenswert?

Für die mentale Stärke, einen Irrtum eingestehen zu können, hast du 
glatt eine "lesenswert" von mir bekommen.

Eigentlich sollte das nicht erwähnenswert sein!
... aber in diesem Forum ist einiges "anders"...

von bingo (Gast)


Lesenswert?

Wolfgang schrieb:
> I2C ist keine Stromschnittstelle

Naja, die I2C-Spezifikation https://www.i2c-bus.org/specification/ 
spricht z.B. unter 3.1.1 ausdrücklich von einer Current-Source oder 
einen Widerstand für die Verbindung zur positiven Versorgungsspannung. 
Ist der Widerstand zu gross, ist der Strom zu klein und die Pegel sind 
zu niedrig, die Flanken zu flach, besonders bei mehreren Teilnehmern. 
Ich schrieb ja oben, dass es funktionieren kann, aber mit niedrigeren 
Widerständen ist man auf der sicheren Seite, siehe 
https://www.i2c-bus.org/i2c-primer/termination-versus-capacitance/. Die 
Widerstände dürfen natürlich auch nicht zu niedrig sein, sonst wird der 
low-Level nicht erkannt, da gibt es in der o.g. Spezifikation unter 7.1 
die Fig.42.

Nochmal: bei Problemen Oszi!

von Manfred (Gast)


Lesenswert?

Lothar M. schrieb:
> Und das alles ohne Punkt und Komma? Wenn deine Fehlersuche ähnlich
> strukturiert ist, dann sehe ich schwarz.

Das muß heutzutage so, nicht selbst nachdenken, sondern ins Internet 
posten :-( Und warum sich Mühe beim Schreiben geben, es finden sich doch 
immer Dödel, die trotzdem antworten.

>> habe alles genau gleich angeschlossen wie du jedoch habe
>> ich A3 des 1115 auf VCC gelegt und A0 auf den Kraftsensor
> Soso, "alles genau gleich"...

Na ja, der ADS1115 ist eigentlich recht simpel in Betrieb zu bekommen, 
es gibt viele Beispielsketche.

>> A0 auf den Kraftsensor
> Dir ist bewusst, was der A0 Anschluss macht?
> Und dass du deine Software anpassen musst, wenn du die Adresse änderst.

Hier hast Du etwas mißverstanden, bei dem Ding heißen die die 
Analogeingänge A0..A3.

Die I2C Adresse zu ändern geht anders, ADDR-Pin mit SDA, SCL, GND oder 
VDD verbinden.

>> jedoch habe ich A3 des 1115 auf VCC gelegt und A0 auf den Kraftsensor
> Warum? Wie viele Teilnehmer hast du auf dem Bus?

Siehe oben, aber auch da muß die Software natürlich den Stein passend 
initialisieren, Single oder Differenz - Datenblatt!

Sehr gut gefällt mir die Beschreibung von lygte incl. seiner Library und 
Beispiele, das ist fast schon Kindersicher und ging hier klaglos in 
Betrieb: https://lygte-info.dk/project/ADS1115Library%20UK.html

von Wolfgang (Gast)


Lesenswert?

bingo schrieb:
> Ist der Widerstand zu gross, ist der Strom zu klein und die Pegel sind
> zu niedrig ...

Mit welchem Eingangsstrom rechnest du denn bei den Empfängern. 
Heutzutage sind das gewöhnlich CMOS-Eingänge, i.e. bis auf die 
Leckströme von irgendwelchen Eingangsschutzdioden fließt da gar kein 
(statischer) Strom.
Statisch wirkt sich die Höhe des Stromes eher auf die Störsicherheit 
aus.

Die Entscheidung Pull-Up vs. Widerstand wirkt sich auf die Umladeflanken 
der Kabel-/Eingangskapazitäten aus und resultiert in (1-e^-t/tau) oder 
linearem Verlauf. Deswegen ist das noch lange keiner Stromschnittstelle.

von Wolfgang (Gast)


Lesenswert?

Wolfgang schrieb:
> ... Pull-Up vs. Widerstand ...

sorry, Pull-Up vs. Stromquelle

von bingo (Gast)


Lesenswert?

Wolfgang schrieb:
> Mit welchem Eingangsstrom rechnest du denn bei den Empfängern.

Laut I2C-Spezifikation 2014:

'The supply voltage limits the minimum value of resistor Rp due to the 
specified minimum sink current of 3 mA for Standard-mode and Fast-mode, 
or 20 mA for Fast-mode Plus.'

von bingo (Gast)


Lesenswert?

bingo schrieb:
> Wolfgang schrieb:
>> Mit welchem Eingangsstrom rechnest du denn bei den Empfängern.
>
> Laut I2C-Spezifikation 2014:
>
> 'The supply voltage limits the minimum value of resistor Rp due to the
> specified minimum sink current of 3 mA for Standard-mode and Fast-mode,
> or 20 mA for Fast-mode Plus.'

In der Spezifikation 2000 war noch von 3-12 mA die Rede.

von bingo (Gast)


Lesenswert?

Lest Euch mal Wikipedia durch:

'Er wird hauptsächlich geräteintern für die Kommunikation zwischen 
verschiedenen Schaltungsteilen benutzt, z. B. zwischen einem Controller 
und Peripherie-ICs. Das ursprüngliche System wurde von Philips in den 
frühen 1980er Jahren entwickelt, um verschiedene Chips in Fernsehgeräten 
einfach steuern zu können.'

Da war noch keine Rede von mobilen Geräten und die hohen Ströme dienten 
einfach einer verbesserten Störunempfindlichkeit. Und das Erbe schleppt 
der I2C-Bus mit sich herum, heute würde man das anders machen.

von Mein Senf (Gast)


Lesenswert?

Mach doch mal bitte ein Foto von deinem Aufbau. Hier scheint niemand 
eine funktionierende Glaskugel zu besitzen.

von Wolfgang (Gast)


Lesenswert?

bingo schrieb:
> Wolfgang schrieb:
>> Mit welchem Eingangsstrom rechnest du denn bei den Empfängern.
>
> Laut I2C-Spezifikation 2014:
>
> 'The supply voltage limits the minimum value of resistor Rp due to the
> specified minimum sink current ...

Das ist der Strom, den der jeweils aktive Sender mit seinem Open-Drain 
nach Gnd aufnehmen soll. Mit den Empfängern hat diese Angabe überhaupt 
nichts zu tun.

von bingo (Gast)


Lesenswert?

Wolfgang schrieb:
> Das ist der Strom, den der jeweils aktive Sender mit seinem Open-Drain
> nach Gnd aufnehmen soll. Mit den Empfängern hat diese Angabe überhaupt
> nichts zu tun.

Was ist denn das für ein Schwachsinns-Aussage, ist Dir denn klar, dass 
Master und Slave über SCK und SDA verbunden sind und die Pullups an SCK 
und SDA dran sind?

von Wolfgang (Gast)


Lesenswert?

bingo schrieb:
> ... dass Master und Slave über SCK und SDA verbunden sind und die
> Pullups an SCK und SDA dran sind?

Der aktive Sender ist derjenige, der die Leitung ggf. runter zieht, der 
Empfänger ist derjenige, der sich den Pegel auf der Leitung anguckt.
So schwierig ist das doch nicht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.