Im Gegensatz zu einem normalen Motor kann man mit einem Schrittmotor und dem Raspberry Pi die Schritte individuell steuern und kann damit immer die genaue Position erkennen. Schrittmotoren eignen sich daher perfekt für Anwendungen, bei denen man den Drehwinkel kennen muss wie z.B. in der Robotik.
Zum einfachen Ansteuern eines solchen Motors genügt ein Treiber IC, wobei es den L293D, sowie den ULN2003 gibt. Die Ansteuerung beider Treiber wird in diesem Tutorial gezeigt.
Der gängigere der beiden ist der ULN2003, wobei dieser auch oft in Driver Boards mit dem 28BYJ-48 verbaut ist. Es ist eine Spannung von 5V sowie 12V möglich.
Der L293D hingegen lässt die Möglichkeit offen eine externe Stromquelle anzuschließen, womit z.B. eine höhere Stromstärke (die bei manchen Motoren nötig ist) angeschlossen werden kann.
Zubehör
- Schrittmotor (z.B. den 28BYJ-48 mit ULN2003 Driver Board)
- L293D Treiber IC
- (alternativ, falls kein L293D gewünscht ist: ULN2003 Darlington Array IC)
- Jumper Kabel
- ggf. eine externe Stromquelle, z.B. Batterien
Als Raspberry Pi Schrittmotor kann natürlich jeder andere auch genommen, wichtig ist beim Anschließen nur auf die ggf. unterschiedlichen Farben zu achten (siehe Datenblatt).
Die besagten Farben beziehen sich in meinem Fall auf die des 28BYJ-48 (Datenblatt):
Aufbau L293D
Hast du einen Motor mir ULN2003 Driver Board bzw. den ULN2003 Treiber IC kannst du diesen Schritt überspringen.
Ein Blick ins Datenblatt zeigt, dass eine externe Stromquelle möglich ist. Der Aufbau ist also wie folgt:
Falls der Motor mehr Stromstärke benötigt, als das Raspberry liefern kann, kommst du um eine externe Stromquelle nicht herum (am besten eine feste Stromquelle und keine Batterie). Der Vorwiderstand ist dabei auch im Datenblatt genannt. Achte dabei, dass du genug Spannung und Stromstärke einspeist, denn das ist die häufigste Ursache, weshalb der Motor später nicht arbeitet wie er soll. Beim 28BYJ-48 ist das jedoch nicht der Fall.
Aufbau ULN2003
Im Gegensatz zum L293D sind hier nur 5V bzw 12V Eingangsspannung erlaubt (Datenblatt). Da das Raspberry aber nur 5V liefert, können wir auch nur Motoren betreiben, die maximal 5V benötigen.
Testen des Raspberry Pi Schrittmotor
Beim 28BYJ-48 ist die Sequenz die folgende. Falls du einen anderen Motor benutzt, musst du die Sequenz entsprechend dem Datenblatt anpassen.
Wir erstellen also ein Skript
sudo nano schrittmotor.py
und fügen folgendes Skript ein:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) coil_A_1_pin = 4 # pink coil_A_2_pin = 17 # orange coil_B_1_pin = 23 # blau coil_B_2_pin = 24 # gelb #enable_pin = 7 # Nur bei bestimmten Motoren benoetigt (+Zeile 24 und 30) # anpassen, falls andere Sequenz StepCount = 8 Seq = list(range(0, StepCount)) Seq[0] = [0,1,0,0] Seq[1] = [0,1,0,1] Seq[2] = [0,0,0,1] Seq[3] = [1,0,0,1] Seq[4] = [1,0,0,0] Seq[5] = [1,0,1,0] Seq[6] = [0,0,1,0] Seq[7] = [0,1,1,0] #GPIO.setup(enable_pin, GPIO.OUT) GPIO.setup(coil_A_1_pin, GPIO.OUT) GPIO.setup(coil_A_2_pin, GPIO.OUT) GPIO.setup(coil_B_1_pin, GPIO.OUT) GPIO.setup(coil_B_2_pin, GPIO.OUT) #GPIO.output(enable_pin, 1) def setStep(w1, w2, w3, w4): GPIO.output(coil_A_1_pin, w1) GPIO.output(coil_A_2_pin, w2) GPIO.output(coil_B_1_pin, w3) GPIO.output(coil_B_2_pin, w4) def forward(delay, steps): for i in range(steps): for j in range(StepCount): setStep(Seq[j][0], Seq[j][1], Seq[j][2], Seq[j][3]) time.sleep(delay) def backwards(delay, steps): for i in range(steps): for j in reversed(range(StepCount)): setStep(Seq[j][0], Seq[j][1], Seq[j][2], Seq[j][3]) time.sleep(delay) if __name__ == '__main__': while True: delay = raw_input("Zeitverzoegerung (ms)?") steps = raw_input("Wie viele Schritte vorwaerts? ") forward(int(delay) / 1000.0, int(steps)) steps = raw_input("Wie viele Schritte rueckwaerts? ") backwards(int(delay) / 1000.0, int(steps)) |
Anschließend nur noch mit STRG+O und STRG+X speichern und beenden. Gestartet wird einfach mit
sudo python schrittmotor.py
Mittels setStep(0,0,0,0)
kannst du den Motor in den Ruhezustand setzen, da ansonsten die ganze Zeit Strom verbraucht wird (durch die Elektromagneten im Motor).
Achte darauf, dass wenn du die Verzögerung (pro Schritt) hoch stellst sich der Motor sehr langsam bewegen wird (z.B. bei 100ms würde eine volle Umdrehung bereits 51,2 Sekunden dauern, da der Motor insgesamt 512 Schritte hat. Eine zu kleine Verzögerung kann jedoch das Gegenteil bewirken, sodass die Signale zu schnell übertragen werden und dadurch der Motor nur „stottert“. Willst du einen schnelleren Motor, wähle ein Modell mit größerem Schrittwinkel).
160 Kommentare
Hallo, da ich mich gerade mit dem Thema beschäftige und mir einen Schrittmotor mit ULN2003 bestellt habe, frage ich mich was mit Pin 18 denn weiter passiert. In deinem Script wir der nur definiert und auf 1 gesetzt, aber verkabelt wird er nicht.
Ja, das stimmt, beim L293D Baustein wird er nicht verkabelt, nur beim ULN2003 IC. Es gibt manche Schrittmotoren, die einen zusätzlichen Impuls brauchen, um den Schritt zu machen. Zu diesem Motor gibt es unterschiedliche Datenblätter (z.B. hier).
Da ich das Tutorial allerdings für alle Schrittmotoren allgemein geschrieben habe, habe ich den
enable_pin
mit hinzugefügt. Motoren, bei denen im Datenblatt explizit nur 4 Verbindungen angegeben habe, brauchen diesen Implus nicht.Für ein Projekt müssen wir zwei Schrittmotoren eigenständig betreiben können. Nachdem wir uns dieses Tutorial aufmerksam(!) durchgelesen haben, haben wir uns dazu entschieden, den L293D als Treiber zu verwenden, da wir eine externe Stromquelle benutzen wollen, um die 12V Schrittmotoren anzutreiben. Hier haben wir jedoch zwei Fragen: Welchen Vorwiderstand benötigt der Motor? Wie müsste die Verkabelung aussehen, wenn zwei Schrittmotoren angeschlossen werden statt einem?
Vielen Dank für die Antwort im Voraus!
Mit freundlichen Grüßen,
Henning
Hallo Henning,
die Daten zum Vorwiderstand und Betriebsspannung stehen im Datenblatt (online). Bei deinem Modell sind es 34 Ohm (wie du den Widerstand perfekt erreichst erfährst du hier: Widerstände berechnen und kombinieren)
Der L293D ist nur für einen Motor geeignet, daher bräuchtest du zwei Module und dementsprechend 8 GPIO Pins. Die Spannung VCC und Masse GND werden an beide parallel angeschlossen (vom Pi und von deiner externen Stromquelle).
LG Felix
Hallo Felix,
danke für deine schnelle Antwort!
Allerdings stellt sich uns noch eine Frage.
Gibt es einen Unterschied bei den GPIO-Pins, die mit Zahlen belegt sind? In der Abbildung sind ja die Pins 4,17,23 und 24 benutzt worden. Es hätten aber auch alle anderen mit Zahlen belegten Pins verwendet werden können, oder? Wenn ich jetzt den Motor 1 der Abbildung nach verkable, welche Pins müsste ich dann für den 2. Motor belegen? Bitte mit Beschreibung (z.B. an Stelle von Pin 4 Pin 18).
Mit freundlichen Grüßen,
Henning
Hi Henning,
welches Raspberry Pi Modell hast du denn (das Model B+ hat mehr GPIO Pins).
Wenn du das Model B (Rev.2) hast, hast du folgende GPIO Pins: Link. Manche Pins haben eine „doppelte“ Funktion, d.h. sie können entweder als einfaches GPIO Pin verwendet werden, oder z.B. mit einer höheren Datenrate.
Welche Pins du nimmst, bleibt dir überlassen. Ein Beispiel wäre du nimmst für den ersten Motor die aufgeführten und für den zweiten diese: 18,22,25,27 Damit hast du jene Pins, die mehrere Funktionen haben noch frei. Du kannst aber im Grunde jeden als GPIO markierten Pin benutzen.
LG Felix
Hallo Felix,
da wir die Teile für unser Projekt noch nicht gekauft haben, haben wir noch kein Raspberry, wir werden uns jedoch das Raspberry Pi B+ kaufen.
Danke für die Hilfe!
Zuerst nicht einmal eine Stunde gebraucht, um zu antworten und jetzt lediglich 8 Minuten bis zur nächsten hilfreichen Antwort, super!
Mit freundlichen Grüßen,
Henning
Danke für das Lob 🙂
Sollte es einmal mit den GPIO Pins knapp werden, kann ich auch einen I²C Port Expander empfehlen: http://amzn.to/1vDhKOW (ansonsten steht hier alles für den Pi benötigte).
Davon können bis zu 8 Stück gleichzeitig betrieben werden, wobei jeder 16 weitere IO Pins liefert. Wie genau diese funktionieren habe ich hier erklärt: GPIOs mittels I2C Port Expander erweitern
Falls noch Fragen auftreten, einfach stellen 😉
LG Felix
Hallo,
ich habe gerade deinen Code übernommen und der RPi liefert mir beim Ausführen folgende Meldung:
Traceback (most recent call last):
File „schrittmotor.py“, line 1, in
import RPi.GPIO as GPIO
ImportError: No module named GPIO
Ich verwende das Modell B+.
Was muss ich tun damit es funktioniert ?
Grüße Lars
Hallo,
die vorige Frage hat sich inzwischen erübrigt.
Meine aktuelle Frage ist, wie muss ich den Code verändern, sodass der Motor tatsächlich mit der Schrittweite von 1,8 bzw 0,9 ° pro Schritt dreht ?
Grüße
Hi Lars,
wenn du einen Motor mit 0.9° Schrittwinkel hast, dann musst du damit genau einen Schritt machen. In meinem Beispiel müsstest du
setStep(w1, w2, w3, w4)
mit entsprechender Sequenz aufrufen. Hier ist es wichtig, in welcher Sequenz sich der Motor befindet (bzw. wie die Magnete gerade geladen sind). Pro Schritt musst du also eine Sequenz weiter. Du müsstest also die Sequenz Nummer speichern und dann jeweils den nächsten Schritt machen.LG Felix
Hallo Felix,
vielen Dank für die schnelle Antwort.
Ich habe deinen Code wie folgt geändert:
so läuft der Motor natürlich wesentlich langsamer aber durch die Modulo-Division ist jeder Schritt einzeln ansteuerbar.
Weist du wie sich diese Lösung auf das Drehmoment auswirkt ?
LG Lars
Du musst aber bei einer Sache aufpassen: Angenommen du rufst die Funktion erst mit 1, dann 2 usw. auf. Dann wäre im ersten Schritt Seq[0] (
i in [0]:
) ausgeführt, im zweiten wieder Seq[0] und Seq[1] (i in [0,1]:
), d.h. der/die ersten Teilschritte wiederholen sich immer wieder und daher wird der Motor stottern.Was du machen kannst ist eine Variable außerhalb zu definieren, darin den letzten Schritt speichern und jedes Mal auch dort es anfangen:
(Habe das nicht getestet, sollte aber funktionieren).
Ich hätte da mal eine frage, ich muss mit einem Raspberry Pi Daten von einer ez430-Chronos Sportuhr die ACC Daten auslesen diese dann an die GPIO’s schicken wo sie dann an den L293D gesendet werden welcher dann 2 Motoren ansteuern soll, also so Motoren welche in ferngesteuerten Autos vorhanden sind. Ich hab schon ein kleines Programm geschrieben welches die Daten auf dem PC von der Uhr ausliest und anzeigt. Das Problem jedoch ist wenn ich es auf den Raspberry Pi starte kommt eine Fehlermeldung dass die Hexadezimal Zahlen nicht vom Raspberry Pi erkannt werden oder so… also her ist mein skript, ich würde mich über verbesserungs Vorschläge freuen
Hallo,
Ich habe genau diese beiden Halbleiter da und möchten ebenfalls meinen Schrittmotor mit dem Pi ansteuern nur habe ich einen Schrittmotor der nur 4 Kabel hat (Schwarz, Rot, Grün, Blau) kann ich ihn trotzdem irgendwie mit diesen ICs ansteuern? 🙂 danke schonmal im Vorraus
Hi,
ja klar, das funktioniert auch. Schau mal beim Aufbau mit dem L293D IC, dort werden nur 4 Kabel des Motors benötigt. Ansonsten kannst du es fast 1:1 übermehmen, nur musst du im Datenblatt deines Motors schauen, welche Funktionen die Kabel mit den versch. Farben haben und diese auf mein Beispiel übertragen (Wiring Diagram).
Hallo,
in meiner Bachelorarbeit geht es darum, zwei Elektrozylinder Typ T6V4 von RACO mit einem Mikrocontroller anzusteuern. Außerdem müssen jeweils ein Temperatur- und Drucksensor, Näherungsschalter für die Endlagen der Zylinder, ein Potentiometer zur Einstellung der Geschwindigkeit und ein Display in die Schaltung integriert werden. Da ich mich bis jetzt noch nie mit Mikrocontrollern auseinandergesetzt hatte, finde ich dieses Thema sehr Anspruchsvoll aber zugleich wahnsinnig interessant. Wäre denn diese Aufgabe mit dem Raspberry Pi zu lösen? Wenn ja, welche zusätzliche Hardware werde ich dafür benötigen?
Ich bedanke mich schon mal im Voraus für die Hilfe!
Herzliche Grüße
Craig
Hallo Craig!
Wenn Du Bitschlerer werden willst und dafür lernen sollst, dann tu das Bitte und
lass Dir Deinen Abschluss nicht hier zusammengutenbergen !
Hallo,
im Umgang mit der Programmierung für Schrittmotor bin ich noch recht unerfahren und deshalb würde es mir sehr helfen, wenn ich hier ein bisschen Hilfe bekommen könnte.
Ich habe einen Schrittmotor (6V, 1,2A, Baugröße NEMA 23) mit 4 Anschlüssen (Kabeln) an eine Schrittmotor-Endstufe (http://www.micompan-shop.de/product_info.php?products_id=45) und diese wiederum an einen Takt- und Richtungssignal-Generator (http://www.micompan-shop.de/product_info.php?products_id=12&MODsid=moikscbl07a8dgs2d74d2vh621) angeschlossen. Diese Ansteuerung funktioniert nach einigen Test mit den Einstellungen problemlos. Nun möchte ich den Takt- und Richtungssignal-Generator durch den Raspi bzw. durch ein geeignetes Programm auf dem Raspi den Schrittmotor ansteuern Ich habe vor, die Eingänge der Schrittmotor-Endstufe über einen Treiberbaustein (welcher ist noch offen) mit den GPIO-Pins zu verbinden. Nun ist die Frage ob das so vom Aufbau her richtig ist bzw. möglich ist, und wenn ja, wäre das obige Programm zum Ansteuern geeignet bzw. wie müsste man das erweitern?
Mit dem Programm müsste ich die sowohl die Richtung als auch die Taktung (Geschwindigkeit) einstellen können.
Vielen Dank im voraus.
MfG Makkez
Hallo Marcus,
wie hast du die Einstellungen gesetzt? Wenn du sie per Signalen setzen kannst, sollte das kein Problem sein, diese auch mit dem Pi (oder einem IC, der vom Pi gesteuert wird) zu setzen.
Hallo,
mich würde interessieren, ob ich viele Schrittmotoren (>10) über einen RPi steuern kann? Es wäre kein Problem, wenn dabei zu jedem beliebigen Zeitpkt immer nur ein Motor laufen kann, es müssten also nie mehrere gleichzeitig arbeiten. Geht das nur über ein BUS-System, wenn ja, welches würde sich anbieten? Und welche Motoren eignen sich (ich würde gerne den 28BYJ-48 verwenden).
Danke vorab!
Steffen
Hallo Steffen,
ja das geht. Dafür reichen jenachdem wie viele Motoren du anschließen willst entweder die GPIOs des Pi’s (je 4 pro Motor) oder aber du nutzt einfach eine GPIO Erweiterung: GPIOs mittels I2C Port Expander erweitern
LG Felix
Hi Felix,
Danke für die schnelle Antwort. Bei meiner Idee wären es 16-18 Schrittmotoren, da wird der Kabelsalat groß. Siehst du noch eine Möglichkeit, mit der man alle Motoren über nur 4 GPIOs (plus evtl Steuerleitung(en)) anschließt und dann temporär nur einen einzelnen Motor ansprechen kann? Jeder dieser Motoren müsste 1-2 Mal pro Tag nur ein paar Umdrehungen fahren, Betriebsdauer pro Motor pro Tag ca 30 sec.
Danke nochmals!
Hallo Steffen,
16-18 sind natürlich eine ganze Menge, da machen Expander weniger Sinn.
Mit nur 4 GPIOs wirst du dennoch nicht zurecht kommen, je nach Realisierung. Z.B. könntest du NAND/AND Gatter als Schalter für die jeweiligen Motoren verwenden. Bestimmt gibt es dazu auch einen IC Baustein, der das nochmals vereinfacht, aber da habe ich grade keinen Namen parat – sorry.
Hallo,
Danke für die super Beschreibung.
Sobald ich „setStep(0,0,0,0)“ in die Konsole eingebe, kommt folgende Fehlermeldung: „-bash: syntax error near unexpected token `0,0,0,0′“
Kann mir jemand sagen, was ich falsch mache?
Herzlichen Dank
Grüße
Hast du das in die Python Konsole eingegeben? Klingt so, als ob du es in die normale Konsole eignebeben hast.
Hi, tolle Anleitung. Ich habe den ULN2003. Der Programmtest wird abgearbeitet und läut aber die Welle am Motor bewegt sich nicht. Nehm ich den Motor in die Hand spüre ich ein rucken im Motor. Er ist neu gekauft und der selbe den du im obigen Beispiel verwendest.
hast du eine Idee was das sein könnte?
lg
Hi Oliver,
der ULN2003 ist nur der Treiber IC. Ich hatte mal exakt das selbe Problem mit einem kleinen Motor, der mehr Stromstärke brauchte (~1Ampere), aber der Pi liefert zu wenig. Da hilft eine externe Stromquelle aus (L293D).
Benutzt du das verlinkte Seit aus Treiber und Motor? Ist er an 5V angeschlossen und hast du sonst noch etwas am Pi (GPIOs) laufen?
LG Felix
Hallo, ich habe das gleiche Problem. Ich verwende den 28BYJ-48 Motor aus dem Tutorial. Habe es auch schon mit einer 9V-Blockbatterie versucht, da wird das zucken nur stärker und der Motor wird leicht handwarm. Habe es auch schon mit 2 verschiedenen Treiberplatinen und 2 verschiedenen Motoren versucht, gleiches Problem bei beiden.
Danke für eure Mithilfe.
Die LEDs der Treiberplatine blinken entsprechend der eingegeben Zeit und Schrittanzahl. Ich habe die Spannungsversorgung jetzt vom Pi gelöst und trotzdem ist keine Bewegung zu sehen. Ein zucken ist zu spüren, wenn man den Motor in der hand hält. Gibt es die Möglichkeit , dass intern das getriebe blockiert? hat es einen Anschlag o.ä.?
PS: vielen dank für die schnelle Hilfe
Guten Tag, ich muss für ein Projekt einen Steppermotor (http://www.adafruit.com/products/324) mit dem L293D Treiber ansteuern, dafür habe ich den Motor, Treiber, Steckplatine, Raspberry und alle möglichen Widerstände (großes Paket mit Widerständen in allen Bereichen) Zuhause. Jetzt habe ich dieses 12V Netzteil (http://www.amazon.de/Overlook-Security-Steckernetzger%C3%A4t-%C3%9Cberwachungskameras-1000mA/dp/B005O1A9B0/ref=sr_1_2?ie=UTF8&qid=1419893870&sr=8-2&tag=modules-21&keywords=netzger%C3%A4t+12v) um den Motor extern mit Strom zu versorgen. Jetzt ist meine Frage, wofür genau ist der Widerstand eigentlich vorhanden und wie groß muss ich den wählen, im Datenblatt finde ich nur die winding resistance, dies müsste aber ja der Spulenwiderstand sein. Können Sie mir da vielleicht weiterhelfen?
Mit freundlichen Grüßen,
ElBarto
Guten Tag, können Sie mir bei meiner Frage behilflich sein, weil es ärgert mich schon, dass ich bei meinem Projekt nicht weiter komme. da ich mir bei dem Widerstand nicht mehr sicher bin wie genau es jetzt muss bzw ob ich überhaupt einen Widerstand verbauen muss.
Mit freundlichen Grüßen,
ElBarto
Hallo,
nunja die Größe des Widerstandes berechnet sich aus U = R*I (U die Spannung, R der Widerstand, I die Stromstärke) bzw. R = U / I
Nun muss geschaut werden, wie viel Spannung der Motor von den angelegten 12V braucht (subtrahieren) und auch welche Stromstärke angegeben ist.
Bsp: 5V Motor mit 200mA (=0.2A) Betriebsstrom bei 12V Eingangsspannung. Es müssen 7V „vernichtet“ werden.
R = 7 / 0.2 = 35 (der nächst passende Widerstand wäre z.B. 33 Ohm)
Danke für die Antwort, also habe ich es doch richtig, dass ich keinen Widerstand, wie dieser in der allgemeinen Zeichnung vorhanden ist, benötige, da mein Motor ja mit 12V läuft und mein Netzteil auch 12v liefert, oder habe ich da einen Denkfehler? Es muss ja keine Spannung „vernichtet“ werden.
Mit freundlichen Grüßen,
ElBarto
Falls das Netzteil auch genügend Stromstärke liefern kann, wie der Motor braucht.
Vorsicht aber bei der Verbindung zum Pi. An die GPIOs darf nie mehr als 3.3V gelangen (falls du 5V statt 3.3V vom Pi VCC nimmst, solltest du einen kleinen Widerstand vor die GPIOs schalten).
Danke für die Antworten. Wo muss ich denn die Widerstände wegen den gpio einbauen, diese sind in der Zeichnung vom Schaltplan oben ja auch nicht vorhanden, obwohl 5V vom Raspberry bezogen. Oder sind die Widerstände nicht notwendig, da der Treiber genügend Spannung aufnimmt?
Mit freundlichen Grüßen,
ElBarto
Im angegebenen Beispiel ist kein Widerstand vor den GPIOs nötig. Sie sind hier der Impuls-Sender für den IC (GPIO.OUT), anders sähe es aus, falls einer als INPUT deklariert werden würde und quasi als GND funktioniert – was aber hier nicht der Fall ist.
Hallo Leute, ich hab folgendes Problem:
ich habe den Script wie in der Anleitung auf meinem Raspberry Pi übernommen.
Wenn ich den Script nun über den Befehl $python schrittmotor.py ausführen will bekomme ich jedoch nur die Meldung:
File „schrittmotor.py“, line 31
GPIO.output(coil_A_1_pin, w1)
^
IndentationError: expected an indented block
Kann mir villeicht jemand weiterhelfen?
mfG,
Alex
Hey Alex,
versuch es jetzt nochmal. WordPress entfernt andauernd die Tabs aus dem Code, daher die Fehlermeldung. Nun sollte es aber klappen.
LG Felix
Hallo, ich möchte den Schrittmotor aus einem CD-Laufwerk, welcher den Laser bewegt, betreiben, zu dem ich keine Daten habe. Ich habe den/das Raspberry Pi 2 Mod B und L293d. Im Datenblatt finde ich aber nichts über den benötigten Vorwiderstand für Pin 8 :/ . Auch weiß ich nicht, wie hoch die Spannung der externen Stromversorgung sein muss. Ich würde auf 5 V tippen. Ich bin Anfänger und würde mich über Hilfe freuen.
MfG Dominic
Hallo Dominic,
ohne Datenblatt ist es vor allem schwierig die richtigen Schritte anzugeben. Auf 5V würde ich bei einem CD Laufwerk auch tippen, aber du solltest dennoch mal schauen, ob du nicht die Bezeichnung des Schrittmotors findest (steht oftmals darauf). Darüber kannst du dann nach dem Datenblatt suchen.
Auf dem Motor steht nichts drauf. Weder Etikett noch Prägung. Ich kann max. sagen das der Motor aus einem AOpen CRW5232/AAO PRO Laufwerk ist. Aber auch darüber finde ich nichts über den Motor. Alternative habe ich noch einen Schrittmotor aus einem Drucker. qh4-4473 smb40-4870-a… aber auch zu dem finde ich keine Daten.. lediglich 27V 6.4 Ohm
MfG Dominic
Darf ich fragen, wofür du ihn verwenden willst? Bzw. was spricht dagegen einen „üblichen“ Motor zu nehmen (abgesehen von der Bastel-Faszination)? Da weißt du zumindest was du hast und es gibt sie bereits für wenige Euro.
Hey. Klar darfst du. Mein Vorhaben wäre in diesem Video zu sehen.
https://www.youtube.com/watch?v=UqOYlB8f48k
Das möchte ich gerne „in etwa“ nachbauen. Mir geht es dabei hauptsächlich um das lernen im Umgang mit dem Raspberry und zum Beispiel der Programmierung mit Python und Ähnlichem. Ich versuche immer alles aus dem zu machen was ich da habe und nicht immer sofort zu kaufen.
Was du noch machen könntest (wobei ich nicht garantieren kann, dass es damit funktionieren wird): Schau mal nach Datenblättern von anderen Schrittmotoren in CD Laufwerken. Meist sind sie relativ ähnlich und wenn du Glück hast kannst du sogar die Schrittreihenfolge benutzen. Wenn er stottert musst du eine andere versuchen – deshalb einfach ausprobieren 🙂
Also die meisten haben 5V. Wenn ich eine Spule bestrome zieht sie knapp 500ma. Steps komme ich mit Hand gefühlt auf 10.. Wie würde jetzt ein sehr einfaches Script aussehen um ihn zu testen ?
MfG Dominic
Im Grunde kannst du das Skript von oben verwenden und umschreiben. Die Steps müsstest du halt anpassen (ebenfalls StepCount).
Ich glaube nicht, dass du die Anzahl so einfach per Hand rausfinden kannst. Bei dem hier verlinkten sind es z.B. 512 Steps mit jeweils 8 Sequenzen. D.h. 4096 „Schritte“ führen zu einer Umdrehung und ein CD Laufwerk wird auch recht viele Schritte haben, um möglichst genau arbeiten zu können. Aber ich lasse mich auch gerne eines besseren belehren 🙂
Kannst du mir vllt bei dem Skript helfen? Bin wie gesagt Anfänger und verstehe nicht alles wie z.B die Kommentare in den grünen Klammern oder das mit dem enable pin.. mein Motor hat 4 Anschlüsse,.. bei den Sequenzen siehts ähnlich aus :/
Das sind keine Kommentare, sondern Outputs. Allerdings kannst du die erstmal ingorieren, da sie nichts bzgl der Funktionalität ändern.
Schau dir am besten mal die Sequenzen auf dem Datenblatt von meinem verwendeten Motor an, dann sollte es wahrscheinlich verständlicher werden. Den Enable Pin kannst du auch ignorieren, wenn dein Motor nur 4 Anschlüsse hat. Ohne vorliegendes Datenblatt kann ich dir leider nicht sagen, wie die richtige Sequenz Folge lautet. Du müsstest hier einfach mal testen (z.B. mit der von mir verwendeten – wenn du Glück hast sind sie gleich). Ansonsten andere Sequenzen ausprobieren.
Ich habe mir die Sequenzen angesehen und folgendes ist mir aufgefallen.
http://www.imgbox.de/users/public/images/2bAIPU8mb8.png
Nur verstehe ich den Sinn /die Logik nicht :/
Desweiteren ist mir aufgefallen das du die GPIOs beim Namen nennst und nicht die Pin Nr verwendest. Ich habe beim Pi 2 B mehr Pins und demnach ein anderes Pinout.
http://pi4j.com/images/j8header-2b-large.png
So wie ich das sehe kann ich das nicht so übernehmen.
Was verstehst du daran genau nicht? Die Reihenfolge der Farbbelegungen ist zwar anders, aber die Logik gleich.
Das Pinout des Pi 2B ist gleich mit den vorherigen Modellen, bis auf dass es mehr Pins besitzt. Die Belegungen der ersten 26 Pins (die hier benutzt werden) sind gleich. Weiterhin gibt es die GPIO Nummern (
GPIO.BCM
) und die Pin Nummern 1-26 bzw. 40 (GPIO.BOARD
).Ich versteh grad garnichts mehr. was hat es dann mit der pinbelegung in der zeichnung oben auf sich ?
http://www.imgbox.de/show/img/Ay0CWikGOW.png
Was du da hast ist jedenfalls nicht die offizielle Pinbelegung. Wie in deinem Bild unten steht ist die Belegung für WiringPi / Pi4J.
Die richtigen Pins sind oben gezeigt und können auch hier nachgeschaut werden: http://de.pinout.xyz/
Ich habs jetzt so übernommen wie bei dir.
Aber bekomme nur fehlermeldungen.
pi@raspberrypi:~/Desktop $ sudo python Schrittmotor2.py
Traceback (most recent call last):
File „Schrittmotor2.py“, line 23, in
GPIO.setup(enable_pin, GPIO.OUT)
NameError: name ‚enable_pin‘ is not defined
Entweder du gibst der Variable
enable_pin
einen Wert oder löschst die Zeile. Die Fehlermeldung ist doch aufschlussreich 🙂GPIO.setup(enable_pin, GPIO.OUT)
GPIO.output(enable_pin, 1)
beide zeilen gelöscht. jetzt sagt er :
pi@raspberrypi:~/Desktop $ sudo python Schrittmotor2.py
Zeitverzoegerung (ms)?
Dann klappt doch alles? Du musst es natürlich auch beantworten.
Schau dir bitte das Skript nochmal genau an.
LG Felix
hab ich angesehen. aber ich hab das pi erst 6-7 tage. und keine programmiererfahrung.
ich weiß nicht was zu tun ist… :'(
ich habs bisher geschafft ne led zum blinken zu bringen und das prog so umzuschreiben das es sos blinkt, oder nen einfaches fenster mit button und ausgabe in die konsole..das wars auch schon
Ich würde dir raten dich erst ein bisschen mehr mit der Programmierung generell zu beschäftigen (falls du Bücher magst, schau mal hier). Zwar sind ambitionierte Projekte sehr gut, aber ohne Grundwissen ist es natürlich schwerer.
ich beschäftige mich doch gerade damit.
ich würde es besser lernen und verstehen wenn du mir sagen würdest was er jetzt von mir will. dann mache ich das und weiß es beim nächsten mal.
wenn es erst mal läuft kann ich am skript basteln/ verändern und dadurch lernen was passiert wenn ich etwas mache.
ich brauche aber jetzt erst die hilfe um es erst mal in gang zu setzen
Was meinst du? Ich habe doch bereits geschrieben, dass du den Wert eingeben musst?
ja, naja.. du sprachst von antworten :D. ich hoffe du bist nachsichtig mit mir.
Nimms mir bitte nicht übel.
ka, so vielleicht??
inwiefern zeitverzögerung ?
Ich meinte damit, dass du dir einfach mal anschauen solltest, was die Funktionen tun: raw_input erwartet (wie der Name sagt) einen Input vom User. Du musst also etwas eingeben. Wenn du das nicht willst, schreib einfach den Variablenwert.
so hab ich es jetzt. jetzt macht es klack klack klack und der motor zuppelt ein bisschen hin und her.
klingt nicht gesund. habe den pi neugestartet weil ich nicht weiß wie ich das skript stoppen kann :/
ich versorge das breadboard mit einem labornetzteil und 5v. ohne widerstand.
im datenblatt finde ich nichts zum widerstand zu vcc2
STRG+C zum Skript stoppen.
Das klackern kommt daher, dass die Schritt-Sequenzen nicht stimmen. Leider kann ich dir ohne Datenblatt da auch nicht mehr sagen 🙁
ich werde da weiter suchen,.. kannst du mir noch nen tipp wegen dem vorwiderstand geben?
ich versorge das breadboard mit einem labornetzteil und 5v. ohne widerstand.
im datenblatt finde ich nichts zum widerstand zu vcc2
Einige Motoren haben einen eingebauten Vorwiderstand (für 5V), ansonsten versuch einen kleinen (5-10Ohm).
Widerstände berechnen und kombinieren
– Sehr gebräuchlich sind 1,8° pro schritt, bzw. 200 Schritt pro Umdrehung! Kleine Schrittmotoren, z. B. aus CD oder Floppy Laufwerken können aber auch nur 12 Schritte pro Umdrehung anbieten!
– Auf diesem Bild der Schrittmotor aus einem alten CD-Laufwerk aus einem alten PC vom Wertstoffhof.16 mm Durchmesser und 13 mm lang! auch dieser Schrittmotor ist hervorragend zu steuern, hat nur 12 schritte für eine volle Umdrehung
– Die bipolaren Stepper machen 18° pro Vollschritt
– Motortyp: 2- Phase 4- draht;
Fahrt Spannung: dc4-6v
Schraubenlänge: 52mm
Effektive Schlaganfall: 40mm
Durchmesser der motor: 15mm
Durchmesser der schraube: 3mm
Spindelsteigung: 3mm
Schrittwinkel: 18 Grad
Menge: 2 stück
das habe ich finden können auf verschiedenen seiten.. hilft dir /uns das weiter?
Naja, du kennst die Sequenzen nicht und ohne diese wird er klappern. Die Schritt Anzahl ist erstmal zweitrangig, da ein Schritt aus z.B. 8 Sequenzen besteht (siehe Tutorial). Dabei werden die Schritte wiederholt, wobei z.B. 512 Schritte (mit je 8 Sequenzen) eine volle Umdrehung ergeben. Das kann im Falle von anderen Schrittmotoren variieren, was aber insofern nicht wichtig ist, da die Schritte sich ja nur wiederholen. Kennst du die Sequenzen (Polung der Magnete), so kannst du die Anzahl der Schritte zählen.
Deshalb meine ich ist es schwierig den Motor anzusteuern, ohne die entsprechenden Sequenzen zu kennen.
ich habe noch jemanden gefragt und einen teil seines skriptes kopiert.
zitat:
Das hängt aber nicht vom Motortyp ab, sondern mehr von der Verkabelung. Die Schrittmotoren in CD-Laufwerken sind wohl alle gleich, also mit der vorgegebenen Sequenz anzusteuern.
Datenblätter zu meinen Motoren habe ich nie gesucht und wie bereits geschrieben kann man die Schritte abzählen wenn der Motor angeschlossen ist und läuft.
skript kopie:
http://pastebin.com/Zptnr2Mu
er benutzt auch sollche motoren
Dann kannst du die Sequenzen ja verwenden (entweder das Skript oder du passt die Seuqnzen in meinen Skript oben an).
LG Felix
ohje,… kann ich doch garnicht :'(
so vllt ?
# anpassen, falls andere Sequenz
StepCount = 4
Seq = range(0, StepCount)
Seq[0] = [1,0,0,0]
Seq[1] = [0,0,0,1]
Seq[2] = [0,1,0,0]
Seq[3] = [0,0,1,0]
Ich denke eher:
Wie gesagt, du musst es ausprobieren. Das ist auch keine 100%ige Aussage, da die Farben nicht angegeben sind. Da es aber nur 4 Sequenzen sind hast du nur ein paar Möglichkeiten und solltest einfach mal ausprobieren.
Juhu,. it works *thumbsup
1000 1 100 10 +
1000 10 100 1 + funktionieren
1000 100 10 1 –
1000 100 1 10 – funktionieren nicht
so läuts ganz gut.
recht herzlichen Dank !!
Super 🙂 Das war eine schwere Geburt 😀
ja. das kann man wohl sagen.
und jetzt konnte ich mein bereits angeeignetes wissen auch einsetzen.
habe das skript jetzt umgebastelt zum experimentieren.
ich habe ja nicht nur den einzelnen laufwerks/laser antriebs motor, sondern komplett mit schlitten. zum testen habe ich es jetzt so gemacht das :
-schlitten fährt 20 schritte vor, pausiert kurz, fährt 20 vor, pausiert kurz, 20 vor
-pausiert etwas länger, fährt 60 schritte zurück
-„while true“ habe ich ersetzt durch for x in range(2)
– und zum ende noch ein „GPIO.cleanup()
*läuft
*jui 😀
ich würde jetzt gerne einen zweiten motor mit hinzufügen… teilweise kann ich das skript selber anpassen,…
aber ein zwei sachen weiß ich leider nicht:
– wo für steht eig das w1, w2, w3, w4 ?
– was heißt “ for i in range “ und “ for j in range“ ? und warum i und j ?
– und wie muss ich es schreiben wenn ich will das beide motoren gleichzeitig eine sache machen ?
den teil den ich ändern könnte würde so aussehen:
http://pastebin.com/yrJmrs9A
den rest weiß ich nicht wirklich..
danke im vorraus
w1, w2, w3, w4
sind Funktionsvariablen vonsetStep
, die die Zustände für die 4 Motor Pins angeben. Ich will dir nicht zu Nahe treten, aber du solltest wirklich zumindest die Programmier Basics dir anschauen, da der meiste Code selbsterklärend ist. Ich versuche dir dennoch zu helfen.Bzgl. der zweiten Frage: http://pythoncentral.io/pythons-range-function-explained/
Zu 3: Du schreibst eine ähnliche Funktion, die die Pins des anderen Motors ansteuert.
danke und kein problem. ich weiß das ich noch viel lernen muss…
schaue auch schon ganz fleißig :
aber zwischen durch ist man nicht mehr so aufnahmefähig, möchte aber dennoch weiter machen 🙂
Versuch am besten dich nicht an einem Projekt zu verfangen. Ich denke vor allem als Anfänger ist es schwer, auch wenn ich verstehe, dass man nach ersten Erfolgen motiviert ist weiter zu machen 🙂
Du könntest aber verschiedene kleine Projekte (wie es sie hier auf der Seite gibt) probieren. Die Python Dokumenation ist ziemlich gut und gibt Hilfe zu unklaren Befehlen. So eignest dir mehr Wissen an und kannst dann nach einiger Zeit ein größeres Projekt starten.
LG Felix
in deinem skript sprichst du iwie deinen motor nicht direkt an,. du sagst nur was und wie schnell und wie lange er was machen soll,.. wie mache ich das denn jetzt mit zweien ?
du definierst was zu tun ist wenn du vorwärts oder rückwerts sagst und sagst dann wenn “dies“ dann abarbeiten in dauerschleife
geht es vllt mit w5,w6,w7,w8 ?
ich studiere dein skript hoch und runter, aber da komme ich nicht weiter :/
Diese
w1
usw sind wie gesagt nur Funktionsvariablen. Ich definiere erst die Pins für den Motor (Nr und Pin als Output) und in der Funktion weise ich den übergebenen Wert (w1, ..) den jeweiligen Pins zu. Du brauchst eine zweite Funktion, die die Pins deines zweiten Motors anspricht, die du natürlich auche rstmal zuweisen musst (äquivalent zum ersten Motor, nur andere Pin Nummern). Wie du die inneren Variablen dabei nennst ist vollkommen egal.kannst du mir ein beispiel schreiben ?
ich tendiere gedanklich zu sowas oder so ähnlich :
http://pastebin.com/jLQpeAki
sprich x und y
also ich habs jetzt auf eigene faust probiert, aber entweder es bewegt sich immer nur einer oder es brummt,.. bekomme es nicht hin :/
Dann poste deinen ganzen Code mal auf http://pastebin.com/ und verlinke ihn hier.
ich habs jetzt hintereinander, dann gehts,.. aber nicht zeitgleich oder oder eben erst motor 1 dann 2 dann1….
http://pastebin.com/0QD3Jd4r
Dein Skript macht an einigen Stellen keinen Sinn bzw. ist falsch. Ich habe es mal geändert: http://pastebin.com/cPED3NyZ
Evtl. stimmen die Einrückungen (Leerzeichen/Tabs) nicht überein, das müsstest du überprüfen (sonst IndentError). Ansonsten natürlich anpassen.
danke, so funktioniert, bzw jetzt versteh ich es
nur merkwürdiger weise fährt jetzt ein motor ( X) nur gequält zurück,.. vorher gings mit delay 2 bis 3,.. jetzt muss mind. 10 sein. und die lampe am labornetzteil geht auf rot,.. heißt für mich das er jetzt mehr strom zieht/braucht,.. wie kann das sein.
info : ich habe die zweite h-brücke (auch l239d) an einem anderen gnd am pi und vcc1 am zweiten 5v anschluss am pi
das mit setstep X und setstepY hatte ich auch schon versucht, aber meine reihenfolge war wohl komplett verkehrt
weiter beschäftigt es mich, wie ich es hinbekomme/ schreiben muss damit zwei sachen gleichzeitig passieren,.. hab viel versucht aber nicht hinbekommen :/
So, bisher habe ich noch allein hinbekommen:
– servo funktionsfähig ins script aufgenommen
– testweise sequenzen funktionsfähig auf 8 erweitert
aber ich kriege x und y nicht zeitgleich ans laufen,.. kann nur treppen zeichnen und keine diagonalen oder kreise :'(
i need help
Du kannst es z.B. mit Threads versuchen. Vollkommen gleichzeitig ist aber auch nicht möglich, da jeder Computer etwas nacheinander abarbeitet. Du könntest jedoch z.B. immer nur einen Schritt mit x, dann einen mit y, dann wieder x usw. machen. Dadurch hättest du einen ähnlichen Effekt.
ja, hab ich gemacht mit nur einem step,.. kam halt eine mini treppe raus,..
hab schon gelesen über threads und multithreading,.. aber immer nur iwelche rechen aufgaben, da ist es dann schwer für mich das in mein projekt „rein zu verstehen“ :/
das mit dem abarbeiten ist doch eine kernel sache oder nicht ?
kannst du mir da helfen ?
Wenn dein Motor keine großwinkligen Schritte hat, sollte das kaum auffallen. Ich denke, es wird keine einfache Lösung für das Problem geben, da die GPIOs nicht wirklich parallel angesprochen werden können. Ich will nicht sagen, dass es nicht möglich ist, aber gerade als Anfängerprojekt sehr kompliziert.
ja, habs hinbekommen,.. mit threads,.. jetzt gehen diagonalen,… was hat es eig mit den „1000.0, int(steps)“ auf sich? wenn ich die zahl zb auf 500 setze läufts langsamer,.. wie könnte ich zb halbschritte realisieren und was mir aufgefallen ist,.. ich benutze ja für meine z achse einen analog servo mit deinem p.changedutycycle,.. warum klappts bei digitalen nicht genauso ? die machen fast garnichts ?!
mfg dom
Nettes, gutes Tuttorial mit viel Hintergrundinformationen, allerdings hab ich dazu ein paar kleine Anmerkungen.
– ich verwende das fertige ULN2003 Modul, da sind die Anschlüsse ein wenig Vertauscht. Richtet man sich nach den Kabelfarben des Motors, kriegt man das aber hin.
– Im script wird der enable_pin nicht definiert. (Programmabbruch) – Da ich den mit dem ULN-Modul eh nicht brauche kann man die 2 Zeilen auch einfach auskommentieren.
– Nach beendigung einer Vor oder Rückwärtsfahrt bleiben immer 1 oder 2 Spulen des Motors unter Spannung, sodas sich der Motor erhitzt, auch wenn er gerade nichts zu tun hat.
Deshalb habe ich im __main__ Programmteil nach den Fahrten einen weiteren setStep Befehl eingefügt wo ich allen Gpios den Wert 0 zuweise.
mfg Kai
Hallo Kai,
wegen dem ULN2003 Modul habe ich die Farben der Kabel dazu geschrieben, denke das sollte nicht all zu kompliziert sein.
Den Enable Pin braucht man bei dem Motor hier nicht, allerdings brauchen manche diesen, daher habe ich ihn mit rein geschrieben (da man ja auch andere Motoren verwenden kann).
Bzgl. deines dritten Punktes muss ich widersprechen: Wenn du alle GPIOs auf 0 setzt liegt zwar keine Spannung an, aber es ist (bei manchen Motoren) ein zusätzlicher Schritt. Wenn der Motor sich nach dem letzten Schritt nicht bewegen und einsatzbereit bleiben soll, sollte die Spannung der GPIOs nicht verändert werden.
LG Felix
Hi Felix,
nun über Punkt eins und zwei brauchen wir nicht wirklich reden.., das Tut ist schon klasse aber.bei den Farben kam es mir im text nicht wirklich rüber (das modul ist ja nicht über fritzing dargestellt) und bei zwei…, jeder der schon mal ein wenig programiert hat, erkennt das auf den ersten Blick und weiss was zu tun ist… beim dritten Punkt gehe ich hier auch vom 28BYJ-48 Motor aus, ich habe halt gesehen, das dieser nach der einer Fahrt und dann ca. 5 Minuten Ruhe doch schon recht warm, bzw. fast heiß wurde und das Labornetzteil gab auch dementsprechend einen höheren Stromverbrauch an. daher habe ich das nach den Fahrten durch die Stromlossetzung der Motorspulen eleminiert. (Hintergrund ist, das ich plane ne Steuerung über Solar/Akku aufzubauen wo der Motor so alle halbe Stunde für ca. ne Minute etwas zu tun bekommt, daher muss ich auf den Stromverbrauch achten) Bei anderen Motoren, oder wo die Position gehalten werden soll, klar da macht es Sinn auch den Motor unter Spannung zu halten.
Ansonsten freue ich mich schon darauf hier weitere nette und sehr gute Tutorials von Euch hier lesen zu dürfen.
@kai: Setz einfach ein GPIO.cleanup () drunter
Hallo Felix,
ich nutze den 28BYJ-48 mit ULN2003 Driver Board. Betrieben wird das Ganze mit 5V.
Das Programm läuft ohne Fehler.
Egal welche Zeitverzögerung und/oder Schritte ich angebe, der Motor ruckelt. Wenn ich vorsichtig die Achse mit der Hand nachführe, ist eine Vorwärts- bzw. Rückwärtsbewegung zu bemerken. Ansonsten kommt der Motor nicht aus dem Quark.
Hast Du eine Idee? Habe es schon mit mehreren Baugleichen Motoren und Platinen probiert.
DANKE!!
Bist du dir bei den Steps sicher, dass diese in der richtigen Reihenfolge sind? Das klingt nämlich sehr verdächtig danach (brummen, ruckeln). Ansonsten könnte es sein, dass zu wenig Stromstärke eingespeist wird, aber davon gehe ich nicht aus.
Hallo Felix,
was wären den so die optimalen Einstellungen?
Was meinst du mit Einstellungen? Dieses Brummen entsteh (aller Wahrscheinlichkeit nach) durch eine falsche Schrittreihenfolge. Das kann entweder an der Software liegen oder aber, dass du die Kabel nicht richtig angeschlossen hast. Auch wenn es unwahrscheinlich ist, können deine Farbem der Kabel von meinen abweichen – das müsstest du testen. Falls es ein andere Motor wäre, müsstest du außerdem noch die Schritte anpassen.
Hallo Felix,
Ich wollte dieses Tutorial nehmen um meinen eigenen Roboter zu bauen, aber leider bewegen sich die Motoren nicht… Hier ist der Script
http://pastebin.com/pVbdBnjp
Ich habe noch Ultraschallsensoren angeschlossen weshalb ich andere Pins benutzen musste.
Ich kann bei meinen Anschl[ssen keinen Fehler finden…
Kannst du mir irgendwie helfen?
Hast du den selben Motor benutzt (mit Treiberboard)?
Ich benutze den L293D und den selben Motor
Hallo,
ich will Anfangen mich mit dem PI zu beschäftigen und habe mir als erstes Projekt einen „V-Plotter“ ausgesucht, ähnlich diesem Projekt hier: http://www.homofaciens.de/technics-machines-v-plotter_ge_navion.htm#commentFrame
Jetzt bin ich gerade dabei die einzelnen Komponenten zusammen zu suchen die ich dafür benötigen werde und wollte dich sicherheitshalber bitten den Schrittmotor und den Treibercontroller kurz anzusehen ob ich diese auch verwenden kann bevor ich die bestelle, wäre super =)
Ausgesucht habe ich:
http://eckstein-shop.de/12V-28BYJ-48-Step-Motor-XH-5P-Stock und
http://eckstein-shop.de/L298N-Schrittmotor-Stepper-Motor-Driver-Controller
Insgesamt werden vier davon im Einsatz sein (mit externem Netzteil, vom PC schätze ich) und ein Servo. Daher werde ich auch die GPIOs erweitern wie von dir beschrieben, bekommst dann auf jeden Fall Rückmeldung zu dem Projekt =)
Hi Patsch,
den 28BYJ-48 Motor bekommt man oft für wenig Geld (<5€) inkl. dem ULN2003 Treiber. Da der Motor auch nur 5V braucht, ist ein L298 IC eigentlich nicht nötig. Ist zwar auch möglich, aber kostet mehr und hat keinen richtigen Mehrwert für diesen Motor. Hat es einen bestimmten Grund, warum du den L298 IC ausgesucht hast?
LG Felix
Hallo,
ich habe vor kurzem damit angefangen mich mit dem Pi, der Schrittmotorsteuerung und der Programmierung zu beschäftigen – bin also noch blutiger Anfänger – habe mir aber ein richtiges Projekt vorgenommen. Ich habe hier viele hilfreiche Infos bekommen, es gibt aber dennoch viele Sachen die ich einfach nicht weis, und bitte somit um Unterstützung.
Ich habe einen Pi und gehe direkt von den GPIO-Ports auf eine Schrittmotor-Steuerplatine: http://www.pollin.de/shop/dt/Mjc5OTgxOTk-/Bausaetze_Module/Bausaetze/Schrittmotorplatine_Bausatz.html
und steuere folgenden Motor: http://www.pollin.de/shop/dt/NTQ1OTg2OTk-/Motoren/Schrittmotoren/Schrittmotor_PSM57BYGHM201_0_9_.html.
Auf der Steuerplatine sind noch zwei Schalteranschlüsse die ich gerne mit benutzen will, in der Montageanleitung ist unter Anderem auch ein Stromlaufplan: http://www.pollin.de/shop/downloads/D810027B.PDF
der anzeigt das die Spannung der Schalterausgänge 5V ist und dann auf nen Transistor geht, und von dort über nen Widerstand und den LPT-Port quasi direkt zum GPIO-Port gehen würde. Jetzt bin ich mir nicht sicher welche Spannung am GPIO ankommen würde (vermute auch 5V), kann es aber auch nicht Messen weil der Impuls zu kurz ist. Ich würde die Widerstände R10/12 sonst gegen andere austauschen, so das ich auf 3,3V bzw etwas weniger komme um den Port nicht zu grillen. Kann mir jemand sagen ob das not tut, und wenn ja, welchen Widerstände ich bräuchte?
Gruß, Mirco
Hallo Felix,
ich bin noch recht neu in python und bin etwas verwundert, das das offenbar nur bei mir auftritt jedenfalls hab ich es noch in keinem anderen Kommentar gesehen. ich bekomme eine Fehlermeldung und zwar:
pi@raspberrypi:~/p $ ./schrittmotor.py
Traceback (most recent call last):
File „./schrittmotor.py“, line 14, in
Seq[0] = [0,1,0,0]
TypeError: ‚range‘ object does not support item assignment
Ich benutze python3 mit RPI3.
Hat jemand eine Idee?
In meinem Python Kurs wurde es im Zusammenhang mit strings angesprochen. Dort heißt es:
„Wie in Java aber nicht wie in C/C++ können strings in Python nicht verändert werden. Versucht man eine indizierte Position zu ändern bekommt man die Fehlermeldung
TypeError: ’str‘ object does not support item assignment.“
Also wieso geht es bei euch?^^
Grüße Marcus
Python3 erstellt aus
range
nicht automatisch eine Liste, anders als Python2 (Standard). Damit kannst du es aber einfach lösen (Zeile 13):Danke, da wär ich so nicht drauf gekommen, da ich direkt mit Python 3 angefangen habe. Hast es oben auch schon ergänzt, Top Mann 😉 – Motor läuft. Das Delay kann ich bis auf 0,8µs drücken (ohne Last)
Hallo Felix! Ich habe dein Skript komplett übernommen. Als Motor habe ich den ULN2003 IC mit dem Motortreiber. Ich weiss aber nicht so recht, wie ich ihn am Raspi anschließen soll…
Wo hängt es denn genau? Im schematischen Aufbau sind die Anchlüsse doch definiert und auch das Datenblatt des ICs sollte helfen.
Ich verwende aber nicht so ein großes Board sonder den Treiber der bei dem moter dazugeliefert wird… Ich weiss nicht wie ich den treiber mit dem Raspberry Pi verbinde
Die Farbe der Kabel ist auch auf den Boards fast immer gleich. Daran kannst du es ablesen.
Hallo, ich habe neben den tollen Tutorials auch die Kommentare durchgelesen. Hier fragte Steffen im September 2015 nach einer Möglichkeit mehrere (16-18) Schrittmotore in einer Art Bussystem anzusteuern. Das geht doch beim L293D über die Enable-Eingänge. Diese müssten über zwei BCD-Dezimal Dekoder (HEF4028B) aktiviert bzw. gesperrt werden. Allerdings müssten eventuell auch noch zwischen die Steuersignale (GPIOs) und die 16-18 L293D Treiber Stufen eingesetzt werden. Ich weiß nicht wie hochohmig die L293D Eingänge sind und ob ein GPIO PIN wirklich 18 Eingänge treiben kann.
Wegen dieser Anfrage habe ich mir nochmal genauer Dein Fritzing Diagramm angesehen und festgestellt, dass die Enable Eingänge zwar miteinander verbunden sind aber ansonsten in der Luft hängen. Müssten die nicht auf High liegen?
Hallo Gunter,
Im Grunde genommen (laut Datenblatt) ja, allerdings funktioniert der L239D auch ohne die Enable Pins. Jedenfalls nutze ich einen L293D in meinem aktuellen Roboter Projekt und habe diese Pins nicht angeschlossen.
Hallo Felix!
Ich bin immer noch begeistert von deiner Seite.
Eine Frage zu dem L293D:
Kann man damit auch einen Trafo „simulieren“?
Hintergrund ist meine alte 12V-Legoeisenbahn. Die hat einen 12V-Trafo, in dem man mit einem Drehknopf die Fahrtrichtung und die Geschwindigkeit variabel verstellen kann. (Gleichstrom-Trafo mit Brückengleichrichtern etc. – gerade erst einen defekten ausgetauscht;) )
Kann ich jetzt die o.g. Schaltung mit einer externen 12V-Stromquelle (ggf. erstmal den 12V-Gleichstrom-Ausgang des Lego-Trafos) nehmen und als Verbraucher dann nicht den Motor, sondern die Gleisanlage anschließen? Wie müssen dann die Sequenzen eingestellt werden? Oder macht das damit keinen Sinn, und ich brauche etwas ganz anderes? Es fahren auf den Gleisen ja mehrere Züge/Motoren.
Im Hinterkopf habe ich, dass ich die Anlage dann über eine kleine Webseite „steuern“ kann – also angefangen mit vorwärts-/rückwärts-fahren um dann die Schaltung der elektrischen Weichen, der Schranke, den „Abstellgleisen“ etc. darüber zu ermöglichen. Später dann… 😉 … eine Digitalisierung mit Dekodern habe ich erstmal nicht vor.
Grußwort vergessen:)
Vielen Dank für ein paar Infos und viele Grüße!
Lars
P.S.: Das Roboter-Projekt finde ich übrigens auch TOP! 🙂
Danke 🙂
Die Geschwindigkeit wird über die Spannung geregelt? Falls ja, denke ich nicht, dass es mit dem L293D klappt 🙁 Muss aber auch gestehen, dass ich noch keinen Trafo mit dem Pi benutzt habe und mich daher auch gerne eines besseren belehren lasse 😀
Hallo Felix,
ja, der Trafo reguliert die Spannung zwischen 0-12V, so dass die Motoren auf den Gleisen dann entsprechend garnicht/langsamer/schneller fahren, und in die eine Richtung gedreht gibt er halt +/- und in die andere Richtung -/+ – Polung aus… (= vorwärts/rückwärts fahren).
Hm – wie kann man denn einen „Trafo“ über einen Raspberry Pi steuern? Hast du / hat jemand eine Idee dazu?
Eine „mechanische“ Idee: Einen Schrittmotor (wie hier beschrieben über Raspberry PI gesteuert) nehmen, der dann per „Lego-Technik-Zahnräder“ den Trafo-Regler entsprechend vor/zurückdreht … Sieht bestimmt lustig aus:)
Danke und Gruß
Lars
Du suchst also quasi einen Potentiometer, den du per Befehl steuern kannst?
Ja, genau sowas wäre das wohl (ich bin ja Elektroniklaie…) – aber ja, klar. Per Programm steuerbarer Potentiometer der 0-12V ausgeben kann (evtl. mit Polwender oder eine Polwendeschaltung dann halt davor „bauen“…)
Also ein „digitaler Potentiometer“ – gibt es sowas?
Danke und Gruß
Lars
Da hast du etwas falsch verstanden: Ein Potentiometer ist ein regelnbarer Widerstand 🙂 Und ja, die gibt es.
Also, sowas z.B.:
http://www.mouser.de/ProductDetail/Intersil/ISL95311WIU10Z/?qs=sGAEpiMZZMsX%252bY3VKDPZyEk97ZwKT6JOKufKn4bykgw%3d
Nur habe ich persönlich nun keinen Plan von den da angegebenen Daten. Heißt das jetzt, ich könnte mit dem 0-12V „Ausgangsleistung“ erzeugen und das mit den 3.3V / 5V vom Raspberry pi steuern?!?
Das war jetzt mal eine schnelle google-suche…
Danke und Gruß
LarsMq
Achso, ja.
Also eine externe 12V-Stromquelle, die durch den regelbaren Widerstand zum Verbraucher geht, und dieser Widerstand wird über den Raspberry Pi entsprechend verändert. (? richtig zusammengefasst?)
Na dann werde ich das mal (nachdem ich noch ein paar Grundlagenprojekte durchgeführt habe) ausprobieren und kann meinem Sohn sagen: Ja, das geht;)
Vielen Dank!
LarsMq
Ja, so ungefähr 🙂
Servus
Ich habe das ganze mit dem ULN 2003 board versucht, jedoch dreht sich der Motor nicht selbstständig… 🙁
Wenn ich nachhelfe dreht er sich, ansonsten vibriert er nur.
Kommt mir vor als würde er den Takt nicht finden…
Beschaltung ist genauso wie in deinem Schaltplan.
Ich habe es mit 2 verschieden Motoren versucht, bei beiden wars gleich.
Wisst ihr vielleicht was das Problem sein könnte?
MfG. Andreas
Dieses vibrieren klingt eher, nach zu wenig Strom. Wie viel mA braucht der Motor und woher bezieht er den Strom?
Habe es zuerst mit meinem Raspberry betrieben…
Nachdem ich das ULN2003 board an mein Netzgerät angeschlossen habe, hats funktioniert.
Danke 😉
Servus ich habe eine Frage
Ich möchte das der schrittmotor bei einer Bestimmten temperatur z.b. 110 Grad nach Links läuft und bei z.b. 98 Grad nach Rechts läuft.
Hier wäre mein Skript: http://pastebin.com/970URF2V
MFG Daniel
Hallo Felix,
deine Tutorials sind echt klasse.
Ich komme aber leider irgendwie nicht weiter.
Ich habe den 28BYJ-48 mit ULN2003AN Board (dein Link) und bekomme ihn einfach nicht zum laufen.
Ich habe den Motor am Treiberboard angeschlossen.
IN1 geht auf GPIO 23
IN2 geht auf GPIO 4
IN3 geht auf GPIO 24 und
IN4 geht auf GPIO 17
Die LEDs auf dem Treiberboard leuchten in folgender Reihenfolge:
D
DC
C
CB
B
BA
A
AD
Ich fühle, dass sich im Motor nach jedem delay was bewegt aber er läuft nicht.
Habe gefühlt 1000 Farbkombinationen und Sequenzen ausprobiert jedoch ohne Erfolg.
Ich hoffe du kannst mir helfen.
mfg Tobias
Hallo Felix,
ist es möglich die Schrittmotoren von einem CNC Plotter wie du beschrieben hast zu verkabeln und diese dann mit LinuxCNC auf dem RasPi anzusteuern?
Mfg
Louis
Also mit dem L293D IC als Steuerung
Mit LinuxCNC habe ich noch nicht gearbeitet, aber mit dem L293D kannst du jeden Schrittmotor, auch aus einem CNC Plotter, ansteuern.
Hallo,
vielen Dank für die Anleitung.
Ist es möglich, dem Motor eine Startposition zu geben? Also so, dass er beim Start erstmal wieder in die Ausgangsstellung zurück fährt?
Nein leider nicht. Der Schrittmotor kennt seinen Zustand nicht – im Gegensatz zu einem Servo Motor, der aber wiederum keine ganzen Umdrehungen kann.
Vielen Dank für deine Rückmeldung. Ja, Servormotor hab ich auch schon durch, funktioniert leider nicht so wie gewünscht aufgrund der nur halben Drehung. Also müsste man dann beim Schrittmotor mit einem Referenz- oder Endschalter arbeiten? Das sollte ja nicht so das große Problem sein.
Ich habe derzeit einen 4-poligen Schrittmotor von Nanotec, ST2018S0604-A, und ein A4988, aber irgendwie komme ich nicht zurecht, weil ich irgendwie keine Anleitung finde, wie man das Board an den Raspberry anschließt und scheinbar auch nur 2 Pins (und GND) vom Board mit dem Raspberry verbunden werden sollen. Würdest du mir ein anderes Treiberboard empfehlen, welches in der Handhabung vielleicht nich ganz so komplex ist?
Richtig. Ich habe mal einen analogen Spieleautomaten aufgemacht, welcher auch Schrittmotoren nutzte. Dort wird solange gedreht, bis ein gewisser Punkt eine Lichtschranke durchfährt und ab dann weiß das System, wo es sich befindet.
Wieso nutzt du keinen L293D oder ULN2003A? Das sind die gängisten Treiber ICs für Schrittmotoren.
Ja, habe jetzt einen L293D und es funktioniert, jedoch macht der Motor nicht pro Schritt 1,8°, sondern 7,2°. Weißt du zufällig woran das liegen könnte?
Wie viele Schritte hat dein Motor denn pro Umdrehung laut Datenblatt?
Hmm ja das ist eine gute Frage. Ich bin davon ausgegengen, dass Step Angle 1,8° einem Schritt entspricht, und demnach 200 Steps für eine Umdrehung gemacht werden müssten. https://de.nanotec.com/fileadmin/files/Datenblaetter/Schrittmotoren/ST2018/ST2018S0604-A.pdf
Hast du wirklich nur einen Step oder eine komplette Phase (= 4 Steps) laufen lassen? Du müsstest immer die vorherige Phase wissen, um den folgenden Schritt zu machen.
Ich hab genau das Skript laufen lassen, welches du oben gepostet hast.
Du musst es natürlich anpassen für deine Zwecke 🙂
Stimmt, das macht sinn.
Ich hab jetzt noch das Problem, dass der Motor quasi kein Drehmoment hat. Hab Ihn angeschlossen an 3,9V (wie im Datenblatt angegeben), und die 1,2A vom Netzteil sollten auch ausreichen denke ich. Aber irgendwie rattert er nur bei dem geringsten Widerstand.
Hab ich vielleicht irgendwas falsch gemacht? Oder ist der Motor einfach scheisse?
Also, zwischenzeitlich habe in in Erfahrung bringen können, dass mein Motor mit 3,9V-48V läuft, jedoch dann ein IMT-901 oder SMC genutzt werden sollte, meine Frage daher, hat der L293D eine ähnliche Funktion wie ein IMT-901 oder SMC?
Hallo Felix,
ich programmiere gerade zuhause einen Plotter mit einer X und Y-Achse die jeweils von einem Schrittmotor angetrieben werden.
Habe mir zur Ideenfindung (:-P) dein Programm angeschaut.
Dabei ist mir aber die Eingabe der Steps unklar.
Würde der motor nicht z.B. 8000 Schritte machen wenn man bei dir 1000 eingibt? da es ja 8 sequenzen gibt die in der inneren Schleife durchlaufen und dann 1000 durchläufe der äußeren Schleife. Dies würde doch 8000 „echte“ Schritte ergeben.
Bitte korrigiere mich falls ich falsch liege
lg Viktor
PS: super seite 😀
Hi Viktor,
ja, du hast recht. Die Sache ist folgende: Du kannst natürlich auch die einzelnen Schritte einer Sequenz „laufen“ lassen, aber dafür müsstest du eben den letzten Stand speichern, um dann den nächsten bzw. vorherigen Schritt auszuführen. Da sich das Tutorial in erster Linie an absolute Neulinge gerichtet hat, wollte ich es nicht unnötig verkomplizieren. Möglich ist es jedoch allemal 🙂
hy,
danke für die schnelle rückmeldung hat mur sehr geholfen 😀
ich lese jetzt den letzten stand über die Parameter der for Schleife ein und über return gebe ich den neuen stand wieder zurück
derweil schreibe ich den stand in den range hinein wobei dies noch nicht 100%ig läuft
gibt es da eine bessere („saubere“) lösung?
lg Viktor
Hallo Felix,
danke für dieses Tutorial nebst Kommentaren. Endlich konnte ich erste Erfolge mit meinem Nema 17 verbuchen.
Nachdem ich im Datenblatt die richtige Sequenz gefunden habe (http://www.osmtec.com/downloads/stepper_motor/stepper_motor.pdf Seite 11)
läuft der Motor etwas ruhiger als mit deinen Originalsequenzen. Allerdings nur mit 8 Steps und nur rückwärts??? Vorwärts brummt er nur. Außerdem lässt sich der Motor durch einfaches Fingerauflegen anhalten. An der Verkabelung scheint es nicht zu liegen, mit deinem Original dreht er sich, wenn auch brummend und ruckelnd, in beide Richtungen.
Das Netzteil sollte mit 12V 2A ausreichend sein. Hast du einen Tip für mich wie das Brummen aufhört und der Motor mit seinem eigentlichen Drehmoment läuft?
Ist die Sequenz ganz sicher richtig? Dieses Brummen/Ruckeln habe ich meist dann festgestellt, wenn die Schritte nicht mit den des Motors übereingestimmt haben.
Hallo Felix,
gibt es ähnlich wie für Servomotoren die Möglichkeit über ein Driver Board mehr als 2 Schrittmotoren anzusteuern? In meinem Projekt möchte ich gerne min. 3 ehr 4 Motoren ansteuern.
Vielen Dank =)
Hallo,
mein Schrittmotor(28BYJ-48) geht nicht. Er vibriert zwar, aber er rührt sich kein einziges Grad.
Bitte um Hilfe!
Klingt nach ntweder zu geringer Stromaufnahme oder falscher Schrittkombination.
Hey Felix,
für meine Masterarbeit, benötige ich einen Schrittmotor und habe deine Anleitung gefunden und nachgebaut. Ich habe das Raspberry Pi 2 Model B V1.1 sowie den Treiber L293D genommen. Als Schrittmotor verwende ich den ST2018S0604-A — Schrittmotor – NEMA 8.
Die Sequenzen habe ich wie folgt umgeschrieben:
Seq[0] = 1,0,1,0
Seq[1] = 0,1,1,0
Seq [2] = 0,1,0,1
Seq [3] =1,0,0,1
Soweit funktioniert der Motor schonmal. Nun zu meinem Problem: Der Motor hat einen minimalen Winkel von 1,8° bedeutet also er müsste 200 Schritte für eine volle Umdrehung machen. Bei mir ist es aber so, dass er nach 50 Schritten schon die 360° macht. Könntest du mir hier weiterhelfen?
Viele Grüße
Maik
Hey Maik,
eine Umdrehung sind 50 Ausgaben der 4-er Sequenz also die angegebenen 200 Schritte. Zur Positionierung auf einzelne Schritte genau ist ein einzelner Schritt erforderlich, also konkret ein einzelner Wert der 4-er Sequenz (z.B. nur Seq[0]).
Schönen Gruß
Reinhard
Hallo
Kleine Info:
Habe ein Breakout Board mit einem ULN2003 vom Chinesen und einen 12V 28BYJ-48 Motor dran.
Musste orange/blau tauschen, damit es funktioniert.
coil_A_2_pin = 23 # orange
coil_B_1_pin = 17 # blau
Wenn ich schon mal da bin, wie kann ich kleinere Zeitverzögerungen als 1ms realisieren?
ERROR: Could not find a version that satisfies the requirement RIP.gpio
ERROR: No matching distribution found for RIP.gpio
und nichs geht !!!