Forum: Mikrocontroller und Digitale Elektronik ESP8266 lässt sich bei externer Stromversorgung nicht flashen


von Marcus (Gast)


Lesenswert?

Hallo,

ich versuche seit einigen Tagen einen ESP8266 an einen Arduino-basierten 
Roboter anzuschließen. Nachdem der, entsprechend einiger 
Internetrecherchen geplante, Erstaufbau zwar funktionierte (rote LED 
leuchtet, ESP meldet sich in der Seriellen Konsole), es aber nicht 
möglich war den ESP über die Arduino IDE (mit ESP-Erweiterung) und einen 
Arduino Uno zu flashen, habe ich seeehr viel rumprobiert und mit 
verschiedensten Konstellationen aus Stromversorgungen, 
Pull-Up-Widerständen und zusätzlichen Kondensatoren experimentiert und 
dabei einen einzigen Weg entdeckt, mit dem die Übertragung von 
Programmen zuverlässig funktioniert:
1
Leitungen vom ESP:
2
TX -> TX Arduino
3
CH_PD -> 3.3V
4
RST -> Taster -> GND
5
3v3 -> 3.3V
6
GND -> GND
7
GPIO2 -> Nicht verbunden
8
GPIO0 -> Taster -> GND (Mit 10 Ohm Pull-Up-Widerstand auf 3.3V)
9
RX -> 10K Ohm -> RX Arduino (zudem ist RX des ESP auch mit 20K Ohm auf Masse gelegt)

Die 3.3V Stromversorgung erfolgt über einen LD33V3-Festspannungsrelger, 
der Eingang ist mit 100nF und der Ausgang mit 10µF gegen Masse 
stabilisiert (entsprechend Datenblatt).

Wenn ich anstelle des 10 Ohm-Widerstandes einen 1K Ohm-Widerstand 
benutze oder zusätzlich zum Arduino eine 5V(2,5A) Stromversorgung 
anschließe (auch mit eigenständigem Betrieb des Arduinos probiert, also 
5V-Leitung zum Arduino getrennt), schlägt die Verbindung beim Versuch 
ein Programm hochzuladen mit
1
error: espcomm_open failed
fehl. Die Serielle Verbindung steht aber dennoch und es ist möglich die 
Boot-Ausgabe beim Start zu empfangen, die sich auch nach Aktivierung des 
Flash-Modes entsprechend auf
1
ets Jan  8 2013,rst cause:2, boot mode:(1,6)
ändert.

Alternativ zum 5V-Netzteil habe ich auch den Betrieb über 8 NimH-Akkus 
ausprobiert, welche über einen weiteren Spannungsregler 5V liefern, die 
Symptome waren aber die gleichen wie auch beim Netzteil.

Außerdem funktioniert ein Programm-Upload nur, solange ich den 
Flash-Taster während des gesamten Upload-Prozesses gedrückt halte (Flash 
drücken - Kurz Reset betätigen - Upload abwarten - Flash loslassen).


Hat jemand eine Idee, was hier schieflaufen könnte und warum es so eine 
starke Auswirkung hat, ob zusätzlich zum 5V-Ausgang des Arduinos eine 
externe Stromversorgung angeschlossen ist? Die Ausgangsspannung des 
Spannungsreglers habe ich kontrolliert, und die liegt unabhängig von der 
Spannungsquelle bei stabilen 3.29V.


Ich wäre über jegliche Hilfe sehr dankbar und hoffe, dass die obige 
Erklärung detailliert genug ist.

Marcus

von Max M. (maxmicr)


Lesenswert?

Hast du die Pins mal so verbunden wie hier steht? Ich dachte, dass Reset 
auf HIGH muss
https://github.com/esp8266/esp8266-wiki/wiki/Boot-Process#esp-boot-modes

von Stefan F. (Gast)


Lesenswert?

Du hast also den AVR Mikrocontroller und den ESP8266 quasi parallel an 
den USB-UART angeschlossen. Das funktioniert nur, wenn der AVR 
"deaktiviert" wird, indem du dessen Reset Eingang auf GND ziehst. Dazu 
kannst du eine Jumper auf den ISP Stecker stecken.

Zweitens sind 10k Ohm sehr viel. Bei 9600 Baud geht das sicher noch. 
Aber zum Flashen wird eine höhere Bitrate verwendet, oder nicht?

Benutze so einen Spannungsteiler, um die 5V auf 3,3V runter zu bringen:
1
USB UART                          ESP8266
2
3
(=Arduino Tx)
4
   Rx o----------------------------o Tx 
5
          
6
   Tx o---------[===]----+---------o Rx
7
(=Arduino Rx)   2,2k     |
8
                        |~|
9
                        |_| 1,5k
10
                         |
11
                         o
12
                        GND

von Michael U. (amiga)


Lesenswert?

Hallo,

Marcus schrieb:
> GPIO0 -> Taster -> GND (Mit 10 Ohm Pull-Up-Widerstand auf 3.3V)

