STEP Motor 28BYJ-48 mit ULN2003 || Led A stottert; leuchtet nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Kiwi_gamer01
User
Beiträge: 17
Registriert: Freitag 2. November 2018, 21:55

Ich möchte den STEP Motor 28BYJ-48 mit dem ULN2003 ansteuern. Undmein Problem liegt dabei das die LED A nicht so stark bzw nicht leuchtet.
Bsp:
Video
https://www.dropbox.com/s/mws6p1x5btlh9 ... 4.mp4?dl=0

Code

Code: Alles auswählen

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
control_pins = [7,11,13,15]
for pin in control_pins:
  GPIO.setup(pin, GPIO.OUT)
  GPIO.output(pin, 0)
halfstep_seq = [
  [1,0,0,0],
  [1,1,0,0],
  [0,1,0,0],
  [0,1,1,0],
  [0,0,1,0],
  [0,0,1,1],
  [0,0,0,1],
  [1,0,0,1]
]
for i in range(512):
  for halfstep in range(8):
    for pin in range(4):
      GPIO.output(control_pins[pin], halfstep_seq[halfstep][pin])
    time.sleep(0.1)
GPIO.cleanup()

Benutzeravatar
__blackjack__
User
Beiträge: 13937
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kiwi_gamer01: Anmerkungen zum Quelltext: ``as`` bei Importen ist zum umbenennen da, Du benennts das Modul aber gar nicht um.

Den `cleanup()`-Aufruf sollte man *sicherstellen*, der sollte auf jeden Fall am Ende ausgeführt werden. Zum Beispiel auch wenn der Code irgendwo mit einer Ausnahme aussteigt, zum Beispiel weil ein Fehler enthalten ist oder der Benutzer Strg+C drückt.

Die Schleife für das Aufsetzen der Pins ist überflüssig weil man `GPIO.setup()` auch eine Sequenz mit Pins und den Initialwert übergeben kann.

Namen die man nur aus syntaktischen Gründen braucht, deren Wert aber nicht verwendet wird, wie `i` im Beispiel, nennt man per Konvention `_`.

Schleifen über Zahlen die dann nur als Indexwert in eine Sequenz vewendet werden sind in Python ein „anti pattern“. Man kann direkt über die Sequenzen iterieren, ohne den Umweg über einen Indexwert. Die Grenzen/Obergrenze für solche Schleifen hart als magische Zahl in den Code zu schreiben ist auch nicht gut, weil fehleranfällig. Listen kennen ja ihre eigene Grösse.

Wenn man über zwei Sequenzen ”parallel” iterieren möchte gibt es die `zip()`-Funktion.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import time

from RPi import GPIO


def main():
    control_pins = [7, 11, 13, 15]
    halfsteps = [
        [1, 0, 0, 0],
        [1, 1, 0, 0],
        [0, 1, 0, 0],
        [0, 1, 1, 0],
        [0, 0, 1, 0],
        [0, 0, 1, 1],
        [0, 0, 0, 1],
        [1, 0, 0, 1],
    ]
    try:
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(control_pins, GPIO.OUT, initial=0)
        for _ in range(512):
            for halfstep in halfsteps:
                GPIO.output(control_pins, halfstep)
                time.sleep(0.1)
    finally:
        GPIO.cleanup()


if __name__ == "__main__":
    main()
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Vom Code her (jenseits der Standardsprueche wie kein Code auf Moduleben, etc - hat __blackjack__ ja schon kommentiert) kann man da nix ableiten. Das sieht IMHO eher nach einer Hardware-Geschichte aus. Wenn du kannst, permutier mal die Kabel am PI durch, und schau, ob das Problem mitwandert (dann ist es der PI), oder es immer die gleiche LED am Treiber ist - dann ist es der. Und das waere auch eher meine Vermutung, denn ein GPIO ist entweder an, aus, oder kaputt. Nicht irgendwie leicht an.
Antworten