Forum: Mikrocontroller und Digitale Elektronik esp8266 per I2C bus mit zweitem esp8266 verbinden


von Fabe K. (fabe1999)


Lesenswert?

Hallo alle zusammen.

Ich bin nun schon eine ganze Weile auf der Suche nach einer Lösung für 
mein Problem:

Ich möchte zwei ESP8266 Boards per I2C Bus miteinander verbinden um 
Daten übertragen zu können.

Wenn ich diese jedoch so verbinde wie im Internet zu finden ist passiert 
rein gar nichts.
Daher habe ich das ganze mal mit ESP und Arduino versucht
Und siehe da, wenn das ESP Master spielt kann ich mit dem Arduino etwas 
empfangen.
Wenn es jedoch anders herum versucht wird (Arduino Master und ESP Slave) 
habe ich beim ESP wieder keine Reaktion.


Hintergrund ist der folgende:
Ich habe einige Fallblattanzeigen bekommen und möchte diese nun 
ansteuern.
Die Ansteuerung der Einzelnen Ziffern funktioniert schon ziemlich gut, 
jetzt möchte ich aber einen Schriftzug anzeigen (z.B. mit 16 Zeichen)

Die Ansteuerung dieser habe ich mir so vorgestellt:
Jede Ziffer bekommt ihr eigenes ESP Modul zur Steuerung.
Am Anfang der Zeile wird nun ein Master ESP angebracht das den 
eingegebenen Text in einzelne Zeichen zerlegt und diese an die Slave 
ESPs verteilt.

Ich habe auch bereits überlegt das ganze über W-LAN zu übertragen.
Jedoch möchte ich nicht das zig IP Adressen in meinem W-LAN sind nur 
wegen dieses Projektes.

Auch über eine Lösung mit nur einem ESP habe ich nachgedacht,
jedoch möchte ich das ganze Skalierbar halten und nicht den gesamten 
Code umschreiben wenn eine Ziffer hinten angefügt wird.


Weiß jemand wo der Fehler liegen könnte?
Oder hat jemand eine Alternative dazu?

von Forist (Gast)


Lesenswert?

Fabe K. schrieb:
> Weiß jemand wo der Fehler liegen könnte?

Vermutlich in deinem Programm.

von Stefan F. (Gast)


Lesenswert?

Die I²C Schnittstelle ist beim ESP8266 nicht in Hardware sondern als 
Software-Emulation ausgeführt und schnarch langsam.

Es macht meiner Meinung nach keinen Sinn, sie so (als Slave) zu 
verwenden. Schau Dir lieber mal die SPI Schnittstelle an, die ist kein 
Fake.

von Michael U. (amiga)


Lesenswert?

Hallo,

das Framework des ESP8266 in der Arduino-IDE unterstützt auf dem ESP822 
nur I2C im Mastermode, keinen Slavemode

https://github.com/adafruit/ESP8266-Arduino

Gruß aus Berlin
Michael

von Draconix (Gast)


Lesenswert?

Nur mal so zum Verständnis: Du hast sechzehn Fallblattanzeigen? Ich gehe 
davon aus daß es es sich um jeweils eine Char handelt, richtig?

Nun willst du für jede Anzeige einen eigenen ESP verwenden? O.o Das ist 
schon extrem Overkill, du benötigst dafür maximal 32 IO, mit 
Multiplexing sogar nur ein Bruchteil davon und gerade bei 
Fallblattanzeigen ist es absolut nicht Zeitkritisch.

Mein Tipp: nimm dir einen passenden MC, sei es ein AVR oder ein STM32 
mit genügend IOs, Papp daran ein kleines ESP01 Modul für die WLan 
Tauglichkeit und vergiss die Geschichte für jeden Buchstabe/ Zahl einen 
eigenen MC zu verwenden.

Das wäre genauso wenn der Bäcker für jedes einzelne Brötchen ein Blech 
in den Ofen schiebt.

von Fabe K. (fabe1999)


