Set Stepper

English version.

Hier möchte ich zeigen, wie man einem Stepper-Motor Anweisungen erteilt, sodass er sich richtungsgebunden um eine gegebene Anzahl an Graden dreht. Dazu nutze ich den 28BYJ-48 Stepper und den ULN2003 Motorcontroller. Beides gibt es im Set für unter 5€. Zum Einstieg in die Schrittmotorenwelt also genau das Richtige!

Stepper

Ich habe mir für den Motor eine kleine Skala gebastelt, um die Umdrehungen genau beobachten zu können.

Der Motor

Bei dem Motor handelt es sich um einen unipolaren 5V Schrittmotor, welcher aber dank des Controllers auch mit 12V versorgt werden kann. Solche Motoren sind weit verbreitet, um kleinere Geräte anzutreiben. Wer sich also einen kleinen Fahrroboter bauen will, der ist mit diesem Motor schon mal ein Stück näher am Ziel!

Der Motor hat am Abtrieb ein Getriebe angebaut, welches eine vom Hersteller angegebene Übersetzung von 64:1 haben sollte. Tatsächlich liegt die Übersetzung bei 63.68395:1. Das Drehmoment ist für die geringe Baugröße gut, die maximale Geschwindigkeit liegt bei etwa 15 RPM (rounds per minute).

Angetrieben wird der Motor über 4 Drahtspulen, welche über die Software in unterschiedlicher Reihenfolge angesprochen werden. Dies führt dazu, dass sich der Motor dreht. Im Datenblatt des Motors lässt sich erkennen, dass er sich mit der half-step-method betreiben lässt. Was hier passiert lässt sich aus der folgenden Tabelle entnehmen.

Half-Step_Sequence

Durch die half-step-sequence ergeben sich also 8 verschiedene Zustände, was ein genaueres Positionieren bei höherem Drehmoment zulässt. Genau das nutze ich im Programmcode in der Funktion setStepper().

Der Controller

Dank dem kleinen Motorcontroller lässt sich der Motor mit jedem beliebigen 5V-Microcontroller betreiben, ich nutze ihn zum Beispiel am Arduino Uno. Auf der Platine findet man 4 LED’s, welche anzeigen, welche Spule gerade in Betrieb ist. Zusätzlich befindet sich ein On/Off Jumper darauf. Will man den Motor mit einem Controller ein- oder ausschalten, so kann man diesen Jumper durch einen Optokoppler der ein Relais ersetzen.

Board

Der Controller sollte unbedingt mit einer externen Spannungsquelle im Bereich von 5-12V und 1A versorgt werden, da er doch sehr viel Strom für den Betrieb braucht. Man sollte ihn auf keinen Fall mit einem Output-Pin des Arduinos versorgen, da dies den ATMega328-PU, welcher sich auf dem Uno befindet, zerstören würde. Bei der Versorgung muss man nur darauf achten, dass beim + Pin 5-12 Volt angelegt werden, und sich beim – Pin der Ground befindet (Der Ground muss dann auch mit dem Arduino Ground verbunden sein, da ansonsten der Stromkreis nicht geschlossen wäre).

Mein Vorschlag ist, das Arduino am Vin-Pin und den Motorcontroller mit +12V der gleichen Spannungsquelle zu versorgen. So bringt man alles mit nur einer Quelle unter einen Hut.

Weiters befinden sich die 4 Signal Pins auf der Platine (IN1, IN2, IN3, IN4). Diese werden zum Steuern des Motors benötigt.

Der Aufbau

Ich habe die 4 Signal Pins wie folgt mit dem Arduino verbunden:

  • IN1 ⇒ Pin 2
  • IN2 ⇒ Pin 3
  • IN3 ⇒ Pin 4
  • IN4 ⇒ Pin 5

Man kann die Pins beliebig vertauschen, oder auch andere Pins benutzen. Man muss lediglich darauf achten, diese im Programm richtig zu belegen.

Im Anschluss muss man nur noch den Stecker des Motors in den Sockel der Platine stecken. Dieser kann zum Glück dank seiner Form nur richtig eingesteckt werden, was ein Schäden unterbindet.

Das Programm

Wie immer findet man die paar Zeilen Code auf GitHub.

