Brauche hilfe. Fehler im Code?

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Halloichbinnoob
User
Beiträge: 2
Registriert: Dienstag 17. Dezember 2019, 16:37

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 
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

"oder so" ist immer schwierig. Deshalb zeigt man die Fehlermeldung zusammen mit dem Code.

Schau mal was sys.argv ist.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

"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.
Halloichbinnoob
User
Beiträge: 2
Registriert: Dienstag 17. Dezember 2019, 16:37

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
Benutzeravatar
__blackjack__
User
Beiträge: 14048
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ups. Ja, muss

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

heißen.
Antworten