PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : While Schleife verlassen?



achso
21.06.2019, 19:40
Hallo,
aus einer while Schleife komme ich zwar herraus, aber bei einem Neustart ist immer noch die letzte Position drin.
Ein Servo wird über einen Rauftaster von 0-100° und von einem Runtertaster von 100-0° mit beliebigem Stop und Wechsel gesteuert. Das geht. Wenn ich einen 3. Taster drücke(Bremstaster) dann wird alles abgebrochen und das Servo fährt schnell auf Null. Wenn ich jetzt aber wieder die Rauftaste drücke, fängt das Servo nicht bei 0° an, sondern an der Position an der ich unterbrach. Mit "break" ist der Effekt der gleiche.


#include<Servo.h>
int pos = 0;
const int Bremstaster = 8;
Servo servo;
void setup() {

pinMode(6, INPUT);//Rauftaster
pinMode(7, INPUT);//Runtertaster
pinMode(Bremstaster, INPUT);//Bremstaster
servo.attach(9);
}
void loop() {
int val = digitalRead( Bremstaster);

if (val == HIGH)

{
servo.write(0);//Null Position
delay(200);

}
else
{

while (digitalRead(6) == HIGH && pos < 100)
{
pos++;
servo.write(pos);//Bei Tasterdruck Schritt um Schritt hoch
delay(150);
}
while (digitalRead(7) == HIGH && pos > 0)
{
pos--;
servo.write(pos);//Bei Tasterdruck Schritt um Schritt runter
delay(150);

}
}
}


Wie lösche ich die letzte Position?
Oder habe ich die völlig falsche Richtung gewählt?

Dankeschön
Achim

Searcher
21.06.2019, 20:35
Hallo,
die variable pos speichert die Position und müßte auf 0 gesetzt werden.


if (val == HIGH)

{

(hier die variable pos noch auf Null setzen)
servo.write(0);//Null Position
delay(200);

}


Gruß
Searcher

achso
21.06.2019, 21:43
Hallo Searcher,
herzlichen Dank!!!
Nun ist alles Ok.
Ich hatte mich da total in der falschen Richtung bewegt.
Super!
Schönen Abend noch
Achim

- - - Aktualisiert - - -

Nun habe ich mich aber getäuscht?
Wenn ich das 1. Mal starte, fährt das Servo schnell auf 100°. Wenn ich dann den Runtertaster drücke passiert nichts.
Wenn ich den Rauftaster drücke, fährt er schnell runter auf 0° und geht dann längsam hoch. Dann läuft es erst richtig?
Woher kommt diese Funktion.
?
Achim

Searcher
22.06.2019, 06:02
Woher kommt diese Funktion.
?


Hallo Achim,
ist es ein Arduino? Welcher?

Ich kenne mich mit damit nicht so gut aus, aber sind die Eingänge für die Taster gegen Prellen geschützt? Ich sehe auch keine aktvierten Pullup- bzw. Pulldown-Widerstände für die Taster. Da Du nach HIGH abfragst, müßtest Du externe Pulldown Widerstände haben. Eventuell haben die Eingänge bei nicht gedrückten Tastern deshalb keinen definierten Pegel.

Was bedeutet
Wenn ich das 1. Mal starte,... Nach Stromeinschalten oder erst nach erstmaligem Betätigen welcher Taste?

Gruß
Searcher

Klebwax
22.06.2019, 10:24
Wenn ich das Arduino-Konzept richtig verstanden habe (ich benutze keinen Arduino), ist das anders gedachr. Die Funktion loop() sollte alles tun, was zu einem Zeitpunkt zu tun ist, und sich dann beenden. Dann kann das Framework seine Arbeit erledigen und ruft danach loop() wieder auf. Blockierende Schleifen sollte man in der loop-Funktion also unterlassen. Ich skitziere hier mal einen möglichen Ablauf in Pseudocode



