RobbyRay
14.09.2025, 16:39

Editiert von
RobbyRay
14.09.2025, 16:45

Wie programmiere ich blockbasiert mit Pybricks für eine Controller-Steuerung?

Hi
Ich habe ein Modell gebaut, was mit einem Spike Prime Hub und 6x Powered Up L-Motoren laufen soll.
Daher habe ich mir die Pybricks Lizens gekauft, die die Blockbasierte Programmierung zulässt. Die L-Motoren werden von dem Hub nur in der textbasierten Python Software von Spike Prime/Robot Inventor erkannt, da ich das aber nicht wirklich behersche und das ganze eh direkt mit einem XBox-Controller angesprochen werden soll, blieb nur Pybricks.

Nun komme ich aber nicht so ganz klar mit der Software.
Eigentlich möchte ich z.B. nur das Motor A auf dem rechten Joystick angesprochen wird, wenn ich den Joystick nach rechts oder links bewege und Motor B bei einer hoch-/runter-Bewegung des Joysticks.
Auch mit den Schultertasten habe ich so meine Probleme. Die untere, linke Schultertaste soll z.B. Motor C im Uhrzeigersinn bewegen, die obere, linke Schultertaste den Motor gegen den Uhrzeigersinn. Ähnlich soll das auch mit den restlichen Tasten funktionieren: Taste A = Bewegung in die eine Richtung, Taste B entgegengesetzt.

Gerne hätte ich auch die Funktion das alle 6 Motoren beim Start des Programms von den Werten her genullt werden, sei es das sie in beide Endpunkte fahren um dann genau auf die mittlere Position zurückzukehren oder einfach das die aktuelle Position ausgelesen und genullt wird.

Das Problem ist halt auch, das das Programm immer sofort abgebrochen wird, sobald man was falsch macht und der Controller sich dann oft disconnected.

Gibt es auch eine Möglichkeit, das man die Zeit verlängern kann, bevor der Hub und auch der XBox-Controller sich wieder ausschalten?

Wer ist hier ein Experte oder hat Ahnung von der Materie?

Dafür das das ganze Powered Up Sortiment ja mal als alles mit allem kompatibel angepriesen wurde, ist das irgendwie ein Witz. Blockbasiert werden die L-Motoren nicht erkannt, textbasiert, in der selben Software, schon. Das ist für mich sinnfrei.


Lego'ische Grüße
Henrik



Carrera124
14.09.2025, 21:03

Als Antwort auf den Beitrag von RobbyRay

Re: Wie programmiere ich blockbasiert mit Pybricks für eine Controller-Steuerung?

Ich könnte mir vorstellen, dass im Doctor Brick Forum der User "Lok24" dir weiterhelfen könnte - er hat sehr viel Erfahrung mit den Powered Up / Control+ Komponenten und auch mit PyBricks.


Grüße an meinen Stalker


MTM
15.09.2025, 05:08

Als Antwort auf den Beitrag von Carrera124

Re: Wie programmiere ich blockbasiert mit Pybricks für eine Controller-Steuerung?

Thomas "TS__" kann dir sicherlich auch helfen.
Auch bei Dr. Brick zu finden.

MTM



Technicmaster0
20.09.2025, 10:53

Als Antwort auf den Beitrag von RobbyRay

+1Re: Wie programmiere ich blockbasiert mit Pybricks für eine Controller-Steuerung?

[image]


Ungefähr so müsste das funktionieren. Ich habe den Code jetzt nicht getestet, aber für die Joysticks (deren Werte von 100 bis -100 gehen) kann man den Output direkt als Power/Speed weitergeben. Da die Leistung von -100 bis 100 geht, kann man die direkt durch den Joystick vorgeben. Für die Geschwindigkeit müsste man das ggf. erstmal mit einem Faktor umrechnen.
Die Werte der Trigger (also der "unteren Schultertasten") gehen von 0 bis 100. Hier ist es am Einfachsten, den einen Trigger minus den anderen zu nehmen. So kommt man, wenn jeweils nur einer gedrückt wird, auf einen Wertebereich von -100 bis 100, der wieder direkt als Power vorgegeben werden kann. Wenn beide gleichzeitig gedrückt werden, kann das zu etwas merkwürdigem Verhalten führen aber ich denke, dass das nicht so schlimm ist.
Die oberen Schultertasten und die Tasten wie A und B können nur gedrückt oder nicht gedrückt sein. Deshalb müssen sie mit einem "if" abgefragt werden. Theoretisch könnte man das vermutlich auch anders machen, aber ich denke so ist es am Einfachsten.

Für das erste Setup müssen natürlich Hub und Controller gepairt werden. Dafür gibt es in der Dokumentation eine Anleitung.

Der automatisch erzeugt Python Code für alle, die sich die Lizenz sparen wollen:
(Achtung! Alles unter dem while muss um vier Leerzeichen nach rechts verschoben werden und die einzelnen Zeilen unter dem if, elif und else noch mal um weitere vier Leerzeichen. Die Leerzeichen scheinen hier im Forum gelöscht zu werden).

from pybricks.hubs import PrimeHub
from pybricks.iodevices import XboxController
from pybricks.parameters import Button, Direction, Port
from pybricks.pupdevices import Motor

# Set up all devices.
prime_hub = PrimeHub()
motor = Motor(Port.A, Direction.CLOCKWISE)
motor_2 = Motor(Port.B, Direction.CLOCKWISE)
motor_3 = Motor(Port.C, Direction.CLOCKWISE)
motor_4 = Motor(Port.D, Direction.CLOCKWISE)
controller = XboxController()


# The main program starts here.
while True:
motor.dc(controller.joystick_right()[0])
motor_2.dc(controller.joystick_right()[1])
motor_3.dc(controller.triggers()[0] - controller.triggers()[1])
if Button.A in controller.buttons.pressed():
motor_4.dc(100)
elif Button.B in controller.buttons.pressed():
motor.dc(-100)
else:
motor.stop()



RobbyRay gefällt das