Somit kann er sich ja 2 Zahlen per Zufall generieren lassen, wenn 0 dann links, wenn 1 dann rechts.
Problem beim programmieren von Roboterauto
-
Tundrameise -
19. November 2020 um 17:24 -
Erledigt
-
-
Problem beim programmieren von Roboterauto? Schau mal ob du hier fündig wirst!
-
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.
-
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.
-
im Minutentakt Beiträge zu posten erhöht nicht gerade die Übersichtlichkeit, dazu gibt es EDIT!
-
Entschuldigung. Nächstes Mal werde ich Edit verwenden. Haben Sie schon eine Idee was das Problem sein könnte?
-
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.
-
Wenn ich keine Helfer mehr finde, habe ich gröber ge********, ich muss meine VA bis im März fertig bringen und ich habe keine Ahnung was ich machen muss.
-
- 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:
in Zeile 20 steht dann, in einer while-Schleife und dort in einer Bedingung:
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:
Codedef 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:
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?
Python
Alles anzeigenMOTOR_LEFT = Motor(21, 20) MOTOR_RIGHT = Motor(26, 16) VELOCITY = 0.5 def motor_backward(velocity): MOTOR_LEFT.backward(velocity) MOTOR_RIGHT.backward(velocity) def main(): motor_backward(VELOCITY) main()
Grüße
Dennis
-
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
-
Zitat
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
-
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
-
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.
-
Hallo Tundrameise
damit wollte ich Boris-Gaertner nur zeigen, das ein 'global' nicht notwendig ist.
Das ist kein vollständiges Programm, aber ja ich würde gpiozero verwenden.
Edit: Da habe ich ja mal wieder lange zum Schreiben gebraucht
Grüße
Dennis
-
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?
Python
Alles anzeigen# Bibliotheken importieren from gpiozero import Motor from gpiozero import DistanceSensor import time #Aus- und Eingänge bestimmen ultrasonic = DistanceSensor(echo=, trigger=) MOTOR_LEFT = Motor(21, 20) MOTOR_RIGHT = Motor(26, 16) VELOCITY = 0.5 #Verschiedene Fahrtrichtungen definieren def motor_backward(velocity): MOTOR_LEFT.backward(velocity) MOTOR_RIGHT.backward(velocity) def motor_forward(velocity): MOTOR_LEFT.forward(velocity) MOTOR_RIGHT.forward(velocity) def motor_left(velocity): MOTOR_LEFT.forward(velocity) MOTOR_RIGHT.stop(velocity) def motor_right(velocity): MOTOR_LEFT.stop(velocity) MOTOR_RIGHT.forward(velocity) def motor_stop(): MOTOR_LEFT.stop() MOTOR_RIGHT.stop() #Hauptschleife while True: if ultrasonic.distance <0.3: motor_stop() print("stopp engines") else: motor_forward(0.5) print("Forward") motor_stop() gpio.cleanup
Freundliche Grüsse und einen schönen Abend.
Raspifriend
-
Das sieht jetzt ganz vielversprechend aus. In Zeile 46 muss es natürlich heißen:
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):
Python
Alles anzeigen#!/usr/bin/env python3 from gpiozero import DistanceSensor, Motor def drive_backward(motors, velocity): for motor in motors: motor.backward(velocity) def drive_forward(motors, velocity): for motor in motors: motor.forward(velocity) def turn_left(left_motor, right_motor, velocity): left_motor.forward(velocity) right_motor.stop() def turn_right(left_motor, right_motor, velocity): left_motor.stop() right_motor.forward(velocity) def stop(motors): for motor in motors: motor.stop() def main(): ultrasonic = DistanceSensor(23, 42) motors = (left_motor, right_motor) = Motor(21, 20), Motor(26, 16) try: while True: if ultrasonic.distance < 0.3: stop(motors) print("stopp engines") else: drive_forward(motors, 0.5) print("Forward") finally: stop(motors)
-
Jetzt mitmachen!
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!