Schrittmotor ansteuern mit Python3

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
Sigurd
User
Beiträge: 10
Registriert: Dienstag 30. Januar 2024, 12:14

Hallo,
ich habe vor kurzem angefangen mit Python3 zu arbeiten. Mit meiner Datei habe ich versucht einen Schrittmotor anzusteuern, was auch funktioniert hat. Jetzt müsste ich nur noch ein while Loop einführen , weiß dort aber nicht wie ich dies machen muss damit es auch funktioniert.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und ohne den Code zu sehen, wissen wir das auch nicht.
Sigurd
User
Beiträge: 10
Registriert: Dienstag 30. Januar 2024, 12:14

wie kann ich meine datei anhängen?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du kopierst den Inhalt hier rein, und benutzt die Code-Tags (</>-Knopf im vollstaendigen Editor) damit der Code vernuenftig formatiert und lesbar ist.
Sigurd
User
Beiträge: 10
Registriert: Dienstag 30. Januar 2024, 12:14

Hier der code:

import pigpio
import time

pi = pigpio.pi()
pi.set_mode(18, pigpio.OUTPUT)
pi.set_mode(17, pigpio.OUTPUT)
pi.set_mode(27, pigpio.OUTPUT)
pi.set_mode(22, pigpio.OUTPUT)

while True:
pi.write(18, 1)
time.sleep(0.01)
pi.write(18, 0)
time.sleep(0.01)
pi.write(17, 1)
time.sleep(0,01)
pi.write(17, 0)
time.sleep(0,01)
pi.write(27, 1)
time.sleep(0,01)
pi.write(27, 0)
time.sleep(0.01)
pi.write(22, 1)
time.sleep(0,01)
pi.write(22, 0)
time.sleep(0,01)
Zuletzt geändert von Sigurd am Dienstag 30. Januar 2024, 16:14, insgesamt 2-mal geändert.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na das mit den Code-Tags hat ja schonmal nicht geklappt.

Und da ist doch ein while-Loop. Was also genau passt nicht?
Sigurd
User
Beiträge: 10
Registriert: Dienstag 30. Januar 2024, 12:14

ich würde gerne wissen wie ich bestimmen kann wie oft ich das ganze durchlaufen lasse
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Indem du statt while eine for-Schleife benutzt, und die macht das ganze dann eben n Schritte. Dann wuerde man das ganze natuerlich so programmieren, dass die einzelnen Schritte erzeugt werden, so das man nicht nur immer eine volle Sequenz durchstiefelt.

Aber das Thema ist ja nun schon wirklich gut abgehangen, da findet man ja nun auch viel vorherigen Code, zB https://github.com/stripcode/pigpio-stepper-motor (ist etwas aelter). Daran wuerde ich mich orienteren.
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sigurd: Bei solchen grundlegenden Fragen würde ich empfehlen ein Grundlagentutorial durchzuarbeiten. In der Python-Dokumentation gibt es beispielsweise eines das man mal gelesen haben sollte.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sigurd
User
Beiträge: 10
Registriert: Dienstag 30. Januar 2024, 12:14

Danke für die schnellen antworten bei weiteren fragen melde ich mich noch einmal
Sigurd
User
Beiträge: 10
Registriert: Dienstag 30. Januar 2024, 12:14

Ich habe das jetzt passend umgeschrieben, jetzt kommt meine nächste frage, wie lasse ich meine Datei den Winkel in schritte umrechnen, sodass ich den winkel eingeben kann und dann die passende anzahl an schritten gemacht wird.

Hier mein jetziger Code:

import pigpio
import time

pi = pigpio.pi()
pi.set_mode(18, pigpio.OUTPUT)
pi.set_mode(17, pigpio.OUTPUT)
pi.set_mode(27, pigpio.OUTPUT)
pi.set_mode(22, pigpio.OUTPUT)

for i in range(256):
pi.write(18, 1)
time.sleep(0.01)
pi.write(18, 0)
time.sleep(0.01)
pi.write(17, 1)
time.sleep(0.01)
pi.write(17, 0)
time.sleep(0.01)
pi.write(27, 1)
time.sleep(0.01)
pi.write(27, 0)
time.sleep(0.01)
pi.write(22, 1)
time.sleep(0.01)
pi.write(22, 0)
time.sleep(0.01)

for i in range(256):
pi.write(22, 1)
time.sleep(0.01)
pi.write(22, 0)
time.sleep(0.01)
pi.write(27, 1)
time.sleep(0.01)
pi.write(27, 0)
time.sleep(0.001)
pi.write(17, 1)
time.sleep(0.01)
pi.write(17, 0)
time.sleep(0.01)
pi.write(18, 1)
time.sleep(0.01)
pi.write(18, 0)
time.sleep(0.01)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und taeglich gruesst das Murmeltier: immer noch keine Code-Tags. Ist das wirklich so schwer?

