Zwei Motoren mit Python

Ich will zwei Motoren per Python ansteuern. Ich habe sie verkabelt und mit dem folgenden Programm
motors_working_open_roberta-
kann ich sie mit OpenRoberta programmieren/fahren lassen.

Jetzt will ich das gleiche in Python machen.

Meine Beobachtungen sind dabei:

Der folgende Code lässt Motor B voll drehen:

>>> pin28.write_digital(1)
>>> pin29.write_digital(0)
>>> pin30.write_digital(1)

dieser Code lässt Motor B langsam drehen – und gleichzeitig beginnt der Lautsprecher nervig zu knacken:

>>> pin28.write_digital(1)                                                                                                          
>>> pin29.write_digital(0)                                                                           
>>> pin30.write_analog(200)                                                                          

dieser Code lässt Motor A langsam drehen – auch hier wieder mit Knacken:

>>> pin28.write_digital(1)                                                                          
>>> pin30.write_digital(0)                                                                          
>>> pin29.write_analog(300)                                                                         

Wenn ich beide Motoren gleichzeitig laufen lassen iwll, dann kann ich aber nicht einfach folgendes machen

>>> pin28.write_digital(1)                                                                                                          
>>> pin29.write_analog(200)
>>> pin30.write_analog(200)                                                                                                         

dann dreht sich kein Motor und es knackt leise.
(Ich nehme an, weil die beiden Pins genau identische PWM Signale abgeben (also was Timing und Amplitude angeht) und so beide Motoren bremsen, wenn beide pins auf HIGH sind.)

So weit ich verstehe, muss ich, um beide Motoren gleichzeitig zum Drehen zu bringen, diese abwechselnd schalten.
Das wird auch hier diskutiert.

Was man ad hoc machen kann, ist so ewtas:

>>> while True:                                                                                                                     
...     pin29.write_digital(1)                                                                                                      
...     pin30.write_digital(0)                                                                                                      
...     pin29.write_digital(0)                                                                                                      
...     pin30.write_digital(1)                                                                                                      

Damit drehen sich beide Motoren und man bekommt ein Fiepen.

Meine Fragen:

  1. Geht das noch besser in Python?
    (Also so, dass ich nicht im Main-Loop die ganze Zeit Motorsignale toggeln muss.)
  2. Kann ich die Geräusche abstellen?

Ich habe jetzt mal einen „Software-PWM“ implementiert, bei dem die Methode aus dem vorangegangenen Post verwendet wird, um die beidem Motoren abwechselnd zu schalten. Ein erstes Ergebnis ist
hier
zu sehen. Es ist noch nicht schön, aber der Roboter bewegt sich schon mal.

Die Nervigkeit des Pipsens potentiert sich hier nochmal, weil man mit dem echten PWM und dem Software-PWM parallel arbeitet :slightly_frowning_face:

Weil Calliope keine Threads anbietet, wird der SW-PWM immer nur aktualisiert, wenn man act() aufruft. Die Hoffnung ist: Wenn man das auch bei den anderen Komponenten des Roboters so programmieren kann, dann kann man in einem Loop alle act() aufrufen und so jede Komponente abarbeiten und bekommt damit ein pseudo-nebenläufiges Verhalten…