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
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).
der motor wird von einem n2003 angesteuert. reicht der n2003 dafür? gruß, andre
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.
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
Andre G. schrieb: > kriege den code irgendwie nicht rein, meldet mir immer, dass spam > enthalten ist... Workaround per pastebin vielleicht?
:
Bearbeitet durch User
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.
Da nimmt man einen ganz normalen DC-Bürstenmotor mit PWM und Anschlag-Reed/IR/Mikroschalter oder vielleicht tuts auch schon ein besserer Servo.
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.
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
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.
Oder einfach mal ein ganzes Programm schreiben. Wie wird auf den Anschlagkontakt reagiert.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.