PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 18 Servos ansteuern



MechMac
08.03.2010, 18:32
Hallo,

ich möchte einen Roboter mit 6 Beinen bauen. Als Controller habe ich eine C-Control Pro mit einem Atmega 128.

Nun habe ich ein generelles Problem.

Die Servos werden ja mit nem Puls zwischen 500 und 2500 µs zwecks positionierung angesprochen. Und das alle 20ms.

Ich habe 18 Servos und möchte sie in Mittelstellung bringen. Also 1500µs.

18 * 1500µs = 27000µs

Das ist ja nun offensichtlich zu viel.
Was kann ich also tun? Das Problem muss sich ja irgendwie umgehen lassen, andere können ja auch Hexabots bauen, die funktionieren. :-b

Ich habe schon versucht das programmtechnisch zu lösen, in dem ich immer abwechselnd 3 Beine ansteuere. Das klappt aber irgendwie nicht. (Vielleicht mache ich das ja auch falsch???)


Wer kann mir da näheres zu sagen?

Gruß, MechMac

Jaecko
08.03.2010, 19:04
Naja ein "Trick" hier ist schon mal, dass die Servos nicht nacheinander, sondern parallel angesteuert werden. Dann hat sich dieses Zeitproblem schon mal von selbst gelöst.

yaro
08.03.2010, 20:12
Ich habe ein ASM Programm geschrieben, mit dem ich bei einem ATmega644 mit 20MHz die 18Beine mit einer Genauigkeit von 0.3° ansteuern kann und dabei nur 14/20 der Zeit dafür verwende, Rest bleibt für Rechenleistung.
Alternativ geht auch 17/20, allerdings mit einer Genauigkeit von nur 1°.
Kann dir das Prog schicken, wenn du willst.
Alternativ kannst du einen fertigen Servo-Controller verwenden.

Gruß, Yaro

Robotniks
08.03.2010, 20:38
Schau dir mal den Servo Befehl der CC-PRO an!
18 Servos sind kein Problem...

IDE--->HILFE--->SERVO


Gruß

MechMac
08.03.2010, 22:02
@Jaecko
Das bedeutet also auch das z.B. zwei Servos am selben Port hängen?

@yaro
Das klingt verlockend, nur leider kann ich kein Assembler, ich könnte das Programm also gar nicht anpassen. Trotzdem Danke.

@Robotniks
Den Befehl nutze ich ja bereits, mein Problem ist kein spezielles C-Control Problem. Das Problem ist das die Signale für die 18 Servos zu lang sind, ich habe nur 20ms und wenn ich 18 Servos gleichzeitig ansteuern will dürfte ich nur auf etwa 1000µs gehen(18*1000µs=18000µs=18ms<20ms), das wäre nicht mal die Mittelstellung.



Gruß, MechMac

Waldschrat
09.03.2010, 11:44
Ich denke dass das genau dass ist was Jaecko gemeint hat... sende nicht die einzelnen Signale hintereinander sondern parallel (also pro Servo auf einem Pin und das gleichzeitig)...
ASM lernen lohnt sich immer, schon allein des Verständnisses wegen.
Gruß

MechMac
09.03.2010, 16:26
Oh, das war ein Fehler meinerseits. Ich meinte nicht mehrere Servos an einem Port, sondern mehrere Servos an einem PortBIT. Das sie sich quasi ein Signal Teilen...das ein Pin mehrfach abgegriffen wird.

Aber ich denke ihr meint wohl eher das weiterhin pro Servo ein Pin belegt sein soll und das Signal auf mehrere Pins gleichzeitig ausgegeben wird.

Da muss ich mal sehen ob die C-Control das kann... Jedes andere Board ja, aber die C-Control...ich weiß ja nicht.

Ich werde es umgehend testen.

Gruß

radbruch
09.03.2010, 17:15
Hallo

Es geht natürlich weiterhin um 18 Servos an 18 Pins. Wobei man auch zwei oder mehr Servos mit einem Pin ansteuern kann, wenn man das mal benötigen sollte.

Ich würde vermeiden alle Servoimpulse gleichzeitig zu starten. Ein Servo aktuallisiert seine Position, wenn es einen neuen Impuls erhält. Wenn alle Servos gleichzeitig ihren Impuls erhalten, korrigieren alle ihre Position gleichzeitig! Das erzeugt extreme Stromspitzen. Besser ist es, die Impulsstarts innerhalb des 20ms-Fensters zu verteilen.

Bei 18 Servos könnte man die Servos in zwei Gruppen aufteilen. Je Gruppe würde die Summe der maximalen Impulslängen die 20ms-Hürde nicht nehmen. Und 9 Servopositionen in einer ISR zu berechnen sollte ein schnell getackteter ATMega locker schaffen. Als Ansatz vielleicht ein Timer1 im CTC-Mode, Kanal A+B mit ihren Comp-ISRs steuern jeweils eine Servogruppe entweder mit gemeinsamen Impulsstart nach dem Wiki: Servo oder man taktet nacheinander (da habe ich grad kein Beispiel zu).

In Bascom könnte man vielleicht diesen Ansatz von Willa "aufbohren":
S ervoansteuerung (http://www.rn-wissen.de/index.php/Servoansteuerung)

Naja, je länger man drüber nachdenkt: Eine ISR würde auch reichen, wenn sie die Gruppen im Wechsel bedient.

Gruß

mic

KR-500
09.03.2010, 21:21
Hi

ich hab mal den Servo Code aus dem Wiki auf 10 servos ausgeweitet, man kann ihn bestimmt noch weiter verbessern aber vielleicht hilfts dir ja. O:) Hier ist der Link zum Code: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=49783&highlight=servo+ansteuerung

KR-500

MechMac
10.03.2010, 19:29
@KR-500
Die C-Control kann leider nur Compact-C verarbeiten, aber zum lernen ist der Code supi. Danke für den Link.

@All
Ich habe es endlich geschafft zwei Servos parallel anzusteuern. Dazu habe ich mich von dem vorgefertigten Servo_Set - Befehl entfernt und das Ganze über Interrupts und der Ausgabe eines Byte-Wertes für den ganzen Port realisiert.

War viel Arbeit bis ich da gedanklich drin war, aber nun ist mir die Sache um einiges klarer. Mit dieser Erkenntnis kann ich nun weiter machen.

Gruß, MechMac