loop(){
if Taste-hoch {
pos++
} else if Taste-runter {
pos--
} else if Taste-stop {
pos = 0
}

if pos > MAX {
pos = MAX
else if pos < MIN {
pos = MIN
}
SetServo(pos)
delay(xx)
}


Das xx beim delay bestimmt, wie schnell das System reagiert. Da ein Servo so rund alle 20ms einen neuen Sollwert entgegen nehmen kann, kann man nicht schneller als diese 20ms werden. Ich kenne die Funktion servo.write(0) nicht. Wenn sie für die 20ms eines Servosignal blockiert, braucht man möglicherweise das delay() garnicht. Blockiert sie nicht sondern erzeugt das Servosignal im Hintergrund, darf man sie nicht zu schnell hintereinder aufrufen, da sonst das neue Signal das alte störtt. Wie es wirklich ist, verrät sicher die Doku.

MfG Klebwax

achso
22.06.2019, 11:10
Entschuldigung Searcher,
einmal für die ungenügende Fragestellung und besonders für meine Dösigkeit!
Ich habe einen Uno auf einer Platte. Ein Display ist immer angeschlossen.Zudem 2 Steckbretter. Die Spannungsversorgung nur über USB. Das kleine Testservo natürlich am Steckbrett, wie auch die Taster mit Pulldown 4K7. Wenn ich nun den Usb angeschlossen habe, bricht natürlich erstmal die Spannung ein. Das fiel mir dummerweise erst heute Nacht ein. Wenn ich das Servo extern versorge ist alles OK.
Sorry,
Wofür das Ganze:
Ich habe ein Tuc tuc mit Drehgriffgas. Mir schlafen beim Gasgeben immer die Finger ein. Jetzt will ich mit den Rauf/runtertastern ein Servo ansteuern, welches direkt vor der Einspritzeinstellung, also da wo der Gaszug dransitzt, platziert wird. Das Gefährt hat eine Fußbremse mit Bremslichtschalter. Auch die Kupplung hat einen Schalter, damit man nur bei getrennter Kupplung starten kann. Die nehme ich als pos 0 Funktion. Dann fährt das Servo schnell zurück. Die normale Gasfunktion bleibt also erhalten, da das Servo parallel arbeitet. Sicherheitsmäßig habe ich keine Bedenken. Das 3-Rad hat zwar noch Garantie, aber es weiß ohnehin kein Schwein wie da was funktioniert. Beziehungsweise was da verbaut ist. Zumal in Indien wohl unendlich viele Varianten gebaut werden. Die Italiener holen die Teile aus dem Container, kleben ihr Emblem drauf, beschaffen sich eine COC Betriebserlaubnis und verticken die Dinger dann selbstverständlich nur zum Selbstkostenpreis.
Danke, du hast mir sehr geholfen. Im ganzen Haus sind zwar schon für viele Funktionen Attinys verbaut, aber Ahnung habe ich nicht wirklich.
Ich wünsche Dir einen schönen Sommer
Achim

- - - Aktualisiert - - -

Danke Klebwax,
Gibt es zwischen setup und Loop noch etwas?
Im Setup gebe ich an was + wer wozu da ist.
Im Loop sind die Funktionen die sich wiederholen.
Wenn ich jetzt nach dem Setup eine Funktion nur einmal haben will, die nichts mit dem Loop zu tun hat und nur am Anfang einmal kommen soll, gibt es da was?
Achim

HaWe
22.06.2019, 11:42
hallo,
klar, in bzw. auch am Ende von setup() kannst du beliebige andere Funktionen aufrufen:


void tuirgendwas() {
Serial.println("Serial + Wire started");
}


void tunochirgendwas() {
Serial.println("bin jetzt fertig mit setup, jetzt kommt die loop!");
}


void setup(){
Serial.begin(115200);
Wire.begin();

tuirgendwas();

tunochirgendwas();
}

void loop(){

// hier wird jetzt alles in einer Endlosschleife wiederholt

}



Es ist übrigens kein mystisches "Framework" was irgendwas abarbeitet,
setup und loop sind etwa so definiert:



void setup();

void loop();

int main() {

setup();

while(true) { loop(); }

// exit main()
}

dabei ist main() als weak definiert, man kann also sogar auch eine eigene main() schreiben, das würde ich allerdings keinem Arduino- und C-Anfänger empfehlen.

Klebwax
22.06.2019, 11:46
Gibt es zwischen setup und Loop noch etwas?
Im Setup gebe ich an was + wer wozu da ist.
Im Loop sind die Funktionen die sich wiederholen.
Wenn ich jetzt nach dem Setup eine Funktion nur einmal haben will, die nichts mit dem Loop zu tun hat und nur am Anfang einmal kommen soll, gibt es da was?
Achim
Ich bin nun nicht so der große Arduino-Erklärer, ich benutze es nicht. Im Prinzip sind meine Programme aber ähnlich aufgebaut. Im Setup() wird alles das gemacht, was nur einmal am Anfang eines Programms gemacht werden muß. Dazu gehört auch die Pins einzurichten. Wenn ich in Loop() mit einer Variable und einem bestimmten Wert starten will, muß ich sie ebenfalls in Setup() setzen. Sollen meine LEDs am Anfang ausgeschaltet sein, schalte ich sie in Setup() aus. Wenn ich in verschiedenen Durchläufen der Loop einen Pin mal als Eingang und mal als Ausgang brauche, dann setze ich den Pin in Loop(). Also alles, was nur am Anfang gemacht werden soll in Setup(), alles regelmäßige in Loop().

MfG Klebwax

achso
22.06.2019, 12:14
Danke für die netten Erklärungen!
Das hilft mir bei zukünftigen Projekten weiter. Irgendwas plant man ja immer!

Erstmal mache ich jetzt einen Stromlaufplan/Verdrahtungsplan und den technischen Einbau in mein Tuc Tuc.

Geniessen wir den Sommer!
Achim