Lesenswert?

Draconix schrieb:
> Nur mal so zum Verständnis: Du hast sechzehn Fallblattanzeigen? Ich gehe
> davon aus daß es es sich um jeweils eine Char handelt, richtig?

Ja das war soweit die Idee.
Und mir ist auch klar das das ein wenig übertrieben ist.

Daher habe ich mir auch überlegt das jedes Zeichen lediglich mit einem 
ATTiny bestückt wird.

Jedoch bekomme ich diesen momentan noch nicht mit der Arduino IDE 
Programmiert.

Die Idee das jedes Zeichen einen eigenen Controller bekommt hat den Sinn 
das das System Skallierbar bleibt ohne den Master neu Programmieren zu 
müssen.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?


von Fabe K. (fabe1999)


Lesenswert?

Danke für die guten Links,
habe es nun zum Laufen gebracht.

Der ATTiny44 funktioniert wunderbahr und auch das einstellen des 
Leerblattes funktioniert super.

Leider funktioniert das Zählen beziegungsweise das Anhalten nach enem 
einzelnen Blatt nicht so richtig.

Meine Befürchtung ist das die Abtastrate des ATTiny zu langsam ist um 
jeden Impuls mit zu bekommen.
Gibt es eine Möglichkeit dies zuverlässig zu zählen oder muss ich mich 
nach einem anderen Microcontroller umschauen?

Außerdem währe da dann noch die Frage wie ich dem ATTiny die 
Invormationen zukommen lasse, welche er zum anzeigen seines Buchstaben 
benötigt.

Über Ideen und Anregungen würde ich mich freuen.

Mit freundlichen Grüßen
Fabe

von Einer K. (Gast)


Lesenswert?

Fabe K. schrieb:
> Über Ideen und Anregungen würde ich mich freuen.
Hmmm...

Ich denke mal, die Schleife, im Bereich um Zeile 42 solltest du noch mal 
überarbeiten.
Dann klappts auch mit dem schnellen zählen!

Fabe K. schrieb:
> Außerdem währe da dann noch die Frage wie ich dem ATTiny die
> Invormationen zukommen lasse, welche er zum anzeigen seines Buchstaben
> benötigt.

I2C ?

von Stefan F. (Gast)


Lesenswert?

> Leider funktioniert das Zählen beziehungsweise das Anhalten nach
> einem einzelnen Blatt nicht so richtig.

Wovon redest du? Um Hilfe zu bekommen könnte es helfen, das Projekt zu 
beschreiben (mit Schaltplan) und wie bereits mehrfach angedeutet wurde, 
den Quelltext zu zeigen.

von Fabe K. (fabe1999)


Lesenswert?

Oh stimmt,
tut mir leid den Quellcode habe ich vergessen an zu hängen:
1
const int motorPin = 3;           //Pin zum Motor der Fallblatt Ziffer
2
const int blattSensorPin =  2;    //Sensor für jedes Blatt
3
4
//Variablen zum entprellen des Signals
5
int blattSensor = HIGH;
6
int blattAlt = HIGH;
7
8
9
void setup()
10
{
11
  pinMode(blattSensorPin, INPUT);
12
  pinMode(motorPin, OUTPUT);
13
14
  //Motor zu beginn an schalten
15
  digitalWrite(motorPin, LOW);
16
}
17
18
19
void loop()
20
{
21
  blattSensor = digitalRead(blattSensorPin);
22
23
  if (blattSensor != blattAlt)
24
  {
25
    if (blattSensor == HIGH)
26
    {
27
      //Wenn der Sensor ein signal gibt ist ein Blatt weiter gedreht worden.
28
      //Motor dann anhalten
29
      digitalWrite(motorPin, HIGH);
30
    }
31
  }
32
  blattAlt = blattSensor;
33
34
  //Wenn Motor durch den Code oberhalb angehalten wird Pausieren und Motor erneut starten.
35
  if (digitalRead(motorPin) == HIGH)
36
  {
37
    delay(3000);
38
    digitalWrite(motorPin, LOW);
39
  }
40
}

