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?
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.
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
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.
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.
Hi Zu ATtiny und Arduino als ISP kannst Du hier etwas lesen: https://www.frag-duino.de/index.php/maker-faq/37-atmel-attiny-85-mit-arduino-arduinoisp-flashen-und-programmieren http://fluuux.de/2013/12/einfuhrung-in-umgang-mit-einem-433mhz-funkmodul/ http://surasto.de/index.php?cat=Elektronik&page=Arduino http://fluuux.de/2015/08/attiny-support-unter-arduino-1-6-installieren/ http://fluuux.de/2012/09/programmieren-eines-attiny-mit-arduino-1-0-1/ http://highlowtech.org/?p=1695 https://flazer.de/blog/14/arduino-atmel-flash-station Selber habe ich dafür einen UNO 'geopfert' und mit einem ICSP-Adapter verheiratet, um die ATtiny bequem im Nullkraft-Sockel programmieren zu können. MfG
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
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 ?
> 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.
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
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?
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
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
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
Hast du eine gute Quelle für solche Fallblattanzeigen? Gerne auch gebraucht?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.