Zitat von MicroBahner
Die Ablaufsteuerung muss halt noch ein klein wenig warten .
Hallo an alle Interessierten ,
Komando zurück - die Ablaufsteuerung muss nicht warten. Sie ist schliesslich das perfekte Testobjekt für die neue Lib. D.h. es wird beides parallel entstehen. Deshalb gibt es jetzt auch die erste Version der Ablaufsteuerung, inkl. der neuen Lib .
Vorher stehen aber noch ein paar Antworten aus:
@Thomas:
Zitat von digi_thomas2003
das freut mich, wenn meine Frage was angestoßen hat.
Meine Frage war zwar in der Tat so nicht gedacht,
Tja, manchmal kann eine simple Frage ungeahnte Auswirkungen haben . Auf die Erfahrungen mit deinen Servos bin ich auch mal gespannt. Ulli hat ja auch schon ernüchternde Tests gemacht, was einfache Servos angeht.
@Wolfgang: Auch dir ein herzlich Willkommen im Club. Ich hoffe schon, dass am Ende etwas brauchbares rauskommt .
@Ulli: Deine Ergebnisse decken sich mit meinen Erfahrungen. Ich habe mir in der Bucht mal digitale Micro-Servos von Blu Bird bestellt. Sind zwar nicht der gleiche Typ wie meins, aber auch digital, und sogar mit einem Kugellager. Das 3er Set gab's für 12€. Wenn das kein Fake ist, wäre es ein super Preis. Ich werde berichten, wenn ich sie ausprobiert habe - sie sollen schon unterwegs sein .
@all:
Nun zum Stand der Dinge . Wie angekündigt, habe ich die Servolib so umgebaut, dass sie sich selbst um die langsame Bewegung der Servos kümmert. Da sie die Signale per HW erzeugt, kann sie nur 2 Servos an D9 und D10 ansteuern. Dafür sind die Impulse extrem stabil und genau.
Genutzt wird sie genau so wie die Standardlib, es gibt aber 2 zusätzliche Funktionen bezüglich der Servogeschwindigkeit. z.B:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SlowServoT1 Schranke; // SlowServoT1 ist der neue Name der Servoansteuerung und
// entspricht dem 'Servo' in der Standardlib
Schranke.attach(9); //Servo an Pin 9 ( Wie Standard Lib )
Schranke.write( 1500 ) ; // Wie Standardlib, entweder als Winkel ( 0-180 ) oder in µs
// als Pulslänge ( Werte > 700, <2300 )
Schranke.setSpeed( 3 ); // Die Geschwindigkeit ist der Wert, um den sich die Impulslänge alle 20ms ändert,
// in 0,5µs Einheiten. 3 bedeutet also, dass sich die Pulslänge alle
// 20ms um 1,5µs ändert bis die vorgegebene Lage erreicht ist
// bei 0 (default) verhält es sich wie die Standardlib.
Weg = Schranke.moving; // Der Rückgabewert zeigt an, wie weit der Servo noch vom Ziel entfernt ist, und
// zwar in % des Weges vom vorherigen write.
// 0 bedeute also, dass der Servo an der Zielposition steht.
Ich habe erstmal nur diese Funktionen im Rahmen der Ablaufsteuerung getestet. Es sind meiner Meinung nach auch die wichtigsten. Die weiteren Funktionen der Lib habe ich gar nicht verändert.
Die Lib enthält noch eine weitere Funktionalität, mit der man Leds weich an- und ausschalten kann. Auch dafür wird der Timer 1 genutzt.
1
2
3
4
5
6
SoftLedT1 Wblinker;
Wblinker.attachLed(6); // muss ein PWM-fähiger (analogWrite) Port sein
Wblinker.riseTime(400); // Zeit in ms für Auf - Abblenden
Wblinker.ledOn(); // Led geht langsam an
Wblinker.ledOff; // Led geht langsam aus
Beim Bue kann man das für einen recht realistisch wirkenden Wechselblinker nutzen.
Tja, und dann gibt es noch eine kleine 'mini-Lib', mit der man sich Zeitfunktionen einrichten kann, die wie eine Eieruhr funktionieren: Über einen Funktionsaufruf wird die Uhr 'aufgezogen', und mit einer 2. Funktion kann man abfragen, ob sie inzwischen abgelaufen ist. Damit kann man im loop sehr einfach Verzögerungen realisieren, ohne den delay() nutzen zu müssen. Der delay() blockiert den loop während der Ablaufzeit, die 'Eieruhr' nicht.
1
2
3
4
5
6
7
8
9
EggTimer blinkerT; // Eine Eieruhr einrichten
:
// im loop:
blinkerT.setValue ( 1000 ); // Uhr für 1sec aufziehen
:
if ( !blinkerT.laeuft ) {
// wird nur ausgeführt, wenn der Blinker abgelaufen ist
}
Wie man das genau nutzt, kann man im Sketch sehen
Jetzt während der Entwicklung der Software sind auch die Lib-Dateien mit im Sketch-Directory gespeichert. Wer möchte, kann sich die also auch ansehen, und gegebenenfalls auch Verbesserungsvorschläge machen.
Wem die Libs 'zu hoch' sind, und die nur nutzen möchte, schaut halt nur ins Hauptprogramm ( 1.Tab in der IDE ).
Die Ablaufsteuerung ist als kleiner Zustandsautomat realisiert. Jetzt am Anfang gibt es erstmal nur 4 Zustände, in denen sich der Bue befinden kann:
- Die Schranke ist offen
Hier sind die Ausgänge (Blinker/Glocke) inaktiv. Es wird nur der Schalter abgefragt, der das Schließen der Schranke einleiten soll. Wird dieser Schalter betätigt, wird Wechselblinker und Glocke aktiviert, und das Senken der Schranke gestartet. Der Zustand wechselt dann zu: - Die Schranke schliesst sich.
Hier wird darauf gewartet, dass sich beide Schrankenbäume in der unteren Position befinden. Ist das der Fall, wird die Glocke abgeschaltet, und der Zustand wechselt zu - Die Schranke ist zu
Der Wechselblinker ist weiterhin aktiv. Ansonsten wird wieder nur der Schalter abgefragt, der bestimmt, dass die Schranke wieder geöffnet werden soll. Wird der Schalter betätigt, wird der Wechselblinker abgeschaltet, und die Aufwärtsbewegung der Schrankenbäume gestartet. Der Zustand wechselt zu - Die Schranke öffnet sich
Hier wird wieder nur abgefragt, ob beide Schrankenbäume die Endposition 'offen' erreicht haben. Wenn ja wechselt der Zustand wieder zu 'Die Schranke ist offen' und das Spiel beginnt von vorn.
Der Zustandsautomat ist so programmiert, das - je nach aktuellem Zustand - im loop immer nur die Programmteile ausgeführt werden, die zu dem entsprechenden Zustand gehören. Im Laufe der Entwicklung werden wir noch weitere Zustände hinzufügen, um den Ablauf realistischer zu gestalten.
So, und hier nun der zugehörige Sketch: [attachment=0]BueSteuerung_V0.1-150828b.zip[/attachment]
Edit: neues Zip-File, PaSchu hat noch einen Fehler entdeckt, dankeBei Fragen, Problemen oder Vorschlägen --- nur zu, es soll ja jeder die Chance haben, das Programm auch zu verstehen und mitzugestalten.