Python Programmierungs Fehler

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
dave1204
User
Beiträge: 4
Registriert: Dienstag 6. Januar 2015, 14:02

Hallo,

ich habe ein kleines Problem ich bekomme immer folgende Fehlermeldung und weis nicht wieso. :K

Code: Alles auswählen

Traceback (most recent call last):
File "/home/pi/Desktop/Projekts/stepper.py", line 21, in <module>
    Seq[4] = [0,0,1,0]
IndexError: list assignment index out of range
Ich hoffe ihr könnt mir weiterhelfen.

Hier mein Programm:

Code: Alles auswählen

import RPi.GPIO as GPIO
import time
 
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
 
#enable_pin = 18    # nur bei ULN2003 Treiber IC wichtig
coil_A_1_pin = 24   # pink
coil_A_2_pin = 25   # orange
coil_B_1_pin = 8    # blau
coil_B_2_pin = 7    # gelb
 
# anpassen, falls andere Sequenz
StepCount = 4
Seq = []
Seq = range(0, StepCount)
Seq[0] = [1,0,0,0]
Seq[1] = [1,1,0,0]
Seq[2] = [0,1,0,0]
Seq[3] = [0,1,1,0]
Seq[4] = [0,0,1,0]
Seq[5] = [0,0,1,1]
Seq[6] = [0,0,0,1]
Seq[7] = [1,0,0,1]
 
#GPIO.setup(enable_pin, GPIO.OUT)
GPIO.setup(coil_A_1_pin, GPIO.OUT)
GPIO.setup(coil_A_2_pin, GPIO.OUT)
GPIO.setup(coil_B_1_pin, GPIO.OUT)
GPIO.setup(coil_B_2_pin, GPIO.OUT)
 
#GPIO.output(enable_pin, 1)
 
def setStep(w1, w2, w3, w4):
    GPIO.output(coil_A_1_pin, w1)
    GPIO.output(coil_A_2_pin, w2)
    GPIO.output(coil_B_1_pin, w3)
    GPIO.output(coil_B_2_pin, w4)
 
def forward(delay, steps):
    for i in range(steps):
        for j in range(StepCount):
            setStep(Seq[j][0], Seq[j][1], Seq[j][2], Seq[j][3])
            time.sleep(delay)
 
def backwards(delay, steps):
    for i in range(steps):
        for j in reversed(range(StepCount)):
            setStep(Seq[j][0], Seq[j][1], Seq[j][2], Seq[j][3])
            time.sleep(delay)
 
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))
Zuletzt geändert von Anonymous am Dienstag 6. Januar 2015, 14:25, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@dave1204: Die Fehlermeldung ist doch recht deutlich: Du versuchst einem Listenindex etwas zuzuweisen den es nicht gibt. Die Liste ist vier Elemente lang, mit den Indexwerten 0 bis 3, und beim Versuch an Index 4 etwas zuzuweisen kracht es dann halt.

Das ist aber sowieso eine sehr komische Art so eine Liste zu erstellen. Erst bindest Du eine leere Liste an den Namen, die dann niemals verwendet wird, weil Du im nächsten Schritt an den Namen eine Liste mit den Zahlen 0 bis 3 bindest, wobei diese Zahlen auch überhaupt nicht verwendet werden sollen, weil die in den folgenden Zeilen umständlich einzeln durch andere Werte ersetzt werden. Erstelle an der Stelle doch einfach eine Liste direkt mit den Werten. Und lass `StepCount` weg. Das was Du da veranstaltest ist kein Python sondern irgend eine andere Programmiersprache. Ein ``for i in range(len(sequence)):`` nur um `i` dann als Index in die Sequenz zu benutzen ist in Python ein „anti pattern”. Man kann *direkt* über die Elemente in Listen & Co iterieren, ohne einen Umweg über einen Index.

Edit: Bezüglich der Namensschreibweisen lohnt sich ein Blick in den Style Guide for Python Code.
dave1204
User
Beiträge: 4
Registriert: Dienstag 6. Januar 2015, 14:02

Ich habe den Code von folgender Website http://www.tutorials-raspberrypi.de/gpi ... -uln2003a/ und nur an meinen Schrittmotor angepasst.

Okay habe meinen Fehler gefunden! Ist eigendlich ganz logisch. :lol:

Ich habe mal eine andere Frage: wie muss ich den Code ändern wenn ich x Schritt vorwärts laufenlassen will aber erst wenn ein Taster gedrückt wurde?

Danke schonmal
Zuletzt geändert von dave1204 am Dienstag 6. Januar 2015, 14:58, insgesamt 1-mal geändert.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Man kann es kürzer und einfacher und ohne offensichtliche Fehler programmieren:

Code: Alles auswählen

#!/bin/env python
# -*- coding: utf-8

import RPi.GPIO as GPIO
import time

COIL_PINS = 24, 25, 8, 7  # pink, orange, blue, yellow

def init():
    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)
    # nur bei ULN2003 Treiber IC wichtig:
    # enable_pin = 18
    # GPIO.setup(enable_pin, GPIO.OUT)
    # GPIO.output(enable_pin, 1)
    for pin in COIL_PINS:
        GPIO.setup(pin, GPIO.OUT)

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

def set_step(values):
    for pin, value in zip(COIL_PINS, values)
        GPIO.output(pin, value)

def walk(delay, steps, reverse=False):
    direction = reversed if reverse else iter
    for i in range(steps):
        for values in direction(SEQ):
            set_step(values)
            time.sleep(delay)

def main():
    init()
    while True:
        delay = .001 * int(raw_input("Zeitverzoegerung (ms)?"))
        steps = int(raw_input("Wie viele Schritte vorwaerts? "))
        walk(delay, steps)
        steps = int(raw_input("Wie viele Schritte rueckwaerts? "))
        walk(delay, steps, reverse=True)

if __name__ == '__main__':
    main()
Ungetestet.
Zuletzt geändert von pillmuncher am Dienstag 6. Januar 2015, 14:59, insgesamt 1-mal geändert.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

dave1204 hat geschrieben:Ich habe den Code von folgender Website http://www.tutorials-raspberrypi.de/gpi ... -uln2003a/ und nur an meinen Schrittmotor angepasst.
Das ändert nichts daran, dass der Code auf der zitierten Seite schon nicht schön und teilweise falsch ist.
dave1204
User
Beiträge: 4
Registriert: Dienstag 6. Januar 2015, 14:02

Okay, ich wollte den Code ja auch nur als Grundmodel nutzen und ob dieser nun schön ist oder nicht, kann ich nicht beurteilen.

Wie muss ich den Code ändern wenn ich x Schritt vorwärts laufenlassen will, aber erst wenn ein Taster an GPIO x gedrückt wurde?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Als erstes solltest du vielleicht ein Tutorial durcharbeiten. Du kannst dich durch Programme nicht durchraten. Das funktioniert vielleicht, wenn du irgendwo eine Konstante ändern willst, bei komplexeren Problemen kommst du damit aber nicht weiter. Das funktioniert ja schon nicht bei so billigem von dir verlinktem Quelltext.
Das Leben ist wie ein Tennisball.
dave1204
User
Beiträge: 4
Registriert: Dienstag 6. Januar 2015, 14:02

Okay, aber in diesem Tutorial wird nicht beschrieben wie durch das kurze drücken eines Tasters ein Programmabschnitt gestartet wird.
Kann mir da jemand weiterhelfen?
BlackJack

@dave1204: Du müsstest halt Code schreiben der den Druck auf den Taster erkennt und dann zum Beispiel eine Funktion aufruft. Wo liegt denn da jetzt konkret das Problem?
Antworten