Forum: Mikrocontroller und Digitale Elektronik Ultraschall-Sensor GY-US42V2: I2C-Adresse lässt sich nicht ändern


von Frank E. (Firma: Q3) (qualidat)


Angehängte Dateien:

Lesenswert?

Bei dem Sensor soll man laut Datenblatt (s. Bild u. Code) duch Schreiben 
in zwei "unlock register", gefolgt von der neuen I2C-Adresse, die 
Adresse ändern können. Dass es eine gerade Adresse sein muss, hab ich 
auch beachtet und die Code-Beispiele stammen von der Webseite des 
Herstellers.

Das Problem: Die I2C-Adresse ändert sich nicht. Der Code wird zwar ohne 
Fehlermeldung ausgeführt, aber sonst passiert nix. Was kann man tun?
1
void changeAddress(byte old_addr, byte new_addr, boolean seven_bit)
2
{
3
  byte tmp = new_addr;
4
  Wire.beginTransmission(old_addr);
5
  Wire.write(0xAA);
6
  Wire.write(0xA5);
7
  if(seven_bit){tmp = new_addr << 1;}
8
  Wire.write(tmp);
9
  Wire.endTransmission();
10
}

Ich habe als neue Adresse 220 versucht, Standard ist 224 und bleibt 
unverändert. :-(

von DerEinzigeBernd (Gast)


Lesenswert?

I2C verwendet so gut wie immer 7-Bit-Adressen. Wenn in einer 
Beschreibung Adressen > 127 auftauchen, liegt eine 8-Bit-Darstellung 
vor, die das Schreib/Lesebit in die Adresse integriert.

Mit großer Wahrscheinlichkeit erwartet Deine Wire-Bibliothek aber 
7-Bit-Adressen ohne Schreib/Lesebit.
Du musst also die verwendeten Adressen durch zwei teilen.

Daß Du keine Fehlermeldung erhältst, ist kein Wunder; wer sollte die 
erzeugen und wohin ausgeben?

von Wolfgang (Gast)


Lesenswert?

Frank E. schrieb:
> Der Code wird zwar ohne Fehlermeldung ausgeführt, aber sonst passiert
> nix.  Was kann man tun?

Das ist doch schon sehr verdächtig.
Wenn der Baustein sich angesprochen fühlen würde, müsste er mit einem 
Acknowledge auf dem Bus reagieren.

Statt auf die Bits zu gucken, könntest du das auch einem I2C-Scanner 
überlassen, der dir sagt, auf welchen Adressen irgendein I2C-Slave 
reagiert. Den Code dafür auf deinen µC zu schieben, ist eine Sache von 
ein paar Sekunden.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Wolfgang schrieb:
> Frank E. schrieb:
>> Der Code wird zwar ohne Fehlermeldung ausgeführt, aber sonst passiert
>> nix.  Was kann man tun?
>
> Das ist doch schon sehr verdächtig.
> Wenn der Baustein sich angesprochen fühlen würde, müsste er mit einem
> Acknowledge auf dem Bus reagieren.
>
> Statt auf die Bits zu gucken, könntest du das auch einem I2C-Scanner
> überlassen, der dir sagt, auf welchen Adressen irgendein I2C-Slave
> reagiert. Den Code dafür auf deinen µC zu schieben, ist eine Sache von
> ein paar Sekunden.

Hab ich schon gemacht, der I2C-Scanner liefert immer nur 224 und darüber 
kann ich auch messen. Da ich aber 3 von den Sensoren verwenden möchte, 
habe ich auf diese Adressänderung gesetzt, die nicht funktionieren will 
(auch mit 7-Bit Adresse 120 und kleiner nicht).

Ich werd' jetzt mein Glück mit Software-I2C versuchen: 1 gemeinsame 
Taktleitung und 3 getrennte SDA's, sind dann zum Glück nur 2 Pins mehr 
als sonst :-(

von dummschwaetzer (Gast)


Lesenswert?

>Da ich aber 3 von den Sensoren verwenden möchte,
>habe ich auf diese Adressänderung gesetzt, die nicht funktionieren will

und wie hättest du einen dieser drei exklusiv ausgewählt?

von Schlaumaier (Gast)


Lesenswert?

dummschwaetzer schrieb:
> und wie hättest du einen dieser drei exklusiv ausgewählt?

In den man die 3 x initialisiert mit ihrer jeweiligen Adresse.

sensor1.init(Adresse_1)
sensor2.init(Adresse_2)
sensor3.init(Adresse_3)

Und dann jeden Sensor DIREKT via Sensor*. anspricht.

Das macht man doch mit anderen Teilen auch so.

von Εrnst B. (ernst)


Lesenswert?

Frank E. schrieb:
> Ich habe als neue Adresse 220 versucht, Standard ist 224 und bleibt
> unverändert.

Original-Chip auf Original-Board? Oder irgendein Clone, bei dem das 
EEProm weggespart wurde?

Frank E. schrieb:
> Ich werd' jetzt mein Glück mit Software-I2C versuchen: 1 gemeinsame
> Taktleitung und 3 getrennte SDA's, sind dann zum Glück nur 2 Pins mehr
> als sonst :-(

TCA9548A, PCA9546A &co erschlagen das Problem auch ohne Zusatz-Pins.

von Wolfgang (Gast)


Lesenswert?

Frank E. schrieb:
> Da ich aber 3 von den Sensoren verwenden möchte,
> habe ich auf diese Adressänderung gesetzt, die nicht funktionieren will
> (auch mit 7-Bit Adresse 120 und kleiner nicht).

Häng einen Logikanalysator auf den Bus und guck dir genau an, was 
passiert.
Kommt bei den Zugriffen für die Adressänderung ein Ack?
Wenn du auch noch sehen willst, wer SDA runter zieht, kannst du dazu 
einen Widerstand zwischen Master und Slave in die SDA-Leitung hängen und 
mit dem Oszi die L-Pegel angucken.

Frank E. schrieb:
> Ich habe als neue Adresse 220 versucht, Standard ist 224 und bleibt
> unverändert. :-(

Und du bist ganz sicher, dass deine Wire-Implementation keine 7-Bit 
I2C-Adressen nach I2C-Standard verwendet?

Zumindest die Standard Arduino Implementation verwendet 7-Bit Adressen 
und kann folglich mit Zahlen über 127 nichts anfangen.
https://www.arduino.cc/reference/en/language/functions/communication/wire/

von Wolfgang (Gast)


Lesenswert?

Hier ist ein Beispiel, wo die I2C-Routinen ein fertiges 8-Bit Adressbyte 
(7Bit Adresse und R/W-Bit) erwarten.
https://www.danielealberti.it/2019/09/gy-us42v2-e-arduino-sensore-di-distanza.html

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Wolfgang schrieb:
> Hier ist ein Beispiel, wo die I2C-Routinen ein fertiges 8-Bit
> Adressbyte
> (7Bit Adresse und R/W-Bit) erwarten.
> 
https://www.danielealberti.it/2019/09/gy-us42v2-e-arduino-sensore-di-distanza.html

Ja, das ist ganz genau der Code, der auch auf der Herstellerseite 
gezeigt wird und von dem aus ich meine Gehversuche mache. Nur, wie 
bereits geschrieben, das "address change example" hat genau Null 
Wirkung.

Wahrscheinlich bin ich auf einen Clon hereingefallen, obwohl die 
Bestückung der Platine äußerlich identisch aussieht. Allerdings ist mein 
PCB schwarz, nicht Magenta.

von Thomas Z. (usbman)


Lesenswert?

Frank E. schrieb:
> Ich habe als neue Adresse 220 versucht, Standard ist 224 und bleibt
> unverändert. :-(

falsch Standard ist 224 >> 1 es hat schon seinen Grund warum nur gerade 
Adressen erlaubt sind. Wire erwartet 7 Bit + RW. Das haben adere ja 
schon geschrieben.
Wenn du schon mit 8 Bit Werten arbeiten willst probier mal
Wire.beginTransmission(old_addr >> 1);
dann wirds vermutlich gehen

von dummschwaetzer (Gast)


Lesenswert?

Schlaumaier schrieb:
>> und wie hättest du einen dieser drei exklusiv ausgewählt?
>
> In den man die 3 x initialisiert mit ihrer jeweiligen Adresse.
>
> sensor1.init(Adresse_1)
> sensor2.init(Adresse_2)
> sensor3.init(Adresse_3)
>
> Und dann jeden Sensor DIREKT via Sensor*. anspricht.
>
> Das macht man doch mit anderen Teilen auch so.

Ist mir immer noch ein bischen unklar. Du hast am Anfang 3 Sensoren mit 
derselben Adresse. Wie willst du da genau einen davon auswählen?

von Wolfgang (Gast)


Lesenswert?

Frank E. schrieb:
> Ja, das ist ganz genau der Code, der auch auf der Herstellerseite
> gezeigt wird und von dem aus ich meine Gehversuche mache.

Was für Bibliotheksroutinen verwendest du für die I2C Zugriffe. Sind das 
die aus der standardmäßigen Wire Bibliothek vom Arduino Framework oder 
ist das etwas selbstgestricktes?

Wenn du sagst, dass du versuchst, den Sensor über die Arduino Wire 
Bibliothek unter 224 anzusprechen, ist das IMHO falsch, weil die 
Bibliothek I2C-Adressen nach I2C-Standard (7-Bit) erwartet. Guck mit 
Oszi oder LA auf das Ack-Bit, ob der Sensor sich von deinen Versuchen 
überhaupt angesprochen fühlt.

Das oben von mir verlinkte Beispiel zur Adressänderung benutzt 
I2C-Funktionen, die vom Sprachgebrauch her nicht dem I2C-Standard 
entsprechen, sondern als Adressparameter 8 Bit Werte erwarten (= 
I2C-Adresse << 1).

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

https://www.danielealberti.it/2019/09/gy-us42v2-e-arduino-sensore-di-distanza.html

Dieser Beispielcode ist, wie bereits weiter oben geschrieben, auch auf 
der Originalseite des Sensor-Herstellers angegeben. Die dort enthaltene 
Funktion zum Ardesswechsel funzt einfach nicht.

Ich habe den Code in keiner Weiser verändert. Ich habe auch die im 
Beispiel angegebene SoftI2C-Lib installiert und verwendet.

: Bearbeitet durch User
von Thomas Z. (usbman)


Lesenswert?

Frank E. schrieb:
> Dieser Beispielcode ist, wie bereits weiter oben geschrieben, auch auf
> der Originalseite des Sensor-Herstellers angegeben. Die dort enthaltene
> Funktion zum Ardesswechsel funzt einfach nicht.

ok du hast alles richtig gemacht. Dann ist das halt so und du musst dir 
einen anderen Baustein suchen. Vieleicht findest du ja auch einen der 
mit 8 Bit Adressen umgehen kann.
Warum schaust du nicht mal in die Arduino Hilfe zu Wire.
https://www.arduino.cc/reference/en/language/functions/communication/wire/begintransmission/

Dort steht ganz klar dass die 7 Bit erwarten.

> Wahrscheinlich bin ich auf einen Clon hereingefallen, obwohl die
> Bestückung der Platine äußerlich identisch aussieht.
So wird das wohl sein.

von Manfred (Gast)


Lesenswert?

dummschwaetzer schrieb:
>> Das macht man doch mit anderen Teilen auch so.
>
> Ist mir immer noch ein bischen unklar. Du hast am Anfang 3 Sensoren mit
> derselben Adresse. Wie willst du da genau einen davon auswählen?

Die ICs wird man vor dem Bestücken programmieren oder auf der 
Leiterplatte Prüfstecker vorsehen müssen, jeweils zwei zu sperren.

Für industrielle Serienproduktion ist es üblich, Bausteine bereits vor 
der Bestückung zu programmieren.

von Thomas Z. (usbman)


Lesenswert?

Hier übrigens noch ein Zitat aus dem Datenblatt:
I2CXL-MaxSonar-EZ Default Address
The representation of the sensor address will be different depending on 
the addressing scheme your master device uses.
The chart below shows the default address for the I2C-MaxSonar-EZ 
sensors under different addressing implementations.
Elsewhere in this datasheet a 8-bit read/write addressing scheme is 
assumed.

von Wolfgang (Gast)


Lesenswert?

Frank E. schrieb:
> Ich habe den Code in keiner Weiser verändert. Ich habe auch die im
> Beispiel angegebene SoftI2C-Lib installiert und verwendet.

Hast du irgendein Gerät, um zu gucken, was auf dem Bus passiert, wenn du 
versuchst den Baustein anzusprechen (=Antwort mit Ack auf SDA oder 
nicht)?

von i2c (Gast)


Lesenswert?

> Ich habe als neue Adresse 220 versucht, Standard ist 224 und bleibt
> unverändert. :-(

Mit diesem Funktionsaufruf geht es vermutlich. Aber saudumm geschriebene 
Funktion.

changeAddress(224>>1, 220, 0)

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Hier mal eine Rückmeldung.
Ich habe für die versuchten Adressänderungen immer den Original-Code von 
der Webseite des Herstellers benutzt.

Da gibt es ein schönes Beispiel-Programm, in dem die Distanz (es handelt 
sich um Ultraschall-Entfernungsmesser) zunächst von der Standardadresse 
abgefragt wird, dann folgt ein Befehl zur Adressänderung, ein erneutes 
Abfragen und zuletzt der Reset zur Standardadresse.

Ich glaube ja nicht, dass die Leute, die diesen Code erstellt haben, 
dumm sind oder Unsinn schreiben. Bei ihnen hat es anscheinend 
funktioniert ... bei mir (scheinbar) nicht. Jeglicher Leseversuch von 
anderen als der Standardadresse war erfolglos.

Bis hierhin wäre die Rückmaldung ja sinnlos, also ist doch etwas 
passiert:

Als ich aus lauter Verzweiflung mal eine I2C-Scanner-Software auf meinen 
Arduino load und die 3 Ultraschall-Sensoren an den I2C-Bus anschloss, 
erlebte ich echt mein "blaues Wunder"! Alle drei Sensoren wurden 
plötzlich unter jeweils unterschiedlichen Adressen gefunden! Keine der 
Adressen war eine, die ich versucht hatte zu vergeben, auch nicht um 1 
größer oder kleiner oder z.B. exakt die Hälfte.

Ich habe nicht die geringste Ahnung, wie es dazu kam. Aber egal, keine 
der 3 Adressen beisst sich mit meinen anderen Busteilnehmern und ich 
nehm' sie erstmall einfach so, wie sie sind ... :-)

von Wolfgang (Gast)


Lesenswert?

Frank E. schrieb:
> Ich habe nicht die geringste Ahnung, wie es dazu kam.

Das Acknowledge auf dem Bus hast du immer noch nicht angeguckt, oder?

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.