Schrittmotor

Ein Schrittmotor ist ein Motor der sich sehr genau steuern lässt. Anders als
andere Motoren dreht er sich nicht einfach vorwärts oder rückwärts, abhängig
von der Spannung. Ein Schrittmotor dreht sich immer nur ein ganz kleines
bisschen. Unser braucht 512 Schritte für eine ganze Umdrehung. Es gibt
verschiedene Arten von Motoren, mache haben mehr oder weniger Schritte.
Durch diese Steuerungsmöglichkeit ist es möglich sehr genaue Bewegungen
auszuführen. Schrittmotoren werden z.B. in 3D Druckern benutzt. Man kann
damit aber auch einen Stift auf Papier steuern. Wenn man z.B. weiß, dass
3210 Schritte des Motors den Stift um 1 cm bewegen, dann ist es sehr leicht
den Stift nicht einen, sondern 4 cm fahren zu lassen. Über die Steuerung
von elektromagnetischen Feldern wird sichergestellt dass der Motor sich
immer nur ein kleines Stück drehen kann. Wir steuern diese Felder über 4
GPIO Pins. Diese werden nach einander aktiv geschaltet und ermöglichen
es dem Motor so einen Schritt zu machen. Jeder Schritt, des Motors, besteht
aus einer folge von Aktiven GPIO Pins. Deswegen brauchen wir auch 4
GPIO Pins um den Motor zu steuern.
In unserem Projekt nutzen wir den Schrittmotor um den Zeiger, der die
Minuten anzeigt, zu bewegen. Den Zeiger findest du ebenfalls in dem Kitt.
Der Zeiger haben wir übrigens mit unserem 3D Drucker gedruckt und dieser
Drucker benutzt ebenfalls Schrittmotoren. Jetzt bringen wir den Motor an
unserem Projekt an.

Motor einbauen

Mit einem spitzen Bleistift oder Kugelschreiber machst du in der Mitte des
Ziffernblattes ein kleines Loch. Jetzt steckst du den Motor von Hinten durch
das Loch so dass vorne nur ein kleiner Teil raus guckt.
Achte darauf dass der Motor möglichst genau in der Mitte sitzt. Du kannst
den Motor ab der Halterung mit 2 Schrauben fest machen, es reicht aber
auch wenn du von hinten 2 LEDs durch die Halterung schiebst und diese auf
der Vorderseite umbiegst.

Neben deinem Motor gibt es in dem Kit eine kleine Platine die den Motor
steuert. Stecke den Stecker des Motors in die Platine.

Raspberry PiMotor
GPIO 22IN1
GPIO 23IN2
GPIO 24IN3
GPIO 25IN4
GNDGND
5VVCC

5V und GND findet ihr an der Seite der Steuerplatine. Dort gibt es auch
einen Jumper, der verbindet die beiden Pins auf der rechten Seite. Der Motor
kann auch mit 12V Strom betrieben werden. Für unseren Pfeil reichen 5V
vom Raspberry Pi aber bei weitem aus.

Schrittmotoren funktionieren anders als herkömmliche DC Motoren. Beim Schrittmotor gibt es mehrere Spulen die nach einander unter
Spannung gesetzt werden und so den Motor ein klein wenig bewegen. Die
Spulen und die Reihenfolge finden wir im Datasheet des Motors. Damit der Motor sich genau einen Schritt in die richtige Richtung bewegt, müssen die Pins des Motor in der richtigen Reihenfolge HIGH (Spannung liegt an) und LOW (keine Spannung liegt an) gesetzt werden.
Die Pins könntest du natürlich auch einzeln ansteuern, aber damit das für dich etwas einfacher ist, haben wir dir dazu ein fertiges Skript geschrieben. Das kannst du so herunterladen:

wget https://cw42.de/p/motor.py

Motor Steuern

Wenn du den Motor und den Motortreiber richtig angeschlossen hast, kannst du diesen jetzt mit dem Skript testen:

python3 motor.py X

Das X steht dabei für die Anzahl der Schritte, die der Motor machen soll. Du kannst auch negeative Zahlen nutzen, um den Motor anders herum drehen zu lassen. Mit diesem Befehl kannst du auch den Minutenzeiger richtig einstellen. Das Skript, dass wir gleich schreiben weiß nämlich nicht an welcher Position sich der Zeiger befindet. Desshalb geht das Skript immer davon aus, dass sich der Zeiger auf Punkt 12 Uhr befindet, wenn du das Skript startest. Wenn es startest, bewegt sich der Zeiger an die richtige Position. Damit wir nicht jede Minute den Zeiger wieder nullen müssen. Speichern wir die aktuelle Zeigersposition in einer Variablen, so dass wir zu jeder Zeit wissen, wo sich der Zeiger jetzt befinden müsste, solange kein kleines Monster an dem Zeiger gedreht hat.

Das fertige Skript sieht so aus:

import os
import time
from datetime import datetime as dt
import motor

motor.setup()
current_position = 0

try:
  while True:
    now = dt.now()
    new_position = round(
      (now.minute*60 + now.second)*512/3600
    )
    move = (new_position - current_position + 512)%512
    motor.move(move)
    current_position = new_position
    time.sleep(1)
except:
  GPIO.cleanup()

Im ersten Block importieren wir alle benötigten Bibliotheken. Besonders ist dabei, dass wir in der Zeile 4 das Motor-Skript importieren, dass du vorhin heruntergeladen hast. Wichtig ist, dass sich dieses im gleichen Ordern befindet, wie dieses Skript, sonst findet Python die Datei nicht.

Im nächsten Block führen wir die setup Funktion in dem Motor-Skript aus. Dadurch werden die entsprechenden GPIO Pins als Ausgang gesetzt. Außerdem deklarieren wir eine Variable current_position in der wir die aktuelle Position des Zeigers speichern und initialisieren sie mit dem Wert 0.

Wie du siehst wird der nächste Block immer wieder ausgeführt, da sich dieser in einer while True:-Schleife befindet. Jede Sekunde wird berechnet, an welcher Position sich der Zeiger aktuell befindet und an welcher Position der Zeiger sein muss.

Wenn du lieber möchtest, dass sich der Zeiger nur zu vollen Minute bewegt, musst du am Anfang der while-Schleife einfach nur diese Zeile einfügen:

time.sleep(60 - float(dt.now().strftime('%S.%f')))

Das Skript pausiert dann an dieser Stelle, bis zu nächsten vollen Minute.