PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C Adressändeung



Toopic
28.04.2014, 16:10
Hey zusammen,

Ich habe ein kleines Problem. Ich will zwei srf02 Ultraschallsensoren über I2C an meinem Arduino Uno anschliessen. Ich habe inzwischen herausgefunden, dass ich die Adressen der slave's ändern muss. Ich habe auch die Befehle gefunden mit denen ich das anstellen kann:

Changing the I2C Bus Address
To change the I2C address of the SRF02 you must have only one sonar on the bus. Write the 3 sequence commands in the correct order followed by the address. Example; to change the address of a sonar currently at 0xE0 (the default shipped address) to 0xF2, write the following to address 0xE0; (0xA0, 0xAA, 0xA5, 0xF2 )
(gefunden bei http://www.robot-electronics.co.uk/htm/srf02techI2C.htm#Address)

ich habe jedoch nicht 0xE0 als Standart, sondern 0x70. dafür muss ich die Adresse ja einfach um einen Byte nach rechts verschieben.

was ich allerdings nicht ganz verstehe: wie und wo muss ich die Befehle anordnern, damit die Adresse auch geändert wird.


meine bisherigen Versuche waren nicht gerade von Erfolg gekrönt.

#include <Wire.h>
#define srfAddress ( 0xE0 >> 1, 0xA0 >> 1, 0xAA >> 1, 0xA5 >> 1, 0xF2 >> 1) // Address of the SRF08
#define cmdByte 0x00 // Command byte
#define rangeByte 0x02 // Byte for start of ranging data
byte highByte = 0x00; // Stores high byte from ranging
byte lowByte = 0x00; // Stored low byte from ranging

void setup()
{

}

void loop()
{

}



Vielen Dank schon im voraus,

Freundliche Grüsse,

toopic

Dirk
28.04.2014, 16:58
Hi toopic,

die Bytes 0xA0, 0xAA, 0xA5 dürfen nicht mit ">> 1" nach rechts geschoben werden, weil das keine Adressen sind.
Diese Bytes werden halt an deine Adress 0x70 gesendet, gefolgt von deiner neuen Adresse (0xYY >> 1).

Toopic
02.05.2014, 11:35
Danke für deine Hilfe Dirk,

das hat mir sehr geholfen. Jetzt habe ich es entlich doch noch geschafft.
Hier wäre der Sketch:





#include "Wire.h"

#define currentAddress 0x70 //aktuelle Adresse reinschreiben / type in current address
#define newAddress 0x74 //neue Adresse reinschreiben / type in new adress

void setup() {

delay (10000); //Delay for Serial Monitor

Serial.begin(115200);
Wire.begin();
Wire.beginTransmission(currentAddress);
Wire.write(0x00);
Wire.write(0xA0);
if (Wire.endTransmission()) {
Serial.println("Error writing 1. command byte (maybe adress already changed)");
return;
}
Wire.beginTransmission(currentAddress);
Wire.write(0x00);
Wire.write(0xAA);
if (Wire.endTransmission()) {
Serial.println("Error writing 2. command byte");
return;
}
Wire.beginTransmission(currentAddress);
Wire.write(0x00);
Wire.write(0xA5);
if (Wire.endTransmission()) {
Serial.println("Error writing 3. command byte");
return;

} Wire.beginTransmission(currentAddress);
Wire.write(0x00);
Wire.write(newAddress << 1);
if (Wire.endTransmission()) {
Serial.println("Error writing new adress byte");
return;
}
Serial.print("Successfully configured new Address: ");
Serial.println(newAddress);
}

void loop() {
}



Man muss darauf achten, dass auf dem Datenblatthttp://www.robot-electronics.co.uk/htm/srf02techI2C.htm die Befehle um die Adresse zu ändern nicht in der richtigen Reihenfolge sind. In diesem Sketch stimmt die Reihenfolge und so funktioniert es.
Am Anfang des Sketches habe ich einen Delay eingebaut, damit man Zeit hat den Serial Monitor zu öffnen und die Erfolgreiche Änderung auch zu sehen. Denn ansonsten führt das Programm den Befehl aus und wenn man den Serial öffnet will es ihn nochmal ausführen, hat aber bereits eine andere Adresse und gibt daher eine Error Warnung an.

Freundliche Grüsse,

Toopic