ADS1115 richtig konfigurieren und auslesen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo allerseits!

    Das ist mein erster Beitrag in diesem Forum - bin verzweifelt!

    Ich bin mir sicher, dass ihr mir weiterhelfen könnt.

    Mein Anliegen: Analoge Spannungswerte (0 bis ca. 2Vdc, Änderungsrate im Sekundenbereich) mit dem Raspberry messen und verarbeiten.

    Nach ein wenig Recherche im Netz habe ich das Joy-it Modul KY-053 mit dem ADS1115 entdeckt; hat mir recht gut gefallen...

    Meine Software am Raspberry schreibe ich mit Lazarus und dem Free Pascal Compiler (aus historischen Gründen - habe früher mit Turbo Pascal gearbeitet)

    Zum Testen des ADS1115 wollte ich diesen zunächst über die Shell des Raspberry mittels i2c-Tools (i2cset, i2cget) ansprechen.

    Den ADS1115 über i2C ansprechen funktioniert tadellos (Adresse 0x48) aber das Config-Register nach meinen Vorstellungen setzen, um dann aus dem Conversion-Register

    die Messwerte auszulesen.

    Und da fängt mein Problemchen an: Das Config-Register setzen scheint noch zu funktionieren, aber die anschließend aus dem Convesion-Register ausgelesenen Werte

    erscheinen eher wie Zufallszahlen.

    Die Eingangsspannung am A0 des KY-053 ist konstant 2Vdc.

    Konfiguration:

    * Raspberry Pi 4

    * Raspbian Buster

    * ADU: Joy-it KY-53 (ADS1115)

    Alle weiteren Infos entnehmt bite den beigefügten Dateien.

    Was mache ich falsch?

    Bitte um eure Hilfe!

    Schöne Grüße,

    Bergmensch

  • Moin Bergmensch,

    erstmal: Herzlich Willkommen im Forum!

    Kannst du mal schreiben, welche Register du mit welchen Daten beschrieben hast?

    Wenn du Terminalausgaben posten willst, dann setzte sie, bitte, in Code. Dieses Zeichen </> oben rechts im Editorfeld.

    Man kann es besser lesen als so ein Bild.

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

    Einmal editiert, zuletzt von Bernd666 (23. September 2021 um 23:03) aus folgendem Grund: Typo

  • Hallo Bernd666,

    danke für deinen Hinweis!

    Habe in der Shell des Raspberry Pi folgendes eingegeben:

    Code
    i2cset -y 1 0x48 0x01 0x8342 w

    Wobei man darauf achten muss, dass bei i2cset das Datenwort so angegeben werden muss (hab ich aus dem Netz): 0xLSBMSB

    Das bedeutet, dass ich das Config-Register (0x01) des ADS1115 so setzen will: (continuous mode, 4.096V, AINP = AIN0 and AINN = GND)

    01000010 10000011

    42h 83h

    Anschließend lese ich das Conversion-Register aus mit:

    Code
    i2cget -y 1 0x48 0x00 w

    Wobei auch für den Rückgabewert gilt: LSBMSB

    Gruß,

    Bergmensch

  • fred0815: Du meinst vermutlich wegen des Bildes RasPi_mit_ADS1115? Da ist noch eine Spannungsquelle mit 2V eingezeichnet, das würde schon passen.

    Mich würde aber interessieren, ob die Spannung mit einem Messgerät tatsächlich mal an GND/A0 gemessen wurde.

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup:

  • fred0815: Du meinst vermutlich wegen des Bildes RasPi_mit_ADS1115? Da ist noch eine Spannungsquelle mit 2V eingezeichnet, das würde schon passen.

    Mich würde aber interessieren, ob die Spannung mit einem Messgerät tatsächlich mal an GND/A0 gemessen wurde.

    Hallo VeryPrivat!

    Ja, habe die Spannung zwischen A0 und GND gemessen: 1,997Vdc

  • Ich habe etwas recherchiert und denke es müsste passen (Code und Schaltung). Ich kenne Deine KTY Beschaltung nicht und würde daher vorerst gerne diese als "Fehlerquelle" ausschließen.

    Kannst Du ein paar Werte einlesen mit GND und mit 3,3V an A0 und die Werte hier posten?

    Kannst Du mal A1-A3 auf GND legen, damit deren Pegel definiert ist?

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup:

  • Falls es hilft, hier hat jemand einen Treiber für Python geschrieben. Den von Adafruit würde ich nicht unbedingt verwenden, da man dann weitere Abhängigkeiten hat (Blinka und noch was).

    Wenn du den A1 - A3 auf GND ziehst, sollte der gelesene Wert == 0 oder ein wenig drüber sein.

  • Falls es hilft, hier hat jemand einen Treiber für Python geschrieben. Den von Adafruit würde ich nicht unbedingt verwenden, da man dann weitere Abhängigkeiten hat (Blinka und noch was).

    Wenn du den A1 - A3 auf GND ziehst, sollte der gelesene Wert == 0 oder ein wenig drüber sein.

    Hallo DeaD_EyE!

    Danke für den Hinweis!

    Ich möchte allerdings keine fertigen Treiber verwenden, sondern alles von Null weg "zu Fuß" machen, damit ich das Thema auch richtig verstehe.

    Allerdings bin ich momentan mit meinem Latein am Ende!

    Habe nun A1-A3 auf GND gehängt aber wenn ich das Config-Register beschreibe mit

    Code
    i2cset -y 1 0x48 0x01 0x8342 w

    bekomme ich trotzdem Zufallswerte am A0 (siehe angehängte Dateien).

    Zumindest der Continuous-Modus scheint vom ADS1115 übernommen worden zu sein.

    Die Werte vom A0 gelesen (Conversion-Register 0x00) sehen so aus, als würde das Potential floaten...

    Gruß,

    Bergmensch

  • Ich habe etwas recherchiert und denke es müsste passen (Code und Schaltung). Ich kenne Deine KTY Beschaltung nicht und würde daher vorerst gerne diese als "Fehlerquelle" ausschließen.

    Kannst Du ein paar Werte einlesen mit GND und mit 3,3V an A0 und die Werte hier posten?

    Kannst Du mal A1-A3 auf GND legen, damit deren Pegel definiert ist?

    Hallo VeryPrivat!

    Habe nun alles so gemacht, wie von dir vorgeschlagen: A1-A3 auf GND und A0 nacheinander auf GND und +3,3V.

    Config-Register des ADS1115 beschrieben mit:

    Code
    i2cset -y 1 0x48 0x01 0x8342 w

    Dann jeweils 10 Werte vom Conversion-Register in eine Datei schreiben lassen (Anhänge).

    Immer noch Zufallswerte!

    Zumindest den Continuous-Modus scheint der ADS1115 übernommen zu haben.

    Gruß,

    Bergmensch

  • Danke, dann würde ich vorschlagen wir versuchen zuerst mal einen vernünftigen GND Wert einzulesen.

    Selbst bei falschen/fehlenden Einstellungen sollte die Chance ca. 0 zurück zu bekommen am höchsten sein...

    Im Datenblatt des ADS115 steht beim Lesen des Wertes nur was von der Adresse und dem Lesebit (Seite 35, Punkt 3)

    Im Internet finde ich verschiedene Versionen des Lesebefehls... Könntest Du bitte statt i2cget -y 1 0x48 0x00 w mal i2cget -y 1 0x48 w probieren?

    Edit: Erklärung: Byte 1 ist Adresse samt Lesebit (wird durch i2cget/i2cset gesetzt bzw. rückgesetzt) , Byte 2 und 3 sind bereits Response des ADS1115

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup:

    Einmal editiert, zuletzt von VeryPrivat (24. September 2021 um 12:13)

  • Danke, dann würde ich vorschlagen wir versuchen zuerst mal einen vernünftigen GND Wert einzulesen.

    Selbst bei falschen/fehlenden Einstellungen sollte die Chance ca. 0 zurück zu bekommen am höchsten sein...

    Im Datenblatt des ADS115 steht beim Lesen des Wertes nur was von der Adresse und dem Lesebit (Seite 35, Punkt 3)

    Im Internet finde ich verschiedene Versionen des Lesebefehls... Könntest Du bitte statt i2cget -y 1 0x48 0x00 w mal i2cget -y 1 0x48 w probieren?

    Edit: Erklärung: Byte 1 ist Adresse samt Lesebit (wird durch i2cget/i2cset gesetzt bzw. rückgesetzt) , Byte 2 und 3 sind bereits Response des ADS1115

    Hallo VeryPrivat!

    Danke für den Tipp!

    Habe über das Lesebit auch schon gegrübelt....

    Leider verlangt i2cget nach dem Parameter für die Slave-Adresse (0x48) noch einen Wert und wenn man den weglässt, gibt es eine Fehlermeldung!

    Kennst du zufällig eine weitere Möglichkeit, um über die Shell mit dem i²C-Bus zu kommunizieren?

    Gruß,

    Bergmensch

  • Tut mir leid, I2C am Raspberry habe ich selbst noch nicht verwendet, daher kann ich auch nur versuchen Dir mit Recherche zu helfen. Daher muss ich Dich auch bitten diverse Versuche zu machen, da ich es nicht selbst probieren kann.

    Der dritte Beitrag von John La Rooy auf raspberrypi.stackexchange.com sieht interessant aus. Könntest Du bitte mal danach vorgehen?

    Damit wir die gleiche Adresse 0x49 haben, müsstest Du ADDR auf VDD verbinden - oder jeweils durch 0x48 ersetzen.

    Statt der 0 nach dem -y brauchst Du vermutlich 1, da es am Raspberry scheinbar der I²C 1 Bus ist und nicht wie in dem Beispiel der 0er.

    Danach müsste folgender Ablauf sein:

    • ADS1115 rücksetzen, indem Du ihn von der Versorgung trennst.
    • i2cget -y 1 0x49 0 w  => 0x0000, da noch keine Messung gestartet wurde
    • i2cget -y 1 0x49 1 w => 0x8385 müsste die Standardeinstellung des Konfigurationsregisters sein
    • i2cset -y 1 0x49 1 0xC385 w => Single Ended AIN0 (also gegen GND) müsste eingestellt sein
    • i2cget -y 1 0x49 0 w => "Kleiner ADC Wert" müsste auch bei mehreren Leseversuchen kommen.

    Übrigens, eine Idee hätte ich noch: Ist vielleicht der SDA Verbindungsdraht defekt? Das könnte erklären, warum Daten willkürlich daher kommen.

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup:

  • Moin Bergmensch,

    Wobei man darauf achten muss, dass bei i2cset das Datenwort so angegeben werden muss (hab ich aus dem Netz): 0xLSBMSB

    Mhm, laut Datenblatt Texas Instruments, ist es anders.

    Zu finden im Datenblatt, Punkt 10.1.7

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Der ADS1115 ist hat eine Auflösung von 16 Bit . Schon bei 8 Bit misst man auf 0,5% genau. Bei einem Spannungsbereich von etwa 3 V Spannung sind das 15 mV pro Bit (Stufe). Bei guten Layouts ließ sich das Rauschen auf der Leiterplatte kaum unter 10 mV bringen. Mit einem solchen Aufbau mit gesteckten Baugruppen kann man schon eine 8 Bit Auflösung nicht mehr sicherstellen. Von den Messwerten deshalb auf die obersten 8 Bit runden. Eventuell kommen dann keine Zufallszahlen mehr. Mit 16 Bit misst man mit den unteren Bits nur das Rauschen. Wenn man einen Zufallszahlengenerator braucht, ist eine Rauschquelle der beste Weg.

  • Hallo Bergmensch,

    ich habe heute auch eine ganze Weile damit verbracht das ganze zum Laufen zu bringen.
    Über deinen Beitrag bin ich zuletzt gestolpert und er hat bei mir noch das "i-tüpfelchen" bewegt.

    Daher für dich als kleines Feedback:

    Ich verwende ebenfalls wie du

    Code
    i2cset -y 1 0x48 0x01 0x8342 w


    und für das Auslesen des Registers

    Code
    i2cget -y 1 0x48 0x00 w


    Bei mir sind die Werte "plausibel" so wie es aussieht. Es geht um einen Drucksensor, der Werte Zwischen 0 und 5V generiert (für 0-30 psi) und soll bei mir dazu dienen am Grund der Zisterne den Füllstand zu überwachen.

    Angeschlossen an einem ca 1m langen schlauch ergibt sich als unterschied zwischen waagerecht und senkrecht ca 0,2 Volt, was sich auch ziemlich gut mit meinem Haushaltsmultimeter deckt:

    Das sollte für meine Zwecke Hinreichend genau sein, bei 2 Meter Wassersäule dürfte das ein delta von ca 0,4 Volt ergeben - reicht um "ca" die % zu bestimmen.

    Warum erzähle ich dir das?

    Will dir damit nur sagen, dass du perse bei der Verwendung (programmatisch) auf dem richtigen Weg bist - Ich würde die Schuld für die Zufällig wirkenden Messwerte daher woanders suchen. Kleiner Hinweis hierzu aus der Praxis: Bei einem anderen PI verwende ich Wlan - und wenn ich einen Sensor (über ein 15cm langes Kabel) auswerten möchte, während das wlan funkt - dann kommt nur Blödsinn raus. Bei Übertragungen via BUS wäre ein "Bit-Flip" sowieso fatal. (Ich weiß nicht, in wie fern der I2C Bus hier mit Checksums o.ä. arbeitet) Bin dort dazu übergegangen das Wlan auszuknippsen, wenn stündlich mal eben abgefragt wird, andere PIs wo es geht auf verkabeltes Ethernet geändert.

  • Kleiner Nachtrag:

    Ich habe die Konfiguration des AD-Wandlers jetzt noch angepasst auf 6 SPS was die kleinste Einstellung ist, aber für meine Zwecke immer noch totaler Overkill.

    Also:

    Code
    i2cset -y 1 0x48 0x01 0x0342 w

    Die Werte sind dadurch jedoch sehr viel präziser (geringere Abweichungen bei unveränderten Bedingungen)

    Was mir noch kam: Du verwendest als Test-Aufbau eine nicht näher genannte 2V Spannungsquelle.
    Wenn du dieses "Signal" mit 100 SPS abtastest, (Hier werden ja quasi schalter geschlossen und geöffnet) könnte es sein, dass
    du da einfach immense "Switch-Bounces" generierst und die Messung daher mehr oder weniger "Zufall" ist.

    "Wer mist, mist Mißt" sagt man so schön.


    Button Debounce Time Delay - EEWeb

    Artikel hierzu:
    https://www.allaboutcircuits.com/technical-arti…o-deal-with-it/

    Dein Multimeter, das die 1.999 Volt anzeigt ist natürlich viel zu träge, um dies wahrzunehmen.

    4 Mal editiert, zuletzt von dognose (12. Juli 2022 um 14:25)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!