Hallo zusammen,
Ich plane die Umsetzung eines Projekts, bei dem ein Master, das SparkFun Redboard Qwiic, Signale von den Slaves empfängt und diese seriell an den Computer weiterleitet.
Die WeMos D1 R1 als Slaves sollen verschiedene Inputelemente wie Taster, Potis oder Encoder haben und daraufhin eindeutige Signale an den Master senden.
Um diese Struktur aufzubauen möchte ich vorher in kleinen Schritten mich mit I2C und dem Master- Slavesystem vertraut machen. Aus diesem Grund versuche ich meinen Arduino Leonardo mit folgenden Bsp-Code:
#include <Wire.h>
void setup() {
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output
}
void loop() {
Wire.requestFrom(8, 6); // request 6 bytes from slave device #8
while (Wire.available()) { // slave may send less than requested
char c = Wire.read(); // receive a byte as character
Serial.println(c); // print the character
}
delay(500);
}
und den WeMos mit dem Code:
#include <Wire.h>
void setup() {
Wire.begin(8); // join i2c bus with address #8
Wire.onRequest(requestEvent); // register event
}
void loop() {
delay(100);
}
// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
Wire.write("hello "); // respond with message of 6 bytes
// as expected by master
}
zu bespielen.
Das klappt auch alles so weit, nur das ich dann auf dem Seriel Monitor kein "hello" bekomme.
Nun habe ich die Vermutung, dass mein WeMos nicht die Ardesse 8 hat.
Aus diesem Grund habe ich den folgenden Sketch drauf gespielt um die Adresse herauszufinden:
# include "Wire.h"
void setup()
{
Wire.begin();
Serial.begin(9600);
delay(500);
Serial.print("I2C Scanner");
}
void loop()
{
byte Fehler, Adresse;
int Geraete = 0;
Serial.println("Starte Scanvorgang");
for (Adresse = 1; Adresse < 127; Adresse++ )
{
// Übertragung starten
Wire.beginTransmission(Adresse);
// wenn die Übertragung beendet wird
Fehler = Wire.endTransmission();
if (Fehler == 0)
{
Serial.print("I2C Gerät gefunden - Adresse: 0x");
if (Adresse < 16) Serial.print("0");
Serial.print(Adresse, HEX);
Serial.println("");
Geraete++;
}
}
if (Geraete == 0) Serial.println("Keine I2C Geräte gefunden\n");
else Serial.println("Scanvorgang abgeschlossen");
delay(10000);
}
nun bekomme ich folgende Antwort:
"Starte Scanvorgang
Keine I2C Geräte gefunden"
Der ESP8266 tut sich mit dem Slavemode relativ schwer.
Soweit mir bekannt tut es zwischen ESP8266 einigermaßen.
Mit anderen Geräten gibt/gab es teilweise massive Probleme.
Der Hauptgrund scheint zu sein, dass dieser ESP keine Hardware Einheit hat, welches das abhandelt. Ist alles in Software.
Bei meinen letzten Experimenten, war bei 35kHz Schluss.
Ich finde es immer wieder erstaunlich, das 8bit Prozessoren mit 16MHz den Master für mehrere 32bit 240MHz Slaves sein sollen. Hört sich für mit total falsch an.
Ich bin noch neu in der Welt der Arduino-Programmierung und habe bisher lediglich kleine Projekte umgesetzt.
Obwohl ich bereits viel zu diesem Thema gelesen habe, versuche ich mich schnell einzuarbeiten. Bitte seht mir meine Unwissenheit nach und vielen Dank für die konstruktiven Hinweise und Tipps.
@kawkas
Wenn der ESP8266 kein I2C Slave per Hardware kann wird das wohl leider nichts werden. Wusste ich nicht. Ein ESP32 soll das mit Umständen können. Link aber wohl immer noch nicht und wohl nie wie man das sonst gewohnt ist. ESP eben.
Oder drehst die Funktion Master-Slave um wenn das ins Konzept passt. Bspw. sendet der ESP zyklisch seine Daten. Unabhängig ob der Arduino Slave neue Daten genau jetzt benötigt oder nicht.
Die Idee besteht darin, eine modulare Plattform zu schaffen, auf der die Bedienelemente angeordnet werden können. Ziel ist es, HMI-Bedienelemente unkompliziert in beliebiger Reihenfolge in Reihe zu schalten (wahrscheinlich mit dem Qwiic-System) und dann Signale (für die jeweiligen Bedienelemente) an ProtoPie oder TouchDesigner zu senden.
Diese Signale sollen so simpel und gleichzeitig eindeutig sein, dass man sich in der Logik der entsprechenden Nachfolge-Programme seine gewünschten Funktionen etablieren kann.
scheint aber nicht für den ESP8266 zu gelten oder schliest Du daraus das werte >10 die Adresse angeben?
das könnte zumindest für den ESP32 ja dann zutreffen.
aus der Doku
I2C (Wire library)
Wire library currently supports master mode up to approximately 450KHz. Before using I2C, pins for SDA and SCL need to be set by calling Wire.begin(int sda, int scl), i.e. Wire.begin(0, 2) on ESP-01, else they default to pins 4(SDA) and 5(SCL).