Fuer einen gegebenen Winkel muss man einfach nur

Code: Alles auswählen

schritte = int(winkel / 360 * SCHRITTZAHL_PRO_UMDREHUNG)
benutzen.
Sirius3
User
Beiträge: 17761
Registriert: Sonntag 21. Oktober 2012, 17:20

Statt hier zigmal den selben Code zu kopieren, würde man Funktionen benutzen. Das Programm wird dadurch strukturierter und besser zu Lesen und zu Warten.
Statt magische Nummern für Pins zu benutzen, definiert man sich einmal Konstanten.

Code: Alles auswählen

import pigpio
import time

MOTOR_PINS = [18, 17, 27, 22]

def initialize():
    pi = pigpio.pi()
    for pin in MOTOR_PINS:
        pi.set_mode(pin, pigpio.OUTPUT)  
    return pi

def step(pi, motor_pins, amount=256, reverse=False)
    for _ in range(amount):
        pins = reversed(motor_pins) if reverse else motor_pins
        for pin in pins:
            pi.write(pin, 1)
            time.sleep(0.01)
            pi.write(pin, 0)
            time.sleep(0.01)

def main():
    pi = initialize()
    step(pi, MOTOR_PINS)
    step(pi, MOTOR_PINS, reverse=True)

if __name__ == "__main__":
    main()
Sigurd
User
Beiträge: 10
Registriert: Dienstag 30. Januar 2024, 12:14

Hat funktioniert, aber wie mache ich es so, dass das Ergebnis der Rechnung automatisch eingesetzt wird, sodass der Motor automatisch so viele Schritte wie ausgerechnet macht?
Sigurd
User
Beiträge: 10
Registriert: Dienstag 30. Januar 2024, 12:14

ok habe es selber herausgefunden, aber kann mir jemand sagen wie man funktionen kapselt?
Sirius3
User
Beiträge: 17761
Registriert: Sonntag 21. Oktober 2012, 17:20

Was meinst Du damit? Funktionen sind die Kapselung.
Sigurd
User
Beiträge: 10
Registriert: Dienstag 30. Januar 2024, 12:14

Wie kann ich hier
schritte = int(360 / 360 * 516)
ruekwaertsschritte = int(180 / 360 * 516)
eine variable angeben sodass diese mit dem Rest gekapselt wird?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Habe ich doch oben geschrieben, mit "winkel"?
Sigurd
User
Beiträge: 10
Registriert: Dienstag 30. Januar 2024, 12:14

Und wie kapsel ich jetzt die Berechnungen mit den dazugehörigen Funktionen?

import pigpio
import time

pi = pigpio.pi()
pi.set_mode(18, pigpio.OUTPUT)
pi.set_mode(17, pigpio.OUTPUT)
pi.set_mode(27, pigpio.OUTPUT)
pi.set_mode(22, pigpio.OUTPUT)

winkel = 180 * 5
winkel_2 = 180 * 2
schritte = int(winkel / 360 * 516)
ruekwaertsschritte = int(winkel_2 / 360 * 516)

for i in range(schritte):
pi.write(18, 1)
time.sleep(0.01)
pi.write(18, 0)
time.sleep(0.01)
pi.write(17, 1)
time.sleep(0.01)
pi.write(17, 0)
time.sleep(0.01)
pi.write(27, 1)
time.sleep(0.01)
pi.write(27, 0)
time.sleep(0.01)
pi.write(22, 1)
time.sleep(0.01)
pi.write(22, 0)
time.sleep(0.01)

for i in range(ruekwaertsschritte):
pi.write(22, 1)
time.sleep(0.01)
pi.write(22, 0)
time.sleep(0.01)
pi.write(27, 1)
time.sleep(0.01)
pi.write(27, 0)
time.sleep(0.001)
pi.write(17, 1)
time.sleep(0.01)
pi.write(17, 0)
time.sleep(0.01)
pi.write(18, 1)
time.sleep(0.01)
pi.write(18, 0)
time.sleep(0.01)
Sirius3
User
Beiträge: 17761
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt nur das Argument übergeben, das die Anzahl der for-Schleifen-Durchläufe bestimmt.

Code: Alles auswählen

    step(pi, MOTOR_PINS, schritte)
    step(pi, MOTOR_PINS, rueckwärtsschritte, reverse=True)
Und natürlich hat das auch seinen Sinn, dass __deets__ eine Konstante eingeführt hat.

Code: Alles auswählen

SCHRITTZAHL_PRO_UMDREHUNG = 516

def rotate_motor(pi, motor_pins, angle):
    step(pi, motor_pins, abs(angle) * SCHRITTZAHL_PRO_UMDREHUNG  // 360, reverse=angle < 0)

...
rotate_motor(pi, MOTOR_PINS, winkel)
rotate_motor(pi, MOTOR_PINS, -winkel2)
Antworten