Kommunikation zwischen zwei Arduino

Hallo zusammen,

ich möchte Daten (integer) von einem Arduino A zum anderen Arduino B zuschicken. Ich habe es geschafft, die Daten von A nach B über den I2C-Bus rüber zu schicken - das funktioniert. Dazu habe ich die Wire.h benutzt.

In Arduino B muss ein großer Code geladen werden (für ein bestimmtes Projekt). Mein Ziel war, das das Senden von Daten von A nach B auch funktioniert, wenn dieser große Code auch in B geladen ist. Dies funktioniert aber nicht. Im Code von Arduino B ist ein eigener I2C-Bus geladen. Anscheinend kann ich wire.h nicht mehr benutzen.

Kann mir jemand Vorschläge geben, wie ich das Problem lösen kann?

Im Code von Arduino B ist ein eigener I2C-Bus geladen.

Ja?

Anscheinend kann ich wire.h nicht mehr benutzen.

Warum?

Kann mir jemand Vorschläge geben, wie ich das Problem lösen kann?

Vielleicht Wire richtig verwenden... Oder eine andere Schnittstelle nutzen.

Mooo: Kann mir jemand Vorschläge geben, wie ich das Problem lösen kann?

Das geht schon mit der "Wire.h".

Du musst nur einen als Master und den anderen als Slave einrichten. Beschreibung

Hallo, wird schon funktionieren. Du brauchst immer einen Slave- und einen Master. Hier gibt es eine Menge Info dazu. Gruß und Spaß Andreas

zu- langsam. Guten Morgen.

Ich habe mich trotzem mit dem I2C-Bus durchgekämpft.

Das ist eine Funktion, die die Daten ausliest:

void I2C_readAnything(uint8_t *buf, uint8_t add, uint8_t size) {
i2c_rep_start(add<<1); // I2C write direction
i2c_write(TWDR); // register selection
i2c_rep_start((add<<1) | 1); // I2C read direction
uint8_t *b = buf;
while (–size) *b++ = i2c_readAck(); // acknowledge all but the final byte
*b = i2c_readNak();
}

Der Code wird vom arduino akzeptiert, jedoch spinnen alle Signale nach dem Laden. Der Code ist also noch nicht richtig. Weiß jemand vielleicht, woran es liegt? Muss ich irgendwie eine Registeradresse vom Sender-Arduino hinschreiben?

Mooo:
Der Code wird vom arduino akzeptiert, jedoch spinnen alle Signale nach dem Laden. Der Code ist also noch nicht richtig. Weiß jemand vielleicht, woran es liegt? Muss ich irgendwie eine Registeradresse vom Sender-Arduino hinschreiben?

Wenn du Code (Sketch) postest, dann bitte den kompletten Sketch und nicht nur Fragmente.
Der Fehler kann auch in den anderen Teilen liegen.

Und bitte posten den Sketch in Code-Tags, die Schaltfläche “</>” im Fenster des Editors oben links.

Ich habe dieses Problem leider immer noch nicht gelöst und bin sehr verzweifelt.

Es geht um den Code zur Ansteuerung eines Quadrocopters in dem Link (Multiwii_2.4): Google Code Archive - Long-term storage for Google Code Project Hosting.

In sensor.cpp werden Sensor über I2C angekoppelt.

void i2c_read_reg_to_buf(uint8_t add, uint8_t reg, uint8_t *buf, uint8_t size) {
  i2c_rep_start(add<<1); // I2C write direction
  i2c_write(reg);        // register selection
  i2c_rep_start((add<<1) | 1);  // I2C read direction
  uint8_t *b = buf;
  while (--size) *b++ = i2c_readAck(); // acknowledge all but the final byte
  *b = i2c_readNak();
}

void i2c_getSixRawADC(uint8_t add, uint8_t reg) {
  i2c_read_reg_to_buf(add, reg, rawADC, 6);
}

