Hi, ich arbeite derzeit an einem Gerät um WiFi signale in Echtzeit darzustellen. Es soll quasi eine Neuauflage von diesem Teil werden: https://www.youtube.com/watch?v=COI6knr9qPM Das Resultat nach 1h Messung ist eine stehende Welle vom Signal (meines Erachtens komplett verrückt das so zu sehen). Der nächste Schritt ist natürlich Echtzeit und ein größeren Bereich aufzunehmen. ;) Die Idee ist, ein 2D Array von ESP8266 ESP01 Modulen zu bauen, und alle gleichzeitig einen "Frame" vom RSSI eines Netzwerkes aufzunehmen. Nachdem ich die erste Platine fertig gemacht und erste Versuche unternommen habe, wurde mir bewusst, dass ESP8266 Module KEINEN i2c Slave Mode unterstützen. Das ist ein Problem. Hat jemand eine Idee, wie ich die ESP01 Module mit einem Master (in welcher Form auch immer) verbinden kann? Aber ohne WiFi (wegen verminderter Framerate durch WiFi Kommunikation zum Master). Warum benutze ich ESP8266 ESP01 Module? - Sind die billigsten und kleinsten WiFi "Sensoren" und haben (sind) ein Microcontroller der frei programmierbar ist - ich dachte i2c wäre eine schnelle und einfache Variante, ohne jeden "Pixel" in ein weiteres Wlan einzubinden - Phased Array fällt wegen Komplexität und fehlender Erfahrung/Messequipment raus. Was habe ich versucht? - Wire Bibliothek von Arduino mit ESP8266 Modulen getestet (Master geht als Sender und Receiver, Slave geht nur als Receiver aber NICHT als Sender) Problem: - Ich habe nur drei GPIO Pins zur Verfügung, einer ist schon als Shutter belegt - Ich möchte (wenn möglich beim ESP01 bleiben) - Bit Banging scheint bei ESP8266 Modulen aufgrund der Architektur / ESP Firmware nicht richtig zu gehen, weil ein Hintergrundprozess wohl 80% der Zeit läuft und dem eigenen Code nur 20% der Zeit überlässt. (wenn ich das richtig verstanden habe) Danke Euch! Gruß, Neumi
"Lösung" gefunden. I2C Slave scheint beim ESP8266 ein Problem zu sein, was bislang nicht zufriedenstellend gelöst werden konnte. Siehe: https://github.com/esp8266/Arduino/issues/1330 https://github.com/esp8266/Arduino/pull/5226 https://github.com/esp8266/Arduino/issues/5762 Meine "Lösung" ist es, die i2c Clock auf 15000Hz zu setzen (normal sind 100000Hz). Damit geht es soweit. Die Geschwindigkeit ist an dieser Stelle nicht super kritisch. Daher versuche ich es erstmal so. Die Code Beispiele sind die Arduino Wire Examples mit angepasster clockSpeed. Ich hoffe das hilft dem einen oder anderen, einen Tag Suche zu sparen! Master Code:
1 | include <Wire.h> |
2 | #include <PolledTimeout.h> |
3 | |
4 | #define SDA_PIN 4
|
5 | #define SCL_PIN 5
|
6 | const int16_t I2C_MASTER = 0x42; |
7 | const int16_t I2C_SLAVE = 0x08; |
8 | |
9 | void setup() { |
10 | Serial.begin(115200); // start serial for output |
11 | Wire.begin(SDA_PIN, SCL_PIN, I2C_MASTER); // join i2c bus (address optional for master) |
12 | Wire.setClock(15000); |
13 | }
|
14 | |
15 | void loop() { |
16 | using periodic = esp8266::polledTimeout::periodicMs; |
17 | static periodic nextPing(100); |
18 | |
19 | if (nextPing) { |
20 | Wire.requestFrom(I2C_SLAVE, 6); // request 6 bytes from slave device #8 |
21 | |
22 | while (Wire.available()) { // slave may send less than requested |
23 | char c = Wire.read(); // receive a byte as character |
24 | Serial.print(c); // print the character |
25 | }
|
26 | }
|
27 | }
|
Slave Code:
1 | #include <Wire.h> |
2 | |
3 | #define SDA_PIN 4
|
4 | #define SCL_PIN 5
|
5 | const int16_t I2C_MASTER = 0x42; |
6 | const int16_t I2C_SLAVE = 0x08; |
7 | |
8 | void setup() { |
9 | Wire.begin(SDA_PIN, SCL_PIN, I2C_SLAVE); // join i2c bus with address #8 |
10 | Wire.onRequest(requestEvent); // register event |
11 | Wire.setClock(15000); |
12 | }
|
13 | |
14 | void loop() { |
15 | }
|
16 | |
17 | // function that executes whenever data is requested by master
|
18 | // this function is registered as an event, see setup()
|
19 | void requestEvent() { |
20 | Wire.write("hello\n"); // respond with message of 6 bytes |
21 | // as expected by master
|
22 | }
|
Neumi schrieb: > Hat jemand eine Idee, wie ich die ESP01 Module mit einem Master (in > welcher Form auch immer) verbinden kann? Aber ohne WiFi (wegen > verminderter Framerate durch WiFi Kommunikation zum Master). Schau Dir mal diesen Artikel an. Er ist vom 13. Oktober 2022. https://randomnerdtutorials.com/esp-now-auto-pairing-esp32-esp8266/ mfg Klaus
Danke für die Antwort. Das Problem ist, dass die Kommunikation nicht über WiFi laufen darf, da die ESPs ununterbrochen nach Netzwerken suchen soll. Daher bleibe ich erstmal bei i2c auf 10kHz. Aber ESP-NOW ist ein spannendes Konzept! Gruß Neumi
Warum muss es i2c sein? Was spricht gegen die serielle Schnittstelle und z.B. Modbus?
Ich dachte zunächst, dass I2C das naheliegendste ist, da ich eh nur auf ziemlich begrenzten Leitungslängen unterwegs bin und I2C da irgendwie der Standard ist. Soweit ich weiß, reicht der normale Adressenraum bei modbus nur bis 32. Aber das könnte man wahrscheinlich recht einfach erweitern. Da ich i2c jetzt auf 10/15kHz zum laufen bekommen habe und die Platinen eh für i2c gebaut wurden, bleibe ich erstmal dabei. Aber danke für die Antwort! Neumi
Geli schrieb: > Wieso nicht den i2c Harware slave mode nutzen? Soweit ich weiß existiert dieser nicht beim ESP8266.
Geli schrieb: > Wieso nicht den i2c Harware slave mode nutzen? > https://github.com/suculent/esp8266-I2C-slave Steve van de Grens schrieb: > Geli schrieb: >> Wieso nicht den i2c Harware slave mode nutzen? > > Soweit ich weiß existiert dieser nicht beim ESP8266. Wie im ersten Post bereits erwähnt, funktioniert der Slave Mode nicht bei höheren Clock speeds. Bei mir läuft es jetzt mit 15kHz soweit ohne Probleme. Das Problem is bekannt und der Slave Mode offiziell von Espressiv auch nicht unterstützt. https://github.com/esp8266/Arduino/issues/5762#issue-410799335 Beitrag "ESP8266 als I2C Slave mit Arduino IDE" "My research further up in this issue showed ESP8266 not being able to catch up to I2C speed 100kHz. When using an Arduino Uno as master and ESP8266 as slave, I had to slow down I2C speed to 25kHz to get it working. But this resarch was before refactoring of I2C code happened. I cannot say how much better (or worse?) it got. ESP8266 user interrupt response time to a changing input pin simply is too slow. "
Neumi schrieb: > Wie im ersten Post bereits erwähnt, funktioniert der Slave Mode nicht > bei höheren Clock speeds. Weil das in Software implementiert ist, nicht in Hardware. Entsprechend dem Vermerk im Datenblatt. Siehe Anhang.
100Ω W. schrieb: > Warum muss es i2c sein? Was spricht gegen die serielle Schnittstelle und > z.B. Modbus? Das wäre mir auch als erstes in den Sinn gekommen. Mit drei Pins gut zu machen, Library gibt es auch zu genüge und wenn's etwas gemächlicher sein darf, ginge es evtl. auch noch über Softserial.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.