Übersetzung

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Hallo Leute,


    ich bin grad dabei das PCA9685 Servohat in Betrieb zu nehmen und hätte da mal eine Verständnisfrage:conf:.


    Ich hab den unten aufgeführten Code im Internet gefunden und kann mir nicht so wirklich erklären was genau die "Helper function" macht. Kann mir das jemand von euch mit eigenen Worten mal kurz erklären? Ich möchte gern verstehen wie bzw was die "150" bei "Servo_min" aussagt bzw wie sie zustande kommt und genauso die "600" bei "Servo_max". Also das Programm an sich funktioniert und ich weiß auch das ich innerhalb des ranges von 150 und 600 Winkel zwischen 0 und 180° anfahren kann aber ich komm nicht hinter den Zusammenhang.:wallbash:


    Vielen Dank schonmal



  • Die Funktion wird doch gar nicht verwandt. Und das ist auch besser so, denn die ist wirklich grausam kompliziert und es ist völlig unklar, was sie eigentlich bringen soll. Vergiss die einfach.


    Um doch mal zu erklären was sie tut: auf umständliche Art und Weise einen Puls in ms auf das Intervall von 0..4095 abbilden, wenn dieses Intervall 1/60 Sekunden lang ist.


    int(pulse_in_ms / 1000) / (1 / (60 * 4096)))


    erledigt das gleiche. Was einem das aber hilft, wenn man eigentlich eh nur Winkel von +/-90 auf 150-600 abbilden will, weiß der Henker.

    Edited once, last by MistyFlower59469 ().

  • Das hängt (in etwa) damit zusammen, welches Signal so ein Modellbau Servo haben möchte. Hier ist es sehr schön erklärt.

    Kurz zusammengefasst:

    - Der Servo möchte ca.(!) alle 20ms ein Signal.

    - Der Servo möchte ca.(!) 1ms für 0° Ansteuerung.

    - Der Servo möchte ca.(!) 2ms für 90° Ansteuerung.


    Daraus resultieren folgende Einstellungen für den PWM

    - Damit Du alle 20ms ein Signal schicken kannst, musst Du es mit 50Hz schicken (1 Sekunde / 20 ms = 50 Hz) - hier wurden 60 verwendet. Ist aber auch nicht sooo genau.

    - Die vollen 20ms sind bei 12Bit Auflösung der Wert 4095.

    - 1ms (für 0°) ist daher ca. 205 Digit (4095 / 20ms * 1ms)

    - 2ms (für 180°) ist daher ca. 410 Digit (4095 / 20ms * 2ms)


    Bei 60 Hz sind die 1 bzw. 2ms:

    - 1 Periode sind ca. 16,7ms (1 Sekunde / 60Hz = 16,7ms)

    - 1ms sind ca. 245 (4095 / 16,7ms *1ms)

    - 2ms sind ca. 490 (4095 / 16,7ms *2ms)


    Wenn Du also bei 50Hz 205 bzw 510 einstellst, solltest Du ca. 180° Ausschlag haben. Das gleiche gilt, wenn Du bei 60 Hz. 245 bzw. 490 einstellst.

    Die meisten Servos können deutlich mehr als 180° - deshalb wird auch oft mehr bzw. weniger Pulsweite eingestellt (wie in diesem Beispiel mit 150/600). Hier besteht allerdings die Gefahr, dass manche Servos in den Endanschlag fahren und das sollte vermieden werden.

    Das mit den 50Hz und 1 bis 2ms ist eher als Richtwert zu betrachten...


    Ich sehe es auch so wie __deets__: Diese Helper Funktion braucht man nicht. Besser man stellt die PWM selbst je nach seinen Anforderungen ein...


    EDIT: Wenn die Angaben auf Wikipedia stimmen solltest Du also mit Deinem Programm etwas über 180° Aussteuerung haben.

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup:

  • wow super vielen Dank für eure Erklärung. Ich glaube ich habe es jetzt langsam verstanden was da vor sich geht. Allerdings bin ich auch schon darüber gestolpert, das die Funktion gar nicht aufgerufen wird:conf:. Aber woher weiß Python dann das die "150" quasi 0° sind, wenn der Bezug durch die Funktion nicht gegeben ist?

  • Ich nehme mal an, Du bist noch neu in Python - ich auch ;)

    Der Code über dem def set_servo_pulse(channel, pulse): und nach der Einrückung unter der Funktion wird ja ausgeführt. Und da ist alles was Du benötigst - ich kopiere Dir mal das wesentliche raus, vielleicht ist es dann klarer:

    Heißt:

    - PWM ist immer 60Hz (Periode).

    - Zuerst Pulsweite 150 einstellen (servo_min wurde mit 150 festgelegt)

    - 1 Sekunde warten (PWM Signal wird aber weiterhin generiert)

    - Danach Pulsweite 600 einstellen (servo_max wurde mit 600 festgelegt)

    - 1 Sekunde warten (PWM Signal wird aber weiterhin generiert)

    - Endlosschleife Schleife beginnt wieder bei 150 einstellen


    EDIT: Warum 150 ca. 0° sind und 600 ca. 180° sind, habe ich in meinem letzten Beitrag zu erklären versucht...

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup:

  • ok vielen Dank.

    Um es mal Laienhaft auszudrücken, könnte ich doch jetzt auch normal über einen Dreisatz jeden Winkel von 0° bis 180° ausrechnen wenn ich weiß das 150 0° sind und 600 180°. Da das ja alles nur ungefähre Angaben sind müsste das ja passen oder?


    Ich überlege grad ob ich mir nicht einfach eine Liste erstelle mit den von mir benötigten "Servosteps" siehe unten. Das müsste doch auch funktionieren wenn ich nun nich unbedingt die Winkelangaben brauche oder?


  • Klar geht das, aber int(150 + 450 / 180 * winkel) zu rechnen ist ja nicht gerade Raketenwissenschaft.

  • wenn ich weiß das 150 0° sind und 600 180°. Da das ja alles nur ungefähre Angaben sind müsste das ja passen oder?

    Am besten Du stellst die Werte ein und misst es an Deinem Servo nach. Ich habe oben die Theorie schon erklärt und begründet, dass diese Werte mehr als 180° sein müssten. Die theoretischen Werte habe ich dort auch abgeleitet...

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup: