Problem beim programmieren von Roboterauto

  • Hallo zusammen


    Ich bin neu auf dem Gebiet Raspberry und möchte ein Roboterauto aus ihm bauen. Am Anfang als ich den Sensor mit den Motoren kombiniert habe, kamen RuntimeWarnings aber das Programm lief weiter. Dann sah ich im Internet dass ich den Befehl GPIO.cleanup() einbauen muss und habe das getan. Dann funktionierte der Ultraschallabstandsensor nicht mehr. Dadurch brach das Skript ab. Dann platzierte ich den Befehl an einen anderen Ort und nun funktioniert gar nichts mehr. Es kommen immer RuntimeWarnings und es läuft nichts mehr. Ich habe keine Ahnung was ich tun soll.


    Danke schon Mal im Vorraus für Hilfe:danke_ATDE:


    Die Hand voller Asse, doch das Leben spielt Schach.



    Erfolg besteht aus drei Buchstaben: Tun

    Göthe

  • Es fällt auf, dass GPIO.cleanup() im Rumpf der Wiederholungsanweisung steht. Nachdem die Schleife einmal durchlaufen wurde, werden durch den Aufruf von GPIO.cleanup() alle die GPIO betreffenden Einstellungen gelöscht und dass danach noch viel passiert, kann ich mir eigentlich nicht denken. Du hast also ein Einrückungsproblem - das ist in Python fast immer sehr schwerwiegend.


    Es könnte viel helfen, den Aufruf GPIO.cleanup() um vier Schreibpositionen nach links zu verschieben - dann wird er nämlich erst ausgeführt, nachdem die Wiederholungsanweisung verlassen wurde.


    Vergleiche mal mit dieser Vorlage: Entfernung messen mit Ultraschall. Hier findet das cleanup() erst viel später und nur einmal statt. Außerdem ist die Distanzmessung eine Funktion, was mir entwurfstechnisch schlüssiger erscheint, aber das ist eher eine Frage des Programmdesigns.

    Edited 2 times, last by Boris-Gaertner: Zwei Tippfehler berichtigt ().

  • Hallo,


    'gpiozero' bietet eine API für Distanzsensoren. Schau doch mal, ob du dein Programm mit 'gpiozero' umsetzen kannst. Das ist der aktuelle Stand der Technik und sollte verwendet werden.



    Grüße

    Dennis

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?

  • Ich danke euch vielmals für eure Beiträge. In einem anderen Forum bin ich auch auf gpiozero gestossen. Ich werde es ausprobieren und hoffe dass es funktioniert. Nochmals vielen Dank.

    Die Hand voller Asse, doch das Leben spielt Schach.



    Erfolg besteht aus drei Buchstaben: Tun

    Göthe

  • Hallo,


    gpiozero ist zwar grundsätzlich die bessere Wahl - aber auch das entbindet dich nicht davon zu verstehen, was du eigentlich tust.


    Quote

    Dann sah ich im Internet dass ich den Befehl GPIO.cleanup() einbauen muss und habe das getan

    Ja, aber halt falsch, wie oben ja schon erklärt wurde. Programmieren ist mehr als Copy&Paste.


    Zum Skript:

    Variablennamen schreibt man in Python per Konvention klein_mit_unterstrich und nicht groß oder CamelCase oder sowas.

    Konstanten schreibt man per Konvention GROSS.

    Immer aussagekräftige Variablennamen verwenden, also z.B. nicht `x` bei den Funktionen `forward` und `backward`, sondern z.B. `duration` oder `dauer`, wenn man bei deutsch bleiben möchte.


    Gruß, noisefloor

  • Danke viel Mal für eure Hilfe.

    Es funktioniert alles prima mit GPIOzero.


    Ich wollte euch noch fragen ob ich einen Sensor welcher 3.3v Spannung braucht, an jeden Pin anschliessen kann. Ich möchte sozusagen einen Notstopper einbauen und habe den Pin 1, welcher ja offiziell 3.3v Spannung hat, schon besetzt. Kann ich den anderen Sensor nun an einen anderen GPIO anschliessen?


    Danke schon im Vorraus.

    Die Hand voller Asse, doch das Leben spielt Schach.



    Erfolg besteht aus drei Buchstaben: Tun

    Göthe

  • Pin 17 gibt ebenfalls 3.3 V ab.Unabhängig davon ist die Parallelschaltung das Hilfsmittel, mit dem man mehrere an eine Spannungsquelle angeschlossene Verbraucher mit der gleichen Spannung versorgt - im Falle des Raspberry an Pin 1 mit 3.3 V. Es ist also ohne weiteres möglich, mehrere Verbraucher über Pin 1 zu versorgen,.

  • Hallo zusammen


    Ich habe als Anfänger mal wieder eine Frage:conf:.

    Wie ihr mir geraten habt, arbeite ich nun mit GPIOzero. Es läuft bestens. Nun möchte ich dass wenn er einem Hindernis zu nahe kommt, sich nach dem Zufallsprinzip entweder nach Links oder nach Rechts dreht. Mit (import Random) funktioniert es nicht. Dann kommt dass es eine nichtunterstützte Funktion ist.


    Hat jemand von euch eine Idee?


    Wäre euch sehr dankbar.


    Raspifriend

    Die Hand voller Asse, doch das Leben spielt Schach.



    Erfolg besteht aus drei Buchstaben: Tun

    Göthe

  • Hier wäre er:


    Code
    /usr/lib/python3/dist-packages/gpiozero/input_devices.py:997: DistanceSensorNoEcho: no echo received
      warnings.warn(DistanceSensorNoEcho('no echo received'))%Run 'Robot VA Project.py'
    0.1821505757344721
    Traceback (most recent call last):
      File "/home/pi/Desktop/Robot VA Project.py", line 13, in <module>
        randint(left, right)
      File "/usr/lib/python3.7/random.py", line 222, in randint
        return self.randrange(a, b+1)
    TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

    Die Hand voller Asse, doch das Leben spielt Schach.



    Erfolg besteht aus drei Buchstaben: Tun

    Göthe

  • Also...... Was muss ich tun? Muss ich left und right selber mit Variabeln programmieren oder was?

    Die Hand voller Asse, doch das Leben spielt Schach.



    Erfolg besteht aus drei Buchstaben: Tun

    Göthe

  • Ja, du musst links und rechts vorgeben. Wenn ich dich frage „sag mal ne Zahl zwischen 1 und keine Angabe“ - was ist dann deine Antwort? Genauso wenig kann der Computer das beantworten.

    Edited once, last by MistyFlower59469 ().

  • Hallo zusammen


    Ich habe nun mit GPIOzero, Links und Rechts, sowie vorwärts, Rückwärts und stop definiert. Die Fehlermeldung bleibt die gleiche.


    Das wäre der neue Code inklusive Fehlermeldung im unteren Bereich.

    Die Hand voller Asse, doch das Leben spielt Schach.



    Erfolg besteht aus drei Buchstaben: Tun

    Göthe

  • Hallo


    'randit' wird beschrieben mit:

    Quote


    Return a random integer N such that a <= N <= b. Alias for randrange(a, b+1).

    Du willst doch keine Zahl als Rückgabewert?


    Ich denke du musst dir hier etwas passenderes aussuchen.

    Eventuell 'choice' ?


    Grüße

    Dennis

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?