Dieser Code sollte eigentlich zu beginn den Motor einschalten und ab 
dann nach jedem "Umblättern" einer Ziffer eine Pause einlegen.
Mit einem Arduino oder auch einem ESP8266 funktioniert das wunderbahr, 
nur hält der ATTiny44 unregelmäßig an (mal nach 2 Blättern, mal nach 5)

Einen Schaltplan habe ich keinen.
Das Ziel ist es die Fallblattanzeigen steuern zu können.
Hierzu habe ich 2 Sensoren:
der eine gibt ein Signal sobalt ein Blatt weiter gedreht wurde (z.b. von 
'A' auf 'B')
der zweite gibt ein Signal sobalt die Anzeige ein mal durch ist und das 
Leerblatt angezeigt wird.

Mit dem 3. Pin wird der Motor geschaltet, ist dieser auf Ground gelegt 
dreht sich der Synchronmotor weiter.


Wenn die Ansteuerung einer einzelnen Ziffer gut funktioniert soll jede 
der 16 Ziffern ihren eigenen Microcontroller bekommen, diese bekommen 
dann (möglicherweise über I2C) von einem ESP8266 die Invormation 
zugespielt welchen Buchstaben sie anzeigen sollen.
Das ESP bekommt einen gesammten String mit 16 Zeichen über eine 
Weboberfläche, zerlegt diesen dann in einzelne Buchstaben und verteilt 
sie an die einzelnen Ziffern.

Ich hoffe ich konnte einigermaßen erläutern was ich mir vorgestellt 
habe.

Mit freundlichen Grüßen
Fabe

von Stefan F. (Gast)


Lesenswert?

Du hast vergessen zu schreiben, dass es sich um eine Fallblatt Anzeige 
handelt. Habe ich das richtig geraten?

Bei AVR Mikrocontrollern ist digitalRead() und digitalWrite() sehr 
langsam. Ich habe mal gelesen, dass diese Funktionen ca 100 Taktzyklen 
brauchen.

Versuche mal, stattdessen direkt auf die Register zuzugreifen, als PINx 
und PORTx.

Was hat das alles mit ESP8266 und I²C zu tun?

von Fabe K. (fabe1999)


Lesenswert?

Hallo nochmal,
Danke für den Tipp mit den Ports, habe es nun zum laufen gebracht.

Und du hast recht ich bin ein wenig von der eigentlichen Überschrift 
abgewichen.
Aber dennoch danke an alle die geholfen haben!

mit freundlichen Grüßen
Fabe

von Joachim S. (oyo)


Lesenswert?

Fabe K. schrieb:
> Hallo nochmal,
> Danke für den Tipp mit den Ports, habe es nun zum laufen gebracht.

Du hast das Problem mittlerweile zwar eh gelöst, dennoch noch ein kurzes 
Kommentar von mir: Das obige Codefragment ist meiner Meinung nach eh 
etwas unsauber; könnte mir vorstellen, dass das ursprüngliche Problem 
sogar damit zusammenhing:

1. Du machst ein digitalRead auf einen Pin, den Du als Output deklariert 
hast:
1
pinMode(motorPin, OUTPUT);
2
[...]
3
digitalRead(motorPin)
Das funktioniert zwar offenbar bei den meisten AVRs, aber eben nicht 
zwingend bei jedem Mikrocontroller bzw. jeder Arduino-Plattform. Eine 
zumindest etwas unschöne/unsaubere Lösung.

