Forum: Mikrocontroller und Digitale Elektronik esp8266 wdt soft reset


von Andre G. (andre_g929)


Lesenswert?

hallo zusammen,

ich versuche, eine elektronisch steuerbare hühnertorklappe zu bauen. das 
ganze soll per webinterface gesteuert werden können.
um alles optimal zu machen, wollte ich das webinterface asynchron 
zugänglich machen. funktioniert soweit auch.
aber wenn ich nun im asynchronen aufruf den motor ansteuere, kriege ich 
einen wdt reset.

alles was ich dazu gefunden habe, ist, dass man in der loop-schleife 
nicht blockend programmieren sollte, weil sonst der watchdog timer einen 
reset auslöst.
gibt es eine möglichkeit, einen stepmotor non-blocking anzusteuern?
der motor soll nachher über reed-kontakte gestoppt werden, es gibt also 
interrupts, die den motorlauf unterbinden würden.

gruß,
andre

von Dieter D. (Firma: Hobbytheoretiker) (dieter_1234)


Lesenswert?

Könnte auf das hinauslaufen:
Beitrag "NodeMcu Board ständig wdt Reset"

von Stefan F. (Gast)


Lesenswert?

Andre G. schrieb:
> gibt es eine möglichkeit, einen stepmotor non-blocking anzusteuern?

Beim ESP8266 Board schwierig, denn du brächtest dazu entsprechende 
Timer, die den Motor autark ansteuern. Ich würde in diesem Fall einen 
zweiten Mikrocontroller daneben packen, der vom ESP irgendwie seriell 
Kommandos empfängt und abarbeitet (als den Motor ansteuert).

von Andre G. (andre_g929)


Lesenswert?

der motor wird von einem n2003 angesteuert. reicht der n2003 dafür?

gruß,
andre

von Stefan F. (Gast)


Lesenswert?

Andre G. schrieb:
> n2003

Unter der Nummer finde ich alles Mögliche, aber keinen Motortreiber.

Meinst du vielleicht einen ULN2003? Das ist ein passives Teil, der kann 
von alleine gar nichts.

von Andre G. (andre_g929)


Lesenswert?

korrekt, meinte uln2003.
ok. habe nun meinen sketch von async auf loop umgebaut, habe aber das 
gleiche problem.

sobald ich den motor ansteuere (TUER=ZU oder TUER=AUF im http request), 
gibt es einen wdt reset.  und ich habe derzeit nichts angeschlossen, 
also nur den esp8266 im trockenbetrieb quasi.

in der loop habe ich yield gesetzt, aber das scheint nichts zu ändern.
nur, wenn ich den motor tatsächlich nur einen einzigen step machen 
lasse, dann scheint es zu klappen. eigentlich ist der plan, die 
hühnerklappe auf bzw. zuzumachen, was mindestens eine minute dauert.

kann ich das irgendwie anders lösen?

kriege den code irgendwie nicht rein, meldet mir immer, dass spam 
enthalten ist...

: Bearbeitet durch User
von Dieter D. (Firma: Hobbytheoretiker) (dieter_1234)


Lesenswert?

Andre G. schrieb:
> kriege den code irgendwie nicht rein, meldet mir immer, dass spam
> enthalten ist...

Workaround per pastebin vielleicht?

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Andre G. schrieb:
> kann ich das irgendwie anders lösen?

Ohne Quelltext, Schaltplan und Fotos von der Leitungsführung kann man 
nur unqualifiziert raten. Ich habe keine Lust darauf, denn so etwas 
endet in der Regel mit wüsten Beschimpfungen.

Stelle du erstmal die Unterlagen zusammen, dann sehen wir weiter.

von batman (Gast)


Lesenswert?

Da nimmt man einen ganz normalen DC-Bürstenmotor mit PWM und 
Anschlag-Reed/IR/Mikroschalter oder vielleicht tuts auch schon ein 
besserer Servo.

von Stefan F. (Gast)


Lesenswert?

Ich möchte nur erwähnen, dass die Problemursache nicht zwangsläufig im 
Timing des Programms liegen muss. Es könnte auch an mangelhafter 
Leitungsführung, Stromversorgung oder Entstörung liegen.

