Forum: Mikrocontroller und Digitale Elektronik viele ESP8266 miteinander verbinden


von Neumi (neumi111)


Lesenswert?

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

von Neumi (neumi111)


Lesenswert?

"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
}

von Klaus R. (klara)


Lesenswert?

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

von Neumi (neumi111)


Lesenswert?

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

von 100Ω W. (tr0ll) Benutzerseite


Lesenswert?

Warum muss es i2c sein? Was spricht gegen die serielle Schnittstelle und 
z.B. Modbus?

von Neumi (neumi111)


Lesenswert?

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

von Geli (Gast)


Lesenswert?

Wieso nicht den i2c Harware slave mode nutzen?
https://github.com/suculent/esp8266-I2C-slave

von Monk (roehrmond)


Lesenswert?

Geli schrieb:
> Wieso nicht den i2c Harware slave mode nutzen?

Soweit ich weiß existiert dieser nicht beim ESP8266.

von Neumi (neumi111)


Lesenswert?

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.
"

von Monk (roehrmond)


Angehängte Dateien:

Lesenswert?

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.

von Ulf L. (ulf_l)


Lesenswert?

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
Noch kein Account? Hier anmelden.