void i2c_writeReg(uint8_t add, uint8_t reg, uint8_t val) {
  i2c_rep_start(add<<1); // I2C write direction
  i2c_write(reg);        // register selection
  i2c_write(val);        // value to write in register
  i2c_stop();
}

uint8_t i2c_readReg(uint8_t add, uint8_t reg) {
  uint8_t val;
  i2c_read_reg_to_buf(add, reg, &val, 1);
  return val;
}

Hier ist ein Beispiel für die Anbindung des Accelerometer MMA7455:

#if defined(MMA7455)
#if !defined(MMA7455_ADDRESS)
  #define MMA7455_ADDRESS 0x1D
#endif

void ACC_init () {
  delay(10);
  i2c_writeReg(MMA7455_ADDRESS,0x16,0x21);
}

void ACC_getADC () {
  i2c_getSixRawADC(MMA7455_ADDRESS,0x00);

  ACC_ORIENTATION( ((int8_t(rawADC[1])<<8) | int8_t(rawADC[0])) ,
                   ((int8_t(rawADC[3])<<8) | int8_t(rawADC[2])) ,
                   ((int8_t(rawADC[5])<<8) | int8_t(rawADC[4])) );
  ACC_Common();
}
#endif

Mein Ziel ist es, mein Arduino Pro Mini (wie beim obigen Beispiel) auch an dem I2C anzubinden. Ich habe aber gar keine Ahnung wie. Ich brauche dringend Hilfe.

Warum liest du dir nicht die gemachten Vorschläge durch? In meinem Post #2 habe ich dir den Link geschickt.

Nach diesem Beispiel kannst du eine I2C-Verbindung zwischen 2 Arduinos aufbauen.

Wenn das dann funktioniert, kannst du mit den Sensordaten weiter machen. Warum nutzt du keine Libraries, damit ist es für dich einfacher.

Und nochmal: Keine Code-Fragmente posten. Immer komplett. Der Fehler liegt meist am "geheimen" Teil.

Hier kann man den kompletten Code herunterladen (Version 2.4): https://code.google.com/archive/p/multiwii/

Dort existiert ein eigenes I2C-Protokoll. In dem Link, den du mir geschickt hast, wird im Code die Library wire.h verwednet. Ich kann diese wire.h für meinen Code nicht mehr benutzen.

Wenn ich den Code von deinem Link mit der Wire.h in meinem Code nutze, dann steht, dass receiveEvent nicht deklariert wurde.

Und warum verheimlichst du uns, dass du mit einer 3. Anwendung Probleme hast.

Dann must du mit einem anderen Protokoll die Daten übertragen und wir hätten uns das ganze sparen können. ;)

Mach es per Funk (VirtualWire) oder per Serial (SoftwareSerial) dann kommst du nicht mit dem externen I2C in Konflikt.

6 Tage bisher.... Vielleicht hätte man in der Zeit alles auf Wire umbauen können...

Ich hatte es in den letzten tagen auch über UART ausprobiert, aber das habe ich wieder aufgegeben, weil sobald ich die Arduino auch zusätzlich über ein USB angeschlossenn ist, funktioniert nichts mehr, weil beide Schnittstellen miteinander gekoppelt sind.

Über Funk geht nicht.

Mooo: Ich hatte es in den letzten tagen auch über UART ausprobiert, aber das habe ich wieder aufgegeben, weil sobald ich die Arduino auch zusätzlich über ein USB angeschlossenn ist, funktioniert nichts mehr, weil beide Schnittstellen miteinander gekoppelt sind.

Über Funk geht nicht.

Du sollst es ja nicht über die hardware-Serielle machen, sondern SoftwareSerial.

Und wieso geht Funk nicht ? Nur interessehalber, muss ja nicht sein.

Mal sehen, wieviele Möglichkeiten noch gefunden werden, wie man es nicht machen kann. Das ist aber eine Aufgabe nur für Leute, denen eine funktionierende Lösung zu wenig ist :-]