von Andre G. (andre_g929)


Lesenswert?

Stefan ⛄ F. schrieb:
> Andre G. schrieb:
>> kann ich das irgendwie anders lösen?
> Ohne Quelltext, Schaltplan und Fotos von der Leitungsführung kann man
> Stelle du erstmal die Unterlagen zusammen, dann sehen wir weiter.

kann ich völlig nachvollziehen, aber der quelltext wird hier 
abgelehnt...
1
#include <Arduino.h>
2
#include <ESP8266WiFi.h>
3
#include <ESP8266HTTPClient.h>
4
#include <Stepper.h>
5
6
const int stepsPerRevolution = 128;
7
Stepper myStepper = Stepper(stepsPerRevolution, 2, 0, 4, 5);
8
9
10
const int motorPin1 = 2;  
11
const int motorPin2 = 0;  
12
const int motorPin3 = 4;
13
const int motorPin4 = 5;
14
15
HTTPClient http;
16
WiFiServer server(80);
17
18
void setup() {
19
  Serial.begin(9600);
20
  pinMode(motorPin1, OUTPUT);
21
  pinMode(motorPin2, OUTPUT);
22
  pinMode(motorPin3, OUTPUT);
23
  pinMode(motorPin4, OUTPUT);
24
25
  WiFi.mode(WIFI_STA);
26
  WiFi.begin(ssid, password);
27
  server.begin();
28
  myStepper.setSpeed(8);
29
30
void loop() {
31
  WiFiClient client = server.available();
32
  if (!client) {    return;  }
33
  String request = client.readStringUntil('\r');
34
  client.flush();
35
36
  if (request.indexOf( --- /TUER=ZU --- ) != -1) {
37
    yield();
38
    myStepper.step(-stepsPerRevolution);
39
    yield();
40
  }
41
  if (request.indexOf( --- /TUER=AUF --- ) != -1) {
42
    yield();
43
    myStepper.step(stepsPerRevolution);
44
    yield();
45
  }
46
47
--- ausgabe html mit links für tür auf und Tür zu.
48
  delay(1000);
49
}



edit: jetzt hat es geklappt. lag vermutlich am html-code im sketch.
edit2: verkabelung schließe ich aus, denn das verhalten tritt auch auf, 
wenn der esp8266 ohne angeschlossenen stepmotor den code durchläuft. 
aber halt nur beim schritt myStepper.step(*).
ansonsten läuft er stabil.

: Bearbeitet durch User
von batman (Gast)


Lesenswert?

Wie wärs dann mit 1 Step per Loopdurchlauf?

von Andre G. (andre_g929)


Lesenswert?

das wäre die alternative. aber dann muss ich mein konstrukt umbauen.
hab eben gelesen, dass es mit der stepper.h lib zusammenhängen kann. 
versuche mich jetzt mal am accelstepper.h. die soll non-blocking 
programmiert sein.

von batman (Gast)


Lesenswert?

Oder einfach mal ein ganzes Programm schreiben. Wie wird auf den 
Anschlagkontakt reagiert.

von Stefan F. (Gast)


Lesenswert?

Der oben gezeigte Quelltext ist jedenfalls ok. Bei HTML und String 
Klasse bekommt man ratzfatz einen Speicherüberlauf. Teilweise wegen 
Fragmentierung des Heap, teilweise weil der Stack nur 5kB für den Sketch 
frei hat.

Benutze lieber ein statisches char array mir fester Grösse, dass du 
wiederholt als Puffer zum erzeugen der HTML Fragmente verwendest. Und 
immer dran denken: Die Webseite kann stückweise übertragen werden. 
Solange die Stücke nicht kleiner als 1kB sind, leidet die Performance 
nicht.

von Andre G. (andre_g929)


Lesenswert?

vielen Dank für die Hinweise.
Habe jetzt AccelStepper in loop() eingebunden, damit klappt es ohne 
Abstürze.
Jetzt muss ich nur noch schauen, wie ich den Motor rückwärts rotieren 
lasse. (edit: klappt jetzt auch, anstatt moveTo einfach move nehmen)

gruß und vielen dank,
andre

edit: hier der code https://pastebin.com/XJDW3LaC

: Bearbeitet durch User
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.