Problem beim programmieren von Roboterauto

  • Hallo zusammen.

    Als ich meinen ganzen Code von der GPIOzero Bibliothek Robot umgeschrieben habe auf Motor und da alles was es braucht definiert habe, lief gar nichts mehr. Als ich es dann wieder auf Robot umgeschrieben habe läuft das Programm aber wenn man es beendet, drehen sich entweder beide oder nur ein Motor einfach weiter. Keine Ahnung was läuft. Ich habe einen Account auf Picockpit und da sah ich das wenn die Motoren drehen meistens keiner der angeschlossenen GPIO's auf High sind und wenn schon, dann meistens nur einer. Ich verstehe langsam nicht mehr was spinnt und was nicht. Der Ultraschallabstandssensor läuft aber. Es spinnen nur die Motoren. Kann es sein dass mein MotoDriver 2 kaputt ist? Hat jemand schon einmal mit so einem gearbeitet und hatte ähnliche Probleme? Denn Code kann ich euch heute Abend hochladen.

    Die Hand voller Asse, doch das Leben spielt Schach.


    Erfolg besteht aus drei Buchstaben: Tun

    Goethe

  • Ich halte es für seeehr unwahrscheinlich, dass die Hardware spinnt. Dazu ist sie weder komplex genug noch passt das Fehler Bild, denn es läuft ja. Nur beenden macht Probleme. Es wird also dein Code sein.

  • Als ich das Problem das erste Mal hatte, war das Problem nur beim beenden und es hörte auf als ich den Raspberry neu startete. Jetzt ist es schon so wenn er sich anschaltet und ich dem Motodriver Saft gebe. Auch nach einem Neustart dreht er einfach weiter.


    Ich glaube dass der eine GPIO automatisch auf High geht wenn der Motodriver angeschaltet wird und dadurch beginnen sich die Motoren zu drehen.


    Das oben beschriebene passiert ohne dass ich ein Programm gestartet habe.

    Die Hand voller Asse, doch das Leben spielt Schach.


    Erfolg besteht aus drei Buchstaben: Tun

    Goethe

    Einmal editiert, zuletzt von hyle (17. Dezember 2020 um 14:41) aus folgendem Grund: 2 Beiträge von Raspifriend mit diesem Beitrag zusammengefügt.

  • im Minutentakt Beiträge zu posten erhöht nicht gerade die Übersichtlichkeit, dazu gibt es EDIT!

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Haben Sie schon eine Idee was das Problem sein könnte?

    ja:

    Die Hand voller Asse, doch das Leben spielt Schach

    Es gibt immer Lösungen, nur nicht für JEDES Problem.

    Besser lernen und solange bis die Probleme lösbar werden und manchmal bedeutet es aufgeben oder mehr lernen.;)

    Irgendwann kommt man an den Punkt wo man mehr weiss als andere oder eh keinen Helfer mehr findet.

    Manche wissen immer mehr von immer weniger bis sie alles von Nichts wissen -> Spezialisten sind.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    • Offizieller Beitrag

    Eine Woche im Forum sind eine lange Zeit, in der (zumindest bei mir so) gefühlt 1000 Beiträge gelesen werden. Da kann man nicht alles auf dem Schirm haben. ;)

    Man kann Dir also nicht helfen ohne den aktuellen Status, bzw. Code zu kennen. Zeige uns diesen bitte (auch falls der sich hier irgendwo im Thread verstecken sollte) nochmals. Änderungen an der Hardware etc. sind ebenfalls hilfreich.

  • Ich kann dem Beitrag #49 nur beipflichten. Es ist wirklich dringend, dass Du uns den aktuellen Code zeigst.

    Ich habe heute alle Beiträge dieser Diskussion durchgesehen und im Beitrag #19 (vom 10. Dezember) sind mir im dort gezeigten Code Dinge aufgefallen, die doch einige Fragen aufwerfen. Es mag sein, dass Du das inzwischen anders programmierst , aber ich will doch erörtern, was mir aufgefallen ist.

    In Zeile 11 steht:

    Code
    backward = motor1.backward(0.5), motor2.backward(0.5)

    in Zeile 20 steht dann, in einer while-Schleife und dort in einer Bedingung:

    Code
            backward

    Vermutlich verbindet sich mit dieser Zeile die Hoffnung, dass die in Zeile 11 rechts vom Gleichheitszeichen stehenden Befehle an die Motoren motor1 und motor2 ausgeführt werden. Wenn das tatsächlich so wäre, dann wäre backward eine benannte Abkürzung für zwei aufeinanderfolgende Befehle. Das ist aber nicht der Fall.

    Eine benannte Abkürzung für eine Folge von Anweisungen zu haben, ist natürlich eine gute Idee, aber sie muss auch richtig umgesetzt werden. Die richtige Umsetzung dieser Idee geschieht durch die Definition eines Unterprogramms.

    Die Definition eines Unterprogramms sieht so aus:

    Code
    def beideMotorenZurueck(wert):
        #  Dieses Unterprogramm sendet an beide motoren
        #  den Befehl backward. 
        global motor1, motor2
        motor1.backward(wert)
        motor2.backward(wert)

    Dieses Unterprogramm (in Python ist die Bezeichnung "Funktion" üblicher) wird in Zeile 20 dann so aufgerufen:

    Code
            beideMotorenZurueck(0.5)

    Für die "Abkürzungen" stop, forward, left, right gilt sinngemäß das gleiche: Sie müssen als Unterprogramme bereitgestellt werden, wofür das oben gezeigte Sprachmittel der Definition zu verwenden ist.

    Wenn dir die Unterprogrammtechnik neu oder nur wenig vertraut ist, solltest Du nach "Python Unterprogramm erstellen" googlen, um ausführlichere Anleitungen zu erhalten.

  • Wenn wir schon dabei sind, Funktionen werden in Python klein geschrieben und längere Namen mit Unterstrichen getrennt.

    'global' sollte man wirklich nur verwenden, wenn es nicht anders geht. Man sollte auch Namen verwenden die aussagekräftig sind, anstatt durchnummerierte Namen. Hier gehts ja auch ohne, wenn ich mich nicht täusche?

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Ich danke euch vielmal für eure Hilfe.

    Ihr seit einfach die besten.

    Ich werde das Programm so schreiben wie Ihr es gemacht habt.

    Falls ich es trotzdem auf die Reihe bringe das etwas nicht funktioniert, werde ich mich wieder melden.

    Liebe Grüsse

    Raspifriend

    Die Hand voller Asse, doch das Leben spielt Schach.


    Erfolg besteht aus drei Buchstaben: Tun

    Goethe

  • Zitat

    Python

    Haben Sie den Code mit der Bibliothek GPIOzero geschrieben oder mit etwas anderem?

    Müsste motor_forward nicht auch noch definiert werden oder ist das schon vorprogrammiert?

    Freundliche Grüsse

    Raspifriend

    Die Hand voller Asse, doch das Leben spielt Schach.


    Erfolg besteht aus drei Buchstaben: Tun

    Goethe

  • Wenn es da nicht steht, dann ist auch kein motor_forward definiert. Da das Programm keinen Namen Motor selbst definiert, und keinen import hat, ist es unvollstaendig, und soll wohl nur der Illustration dienen.

    Gab es nicht mal den Plan, das bestehende Programm hier zu posten?

  • Doch, ich bin momentan nur nicht zu Hause. Bei mir funktionierte bis jetzt nur der Code mit GPIOzero Robot. Ich kann aber mit dem programmieren erst in ein paar Tagen beginnen, da ich ein neues Gerüst baue. Das alte hielt nicht so richtig.

    Soll ich auch noch das Programm mit GPIOzero Motor hochladen? Da funktioniert aber gar nichts.

    Freundliche Grüsse

    Die Hand voller Asse, doch das Leben spielt Schach.


    Erfolg besteht aus drei Buchstaben: Tun

    Goethe

  • Das sieht nach der Klasse Motor aus der Bibliothek GPIOzero aus. (Dokumentation: GPIOzero Klasse Motor. In dieser Dokumentation steht auch, was bereits vorprogrammiert ist und folglich sofort verwendbar ist.) Falls statt der Klasse Motor die Klasse Robot verwendet werden soll, ist dieser Beschreibung zu folgen: GPIOzero Klasse Robot.

    Die Funktion motor_forward muss, falls sie gebraucht wird, natürlich ebenfalls definiert werden. Es ist gut möglich, dass noch einige weitere Definitionen dazukommen, bevor das Roboterfahrzeug alles kann, was es können soll.

  • Okey ich habe einmal einen theoretischen Code aufgestellt aber noch nicht testen können. Könntet ihr mal drüber schauen ob es eurer Meinung nach funktionieren würde?

    Freundliche Grüsse und einen schönen Abend.

    Raspifriend

    Die Hand voller Asse, doch das Leben spielt Schach.


    Erfolg besteht aus drei Buchstaben: Tun

    Goethe

  • Das sieht jetzt ganz vielversprechend aus. In Zeile 46 muss es natürlich heißen:

    Code
    gpio.cleanup()

    Die Klammern sind wichtig, weil die Funktion cleanup sonst nicht ausgeführt wird. Das Ärgerliche ist, dass Python keine Fehlermeldung gibt, wenn die Klammern fehlen. Ohne das Klammernpaar ist die Anweisung nähmlich auch gültiges Python, aber eben kein Funktionsaufruf.

    Zeilen 27 und 23: Die Funktion stop der Motersteuerung ist ohne einen Parameter aufzurufen. Der Parameter  velocity ist in den Aufrufen in den genannten Zeilen also zu streichen; die Klammern müssen aber stehenbleiben! (Siehe oben: Ohne Klammern keine Ausführung der Funktion!) Die Aufrufe von stop in den Zeilen 30 und 31 sind richtig und können als Vorlage dienen.

    In Zeile 7 sind für die Parameter echo und trigger des Distanzsensors natürlich noch die Pinnummern anzugeben.

  • Da sind Fehler drin die man durch einfaches ausprobieren hätte finden können. Programmieren als Trockenübung ist nicht so das Wahre.

    Beim Entfernungssensor fehlen die Werte für die Argumente damit das überhaupt am Compiler vorbei kommt.

    Um `cleanup()` aufrufen zu können, müsste es ja `gpio` erst einmal geben. Das ist aber eine andere Bibliothek, gehört also gar nicht in dieses Programm.

    Was bitte soll `Motor.stop()` mit dem Argument anfangen?

    Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Die `Motor`-Objekte werden nicht zu Konstanten nur weil man die in dem Wunschdenken mit gross geschriebenen Namen versieht.

    Die Konstante `VELOCITY` und das Modul `time` werden nirgends verwendet.

    Die Kommentare bringen dem Leser alle keinen wirklichen Mehrwert. Das steht da bereits als Code.

    Das `motor` in den ganzen Funktionsnamen ist im Grunde falsch. Es müsste entweder Mehrzahl sein, denn es betrifft ja jeweils mehr als einen Motor, oder es müsste sich auf das Auto als ganzes beziehen.

    Zwischenstand (ungetestet):

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!