Stepper Motor über LN298N mit Raspberry ansteuern , Problem

  • Hallo,

    ich benötige für ein Schulprojekt welches freiwillig ist Hilfe. Es geht darum eine 360 Grad Drehung mit einem Stepper Motor durchzuführen mittels einem LN298N Gerät. Der Raspberry Pi3 hat Ubuntu oben und ist bereits mit dem LN298N (LN298N hat ein 12 V Netzteil) verbunden und dieser ist dann mit dem Stepper Motor verbunden.

    Ich habe Python Code bis jetzt verwendet. Die Ansteuerung des Stepper Motors funktioniert anscheinend, jedoch bekomme ich keine komplette Drehung zusammen sondern eher nur kleine Bewegungen die hin und her gehen.

    Kann mir bitte jemand bei diesem Projekt helfen? Anscheinend ist irgendwo ein Fehler aber ich finde diesen nicht.




    Edited once, last by raspiboy ().

  • Hallo und willkommen im Forum.


    Gewöhne dich bitte nicht daran, dass man dir so schnell antwortet, das war gerade Zufall. ^^


    Könntest du den Code bitte nochmals so einstellen, dass die Zeilen inklusive Einrückungen so stehen, wie sie bei dir im original sind?

    So ist der Code nur schwer lesbar und man kann nur erraten wie er gemeint ist.


    Ist der Code von dir selbst erstellt und du weist was da bei jeder Zeile passiert oder hast du den Code kopiert und du benötigst noch etwas Erklärung dazu?



    Grüße

    Dennis

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?

  • Hallo :)

    Verstehe ok :D


    Ich habe den Code jetzt so eingefügt das er besser lesbar ist.

    Der Code ist von einer anderen Website. Ich bin eher nur ein C# Programmierer und kenne mich deswegen mit Python nicht so gut aus. Ich weiß nicht was genau überall passiert.


    Lg Max

  • Post by SteepBrook64153 ().

    The post was deleted, no further information is available.
  • Ja ich denke.

    Dankeschön für deinen Ansatz. Hast du konkret ein bisschen mehr Code der direkt verwendbar ist zu meinem Stepper Motor weil ich mich ehrlich gesagt mit solchen Arbeiten noch nicht wirklich auskenne. Sobald ich das Prinzip dann verstanden habe wäre es einfacher.

    Ich bin aktuell auch ein bisschen im Stress da ich nun seit Stunden die letzten Tage versucht habe das zum Laufen zu bekomme und es aber nicht schaffe. Weiters muss ich es am Mittwoch um 8:15 schon haben :(


    LG Max

  • Hallo,


    raspiboy dein Code ist ziemlich umfangreich und dadurch auch nicht ganz so einfach durch zu blicken bzw. Fehler zu finden.

    Du verwendest die 'RPi'-Bibliothek, die ist schon längers nicht mehr aktuell. Die aktuellere, bessere, einfachere Alternative ist gpiozero.


    In deinem Code werden immer wieder die gleichen Zeilen geschrieben, in denen jeweils ein anderer Pin auf High oder Low gesetzt wird. Das ist nervig zu schreiben, unübersichtlich und anstrengt bei der Fehlersuche bzw. bei Codeänderungen. Dafür würde ich, wie mein Vorposter aus, eine Liste verwenden. Die Einsen und Nullen definieren pro Durchlauf die Zustände der Pins.


    Ich habe keine Möglichkeit das zu testen, aber das Programm könnte so aussehen:


    Zeile 4: Ich importiere 'OutputDevice' von gpiozero(siehe Link) und benenne das Objekt in 'step_motor'

    Zeile 7: Definition einer Konstanten (in Python mit Großbuchstaben). Es handelt sich um eine Liste, die die Pin-Nummern enthält, an die der Motor angeschlossen ist. Bei Änderungen kann man das einmal hier am Anfang vornehmen.

    Zeile 8: Definition der Pin-Zustände und zwar in Listen, immer bestehend aus 4 Zuständen, in einer Liste. Auch hier kann man die Änderungen einfach und einmalig durchführen. Vergleiche die Zustände mit deinem GPIO.LOW bzw GPIO.HIGH.


    Es folgen zwei Funktionen, die überspringen wir kurz, die werden hier auf Modulebene nur definiert, aber noch nicht aufgerufen.


    Zeile 41: Ruft die Funktion 'main' auf, es sei denn dieses Pythonskript wäre in ein anderes importiert, siehe hier

    Zeile 34: Funktion 'main' wird ausgeführt. Erstellen einer leeren Liste. Die 'for'-Schleife bindet pro Durchgang ein Wert nach dem anderen der MOTOR_PINS-Liste an den Namen 'pin'. Während jedem Durchgang wird ein Objekt 'step_motor' (wurde am Anfang importiert) erstellt und diesem den jeweiligen Pin zugewiesen. Dieses Objekt wird mit 'append' der Liste 'motor' hinzugefügt.

    Zeile 38: Aufruf der Funktion 'rotate_motor', dieser Funktion geben wir die 'motor'-Liste als Argument mit. Wir wollen mit den Objekten arbeiten und die nicht immer neu erstellen müssen.


    Zeile 20: In diesem Code soll die Reihenfolge von Schaltzuständen einmal durchlaufen. Das heißt wir müssen die Durchgänge zählen. Dazu starten wir mit 'step = 0'.

    Zeile 21: Start der Dauerschleife. 'while(1), wie in deinem Beispiel verwendet man in Python nicht.

    Zeile 22: Den Listeninhalt kann man mit dem Indexwert abfragen.Wir haben 4 Motorobjekte definiert, deren Zustand wir nach einander setzen müssen. Also benötigen wir die Indexwerte 0-3, sprich 'range(4).

    Zeile 23: Wir binden das Motorobjekt des jeweiligen Index an den Namen 'pin'.

    Zeile 24: Wir haben die Liste SEQUENCE mit weiteren Listen darin. Mit 'step' werden die "inneren" Listen angesprochen und mit 'index' der Inhalt der entsprechenden Liste. Mit 'if not' wird abgefragt ob der angesprochene Wert '0' bzw. 'False' ist. Wenn das zutrifft wird der Pin auf high gesetzt, das passiert hier mit 'on()'. Wenn nicht dann 'off()'.

    Zeile 28: 'step' wird um eins erhöht.

    Zeile 29: Gezählt wird ab 0, wenn 'step' 7 erreicht hat, dann sind 8 Durchgänge durchgelaufen, dann wird mit 'break' die Dauerschleife abgebrochen.


    Schau mal ob es funktioniert.


    Grüße

    Dennis

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?

  • In Zeile 40 stellst du negative auf 0 - der If-Teil wird dann nie mehr durchlaufen.

    Du zählst von x auf 0 runter und führst entsprechend oft die Schleife aus.

    Der "if negativ == 1"-Teil wird aber nur einmal ausgeführt.

    Dein i müsste demnach ins Unendliche abhauen - derf Motor macht 7 Schritte und das wars.


    negativ und positiv sollen die Drehrichtung sein, nehme ich an?

    Warum verwendest du nicht eine Variable "richtung", die +1 oder -1 sein kann. Dann kannst du mit i+richtung % 8 den jeweils nächsten Schritt auswählen


    Deine x < 400 usw. Sache verstehe ich nicht. Geht es um eine Einschränkung des Wertes, den der User eingeben soll? Er darf nur zwischen 0 und 400 liegen und muss positiv sein, auch wenn der User negative Zahlen eingibt?

    Das wäre einfacher mit x = (abs(input())) % 401

    Dann die For-Schleife for y in range(x):

    und darin i = (i+richtung) % 8

    und danach die Motorschritte.


    Ist jetzt nur so aus der Hüfte geschossen. Schau mal, ob du damit weiter kommst.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Dennis89 Lieber Dennis!

    Es freut mich wirklich sehr das du mir so eine ausführliche Nachricht zurückschreibst und es freut mich auch sehr zu sehen das es Menschen gibt die wahre Begeisterung für die Technik empfinden. Danke für die ausführliche Beschreibung des Codes! :danke_ATDE:


    Ich habe gestern am Abend es noch ausprobiert ob es funktioniert: Ich habe den Code deinerseits genommen und in eine python Datei auf meinem Raspberry gegeben. Anschließend "startetet" ich das Pythonscript. Es kam sofort ein Fehler darüber das ein Import error vorhanden ist und kein Module gpiozero vorhanden ist. Ich habe gpio zero laut dem Tutorial installiert ----> https://gpiozero.readthedocs.io/en/stable/installing.html

    Hast du eine Idee wie ich den Fehler beheben kann. Ich habe unter anderem schon über pip usw. versucht es zu installieren.


    LG Max :)

  • Dennis89 Hallo Dennis,

    ich habe nun das Pythonskript von dir gestartet. Es wird kein Fehler ausgegeben jedoch passiert gar nichts.

    Ich habe mit: python3 <dateiname>.py gestartet

    Was könnte das Problem sein?

    LG Max

  • Hi,


    das mit den Pin- und GPIO- Bezeichnungen habe ich übersehen. Aber in meiner Beschreibung steht ja wo du 27, 17, 22 und 18 einfügen bzw. durch welche Ziffern du die ersetzen musst.


    Hoffentlich hab ich es richtig rausgesucht, sieh zur Sicherheit nochmals in dem Link von hyle nach. Ich stehe gerade am Grill 😃


    Grüße

    Dennis

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?

  • Post by SteepBrook64153 ().

    The post was deleted, no further information is available.
  • Post by SteepBrook64153 ().

    The post was deleted, no further information is available.