Ich Arbeite mich schon seit einigen Wochen in Arduino ein.
Nun bin ich erstmals auf ein Problem gestossen welches ich nicht selber lösen kann.
Nach reichlicher Recherche habe ich das Problem im Englischem und Spanischem Forum gefunden.
Mein Problem jetzt ist: Spanisch kann ich nicht, und beim Englischen verstehe ich nicht genau was die Lösung ist.
Jedes I2C Gerät muss auf einer auf dem I2C Bus einmaligen I2C Adresse laufen.
Die DS1307 Module haben die I2C Adresse 0x68.
Welche I2C Adresse Dein MPU6050 Modul hast, kannst Du mit dem I2C Scanner Sketch herausfinden.
Wenn das Modul ebenfalls die Adresse 0x68 hat, kannst Du beide Module nicht parallel am selben I2C Bus betreiben.
Welche Adresse hat Dein MPU6050, was sagt der I2C Scanner?
meine RTC DS1307 hat irgendwie 2 Adressen...0x50 und 0x68 ?
Habe folgenden ScanSketch auf Nick Gammons HP gefunden und etwas erweitert, damit meine Zuordnungen passen (kann ja leicht angepasst werden).
Dies Proggi lasse ich als Teil meines Sketches am Anfang im Setup durchlaufen um zu sehen (SerialMonitor bzw. PC) ob und welche Komponenten erkannt wurden:
// --------------------------------------
// i2c_scanner
//
// Version 1
// This program (or code that looks like it)
// can be found in many places.
// For example on the Arduino.cc forum.
// The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
// Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26 2013
// V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
// by Arduino.cc user Krodal.
// Changes by louarnold removed.
// Scanning addresses changed from 0...127 to 1...119,
// according to the i2c scanner by Nick Gammon
// http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
// As version 4, but address scans now to 127.
// A sensor seems to use address 120.
// Version 6, October 02, 2013, Using Arduino 1.5.4 user A.R.Ty
// Added MY descriptions for different adresses to
// identify each more easier in letters instaed crypted
// HEX-appearance.
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
Serial.println("\nI2C Scanner");
}
void loop()
{
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
if ((address) == 0x20)
{
Serial.println("............... is I2C LCD_2x16");
Serial.println();
}
if ((address) == 0x27)
{
Serial.println("............... is I2C LCD_4x20");
Serial.println();
}
if ((address) == 0x45)
{
Serial.println("............... is I2C LED-Bus ");
Serial.println();
}
if ((address) == 0x50)
{
Serial.println("............... is I2C RTC_1307");
Serial.println();
}
if ((address) == 0x54)
{
Serial.println("............... is I2C EEpRom ");
Serial.println();
}
if ((address) == 0x68)
{
Serial.println("................ is I2C RTC_RAM ");
Serial.println();
}
nDevices++;
}
else if (error==4)
{
Serial.print("Unknow error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000); // wait 5 seconds for next scan
}
Wenn ich das laufen lasse und NUR die RTC dran habe, erscheinen eben 0x50 und 0x68 als erkannt.
Das sieht nach einem herausgeführten ADO-Anschluß aus. Dann würde ich mal ausprobieren, was im Playground beschrieben steht: Arduino Playground - HomePage
Zitat: The I2C-address depends on the AD0 pin of the sensor. If it is connected to ground, the address is 0x68. If it is connected to VLOGIC (+3.3V) it is 0x69.
Welche Adresse zeigt dann der I2C-Scanner an, wenn Du ADO mit 3.3V versorgst?
@A.R.Ty: An Adresse 0x50 sitzt noch ein zusätzliches EEPROM vom Typ AT24C32 auf Deiner Uhrenplatine, das Du per I2C programmieren und in dem Du Daten speichern kannst, schau Dir die Bauteilebestückung an!
Thx, wieder was gelernt - nicht dass es I2C Ram war (das dachte ich mir schon) aber dass die Adresse genau "anders herum" ist.
Da wurde mir sofort einiges unerklärliche Uhrenverhalten erklärlich, gerade im Umgang mit Kurzzeittimern
Naja, wenn man alles könnte und wüsste....wäre es dann nicht schon wieder langweilig ? XD
der i2c Manager zeigt jetzt endlich 2 verschiedene Daten an.
Scanning...
I2C device found at address 0x68 !
................ is I2C RTC_RAM
I2C device found at address 0x69 !
done
Beide (RTC und MPU6050) laufen jetzt.
Das nächste was ich ausprobieren werde ist sie gleichzeitig Arbeiten zu lassen, was mein ursprüngliches Ziel war, aber ich denke nicht, dass das ein Problem sein sollte. Vielen dank Jurs
Kann das MPU6050-Board zum Ändern der Adresse mit AD0 auch auf 5V+ gelegt werden oder müssen das zwingend 3,3V+ sein ?
3,3V ist wegen einem SensorShield 5 - Board nicht (mehr) verfügbar - oder gibts die noch woanders ?
Pinout gibt nichts Anderes her
Ansonsten kann ich ja noch 2 Dioden dazwischen schweissen, jede zieht so ca. 0,8V AFAIK....
ich versuche die RTC 1307 und das Gyroskop MPU6050 zusammen zu betreiben. Dazu habe ich wie beschrieben die i2c adresse des Gyros auf 0x69 geändert (i2c scanner bestätigt dies)
Wenn ich nun das set_time sketch hochlade und im Anschluss mein Hauptprogramm für das Gyroskop hochlade, funktioniert alles perfekt.
ABER, wenn ich jetzt den Arduino vom Strom trenne und wieder anschliesse, läuft lediglich die Zeit und der Gyro antwortet nicht.
Fraser-Island:
Ich lade erst set_time hoch (um die Zeit erstmalig zu definieren) und anschließend mein normales Programm, welches die RTC und den Gyro ausliest.
Das klappt ja auch so weit, aber nach trennen der Stromversorgung liest er nur noch die Zeit und das Gyroskop nichmehr...
Wie schon geschrieben,
das geht so nicht. Du musst ein Programm daraus machen.
Wenn du die Zeit stellst, wird diese in der RTC gespeichert und kann natürlich immer abgerufen werden.
Ok, sorry, habe eben nochmal gelesen.
Dein "Hauptprogramm" beinhaltet schon beide Routinen. Das habe ich in deinem ersten Post so nicht gelesen.
Fraser-Island:
Ja mein Programm kann die RTC lesen, aber nach Verlust der Spannungsversorgung nur noch die RTC und das Gyroskop nichtmehr.
Wenn ich die RTC dann entferne kann er den Gyro wieder lesen (Uhr ausgesteckt)
erneutes einstecken der Uhr : nur noch Gyro, ohne Uhr
Dann solltest du uns deinen Sketch zeigen.
Füge diesen hier in Code-Tags (diese Schaltfläche </>) ein.
Da wird mit I2C etwas nicht stimmen.
Vermutlich hast du die Adressen im Sketch nicht angepasst.