# Zwei Motoren mit Python

**URL:** <https://forum.calliope.cc/t/zwei-motoren-mit-python/1650>\
**Category:** Software allgemein\
**Created:** [19. Juni 2020 um 21:54 UTC](https://forum.calliope.cc/t/zwei-motoren-mit-python/1650 "2020-06-19T21:54:26Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![kopp](https://avatars.discourse-cdn.com/v4/letter/k/9f8e36/32.png) [@kopp](https://forum.calliope.cc/u/kopp)\
**Post date:** [19. Juni 2020 um 21:54 UTC](https://forum.calliope.cc/t/zwei-motoren-mit-python/1650/1 "2020-06-19T21:54:26Z")

</div>

Ich will zwei Motoren per Python ansteuern. Ich habe sie verkabelt und mit dem folgenden Programm  
 ![motors_working_open_roberta](https://canada1.discourse-cdn.com/flex027/uploads/calliope/original/2X/4/4588540392255e8d30130c9c28b4dd99d67340ba.png)-  
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](https://forum.calliope.cc/t/diverse-fragen-zur-motorenansteuerung/295/4) 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?

---

<div class="post-metadata">

**Author:** ![kopp](https://avatars.discourse-cdn.com/v4/letter/k/9f8e36/32.png) [@kopp](https://forum.calliope.cc/u/kopp)\
**Post date:** [21. Juni 2020 um 21:26 UTC](https://forum.calliope.cc/t/zwei-motoren-mit-python/1650/2 "2020-06-21T21:26:56Z")

</div>

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](https://gist.github.com/kopp/2642945fb9988fe21fcf0e68da2925a6)  
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 🙁

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…
