Überprüfen der Teilnehmer an I2C Bus, anpingen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Tinker232
User
Beiträge: 50
Registriert: Mittwoch 25. Juli 2018, 13:45

Hallo zusammen,

ich möchte gerne die Sensoren an meinem Datenlogger vor Aufzeichnung überprüfen und sozusagen anpingen.
Meine Suche ergab bisher leider nichts brauchbares. Ist das überhaupt möglich.
Im Endeffekt reicht es mir ja die I2C-Adresse zu überprüfen ob diese connected ist oder nicht, sodass im Endeffekt ja egal ist was da hinten dranhängt.
Habt ihr eine Idee?

LG Tina
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Tinker232: entweder funktioniert das Lesen der Daten, oder eben nicht. Wenn es nicht funktioniert, ist entweder kein Sensor angeschlossen, die Verbindung kaputt, der Sensor kaputt, die Spannungsversorgung wacklig, ...
Tinker232
User
Beiträge: 50
Registriert: Mittwoch 25. Juli 2018, 13:45

ich möchte ja auch nur die Verbindung überprüfen. Es kann ja auch sein, dass jemand Hardwareseitig die Adresse umgestellt hat und genau das möchte ich vorher checken :)
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja, und das machst du halt, indem du mal probierst zu lesen. Wenn da nichts oder das falsch rumkommt, dann ist der Sensor halt nicht da/umgestellt/ein anderer dran. Eine wirkliche Identifizierung in dem Sinne gibt es eh nicht, es gibt weit mehr als 127 I2C Sensoren/Bauteile, womit Address-Kollisionen unvermeidbar sind. Du kannst das also eh nur heuristisch machen.
Tinker232
User
Beiträge: 50
Registriert: Mittwoch 25. Juli 2018, 13:45

__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Puh. Das wuerde ich aber so nicht machen. Letztlich liest der auch einfach nur von dem Bus (https://github.com/mozilla-b2g/i2c-tool ... 2cdetect.c), das kannst du mit einer simplen Schleife auch in Python machen. Last but not least sieh dir die Warnungen in dem Code an: I2C hat kein 'autodetect'. Es kann grundsaetzlich beliebige Nebenwirkungen haben, wenn man ein Geraet anspricht. Wenn da am Ende der Knopf zur Zerstoerung des Internets dranhaengt, und der wird einfach aktiv durch schreiben eines beliebigen Bytes, dann ist das Internet kaputt.
Tinker232
User
Beiträge: 50
Registriert: Mittwoch 25. Juli 2018, 13:45

Ich habe das nun folgendermaßen probiert:

Code: Alles auswählen

pi = pigpio.pi() # connect to local Pi
sensoraddr = [0x48, 0x44, 0x43]

for device in sensoraddr:
    sensor_addr = int(device, 16)
    h = pi.i2c_open(1, sensor_addr)
    
    try:
        pi.i2c_read_byte(h)
    except:
	print("Exception")
	
    pi.i2c_close(h)

pi.stop
Das funktioniert auch bisher gut. Allerdings habe ich einen SHT-31D Sensor, der das nur genau 1x mal. Sobald ich das nochmal ausführen möchte, bekomme ich (bei auskommentierter Exception natürlich) eine Fehlermeldung: I2C read failed!
Ich stecke den Sensor dann kurz ab und warte einige Zeit oder starte den PI neu. Danach funktioniert es wieder... für das erste Mal.
Irgendwo wird scheinbar das erneute lesen blockiert? Habt ihr eine Idee woran das liegen kann? Bei der Abfrage meines ADS1115 macht er das ohne Probleme :/
Danke
LG Tina
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Tinker232: Wie __deets__ schon schrieb, Geräte können beliebig komisch darauf reagieren wenn man da einfach was liest oder schreibt. Man sollte das einfach nicht machen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

I2C ist halt nicht fuer so etwas gedacht. Das ist kein Netzwerk oder USB-Bus. Sondern ein low-level Protokoll, bei dem vorrausgesetzt wird, das man recht genau weiss, was man angehangen hat. Man *kann* Glueck haben, aber du hast halt keins. Und ich wuerde das auch nicht als feature anbieten oder entwicklen, wenn das so wackelig ist. Dann schreib deinem Betreuer einen Absatz in die Arbeit, der diese Entwurfsentscheidung dokumentiert. Das muss man als angehender Softwerker halt machen - Dinge, die nicht gehen, auch als solche benennen.
Tinker232
User
Beiträge: 50
Registriert: Mittwoch 25. Juli 2018, 13:45

Ja, wobei das immer nur dann nicht mehr funktioniert hat, wenn auf den einen Sensor zugegriffen wurde. Naja, ich habe es jetzt umgestrickt, sodass jeder Sensor beim Start gezielt angesprochen wird und bei einem Fehler dieser nicht in der Messung berücksichtigt wird.
Vielen Dank
Antworten