2. Die if-Abfrage mit dem besagten digitalRead(motorPin) ist in obigem 
Codefragment auch schlicht unnötig, möglichweise sogar eine 
Problemquelle. Die obige loop-Funktion wäre so sinnvoller:
1
void loop()
2
{
3
  blattSensor = digitalRead(blattSensorPin);
4
5
  if (blattSensor != blattAlt)
6
  {
7
    if (blattSensor == HIGH)
8
    {
9
      //Wenn der Sensor ein signal gibt ist ein Blatt weiter gedreht worden.
10
      //Motor dann anhalten
11
      digitalWrite(motorPin, HIGH);
12
      //Kurz warten, Motor dann wieder anschalten
13
      delay(3000);
14
      digitalWrite(motorPin, LOW);
15
    }
16
    blattAlt = blattSensor;
17
  }
18
}

: Bearbeitet durch User
von Joachim S. (oyo)


Lesenswert?

Und noch ein kurzes Kommentar dazu, wie man die einzelnen Controller 
miteinander verbinden könnte:
Wenn Du wirklich für jedes Fallblatt einen einzelnen Controller 
verwenden willst, weil Du eine skalierende Lösung willst, dann wäre 
folgendes IMHO die cleverste Lösung:

Du verbindest die einzelnen Fallblätter bzw. der Controller so, wie die 
einzelnen LEDs auf einem WS2812-RGB-LED-Streifen miteinander verbunden 
werden, und schickst die eigentlichen Daten als gewöhnliche Zeichenkette 
per UART.
Der erste Fallblattcontroller liest das erste Zeichen. Sobald er dies 
empfangen hat, leitet er den eingehenden seriellen Datenstrom 
unverändert an den nächsten Fallblattcontroller durch usw. usw.
Sobald ein bestimmtes Ende-Zeichen (z.B. ein einfaches NEWLINE) 
empfangen wurde, werden die Daten übernommen, und der Prozess beginnt 
von vorne.

Vorteile dieser Lösung:
- Auf jedem Mikrocontroller kann exakt die gleiche Software laufen, ohne 
dass jeder Mikrocontroller zumindest eine andere Adresse/ID haben muss
- Die Reihenfolge der Fallblätter kann beliebig verändert werden, es 
können einzelne Fallblätter entfernt oder ausgetauscht werden etc., ohne 
dass man irgendetwas an der Software ändern muss
- Die Fallblätter können nicht nur von jedem beliebigen Mikrocontroller, 
sondern auch von einem gewöhnlichen PC gesteuert werden, und zwar mit 
einem beliebigen Terminalprogramm

von herrschrader (Gast)


Lesenswert?

Hast du eine gute Quelle für solche Fallblattanzeigen?
Gerne auch gebraucht?

von Fabe K. (fabe1999)


Lesenswert?

Joachim S. schrieb:
> Du verbindest die einzelnen Fallblätter bzw. der Controller so, wie die
> einzelnen LEDs auf einem WS2812-RGB-LED-Streifen miteinander verbunden
> werden, und schickst die eigentlichen Daten als gewöhnliche Zeichenkette
> per UART.

Danke für diese Idee, das hört sich nach exakt der lösung an die ich 
suchte. Gibt es für diese Verbindungsart einen speziellen Namen?
Oder hättest du mir eventuell sogar einen Link?
Werde auf jeden fall diesen Pfad mal weiter verfolgen.

herrschrader schrieb:
> Hast du eine gute Quelle für solche Fallblattanzeigen?

Nein, eigentlich nicht.
Meine wurden aus einer großen Anzeigetafel als Kaputt deklariert 
ausgebaut, diese habe ich zuhause wieder reppariert.

von Einer K. (Gast)


Lesenswert?

Fabe K. schrieb:
> Gibt es für diese Verbindungsart einen speziellen Namen?
daisy chain

von Fabe K. (fabe1999)


Lesenswert?

Guten Abend alle miteinander,
Ich weiß das es eine Weile her ist nichts desto trotz wollte ich 
abschließend sagen das es tatsächlich funktioniert:

https://youtu.be/IPVxk0KE8MM

Habe es nun so gemacht das jeder Buchstabe seinen eigenen Controller hat 
und per Dasychain verbunden wurde.
Funktioniert prima.
Danke nochmal an alle Ideen.

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.