-         

Ergebnis 1 bis 10 von 10

Thema: 18 Servos ansteuern

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    08.03.2010
    Beiträge
    66

    18 Servos ansteuern

    Anzeige

    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.

    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    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.
    #ifndef MfG
    #define MfG

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    21.05.2008
    Ort
    Oststeinbek
    Alter
    27
    Beiträge
    607
    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

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Robotniks
    Registriert seit
    13.10.2007
    Beiträge
    168
    Schau dir mal den Servo Befehl der CC-PRO an!
    18 Servos sind kein Problem...

    IDE--->HILFE--->SERVO


    Gruß

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    08.03.2010
    Beiträge
    66
    @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

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    01.11.2009
    Beiträge
    46
    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ß

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    08.03.2010
    Beiträge
    66
    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ß

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    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

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

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #9
    Benutzer Stammmitglied Avatar von KR-500
    Registriert seit
    26.12.2007
    Alter
    22
    Beiträge
    91
    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. Hier ist der Link zum Code: http://www.roboternetz.de/phpBB2/zei...vo+ansteuerung

    KR-500

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    08.03.2010
    Beiträge
    66
    @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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •