bin neu im Forum - und in der Arduino-Community - und will gleich mit einem ambitionierten Projekt beginnen. Ich habe ein wenig Erfahrung (auch mit ein paar Arduino Übungsaufgaben) aber ich komme hier leider nicht weiter.
Aufgabe: Ich würde gern max. 16 Servos (via einem Adafruit PWM Board) mit 16 Tastern (4x4 Matrix) jeweils zwischen zwei Positionen hin- und herfahren lassen. Die Servos sollten zwischen den jeweiligen Tasterbetätigungen "stromlos" geschaltet werden, d.h. in der Zwischenzeit nicht zittern.
Den Ablauf habe ich mir so vorgestellt:
alle Servos werden zu Beginn nacheinander auf eine Grundstellung gebracht (nacheinander um eine zu hohe Stromaufnahme zu vermeiden)
wird einer der Taster gedrückt, verfährt das jeweils zugeordnete Servo auf die andere Position (z.B. 90°)
diese abweichende Position müsste sich das Programm merken, damit bei der erneuten Betätigung des spezifischen Tasters sich das Servo wieder in die Ausgangslage zurückbewegt
ElEspanol:
Servos schaltet man nicht stromlos, da sie dann keine Haltekraft haben. Servos zittern auch nicht, von Ausnahmen wie z.B. Kaputte, abgesehen.
Das würde ich jetzt mal nicht so bedingungslos unterschreiben. Das hängt sehr vom Anwendungsfall ab. Wobei 'stromlos schalten' nicht immer das Mittel der Wahl ist, oft ist es besser, den Ansteuerimpuls abzuschalten. Durch die hohe Getriebeuntersetzung gibt es schon noch eine gewisse Haltekraft. Hängt alles vom (unbekannten) Anwendungsfall und den (unbekannten) Servos ab.
… das mit der fehlenden Haltekraft verstehe ich. Der vorgesehene Einsatzzweck (Signale für die Modellbahnbahn in H0n [Maßstab 1:87]) erfordert tatsächlich nur eine zu vernachlässigende Kraft, sowohl beim Stellvorgang als auch beim Halten.
Wie kann ich die Stellung eines Servos speichern, damit bei einem folgenden Stellvorgang in die jeweils andere Position verfahren wird?
Flevo:
Der vorgesehene Einsatzzweck (Signale für die Modellbahnbahn in H0n [Maßstab 1:87]) erfordert tatsächlich nur eine zu vernachlässigende Kraft, sowohl beim Stellvorgang als auch beim Halten.
Bei dieser Anwendung ist das Abschalten der Servos in den Endlagen auch durchaus üblich.
Was die Arrays angeht, gibt's für eine erste Einführung auch in Beispiel in den Arduino Tutorials. Eine allgemeine Erklärung findest Du in der Reference.
Und das Speichern im EEPROM ist auch eine gute Idee, sodass man beim Programmstart die Pulslänge gleich an die Stellung des Servos anpassen kann. Dann gibt es keinen Einschaltruck. ( muss aber nicht gleich im ersten Anlauf sein )
Abschalten ist deutlicher Mehraufwand. Es sei denn, du machst mit einen einzigen p-Kanal Mosfet für all Servos zusammen. Dann hält sich der Hardwareaufwand in Grenzen. Dafür softwaretechnisch ansprucksvoller.
Mit Eeprom backup gibt es nicht nur keinen Einschaltruck, es stehen die Signale und Weichen auch gleich, wie sie waren. Sonst würden sie in Grundstellung fahren.
Ich weiß nicht, wie der TO das abspeichern im EEPROM machen will (wahrscheinlich nach jeder Schaltung). Da ist die begrenzte Anzahl an Schreibzyklen zu beachten.
Da würde ich eher zu einem FRAM raten. Der behält seine Info auch nach dem Ausschalten und ist wesentlich öfter beschreibbar.
Es gibt ne lib, die schreibt nur, wenn der Wert unterschiedlich ist. Und bei 16 Servos sind das nur 2 Byte, wenn man es richtig macht. Die ändern sich zwar dann bei jeder Betätigung, aber man kann ja die Speicherstellen automatisch wechseln.
Wobei es in den meisten Fällen ausreicht, einfach die Servoimpulse abzuschalten ( hat zumindest bei mir bisher immer funktioniert ) - das ist dann kein zusätzlicher HW-Aufwand. Das Abschalten der Servoversorgung kann auch zu neuen Problemen führen: Viele (einfache) Servos rucken beim Einschalten der Versorgungsspannung.
ElEspanol:
Mit Eeprom backup gibt es nicht nur keinen Einschaltruck, es stehen die Signale und Weichen auch gleich, wie sie waren.
Wobei es bei Signalen auch durchaus Vorteile hätte, wenn sie beim Einschalten erstmal auf 'HALT' stehen
Was die Lebensdauer der EEPROM's angeht: so häufig werden die Signale und Weichen üblicherweise nicht geschaltet, dass das ein Problem ist. Gegebenenfalls könte man noch mehrere EEPROM Zellen im Wechsel nutzen. Und wenn sich der Wert nicht ändert, sollte man eh' nicht schreiben.
... eine - anscheinend - kompliziertere Speicherung der Servozustände in einem EEPROM muss nicht sein. Wie ich schon am Anfang geschrieben habe, werden die Servos nach dem Einschalten nacheinander in eine definierte Position gebracht (alle Signale auf "Halt").
Bei der Nutzung werden lediglich von Zeit zu Zeit die einzelnen Signale betätigt, daher meine Idee mit "stromlos". Wenn das aber mit "Pulsfrei" funktioniert bin ich damit zufrieden.
Im Moment habe ich noch eine Hürde mit dem Befehl einen einzelnen Servo anzusprechen, um diesen gezielt zu verfahren...
Beste Grüße und vielen Dank für alle bisherigen Hinweise und Tipps!
das mit der Dokumentation hätte ich auch gedacht... Aber irgendwie hängt es mir quer. Ich hätte eher Befehle wie in der Servo-Library erwartet. Wie lautet denn die Syntax, um z.B. das Servo am Anschluss "5" auf (oder um) einen bestimmten Winkel zu bewegen? Ich habe wohl eine Blockade…
Hallo Flevo,
beim Einsatz dieses Boards muss dir klar sein, dass es nicht primär für die Ansteuerung von Servos gedacht ist ( auch wenn Adafruit es so vermarktet ). Der dort verbaute Chip wurde entwickelt, um Leds per PWM zu dimmen.
Nun ist das Steuersignal für Servos auch letzendlich ein spezielles PWM-Signal und lässt sich daher mit diesem Board erzeugen. Allerdings ist die mögliche Auflösung für Servos nicht besonders groß, so dass man sie nicht sehr feinfühlig steuern kann - für deine Signale sollte es aber ausreichen.
Auch die Adafruit-Lib ist letztendlich keine Servo-Lib, sondern eine allgemeine Lib um beliebige PWM-Signale mit diesem Board zu erzeugen. Du musst dich also damit beschäftigen, was für ein Signal die Servos benötigen: Die Wiederholzeit des Pulses muss 20ms sein, und die Pulsbreite 1-2ms.
Dieses Signal musst Du nun mit den Lib-befehlen erzeugen.
Die Wiederholfrequenz kannst Du mit mit setPWMFreq(50) auf die erforderlichen 50Hz stellen.
mit setPin() kannst Du die Länge des Pulses bestimmen, wobei 0=Puls aus ist, und 4095=voll an.
nun kannst Du ausrechenen, welche Werte für 1ms und 2ms Pulsbreite übertragen werden müssen:
1ms: 4095/ 20 = 204
2ms: 4095/10 = 409
In diesem Bereich kannst Du also Werte ausgeben, um dein Servo zu steuern.
Da viele Servos auch auf Impulslängen <1ms und >2ms noch reagieren, kannst Du gegebenenfalls auch etwas kleinere oder größere Werte ( wie in den Adafruit-Beispielen ) verwenden.
Mittlerweile läuft der Sketch zu meiner Zufriedenheit. Ich hatte ein Beispiel gefunden in dem die Ansteuerung so berechnet wird, das die Angabe des Drehwinkels möglich wird.
Gern würde ich jetzt Schaltung und Sketch derart verändern, das ich mit einem Regler (Poti) die Verstellgeschwindigkeit der Servos (für alle) beeinflussen kann. Hat einer dafür ein Beispiel? Welcher Wert muss dafür angepasst werden?
Flevo:
Gern würde ich jetzt Schaltung und Sketch derart verändern, das ich mit einem Regler (Poti) die Verstellgeschwindigkeit der Servos (für alle) beeinflussen kann. Hat einer dafür ein Beispiel? Welcher Wert muss dafür angepasst werden?
So einfach wird das nicht gehen - mit der Anpassung eines Wertes ist es nicht getan. Wenn Du ein Servo langsam bewegen willst, musst Du die Impulslänge ihn kleinen Schritten - je nach Geschwindigkeit - verändern, bis die Zielposition erreicht ist. Die Adafruit-Lib unterstützt dich da leider nicht, das musst Du im Sketch selbst machen. Wenn man dir da Tips geben soll, müsstest Du mal deinen Sketch zeigen.
Ich habe zwar für Modellbahner eine Lib geschrieben, die u.a. sowas kann. Die arbeitet aber nicht mit dem von dir verwendeten Shield sondern gibt die Impulse - wie die Standard Servo Lib - direkt an Pins des Arduino aus.