.. include:: /index.rst
:start-after: start_hello_message
:end-before: end_hello_message
.. _py_motor:
1.6 Motor
=============
**Einführung**
In diesem Projekt lernen wir, wie man mit dem Fusion HAT+ einen Gleichstrommotor (DC-Motor) steuert, sodass er sich im Uhrzeigersinn und gegen den Uhrzeigersinn drehen kann.
----------------------------------------------
**Benötigte Komponenten**
Um dieses Projekt durchzuführen, benötigen Sie die folgenden Komponenten:
.. list-table::
:widths: 30 20
:header-rows: 1
* - KOMPONENTE
- KAUFLINK
* - :ref:`cpn_motor`
- |link_motor_buy|
* - :ref:`cpn_fusion_hat`
- \-
* - Raspberry Pi
- \-
----------------------------------------------
**Schaltplan**
Das folgende Schaltbild zeigt die Verbindungen, die erforderlich sind, um den Motor zu steuern.
.. image:: img/fzz/1.3.1_sch.png
:width: 80%
:align: center
----------------------------------------------
**Verdrahtungsdiagramm**
.. image:: img/fzz/1.3.1_bb.png
:width: 80%
:align: center
----------------------------------------------
**Beispiel ausführen**
Der gesamte Beispielcode, der in diesem Tutorial verwendet wird, befindet sich im Verzeichnis ``ai-lab-kit``.
Folgen Sie diesen Schritten, um das Beispiel auszuführen:
.. raw:: html
.. code-block:: shell
cd ~/ai-lab-kit/python/
sudo python3 1.6_Motor.py
Nach dem Ausführen des Skripts startet und stoppt der Motor, der mit Port M0 verbunden ist, wiederholt in einer Schleife. Zunächst stoppt er für 0,5 Sekunden, läuft dann mit −50 % Leistung für 1 Sekunde, stoppt erneut für 0,5 Sekunden und läuft schließlich mit 75 % Leistung für 1 Sekunde. Diese Sequenz wiederholt sich kontinuierlich. Wenn das Programm beendet wird, wird der Motor sicher gestoppt.
----------------------------------------------
**Code**
Der folgende Python-Code steuert die Drehrichtung und die Laufzeit des Motors:
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
from time import sleep
from fusion_hat.motor import Motor
# Motor on port M0, reverse direction if needed
motor = Motor("M0", is_reversed=True)
try:
while True:
motor.power(0)
sleep(0.5)
motor.power(-50)
sleep(1)
motor.power(0)
sleep(0.5)
motor.power(75)
sleep(1)
except KeyboardInterrupt:
# Ctrl + C to stop
print("\nStopped by user.")
finally:
# Always stop the motor safely
motor.stop()
sleep(0.1)
----------------------------------------------
**Den Code verstehen**
1. **Bibliotheken importieren**
Die Bibliothek ``fusion_hat`` vereinfacht die Interaktion mit den GPIO-Pins, während die Bibliothek ``time`` Funktionen für Zeitverzögerungen bereitstellt.
.. code-block:: python
from time import sleep
from fusion_hat.motor import Motor
2. **Initialisierung des Motors**
Das ``Motor``-Objekt wird mit den M0-Pins erstellt.
.. code-block:: python
motor = Motor('M0', is_reversed=True)
3. **Motorsteuerung**
Die Motorleistung wird nacheinander auf 0, -50 und 75 gesetzt. Die Funktion ``sleep`` pausiert das Programm jeweils für eine bestimmte Zeit.
.. code-block:: python
try:
# Loop forever
while True:
motor.power(0) # Stop the motor
sleep(0.5) # Wait 0.5 seconds
motor.power(-50) # Run the motor at -50% power
sleep(1) # Run for 1 second
motor.power(0) # Stop again
sleep(0.5) # Wait 0.5 seconds
motor.power(75) # Run the motor at 75% power
sleep(1) # Run for 1 second
----------------------------------------------
**Fehlerbehebung**
1. **Motor bewegt sich nicht**
- **Ursache**: Falsche Verdrahtung oder falsche GPIO-Pin-Konfiguration.
- **Lösung**: Stellen Sie sicher, dass der Motor mit Strom versorgt wird und der Enable-Pin korrekt angeschlossen ist.
2. **Nur eine Drehrichtung funktioniert**
- **Ursache**: Fehlerhafte Verbindung zum Vorwärts- oder Rückwärts-Pin.
- **Lösung**: Überprüfen Sie, ob die Pins sicher mit dem Fusion HAT+ verbunden sind.
3. **Motor dreht sich kontinuierlich ohne anzuhalten**
- **Ursache**: Die Funktion ``stop()`` wird möglicherweise nicht korrekt ausgeführt.
- **Lösung**: Stellen Sie sicher, dass die Methode ``motor.stop()`` aufgerufen wird.
----------------------------------------------
**Erweiterungsideen**
1. **Benutzergesteuerte Steuerung**
Ermöglichen Sie dem Benutzer, den Motor in Echtzeit über Tastatureingaben zu steuern:
.. code-block:: python
while True:
num = int(input("The speed percentage (-100~100): "))
if num >= -100 and num <= 100:
motor.speed(num)
else:
print("Invalid action!")
3. **Zeitgesteuerte Motorsteuerung**
Fügen Sie eine Funktion hinzu, mit der der Motor für eine vom Benutzer festgelegte Dauer läuft:
.. code-block:: python
duration = int(input("Enter duration (seconds): "))
motor.speed(50)
sleep(duration)
motor.stop()
----------------------------------------------
**Fazit**
Dieses Projekt zeigt, wie ein Gleichstrommotor mit dem Fusion HAT+ gesteuert werden kann. Das Verständnis der Motorsteuerung ist eine wichtige Grundlage für den Bau von Robotikprojekten und anderen bewegungsbasierten elektronischen Anwendungen.