Seite 1 von 1

Brauche hilfe. Fehler im Code?

Verfasst: Dienstag 17. Dezember 2019, 16:41
von Halloichbinnoob
Leute ich habe diesen Code zum Steuern eines servos aus einem Buch abgetippt. Immer wenn ich in Aufrufe kommt ein Fehler in der 6 Zeile. List Index Out of range oder so.
Ich benötige Hilfe den Fehler zu beheben und zu verstehen
LG bin noob




Code: Alles auswählen

import spidev
import time
import sys
import pigpio

mot = sys.argv[1]
dir = sys.argv[2]
mot1 = 3
mot2 = 4
pi = pigpio.pi()
pi.set_mode(mot1, pigpio.OUTPUT)
pi.set_mode(mot2, pigpio.OUTPUT)

if dir == "home":
    pi.set_servo_pulsewidth(int(mot), 1500)
    f = open("mot"+ mot+".txt","w")
    f.write ("1500")
    f.close()

else:
    f = open("mot"+ mot+".txt","r")
    lastPos = f.read()
    print (lastPos)
    f.close()
    newPos = float(lastPos)+ int(dir)
    if newPos >= 2000 or newPos <=1000:
        print("Endlage erreicht!")
        print(newPos)
        sys.exit()
    else:
        pi.set_servo_pulsewidth(int(mot), int(newPos))
        f = open("mot"+ mot+".txt","w")
        f.write (str(newPos))
        f.close 

Re: Brauche hilfe. Fehler im Code?

Verfasst: Dienstag 17. Dezember 2019, 16:52
von sparrow
"oder so" ist immer schwierig. Deshalb zeigt man die Fehlermeldung zusammen mit dem Code.

Schau mal was sys.argv ist.

Re: Brauche hilfe. Fehler im Code?

Verfasst: Dienstag 17. Dezember 2019, 16:57
von __deets__
"List out of range oder so" ist keine gute Fehlerbeschreibung. Bitte in Zukunft den gesamten Fehler posten.

Im konkreten Fall ist es allerdings nicht schwer zu erraten, was da falsch laeuft: das Programm erwartet *ZWEI* Argumente, mot und dir. Diese muessen bei Aufruf uebergeben werden. Also sowas wie

Code: Alles auswählen

python schlechtes-aus-buch-abgetipptes-skript.py mot-argument richtungs-argument
Und der Name den ich dem Skript gegeben habe, kommt nicht von ungefaehr. Wenn das stellvertretend fuer die Qualitaet des Codes im allgemeinen ist, der da im Buch steht, dann gute Nacht. Unbenutze Importe, Code-Dopplungen, nutzlose Pin-Definitionen.

Eine leicht aufgeraeumte Version:

Code: Alles auswählen

import sys
import pigpio


def read_pos(filename):
    with open(filename) as inf:
        return int(inf.read())


def write_pos(filename, pos):
    with open(filename, "w") as outf:
        outf.write("{}".format(pos))


def main():
    mot = int(sys.argv[1])
    dir = int(dir) if sys.argv[2] != "home" else None

    filename = "mot{}.txt".format(mot)

    pi = pigpio.pi()
    if dir is None:
        pi.set_servo_pulsewidth(int(mot), 1500)
        write_pos(filename, 1500)

    else:
        current_pos = read_pos(filename)
        new_pos = current_pos + dir
        if 1000 <= new_pos <= 2000:
            pi.set_servo_pulsewidth(mot, new_pos)
            write_pos(filename, new_pos)
        else:
            print("Endlage erreicht!")
            print(new_pos)
            sys.exit()


if __name__ == '__main__':
    main()
Geil ist das Prinzip natuerlich immer noch nicht, aber schonmal etwas besser. Laut Dokumentation braucht man das definieren von mot1 und mot2 nicht, sollte man das doch benoetigen, dann sollte man stattdessen das uebergebene mot als output definieren, statt irgendwelche Pins mit denen man dann eh nix macht.

Re: Brauche hilfe. Fehler im Code?

Verfasst: Dienstag 17. Dezember 2019, 19:17
von Halloichbinnoob
Sorry habe keine Ahnung von Python. Danke für den Code vorschlag. Leider ist ein neuer Fehler aufgetreten.
Fehler: File "servo.py, Line 22
write_pos(Filename, 1500)
⬆️
SyntaxError: invalid syntax

Re: Brauche hilfe. Fehler im Code?

Verfasst: Dienstag 17. Dezember 2019, 20:27
von __blackjack__
@Halloichbinnoob: Bei dem Code den __deets__ gepostet hat ist der Inhalt bereits in Zeile 10 und das hat keinen Syntaxfehler. Es gibt allerdings einen Fehler beim ausführen weil auf `dir` zugegriffen wird bevor `dir` definiert wurde.

Re: Brauche hilfe. Fehler im Code?

Verfasst: Mittwoch 18. Dezember 2019, 01:27
von __deets__
Ups. Ja, muss

dir = int(sys.argv[2]) if sys.argv[2] != "home" else None

heißen.