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.
Schrittmotor ansteuern mit Python3
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)
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.
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.
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.
- __blackjack__
- User
- Beiträge: 13241
- 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.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
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)
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)
Und taeglich gruesst das Murmeltier: immer noch keine Code-Tags. Ist das wirklich so schwer?
Fuer einen gegebenen Winkel muss man einfach nur
benutzen.
Fuer einen gegebenen Winkel muss man einfach nur
Code: Alles auswählen
schritte = int(winkel / 360 * SCHRITTZAHL_PRO_UMDREHUNG)
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.
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()
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)
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)
Du mußt nur das Argument übergeben, das die Anzahl der for-Schleifen-Durchläufe bestimmt.
Und natürlich hat das auch seinen Sinn, dass __deets__ eine Konstante eingeführt hat.
Code: Alles auswählen
step(pi, MOTOR_PINS, schritte)
step(pi, MOTOR_PINS, rueckwärtsschritte, reverse=True)
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)