Das Programm Set_One_Stepper.ino ist so aufgebaut, dass man dem Arduino via dem seriellen Monitor die Anzahl der Steps schicken kann, die sich der Motor drehen soll. Dabei lassen sich sowohl positive, als auch negative Zahlen schicken – dies beeinflusst die Drehrichtung des Motors.

Zusätzlich kann man im Programm festlegen, ob der gesendete Zahlenwert als Steps oder als Grade interpretiert werden soll. Denn ein Step ist nicht ein Grad! Hierfür benötigt man etwas Mathematik:

  • Ein voller Step (alle 8 Zyklen der Spulen) sind am Getriebeeingang 5.625°.
  • Eine Umdrehung am Getriebeeingang sind also 64 volle Steps.
  • Die Getriebeübersetzung war 63.68395:1, zusammen bedeutet das: 4076 Steps für eine Umdrehung am Getriebeausgang.
  • Nun muss man nur noch von den errechneten Steps auf volle Steps zurückrechnen. Man erhält also 509.5 volle Steps pro ganzer Umdrehung am Getriebeausgang.
  • Daraus folgt, dass ein Grad am Getriebeausgang 1.4153 Steps sind.
boolean Rotate_In_Degrees = true;

Ist die oben angegeben Variable im Programm auf true gesetzt, so wird der Zahlenwert vom seriellen Monitor in Grade umgerechnet. Der Stepper dreht sich also bei einem Zahlenwert von 360 einmal im Kreis.

int Delay_Of_Steps = 1000;

Mit dem Delay kann man die Geschwindigkeit, mit der die Spulen angesprochen werden verändern. Je kleiner dieser Wert ist, desto schneller dreht sich der Motor. 1000 Mikrosekunden ist in etwa die kürzeste Pause zwischen dem Spulenwechsel. Dies liegt zum Großteil an der Trägheit der Masse.

Das eigentliche „Drehen“ des Motors wird wie bereits angesprochen über eine wechselnde Beaufschlagung der Spulen mit Spannung erreicht. In der Funktion setStepper() mache ich nichts anderes, als genau die Beaufschlagung, wie sie oben in der Tabelle gezeigt ist, nachzubilden.

Anmerkung

Da ein Grad leider 1.4153 volle Steps sind schleicht sich so ein Fehler ein. Würde man 360 Grad fahren wollen, so wären das wie oben errechnet 509.5 volle Steps. Nun kann der Stepper keine 0.5 Steps fahren. Dies hat zur Folge, dass sich ein Rundungsfehler einschleicht. Diesen Fehler kann man unterbinden, indem man in der for-Schleife eine Abbruchbedingung implemetiert. Allerding muss man dann, um den Stepper weiterhin nutzen zu können, wissen, an welchem Punkt der Schleife abgebrochen wurde. Dort muss man dann neu einsteigen.

Erweiterung 1

Wer zwei Stepper verwenden möchte, und diese gleichzeitig drehen lassen mag, der kann sich das Programm Set_Two_Stepper.ino ansehen. Hierbei habe ich die Funktion setStepper() einfach nur um die Spulenbeaufschlagung des zweiten Steppers erweitert.

Bei herkömmlichen Bibliotheken habe ich noch keine solche Funktion finden können. Hier musste man immer einen Motor nach dem anderen ansprechen, und jeweils nur einen Schritt fahren. Dies hat zur Folge, dass alles etwas ruckelig wird.

Nutzt man hingegen die hier vorgestellte Funktion, so kann man zwei oder mehrere Motoren tatsächlich gleichzeitig in Betrieb nehmen.

Erweiterung 2

Die beiden oben gezeigten Programme lassen lediglich ein manuelles Verfahren zu. Das Programm denkt nicht mit. Möchte man, dass der Stepper zu einer gewissen Position fährt, so musste man die Grade mit + und – eingeben.

Das Programm Goto_Position.ino übernimmt diesen Part. Im seriellen Monitor muss man hier nur mehr die Zielposition eingeben, und der Motor bewegt sich darauf zu. Hierbei bewegt sich der Motor immer wie folgt:

  • Erhöhung des Wertes (max.359): Der Motor dreht im Uhrzeigersinn.
  • Erniedrigung des Wertes (max. 0): Der Motor dreht entgegen dem Uhrzeigersinn.