das ist hoffentliche in Schreibfehler und sollte 10k Ohm heißen??
Ein PullUp ist da nicht zwingend nötig, ist ein interner aktiv beim 
Booten.
Zum Spannungsteiler wurde schon was gesagt, ist mit 10k/22k zu 
hochohmig.

Dicht an den ESP einen Elko 220µ von 3,3V nach GND, der reagiert sehr 
empfindlich auf Störungen der Betriebsspannung.

Flash drücken, Reset drücken und wieder loslassen und dann Flash wieder 
loslassen reicht normalerweise.
Vermutlichs stürzt der ESP wegen Problemen mit der BEtriebsspannung beim 
Flashbeginn ab und dann bootet er natürlich nicht wieder im Flashmode 
ohne GPIO0 auf L.

Gruß aus Berlin
Michael

von Marcus (Gast)


Lesenswert?

Vielen Dank für eure Rückmeldungen!


@maxmicr: Sprichst du von der Tabelle, die auf der Wiki-Seite zu sehen 
ist..? Die handelt glaube ich von einem anderen ESP8266-Modell, da ich 
einen ESP-01 habe. Und auch da steht unter UART und GPIO0 ein "L", was 
auf Low hindeutet. Oder meintest du etwas anderes..?

@stefanus: Da das Flashen problemlos klappt, solange der ESP nur über 
die 5V vom USB-Kabel versorgt wird, glaube ich nicht, dass es ein 
Problem darstellt, wenn der AVR des Arduino Unos zusätzlich an der 
Seriellen Schnittstelle angeschlossen ist. Auf den Uno ist ein 
Minimalprogramm (ohne jeglichen Code) aufgespielt, sodass dieser nicht 
dazwischenfunkt.

Außerdem sollte ich vlt. erwähnen, dass ich den ESP vor einiger Zeit 
schonmal auf einem Breadboard erfolgreich mit dem gleichen 5V-Netzteil 
betrieben hatte, und der da auch ohne Probleme über den internen 
Programmer des Arduino Unos flashbar war. Zudem bin ich mir sicher, dass 
ich letztes Mal auch nicht den Flash-Taster die ganze Zeit über gedrückt 
halten musste, also ist ziemlich sicher irgendetwas mit meinem 
momentanen Aufbau falsch.

Deinen Vorschlag für einen anders dimensionierten Spannungsteiler werde 
ich mal ausprobieren, danke!

@amiga: Nein, dies ist kein Schreibfehler. Ursprünglich war ein 10K Ohm 
Widerstand vorgesehen, allerdings hatte ich in die Schaltung aufgrund 
einer Verwechslung versehentlich 10 Ohm eingebaut, womit das Flashen wie 
oben beschrieben auf spezielle Weise auch funktionierte. Nach Korrektur 
des Fehlers durch Verwenden eines 1K Ohm Widerstandes war ein Flashen 
allerdings nicht mehr möglich...

Ein Anschließen eines Elkos direkt vorm ESP habe ich bereits erfolglos 
probiert, allerdings habe ich nur welche mit einer Kapazität von bis zu 
100µF.

Wie gerade beschrieben war es mir früher bereits möglich den ESP mit der 
von dir genannten Weise korrekt in den Flash-Mode zu versetzen, ich weiß 
nicht, warum dies bei der neuen Schaltung nicht mehr funktioniert. An 
einem einmaligen Reset beim Flashvorgang liegt es denke ich nicht, da 
der Uploadvorgang auch sofort abbricht, sobald ich den Flash-Button 
loslasse.


Danke für eure zahlreichen Tipps, ich werde mit verschiedenen 
Korrekturen und Variationen der Schaltung in Kürze weiter 
experimentieren, sobald ich die Zeit dazu finde, und dann berichten.

Marcus

von Philipp H. (hansimglueck2)


Lesenswert?

Wenn du am arduino ne brücke von gnd nach reset machst und dann tx nach 
tx und rx mit 10k nach rx fungiert der arduino als usb serial wandler 
und du musstest den esp flashen können

von Sven S. (sven_s370)


Lesenswert?

Also das mit dem Arduino als USB Seriel Wandler sollteste vergessen.
Nim eine USB Serial Wandler mit FTDI drauf, der 3.3V kann. Den ESP musst 
du auf jedenfall mit einer eigenen Spannungsversorgung mit midestens 1A 
verwenden.
Habe mir bei in der bucht mal so 3.3 Volt Module gekauft die sind 
Spannungsmässig nach einiger Zeit eingebrochen.

Das mit den Arduino als USB Serial wandler ist zwar auch schön und gut, 
hat aber ein entscheidenen fehler. Die RS232 bei 115200 Baud und 16MHZ 
kann massive übertragungsfehler verursachen (Siehe Datenblatt RS232). 
Ich habe es mit 2 Arduino Leonardo getestet. Bei einem geht es , bei dem 
anderen nicht.

Also 50/50.

Hier ist auch eine Seite mit der ausenbeschaltung.

http://www.xess.com/blog/esp8266-reflash/

