Die Motoren sind da. (2)
Am Ende des Kapitels 'Die Motoren sind da (1)' hatten wir ein Problem. Der Servomotor war zwar korrekt angeschlossen, aber er bewegte sich, wenn, dann vollkommen unberechenbar. Aber die korrekte Ansteuerung
unserem Programm folgend, konnten wir mit dem Multimeter nachweisen.
Es lag also an unserem Programm selbst. Die über dem Motor des Micro Servo 9g eingebaute Platine verlangt nach einer wesentlich komplizierteren Ansteuerung. Um die zumindest von ihren Anforderungen her zu
verstehen, sollte man sich den Spannungsverlauf oben anschauen.
Es soll also ein 20 ms langes Signal an den Servo geschickt werden, das für etwa 1,5 ms lang auf ca. 5 Volt angehoben wird. Bei genau 1,5 ms bleibt der Motor auf 0° stehen bzw. fährt dahin. 2 ms veranlassen
ihn zum Weg 90° nach rechts, 1 ms zum gleichen Winkel nach links.
Sie merken schon, das wird ein wenig schwieriger. Wie reagieren nun die meisten (Hobby-) Programmierer/innen darauf? Sehr viele steuern den Servomotor mit einem entsprechenden Bauteil an, dass den
Servomotor haargenau der Stellung des Drehknopfes folgen lässt.
Andere zeigen die Ansteuerung überhaupt nicht, sondern nur die Bewegung des Servomotors. Fortgeschrittenere zeigen zwar, wie sie das programmiert haben, verwenden aber in ihren Programmen die
Bibliothek Servo.h. Dann muss man sich noch einmal in die Ansteuerung dieses Programms eindenken.
Sie merken schon, wir möchten grundsätzlich gerne Zusatzprogramme umgehen. Wer weiß, wie lange sie herunterladbar sind und wohin sie sich entwickeln werden. Es gibt nämlich bei YouTube auch schon
Beschwerden, dass der Servomotor bei wiederholter Ansteuerung nicht immer das gleiche Ergebnis liefert.
Ein nicht zu kontrollierendes, weil kompiliertes Zusatzprogramm würde die Fehlersuche bzw. -korrektur deutlich erschweren. Also sind wir auf die Suche nach einer Programmierung ohne Servo.h gegangen und
sind bei einem Programm von C. Andree aus 08/2022 fündig geworden. Übrigens ob Arduino oder ATtiny spielt vom Prinzip her keine Rolle.
* es entsprechen...
* 0° = Puls 500 µs = Rechtsanschlag
* 45° = Puls 975 µs
* 90° = Puls 1450 µs
* 135° = Puls 1925 µs
* 180° = Puls 2400 µs = Linksanschlag
Herr Andree hat also zunächst die ersten 2,5 ms noch etwas genauer aufgedröselt und offensichtlich Versuche gemacht, was noch kleine Abweichungen ergeben hat. Sein Bereich geht also von 500 µs nur bis
2400 µs. Das können Sie so den ersten beiden Zeilen unten entnehmen.
int Puls1 = 500; //fixer Wert
int Puls2 = 1600; //einstellbar bis 2400
int LEDrt = 0; //entspricht Pin 5 vom ATTINY85 für LED rot
int LEDgn = 1; //entspricht Pin 6 vom ATTINY85 für LED grün
int Taste1 = 4; //entspricht Pin 3 vom ATTINY85 für Drehung links
int Taste2 = 2; //entspricht Pin 7 vom ATTINY85 für Drehung rechts
int Servo1 = 3; //entspricht Pin 2 vom ATTINY85
Was sein Programm komplizierter macht, sind die beiden LEDs. Die haben wir weggelassen, weil damit zwei zusätzliche Pins am ATtiny belegt wären, die wir brauchen, um diesen über den Arduiono ständig
mit dem Computer in Verbindung zu halten. So kommen wir mit drei Pins aus, wie man den letzten drei Zeilen entnehmen kann.
int z = 0; //Zähler für blinken der LEDs
float Tempogrenze = 6; // einstellbare V max des Servos, 4-10 ist realistisch.
float Tempo; //dynamische Geschwindigkeit des Servos, wird berechnet
float Winkel_grad;
float Winkel_rad=0;
float Sinus;
float Pulsdauer;
float Periode = 20000; //20ms bzw. 50Hz
Damit ersparen wir uns auch die Zähler für das Blinken. Auch die Geschwindigkeit, mit der z.B. Weichen gestellt werden sollen, ist uns egal. Was wir aber brauchen, ist der jeweilige Winkel, bei dem die
Weichenzungen in den Endlagen anliegen, weil wir unbedingt vermeiden wollen, dass sich die Stromstärke zu sehr erhöht und unseren ATtiny tötet.
void setup() {
pinMode(Taste1, input);
pinMode(Taste2, input);
pinMode(Servo1, OUTPUT);
pinMode (LEDrt, OUTPUT);
pinMode (LEDgn, OUTPUT);
Wir sind jetzt schon im Programm drin, wenn auch nur im Setup, wo die Grundeinstellungen vollzogen werden und die nur einmal durchlaufen wird. Von den fünf Zeilen hier brauchen wir wie schon erwähnt die
ersten drei.
//nach dem Einschalten fährt der Servo nach rechts:
for(Pulsdauer = 2400; Pulsdauer >= 500; Pulsdauer=Pulsdauer-5){
digitalWrite(Servo1,HIGH);
delayMicroseconds(Pulsdauer);
digitalWrite(Servo1,LOW);
delayMicroseconds(Periode - Pulsdauer);
}
//rote LED leuchtet:
digitalWrite (LEDrt,HIGH);
}
Das ist jetzt der Versuch, zu einer gewissen Grundeinstellung zu kommen. Natürlich kann man annehmen, dass diese Schleife in der anschließenden 'void loop()' noch öfter durchlaufen wird. Hier nur einmal,
aber gut, um sie verstehen zu lernen. Die Pulsdauer wird von einem möglichen Linksanschlag bei 2400 µs auf 500 µs in Fünferschritten heruntergefahren.
Es werden also alle möglichen Stellungen links vom Rechtsanschlag angefahren und dann der Servomotor quasi mitgenommen, bis er rechts anlangt. Nicht vergessen werden darf bei jeder um 5 µs gesenkten
Pulsdauer der fehlende Rest an den 20.000 µs, über den der Output zum Servomotor auf 'LOW' gesetzt wird.
|