Natürlich ändert sich so auch die Eingabemöglichkeit des seriellen Monitors. Bisher konnte man eine beliebige Zahl eingeben, nun muss der Bereich zwischen 0 und 359 liegen.

Bei Programmstart wird die aktuelle Position auf 0 festgelegt. Steht der Zeiger wo anders, so stimmt die Anzeige mit dem gesendeten Zahlenwert nicht überein.

Advertisements

5 Gedanken zu “Set Stepper

  1. Hi,
    ja die Idee hatte ein Freund von mir, der öfters Dokumentationen macht und sich immer über die Unzulänglichkeiten des AF beim Filmen ärgert. Ich dachte mit Lasermessung und Schrittmotor müsste sowas doch zu handeln sein. Gefunden habe ich zu diesem Thema auch recht wenig, nur wie man den AF mittels Motoren manuell steuert.
    Als Entfernungmesser hatte ich eigentlich eher an Laser als an Ultraschall gedacht, aber die Schallvariante reicht zum basteln erstmal aus, ist ja auch unschlagbar billig.
    Danke für die Tipps mit dem Referenzpunkt, ich habs jetzt mittels 2 Magneten am Anfang und Ende und einem Hallsensor realisiert. Klappt so schonmal ganz gut mit dem kalibrieren. Momentan ist das Objektiv aber sozusagen noch auf einem langen Stück Holz abgewickelt 😉 Das vereinfacht das Testen ungemein.
    Die Stellwege von Objektiven varieren auch extrem von bei mir 32mm (AF) über 100mm (AF) bis 130mm (MF), wobei ersters sich wohl kaum abbilden lässt bzw. nicht so genau angesteuert werden kann.
    Macht auf jeden Fall Spaß der Kleine…

    Gefällt mir

    1. Ultraschall ist zum Beginn sicher am einfachsten (günstigsten). Leider, so habe ich das bei den sehr günstigen Komponenten gemerkt, sind diese auch nicht die genauesten.

      Auf jeden Fall würde ich mich freuen, mehr von dem Projekt zu hören, klingt spannend (vor allem wie du den Fokus regelst).

      Vielleicht machst du ja einen Blog darüber (würde all‘ jenen helfen, die das gleiche Problem haben).

      Gefällt mir

  2. Super Beschreibung! Damit konnte ich meinen Motor auf Anhieb zum Laufen bekommen und ausserdem ist alles sehr verständlich geschrieben.
    Bei Beispielen von anderen Seiten hatte ich massiv Probleme und musste auch immer Bibliotheken einbinden.
    Ich wollte das mal mit dem Entfernungsmesser für einen externen Autofokus koppeln, aber nur so als Bastelei. Man bräuchte ja irgendwie noch einen Referenzpunkt über einen magnetischen Schalter oder so…

    Gefällt mir

    1. Hallo Radla!
      Danke für die pos. Rückmeldung und die Idee mit dem Autofokus finde ich richtig gut.

      Den Referenzpunkt könntest du auch mit einer Scheibe realisieren, welche an einer Stelle ein Loch hat. Durch dieses Loch kann dann ein Infrarot-Lichtstrahl fallen. Günstige Module gibt’s wie immer auf eBay:

      http://www.ebay.at/itm/IR-Infrarotstrahlung-Infrarot-Radiation-Velometer-Sensor-Module-Modul-Arduino-/321843830208?hash=item4aef631dc0:g:PnUAAOSwTapV3N6E

      Das spart Gewicht und ist dann so ähnlich aufgebaut, wie industrielle Drehgeber.
      Im Programm funktioniert es dann genau so wie mit dem magn. Schalter: Ist ein Signal vorhanden, so befindet sich die Scheibe (und so die Winkelstellung) in der Referenzposition. Die einzige Voraussetzung ist, dass du von Beginn an mitzählst, wie viele Umdrehungen du bereits gemacht hast. Diese kann man dann im EEPROM des Arduinos speichern. Dann bleibt der Wert auch bei stromlosem Arduino erhalten.

      Gefällt mir

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s