Problem beim programmieren von Roboterauto

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • 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

    Goethe

  • 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.

    2 Mal editiert, zuletzt von Boris-Gaertner (20. November 2020 um 18:09) aus folgendem Grund: Zwei Tippfehler berichtigt

  • Hallo,

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

    Zitat

    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

    Goethe

  • 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

    Goethe

  • 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

    Goethe

  • 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.

    Einmal editiert, zuletzt von MistyFlower59469 (10. Dezember 2020 um 12:19)

  • 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

    Goethe

  • Hallo

    'randit' wird beschrieben mit:

    Zitat


    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

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

Jetzt mitmachen!

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