Archiv verlassen und diese Seite im Standarddesign anzeigen : serial.println blockiert Stepper
Hallo,
hier mein StepperCode:
#include <CustomStepper.h>
CustomStepper stepper(8, 9, 10, 11);
boolean rotate1 = false;
void setup()
{
Serial.begin (9600);
stepper.setRPM(12); // Drehzahl
stepper.setSPR(4242); // Schritte pro Umdrehung, hier für den 28BYJ-48
}
void loop()
{
if (stepper.isDone() && rotate1 == false)
{
stepper.setDirection(CCW); // Drehrichtung (CW, CCW, and STOP)
stepper.rotate(10);
rotate1 = true;
}
// Serial.println ("ok");
stepper.run();
}
Mit diesem Code macht der Stepper prima seine 10 Umdrehungen.
Sobald ich aber die Zeile
Serial.println ("ok");
scharf mache und sonst nichts ändere, dreht sich nichts mehr. Es steht nur ein Ausgang des Treibers fest an.
das ändert sich auch nicht nach einem RESET oder mit "Serial.print ("ok");
Wie ist das möglich?
Kenne mich zwar mit Arduino nicht aus, aber bei der Verwendung fertiger Bibliotheken schaue ich mir generell die mitgelieferten Beispiele an. In dem Fall springt mir sofort ins Auge, dass in den Arduino-Beispielen hinter Serial.begin() mit
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
} gewartet wird, dass die Initialisierung der seriellen Schnittstelle fertig ist. Vielleicht hilft das in deinem Fall auch?
Irgendwie scheint es damit zu tun zu haben. Wenn ich dann aber weiter Prints einfüge, um den Programmablauf zu überprüfen, ist das Problem wieder da; besonders, wenn diese Befehle in dem kleinen Programm bei jedem Schleifendurchlauf an die USB SS gesendet werden müssen.
Wenn ich die Prints jedoch durch ein if nur alle 100 ms ausführen lasse, dann klappt es. Bei 10 ms aber wieder nicht. Ob das dann bei einer Fehlersuch reicht , ist noch die Frage.
vG
fredyxx
Rabenauge
02.05.2016, 22:12
Hm, das klingt nach nem Timing-Problem.
Die Stepper-Lib. scheint auf nen anständiges Timing angewiesen zu sein (nutzt ja keinen echten Timer), wenn du da ewig mit der seriellen Schnittstelle herummährst, klappt das nicht.
Stell mal die Baudrate auf nen anständigen Wert rauf, die 9600er bremst so ziemlich allen Kram aus.
Peter(TOO)
02.05.2016, 22:45
Hallo fredyxx,
Irgendwie scheint es damit zu tun zu haben. Wenn ich dann aber weiter Prints einfüge, um den Programmablauf zu überprüfen, ist das Problem wieder da; besonders, wenn diese Befehle in dem kleinen Programm bei jedem Schleifendurchlauf an die USB SS gesendet werden müssen.
Wenn ich die Prints jedoch durch ein if nur alle 100 ms ausführen lasse, dann klappt es. Bei 10 ms aber wieder nicht. Ob das dann bei einer Fehlersuch reicht , ist noch die Frage.
9'600 Baud sind etwa 1'000 Zeichen/s, also 1ms für ein einzelnes Zeichen.
Serial.println ("ok");
sendet 4 Zeichen (Die beiden Buchstaben plus CR und LF).
Da ist die Routine schon mal 4ms beschäftigt.
Ist aber immer auch eine Frage wie die Bibliothek implementiert ist! Wenn der ganze Ablauf über Interrupts gelöst ist, funktioniert es recht gut im Hintergrund.
Mit Polling wird halt alles ausgebremst.
MfG Peter(TOO)
Hm, das klingt nach nem Timing-Problem.
Stell mal die Baudrate auf nen anständigen Wert rauf, die 9600er bremst so ziemlich allen Kram aus.
Was ist anständig?
Kurz gesagt: Die run() Methode muss innerhalb eines bestimmten Zeitfensters aufgerufen werden.
Die Zeitfenster ist kleiner als : 60000000.0/SPR/RPM µs also bei deinem Code 1179 µs.
Abzüglich Rechenzeit der Bibliotheksfunktionen müsstest die loop() mind. jede Millisekunde aufgerufen werden.
Rabenauge
02.05.2016, 23:18
So schnell es geht?
Meine Güte- die IDE macht bis mindestens 115200 Baud mit-wieso rödelst du in nem zeitkritischen Programm dann mit 9600 rum?
Und zeitkritisch ist es, da der run()-Aufruf so oft wie möglich benutzt werden sollte. Diese Verrenkung (sowas löst man normal über nen Timer) wurde nur gemacht, um keinen Timer zu belegen. Aber besser wirds davon dann nich, im Gegenteil: _das_ kann nur funktionieren, wenn du das Programm wirklich schnell laufen lässt.
Hm, eventuell könnte man da nachbessern: die Timer-Bibliothek benutzen, um sicher zu stellen, dass run() zyklisch aufgerufen wird.
Kannst auch die Gegenprobe machen: bau mal in die Hauptschleife ein delay() ein, und schau, bis zu welcher Verzögerung es _noch_ funktioniert.
Dann weisst du auch, wie schnell die Hauptschleife abgearbeitet werden muss.
Wenn es _gar_ nicht geht, überleg dir eine andere Strategie:
Beispielsweise ist es recht unsinnig, andauernd "ok" zu senden. Viel Zeit kannst du sparen, wenn du, wenns läuft, gar nix sendest, und nur, wenn irgendwas _nicht_ klappt, ne Debug-Meldung schickst.
Hallo,
wenn ich im Gerätemanager und im Serial.begin -Befehl auf 19200 stelle, klappt das Hochladen immer sofort.
Bei meinem Stepperprogramm läuf das Programm selber aber nicht mehr. Auch nicht nach Arduino - und PC Neustart.
Mit dem Blinkprogramm läuft zwar das Programm (PIN 13 blinkt), aber wenn ich mir den PIN im Seriellen Monitor ansehe,
erscheint dort statt einer 0 ein :ø (Dopppelpunkt mit Durchschnittszeichen) und für eine 1 ein Quadrat mit einem
seltsamen kleinen b und p übereinander geschrieben.
Also was stimmt da nicht?
Gruß
fredyxx
- - - Aktualisiert - - -
So schnell es geht?
Kannst auch die Gegenprobe machen: bau mal in die Hauptschleife ein delay() ein, und schau, bis zu welcher Verzögerung es _noch_ funktioniert.
Dann weisst du auch, wie schnell die Hauptschleife abgearbeitet werden muss.
Wenn es _gar_ nicht geht, überleg dir eine andere Strategie:
Beispielsweise ist es recht unsinnig, andauernd "ok" zu senden. Viel Zeit kannst du sparen, wenn du, wenns läuft, gar nix sendest, und nur, wenn irgendwas _nicht_ klappt, ne Debug-Meldung schickst.
Klappt auch bei einer Mikrosekunde und 9600 nicht mehr.
i.O. bei 57600 bis 700 Mikro, aber im Monitor erscheinen die falschen Zeichen
i.O. bei 128000 bis 1400 Mikro darüber wird der Stepper lauter, aber im Monitor erscheinen die falschen Zeichen
dein 2. Satz ist wohl der richtige Tipp. Wo kann ich was über die Debug-Meldung finden?
Gruß
fredyxx
Rabenauge
03.05.2016, 07:22
Du weisst schon, dass du in der Konsole die richtige Baudrate auch einstellen musst?
Unten, rechts glaub ich...
Und bitte: nimm nicht irgendwelche frei erfundenen Geschwindigkeiten (obwohl das theoretisch auch funktionieren sollte), schau unten in der seriellen Konsole, welche voreingestellten es gibt, die sollten auch wirklich gehn).
Den Test mit dem delay() meinte ich natürlich so, dass du die serielle ausgabe weg lässt dabei, sonst hast du ja zwei Verzögerungen (das delay() und die Ausgabe).
Ne Debug-Meldung, die schon fertig ist, wird es nich geben, die musst du dir schon selbst machen.
Beispielsweise so:
if(alles läuft)
{
debug=0;
}
if(debug != 0)
{
serial.println("wir haben Probleme!");
debug=1;
So wird immer dann ne Meldung abgeschickt, wenn allesLäuft false liefert, ansonsten einfach- nichts.
Was meinst du mit Konsole?
Ich stelle die Geschwindigkeiten über den Gerätemanager im Treiber (Eigenschaften >> Anschlusseinstellungen) der USB-SS ein (WIN10). Das scheint ja auch zu funktionieren, denn das Hochladen klapt ja immer ohne Probleme.
Gruß
fredyxx
- - - Aktualisiert - - -
Und dort sind auch die möglichen Geschwindigkeiten vorgegeben. Also nicht irgendwelche!
nikolaus10
03.05.2016, 10:09
???
Die Methode ist mir neu.
Wird dann nicht jedesmal wenn die serielle Schnittstelle angesprochen wird
die Geschwindigkeit veraendert ?
73
Nein, die Einstellung bleibt erhalten. aber noch mal die Frage: was meinst du mit Konsole?
Gruß
fredyxx
- - - Aktualisiert - - -
Ne Debug-Meldung, die schon fertig ist, wird es nich geben, die musst du dir schon selbst machen.
Beispielsweise so:
if(alles läuft)
{
debug=0;
}
if(debug != 0)
{
serial.println("wir haben Probleme!");
debug=1;
Was meinst du mit alles läuft?
Peter(TOO)
03.05.2016, 12:40
Hallo,
Die Methode ist mir neu.
Wird dann nich jedesmal wenn die serielle Schnittstelle angesprochen wird
die Geschwindigkeit veraendert ?
Seit je her kann man im Windows-Treiber die Default-Baudrate, und anderen Parameter, einstellen.
Wenn man also COMx: aufmacht, wird diese mit diesen Werten initialisiert und das Programm muss dies nicht tun.
Unter DOS kann man mit
COPY CON: COM1:
Alles von der Tastatur zur COM1: Schnittstelle senden. Schnittstellen-Parameter sind dann entweder das, was im Gerätetreiber eingestellt ist oder was mit
MODE .....
eingestellt wurde.
Normalerweise setzt aber heute jedes Programm die Parameter selbst.
Der Download funktioniert, weil der Loader die Schnittstelle mit seinen Werten initialisiert.
Der Fehler liegt nun darin, dass er am PC eine andere Rate einstellt, aber nicht in seinem Programm.
MfG Peter(TOO)
Der Fehler liegt nun darin, dass er am PC eine andere Rate einstellt, aber nicht in seinem Programm.
MfG Peter(TOO)
Das ist mir nicht klar. Ich stelle doch am PC und mit dem Befehl " Serial.begin (9600);" im Programm die Baudrate ein. Wo kann/muss ich die denn sonst noch verstellen?
Ist mit Konsole das DOS-Fenster gemeint?
Gruß
fredyx
Mit diesem Code macht der Stepper prima seine 10 Umdrehungen.
Sobald ich aber die Zeile
Serial.println ("ok");
scharf mache und sonst nichts ändere, dreht sich nichts mehr. Es steht nur ein Ausgang des Treibers fest an.
das ändert sich auch nicht nach einem RESET oder mit "Serial.print ("ok");
Wie ist das möglich?
so gehts aber auch (die pins für den stepper musste ich anpassen...
#include <CustomStepper.h>
CustomStepper stepper(23, 25, 27, 29);
boolean rotate1 = false;
void setup()
{
Serial.begin (9600);
stepper.setRPM(12); // Drehzahl
stepper.setSPR(4242); // Schritte pro Umdrehung, hier für den 28BYJ-48
}
void loop()
{
if (stepper.isDone()) // && rotate1 == false)
{
stepper.setDirection(CCW); // Drehrichtung (CW, CCW, and STOP)
stepper.rotateDegrees(10);
Serial.println ("ok");
// rotate1 = true;
}
// Serial.println ("ok");
stepper.run();
}
Peter(TOO)
03.05.2016, 17:48
Hallo fredyx,
Das ist mir nicht klar. Ich stelle doch am PC und mit dem Befehl " Serial.begin (9600);" im Programm die Baudrate ein. Wo kann/muss ich die denn sonst noch verstellen?
Die Übertragungstrecke besteht aus zwei Sendern/Empfängern, je einer an den Enden des Kabels.
Einer steckt in deinem Arduino und der andere im/am PC.
Diese muss man getrennt voneinander auf die selben Übertragungsparameter einstellen.
Beim Arduino werden die Parameter aus dem Oszillator der CPU abgeleitet, da müssen auch noch die richtigen Werte für FCPU eingestellt sein.
Ist mit Konsole das DOS-Fenster gemeint?
Mit Konsole ist das Programm gemeint, welches die Daten von der seriellen Schnittstelle auf dem Bildschirm anzeigt, auch Terminal genannt.
Diese Programm hat halt auch irgendwo eine Einstellung der Übertragungsparameter, welche deine Einstellungen im Treiber überschreiben.
MfG Peter(TOO)
Rabenauge
04.05.2016, 08:56
Klingt als würdest du eines der praktischsten Tools der Arduino-IDE gar nicht kennen?
Wenn du den Editor offen hast, ist oben rechts ne kleine Lupe- die öffnet (nur bei angeschlossenem Board) ne Art Konsole, in der alles Darstellbare angezeigt wird, was mit Serial.() rausgeschickt wird.
Diese Konsole wiederum hat unten (rechts, glaub ich) nen Auswahlfeld für die Baudrate.
Die dort vorgegebenen Werte sind allerdings nicht in Stein gemeisselt, man kann auch per Hand durchaus andere Werte eingeben, aber zum debuggen genügen die.
Klingt als würdest du eines der praktischsten Tools der Arduino-IDE gar nicht kennen?
Wenn du den Editor offen hast, ist oben rechts ne kleine Lupe- die öffnet (nur bei angeschlossenem Board) ne Art Konsole, in der alles Darstellbare angezeigt wird, was mit Serial.() rausgeschickt wird.
Diese Konsole wiederum hat unten (rechts, glaub ich) nen Auswahlfeld für die Baudrate.
Die dort vorgegebenen Werte sind allerdings nicht in Stein gemeisselt, man kann auch per Hand durchaus andere Werte eingeben, aber zum debuggen genügen die.
Hallo
ich hatte nun Zeit, das noch mal zu testen. Hier das Ergebnis:
die Verwirrung kam daher, dass ich die Konsole, wie sie hier bezeichnet wird, nur als Serieller Monitor kannte. Ist nun aber klar.
Die Einstellung der Baudrate unten rechts in der Konsole habe ich auch gefunden und es klappt auch mit 250.000.
Die Einstellung im Gerätemanager spielt da offensichtlich keine Rolle. Die steht trotzdem bei 9.600
Gruß
fredyxx
Rabenauge
09.05.2016, 17:53
Wen interessiert der Gerätemanager?
Stell beim Arduino (in der Software, die drauf löuft) die Baudrate hoch, stell sie in der Konsole genauso ein und das wars.
Um weiteres musst du dich da überhaupt nicht kümmern.
Wen interessiert der Gerätemanager?
Stell beim Arduino (in der Software, die drauf löuft) die Baudrate hoch, stell sie in der Konsole genauso ein und das wars.
Um weiteres musst du dich da überhaupt nicht kümmern.
Nichts anderes Hatte ich ja geschrieben.
Gruß
fredyxx
Peter(TOO)
11.05.2016, 00:16
Hallo fredyxx,
Die Einstellung im Gerätemanager spielt da offensichtlich keine Rolle. Die steht trotzdem bei 9.600
Die Einstellung im Gerätemanager ist noch ein Relikt aus DOS-Zeiten und kann heute vergessen werden.
MfG Peter(TOO)
nikolaus10
11.05.2016, 08:39
Nichts anderes Hatte ich ja geschrieben.
Gruß
fredyxx
Ich auch :)
73
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.