Seite 1 von 1

Python Programmierungs Fehler

Verfasst: Dienstag 6. Januar 2015, 14:13
von dave1204
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))

Re: Python Programmierungs Fehler

Verfasst: Dienstag 6. Januar 2015, 14:31
von 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.

Re: Python Programmierungs Fehler

Verfasst: Dienstag 6. Januar 2015, 14:53
von dave1204
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

Re: Python Programmierungs Fehler

Verfasst: Dienstag 6. Januar 2015, 14:54
von pillmuncher
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.

Re: Python Programmierungs Fehler

Verfasst: Dienstag 6. Januar 2015, 14:57
von /me
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.

Re: Python Programmierungs Fehler

Verfasst: Dienstag 6. Januar 2015, 15:20
von dave1204
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?

Re: Python Programmierungs Fehler

Verfasst: Dienstag 6. Januar 2015, 15:29
von EyDu
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.

Re: Python Programmierungs Fehler

Verfasst: Dienstag 6. Januar 2015, 17:28
von dave1204
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?

Re: Python Programmierungs Fehler

Verfasst: Dienstag 6. Januar 2015, 18:22
von 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?