Damit habe ich an die 20 ESP Schon geflashed, und das ohne probleme.
Hier ist jedoch gesagt, man sollte nicht den 3.3 Volt vom FTDI nehmen.

von Stefan F. (Gast)


Lesenswert?

Schau Dir mal den Schaltplan vom Arduino Uno an. Da sind bereits 
Widerstände zwischen dem USB-Chip und der externen Stiftleiste. Die 
musst du in deinem Schaltungsdesign berücksichtigen. Ich hatte Dir 1,5k 
Ohm empfohlen, davon musst du die bereits vorhandenen 1k Ohm 
subtrahieren.

Weiterhin solltest du bedenken, dass der Bootloader den seriellen Port 
aktiviert und in diesem Zustand belässt. Ein "nackter" AVR startet 
hingegen mit deaktiviertem seriellen Port, so dass diese Pins als 
Eingang konfiguriert sind.

Wenn du mal das diesem Thema Googelst, wirst du feststellen, dass 
praktisch alle Tutorial dringend dazu raten, ein Kabel mit FTDI Chip zu 
verwenden. Die schreiben das sicher nicht ohne Grund - sie hätten ja 
auch den Arduino dazu nutzen können, der ohnehin auf dem Tisch liegt.

Ich habe meine ESP-01 Module mit einem alten Nokia Datenkabel 
aktualisiert, in dem befindet sich ein PL2303 Chip. Diese alte Version 
des Chips wird vom Windows 7-10 Treiber nicht mehr Unterstützt, aber 
unter Linux funktioniert er einwandfrei. Es muss also nicht unbedingt 
ein Chip von FTDI sein.

Aber der Ratschlag, dazu nicht den Arduino zu verwenden, ist sicher 
sinnvoll.

Hast du einen Arduino Nano? Wenn ja, dann betreiben ihn mit 3,3V und 
stecke einen Reset-Jumper auf den ISP Stecker. So kannst du dessen FTDI 
Chip verwenden.

von Stefan F. (Gast)


Lesenswert?

Oh, sorry. Ich sehe gerade, dass ich ganz oben bei meinem 
Spannungsteiler Vorschlag die beiden Widerstände vertauscht habe.

So soll es sein:
1
USB UART                          ESP8266
2
3
   Rx o----------------------------o Tx 
4
          
5
   Tx o---------[===]----+---------o Rx
6
                1,5k     |
7
                        |~|
8
                        |_| 2,2k
9
                         |
10
                         o
11
                        GND
Wobei auf deinem Arduino Board schon 1kΩ vorhanden sind, also nimmst du 
510Ω und 2,2k Ohm.

von Marcus (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

entschuldigt bitte, dass ich mich erst jetzt zurückmelden kann. Da ich 
leider gerade keinen (funktionierenden) FTDI-Programmer oder etwas, was 
man dafür zweckentfremden könnte, hier habe, habe ich erstmal weiter 
versucht den Flash-Vorgang über meinen Arduino durchzuführen, was 
entsprechend dieser Anleitung, ja auch möglich sein sollte (und bei mir 
auch schonmal geklappt hat):
http://www.arduinesp.com/blink-manual-flash

Ich habe den nicht funktionalen Aufbau von meiner Leiterplatte nun 
nochmal auf dem Breadboard nachgebaut und diesmal versucht die 
Widerstände des Spannungsteilers so zu wählen, dass ich mit den hier 
vorrätigen ungefähr an die von stefanus empfohlenen Werte komme.
Zudem habe ich den PullUp-Widerstand am GPIO0 nun testweise komplett 
weggelassen.

Die entsprechende Beschaltung findet ihr im Anhang.

Und siehe da - es funktioniert! :-)
Jetzt ist es auch möglich bei externer 5V-Stromversorgung einen 
Programmupload durchzuführen und auch der Flsh-Taster muss nicht mehr 
gedrückt gehalten werden.

Vermutlich lag es tatsächlich am dem völlig überdimensionierten 
Spnnungsteiler oder der PullUp-Widerstand an GPIO0 hat da Mist 
angestellt.

Ich versuche die Schaltung auf meiner Leiterplatte nun nochmal so 
anzupassen, dass sie dem Aufbau auf dem Breadboard genau entspricht, 
dann müsste es ja eigentlich funktionieren...

Danke für eure Hilfe! :-)

von Marcus (Gast)


Lesenswert?

So, ich habe die Leiterplatte nun entsprechend angepasst (sihe 
Schaltplan vom vorherigen Post) und nun funktioniert das Flashen 
komplett wie gewünscht. :-)

Also falls jemand an dem gleichen Problem verzweifelt und nur einen 
Arduino Uno zur Hand hat, ich kann bestätigen, dass der oben genannte 
Schaltplan korrekt funktioniert, und bislang hat noch nichts Feuer 
gefangen. :D

Marcus

von Daniel B. (Gast)


Lesenswert?

Nach mehreren Stunden des Probierens war das hier die Lösung!
Danke!

Daniel

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.