41dpHtM5WfL

GPIO

Raspberry Pi Schrittmotor ansteuern mit L293D / ULN2003A

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

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):

Raspberry Pi Schrittmotor Aufbau
Falls du also einen anderen Motor wählst, achte dabei darauf, dass die Farben anders sein können, wichtig sind allerdings nur die Positionen und Schritte.

 

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:

Raspberry Pi Schrittmotor Aufbau - L293D
 Wichtig ist noch zu sagen, dass falls du keine externe Stromquelle benutzt, muss +5V vom Raspberry auch unten links an den IC (Pin 8), zusätzlich zu Pin 16 angeschlossen werden.

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.

 

Raspberry Pi Schrittmotor Aufbau - ULN2003
 

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:

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).

 



, , , , ,


115 Kommentare

  1. Heinz-Rolf sagt:

    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.

    • Admin sagt:

      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.

  2. Henning sagt:

    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

    • Felix sagt:

      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

    • Henning sagt:

      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

    • Felix sagt:

      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

  3. Henning sagt:

    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

    • Felix sagt:

      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

  4. Lars sagt:

    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

  5. Lars sagt:

    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

    • Felix sagt:

      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

    • Lars sagt:

      Hallo Felix,
      vielen Dank für die schnelle Antwort.
      Ich habe deinen Code wie folgt geändert:

      def forward(delay, steps):
          for i in range(steps):
                  setStep(Seq[i%8][0], Seq[i%8][1], Seq[i%8][2], Seq[i%8][3])
                  time.sleep(delay)

      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

    • Felix sagt:

      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:

      schritt = 0
      
      def forward(delay, steps):
          for i in range(schritt, schritt + steps):
              ...
          schritt = (schritt + steps) % 8

      (Habe das nicht getestet, sollte aber funktionieren).

  6. jack sagt:

    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

    import Tkinter,thread,time,serial
    #Programm für den Rapberry Pi als Kommentar 
    #import RPi.GPIO as GPIO
    
    #Variblen
    varExit=False
    varRun=False
    #GPIO Ausgänge festlegen
    #GPIO.setwarnings(False)
    #GPIO.setmode(GPIO.BCM)
    #GPIO.setup(4,GPIO.OUT)
    #GPIO.setup(17,GPIO.OUT)
    #GPIO.setup(23,GPIO.OUT)
    #GPIO.setup(24,GPIO.OUT)
    
    
    ser=serial.Serial(port="COM5",baudrate=115200,parity='N')
    #ser = serial.Serial('/dev/ttyACM0',115200,timeout=1)
    
    #Funktionen
    
    def offnen():
        global ser
        try:
            ser.open()
            lb.configure(text="Port wurde geöffnet")
    
        except:
            lb.configure(text="Fehler beim öffnen")
            
    
    def schliessen():
        global ser
    
        try:
            ser.close()
            lb.configure(text="Port wurde geschlossen")
        except:
            lb.configure(text="Fehler beim schliessen")
            
            
    def start():
        cmd ='\xff\x07\x03'
        try:
            ser.write(cmd)
            lb.configure(text="AP start")
            for i in range(3):
                print hex(ord(ser.read()))
        except:
            lb.configure(text="Fehler beim Starten vom AP")
            
        
    def stop():
        global varRun
    
        cmd = '\xFF\x09\x03'
        varRun=False
        try:
            ser.write(cmd)     
            lb.configure(text="AP stop")
            for i in range(3):
                print hex(ord(ser.read()))
        except:
            lb.configure(text="Fehler beim Stoppen vom AP")
            
        
    def acc_data():
        global ser,varRun,varExit
    
        while varExit == False:
            if varRun==True:
                cmd = '\xff\x08\x07\x00\x00\x00\x00'
                r = ser.write(cmd)
                r = ser.read(7)
                if(ord(r[3]) == 1):
                    r=([ord(r[4])],[ord(r[5])],[ord(r[6])])
                    lb1.configure(text=r[0])
                    lb2.configure(text=r[1])
                    lb3.configure(text=r[2])
                    x =r[0]
                    y =r[1]
                    z =r[2]
    
                    #Durch die Positionen der x-y-z-Achsen in bewegung bringen
                    if x > [240] and y > [10] and y = [40]:
                        print "Roboter vorwärts normale Geschwindigkeit"
                        #L=GPIO.PWM(4,200)
                        #R=GPIO.PWM(23,200)
                        #m=GPIO.PWM(17,200)
                        #s=GPIO.PWM(24,200)
                        #L.ChangeDutyCycle(50)
                        #R.ChangeDutyCycle(50)
                        #m.ChangeDutyCycle(0)
                        #s.ChangeDutyCycle(0)
                    elif x > [245] and y > [20] and y  [245] and y  [200] and z  [240] and y > [250] and z > [52]:
                        print "Roboter steht"
                        #L=GPIO.PWM(4,200)
                        #R=GPIO.PWM(23,200)
                        #m=GPIO.PWM(17,200)
                        #s=GPIO.PWM(24,200)
                        #m.start(0)
                        #s.start(0)
                        #L.start(0)
                        #R.start(0)
                    elif x > [100] and y < [10] and z < [10]:
                        print "Roboter nach links"
                        #R=GPIO.PWM(23,200)
                        #s=GPIO.PWM(24,200)
                        #L=GPIO.PWM(4,200)
                        #m=GPIO.PWM(17,200)
                        #L.ChangeDutyCycle(20)
                        #m.ChangeDutyCycle(20)
                        #R.ChangeDutyCycle(100)
                        #s.ChangeDutyCycle(100)
                    elif x < [100] and y  [0] and z < [20]:
                        print " Roboter nach rechts"
                        #R=GPIO.PWM(23,200)
                        #s=GPIO.PWM(24,200)
                        #L=GPIO.PWM(4,200)
                        #m=GPIO.PWM(17,200)
                        #L.ChangeDutyCycle(100)
                        #m.ChangeDutyCycle(100)
                        #R.ChangeDutyCycle(20)
                        #s.ChangeDutyCycle(20)
                    else:
                        print "Wartet auf Anweisung"
                        #R=GPIO.PWM(23,200)
                        #s=GPIO.PWM(24,200)
                        #L=GPIO.PWM(4,200)
                        #m=GPIO.PWM(17,200)
                        #L.ChangeDutyCycle(20)
                        #m.ChangeDutyCycle(0)
                        #R.ChangeDutyCycle(20)
                        #s.ChangeDutyCycle(0)
    
    
        stop()
        #R.stop()
        #L.stop()
        #m.stop()
        #s.stop()
        #GPIO.cleanup()
        schliessen()
    
        
    def read():
        global varRun
        
        if varRun==False:
            varRun=True
            lb.configure(text="Lesen der Daten")
        else:
            varRun=False
            lb.configure(text="Lesen der Daten gestoppt")
    
        
    
            
    def ende():
        global varExit, varRun
    
        varRun=False
        varExit=True
        time.sleep(1)
            
        main.destroy()
    
    
    #Hauptprgramm
    
    main=Tkinter.Tk()
    
    a=Tkinter.Button(main,text="open Port",command=offnen)
    b=Tkinter.Button(main,text="close Port",command=schliessen)
    c=Tkinter.Button(main,text="start AP",command=start)
    d=Tkinter.Button(main,text="stop AP",command=stop)
    e=Tkinter.Button(main,text="read Data",command=read)
    end=Tkinter.Button(main,text="Exit",command=ende)
    lb=Tkinter.Label(main,text="Letzte Aktion",width=20)
    lb1=Tkinter.Label(main,text="x")
    lb2=Tkinter.Label(main,text="y")
    lb3=Tkinter.Label(main,text="z")
    
    a.grid(row=2,column=1)
    b.grid(row=2,column=2)
    c.grid(row=3,column=1)
    d.grid(row=3,column=2)
    e.grid(row=3,column=3)
    end.grid(row=5,column=2)
    lb.grid(row=1,column=3)
    lb1.grid(row=4,column=1)
    lb2.grid(row=4,column=2)
    lb3.grid(row=4,column=3)
    
    
    thread.start_new_thread(acc_data,())
    main.mainloop()
  7. Thorxel sagt:

    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

    • Felix sagt:

      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).

  8. Craig sagt:

    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

  9. Marcus Wollmann sagt:

    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

    • Felix sagt:

      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.

  10. Steffen sagt:

    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

  11. Steffen sagt:

    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!

    • Felix sagt:

      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.

  12. Christian sagt:

    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

  13. Olli sagt:

    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

    • Felix sagt:

      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

    • Olli sagt:

      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

  14. ElBarto sagt:

    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

    • ELBARTO sagt:

      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

    • Felix sagt:

      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)

  15. ElBarto sagt:

    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

    • Felix sagt:

      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).

  16. ELBARTO sagt:

    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

    • Felix sagt:

      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.

  17. Alex sagt:

    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

    • Felix sagt:

      Hey Alex,
      versuch es jetzt nochmal. WordPress entfernt andauernd die Tabs aus dem Code, daher die Fehlermeldung. Nun sollte es aber klappen.
      LG Felix

  18. Dominic sagt:

    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

    • Felix sagt:

      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.

  19. Dominic sagt:

    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

    • Felix sagt:

      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.

  20. Dominic sagt:

    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.

    • Felix sagt:

      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 🙂

  21. Dominic sagt:

    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

    • Felix sagt:

      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 🙂

  22. Dominic sagt:

    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 :/

    • Felix sagt:

      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.

  23. Dominic sagt:

    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.

    • Felix sagt:

      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).

  24. Dominic sagt:

    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

    • Felix sagt:

      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/

  25. Dominic sagt:

    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

    • Felix sagt:

      Entweder du gibst der Variable enable_pin einen Wert oder löschst die Zeile. Die Fehlermeldung ist doch aufschlussreich 🙂

  26. Dominic sagt:

    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)?

    • Felix sagt:

      Dann klappt doch alles? Du musst es natürlich auch beantworten.
      Schau dir bitte das Skript nochmal genau an.
      LG Felix

  27. Dominic sagt:

    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

    • Felix sagt:

      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.

  28. Dominic sagt:

    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

  29. Dominic sagt:

    ja, naja.. du sprachst von antworten :D. ich hoffe du bist nachsichtig mit mir.
    Nimms mir bitte nicht übel.

    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))

    ka, so vielleicht??

    if __name__ == '__main__':
    	while True:
    		delay = raw_input(1)
    		steps = raw_input(5)
    		forward(int(delay) / 1000.0, int(steps))
    		steps = raw_input(5)
    		backwards(int(delay) / 1000.0, int(steps))

    inwiefern zeitverzögerung ?

    • Felix sagt:

      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.

      delay = 300
      steps = 100
  30. Dominic sagt:
    if __name__ == '__main__':
    	while True:
    		delay = 300
    		steps = 100
    		forward(int(delay) / 1000.0, int(steps))
    		steps = 100
    		backwards(int(delay) / 1000.0, int(steps))

    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

    • Felix sagt:

      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 🙁

  31. Dominic sagt:

    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

  32. Dominic sagt:

    – 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?

    • Felix sagt:

      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.

  33. Dominic sagt:

    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

    • Felix sagt:

      Dann kannst du die Sequenzen ja verwenden (entweder das Skript oder du passt die Seuqnzen in meinen Skript oben an).
      LG Felix

  34. Dominic sagt:

    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]

    • Felix sagt:

      Ich denke eher:

      Seq[0] = [1,0,0,0]
      Seq[1] = [0,0,1,0]
      Seq[2] = [0,1,0,0]
      Seq[3] = [0,0,0,1]

      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.

  35. Dominic sagt:

    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.

    if __name__ == '__main__':
    	while True:
    		delay = 10
    		steps = 60
    		forward(int(delay) / 1000.0, int(steps))
    		steps = 60
    		backwards(int(delay) / 1000.0, int(steps))

    recht herzlichen Dank !!

  36. Dominic sagt:

    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 😀

  37. Dominic sagt:

    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

    • Felix sagt:

      w1, w2, w3, w4 sind Funktionsvariablen von setStep, 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.

  38. Dominic sagt:

    danke und kein problem. ich weiß das ich noch viel lernen muss…
    schaue auch schon ganz fleißig :

    https://www.youtube.com/playlist?list=PLNmsVeXQZj7q0ao69AIogD94oBgp3E9Zs

    aber zwischen durch ist man nicht mehr so aufnahmefähig, möchte aber dennoch weiter machen 🙂

    • Felix sagt:

      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

  39. Dominic sagt:

    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 :/

    • Felix sagt:

      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.

  40. Dominic sagt:

    kannst du mir ein beispiel schreiben ?

    ich tendiere gedanklich zu sowas oder so ähnlich :

    http://pastebin.com/jLQpeAki

    sprich x und y

  41. Dominic sagt:

    also ich habs jetzt auf eigene faust probiert, aber entweder es bewegt sich immer nur einer oder es brummt,.. bekomme es nicht hin :/

  42. Dominic sagt:

    ich habs jetzt hintereinander, dann gehts,.. aber nicht zeitgleich oder oder eben erst motor 1 dann 2 dann1….

    http://pastebin.com/0QD3Jd4r

    • Felix sagt:

      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.

  43. Dominic sagt:

    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

  44. Dominic sagt:

    weiter beschäftigt es mich, wie ich es hinbekomme/ schreiben muss damit zwei sachen gleichzeitig passieren,.. hab viel versucht aber nicht hinbekommen :/

  45. Dominic sagt:

    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

    • Felix sagt:

      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.

  46. Dominic sagt:

    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 ?

    • Felix sagt:

      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.

  47. Dominic sagt:

    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

  48. Kai sagt:

    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

    • Felix sagt:

      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

  49. Kai sagt:

    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.

  50. Dominic sagt:

    @kai: Setz einfach ein GPIO.cleanup () drunter

  51. Frank sagt:

    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!!

    • Felix sagt:

      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.

  52. Frank sagt:

    Hallo Felix,
    was wären den so die optimalen Einstellungen?

    • Felix sagt:

      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.

  53. Jonas sagt:

    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?

  54. Patsch sagt:

    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 =)

    • Felix sagt:

      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

  55. Mirco sagt:

    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

  56. Marcus sagt:

    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

    • Felix sagt:

      Python3 erstellt aus range nicht automatisch eine Liste, anders als Python2 (Standard). Damit kannst du es aber einfach lösen (Zeile 13):

      Seq = list(range(0, StepCount))
    • Marcus sagt:

      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)

  57. CreeperNicol sagt:

    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…

    • Felix sagt:

      Wo hängt es denn genau? Im schematischen Aufbau sind die Anchlüsse doch definiert und auch das Datenblatt des ICs sollte helfen.

    • CreeperNicol sagt:

      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

    • Felix sagt:

      Die Farbe der Kabel ist auch auf den Boards fast immer gleich. Daran kannst du es ablesen.

  58. Gunter sagt:

    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?

    • Felix sagt:

      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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Blog abonnieren

Abonniere Tutorials-RaspberryPi, um kein Tutorial mehr zu verpassen!