Projekt: Autonomer Roboter

  • Habe den Fehler gefunden. Die Ausgabe funktioniert nun. Durch das kopieren des Codes aus dem Forum, hat sich die Formatierung jeweils um 4 Leerzeichen verrückt. Habe alles um 4 Leerzeichen eingerückt und nun funktioneirt es auch. Lediglich das mit dem turn_left()weis ich nicht ob das so von dir gewollt ist.


    Hier einmal die Ausgabe vom Raspberry:



    und nochmal ein Video vom durchlauf:


    Video


    LG

    Bastelstube

  • Hallo, Bastelstube;

    der code vom werten meigrafd lautet halt:

    Code
    def turn_left(self):
    self.gpio.output(self.motor_a_in1, True)
    self.gpio.output(self.motor_a_in2, False)
    self.gpio.output(self.motor_b_in3, False)
    self.gpio.output(self.motor_b_in4, True

    -->Also Motor1 vorwärts, gleichzeitig Motor2 rückwärts, würde also eine Drehung auf der Stelle verursachen (Nennt man das "pivot"?)

    Ist doch gar nicht negativ für deine Absichten. Falls es dich stört, müsste wohl

    Code
    self.motor_b_in4, False

    gesetzt werden.

    meigrafd:

    Ich bewundere seit Anfang dieses Threads deine Geduld.

    Schön, dass einem Anfänger so ausführlich geholfen wird und auch andere interessierte Anfänger so dazulernen können!


    Weiter so;

    rasray

  • Durch das kopieren des Codes aus dem Forum, hat sich die Formatierung jeweils um 4 Leerzeichen verrückt.

    Wie kopierst du den Code? Am Code-Block ist oben rechts eine "Inhalt kopieren" Schaltfläche, nutzt du die?


    Lediglich das mit dem turn_left()weis ich nicht ob das so von dir gewollt ist.

    Das kannst du recht einfach anpassen - siehe rasray s Beitrag ;)

    Python
    def turn_left(self):
    GPIO.output(self.motor_a_in1, True)
    GPIO.output(self.motor_a_in2, False)
    GPIO.output(self.motor_b_in3, False)
    GPIO.output(self.motor_b_in4, True)
    self.telemetry['steerTo'] = 'left'
    print('Motor: {}'.format(self.telemetry['steerTo']))

    Ändern in

    Python
    def turn_left(self):
    GPIO.output(self.motor_a_in1, True)
    GPIO.output(self.motor_a_in2, False)
    GPIO.output(self.motor_b_in3, False)
    GPIO.output(self.motor_b_in4, False)
    self.telemetry['steerTo'] = 'left'
    print('Motor: {}'.format(self.telemetry['steerTo']))

    Und natürlich auch "turn_right" entsprechend anpassen


    ...wie gehabt, setzt man damit ja welcher Motor wie rum drehen soll...



    Den aktuellen Code findest du by the way nun auf meiner Github Seite => https://github.com/meigrafd/Sample-Code/blob/master/robot.py

  • -->Also Motor1 vorwärts, gleichzeitig Motor2 rückwärts, würde also eine Drehung auf der Stelle verursachen (Nennt man das "pivot"?)

    Ist doch gar nicht negativ für deine Absichten. Falls es dich stört, müsste wohl

    Jaa nennt man pivot. Ist auch nicht negativ sondern besser. Somit fallen zwei Funktionen nämlich weg. Hatte vorher ja noch turn_leftdrin wo sich nur ein Rad dreht. So ist es aber besser.


    Wie kopierst du den Code? Am Code-Block ist oben rechts eine "Inhalt kopieren" Schaltfläche, nutzt du die?

    Ähm nö, ist mir noch nie aufgefallen. Habe immer alles markiert und dann mit Strg+C kopiert.




    Dann scheint ja jetzt alles so zu laufen wie es soll und es ist ein Grund konstrukt nun vorhanden, worauf man aufbauen kann (weitere Ultraschallsensoren, GPS Steuerung, einen Bumper (ob es da was fertiges gibt oder selber bauen mehr sind macht:conf:) etc.).


    Ich werde nun den Code mal analysieren und mich dann hier nochmal melden ob ich diesen so richtig verstanden habe.


    Ich bedanke mich aber an dieser Stelle trotzdem schonmal für die Geduld und die Hilfsbereitschaft bei allen beteiligten. :danke_ATDE:


    Falls fragen zu der weiteren Vorgehensweise sind bzgl. weiterer Programmierung oder ähnliches etc. soll ich dafür dann einen neuen Thread aufmachen oder sollen wir diesen hier auflassen?

    Dann hätte man einen Thread, welchen man ggf. erweitern könnte und wo andere sich zusammenhängend alles durchlesen können.


    LG

    Bastelstube


  • Kann man an einen Voltage Translator von joy-it mehrere HC-SR04 Sensoren anschließen oder braucht man für jeden Sensor einen eigenen Translator?

    Hätte diese dann zunächst über ein BreadBoard gesteckt.


    LG

    Bastelstube

  • Weil die Abbildung auf http://sensorkit.fr.joy-it.net…ranslator_/_Level_Shifter zeigt dass der Levelshifter 4 Ports hat, A1 bis A4.

    Wie gesagt brauchst du eigentlich nur ECHO auf 3V3 leveln damit der Pi nicht geschrottet wird, das TRIG Signal wird vom Pi an den Sensor gesendet und der reagiert eigentlich auch bei 3V3.

  • Habe gerade nochmal geschaut. Es müssten eigentlich nur zwei gehen, da ich die GPIOs ja auch noch stecken muss. Ist im Prinzip aber egal, da ich nur einen zweiten benötige.


    LG

    Bastelstube

  • Es müssten eigentlich nur zwei gehen, da ich die GPIOs ja auch noch stecken muss.

    :conf:


    Wenn du auf der A-Seite den Pi hast und auf der B-Seite den Sensor,

    dann schließt du VCCa an 3V3 vom Pi an,

    A1 auf einen GPIO der für ECHO eingestellt ist und

    B1 auf den ECHO-Pin des Sensors.

    Auf der B-Seite brauchst du dann natürlich noch auf VCCb eine 5V Quelle - und dann natürlich GND von allen Quellen jeweils auf die GNDa und GNDb des Levelshifters.

    Damit müsste nur ein von vier Ports des Levelshifters belegt sein - und das wiederum bedeutet das du noch 3 weitere Sensoren anschließen könntest. Keine Ahnung wieso du auf nur zwei kommst?

  • Heute kam mein zweiter HC-SR04, den ich direkt verbaut und das Programm angepasst habe.


    Bekomme jedoch folgende Meldung



    Kann jemand behilflich sein?


    LG

    Bastelstube

  • Gewöhne dir bitte an erst mal selber rum zu probieren - natürlich ist es einfacher und bequemer direkt einen Beitrag zu erstellen....


    Guck dir mal ganz genau die Fehlermeldung an. Da steht eigentlich gut erkennbar was schief läuft.


    Davon abgesehen sind deine Anpassungen Quatsch...zB wofür brauchst du unit_left und unit_right?

    Den Sinn einer Klasse hast du offensichtlich auch noch nicht begriffen - wieso läßt du die Sonar_Ranger Klasse nicht so wie sie war und initialisierst einfach nur 2 unterschiedliche Objekte pro Sensor-Seite?

    Zwischen Zeile 238 und 284 steht somit auch jede Menge Quatsch

  • Meinst du das so?


    Python
    sonar_trigger_left = 38
    sonar_trigger_right = 35
    sonar_echo_left = 40
    sonar_echo_right = 37


    radar = Sonar_Ranger(sonar_trigger_left, sonar_trigger_right, sonar_echo_left, sonar_echo_right, telemetry, status, settings)


    LG

    Bastelstube

  • Nein.


    Was zeigt Zeile 238 bis 284 Deines Codes aus Beitrag#112 ... und was steht diesbezüglich in Meinem Beitrag#113 (der Absatz in dem die Zeilen erwähnt werden) :?:


    Du sollst die Sonar_Ranger so lassen wie sie war - von mir. Unverändert. Keine zusätzlichen Parameter einbauen.

    Du brauchst nur 2 unterschiedliche Objekte erzeugen, zB. radar_left und radar_right

  • So sieht jetzt die def main(): aus:


    Bekomme jedoch die Fehlermeldung, dass das Attribut distance() in der class Sonar_Ranger fehlt. Die Klasse habe ich wieder ins original versetzt und bastel nur an der main():.


    Python
    AttributeError: Sonar_Ranger instance has no attribute 'distance'


    LG

    Bastelstube

  • Von distance() steht in der Fehlermeldung nichts - ist ein Unterschied. Die Fehlermeldung ist aber auch nicht vollständig...


    Zeile 24 - 27 sind fehlerhaft.

    Zeile 12 könnte ggf auch Probleme bereiten, da in Deinem Fall 2 unterschiedliche Sensoren in ein Dictionary schreiben - es sei denn du willst nicht 2 verschiedene Distance-Werte.


    Die einzige Erklärung die ich für die Fehlermeldung zZt habe ist dass print_distance() früher als ping() ausgeführt wird... Abhilfe: Zwischen Zeile 40 & 41 das einfügen: self.distance=None(in meinem Code)

    Ansonsten bitte vollständige Fehlermeldung zeigen (immer).

  • Hier mal der gesamte Code:



    Wenn ich das self.distance=None einbaue, dann drehen sich die Räder und wenn ich es rausnehme genauso. Jedoch stimmen die Werte nicht die ausgegeben werden. Der Sensor gibt immer den gleichen Wert aus, egal wie nah ich einen Gegenstand davor halte und egal ob ich das self.distance=Nonedrin habe oder nicht. Kommt er in das unter 15cm Fenster so wird auch der turn_left()ausgelöst.


    Der zweite Sensor war dazu gedacht, dass wenn der linke Sensor merkt, dass die Distanz nicht mehr passt das er einen turn_right() macht. Wenn der rechte Sensor merkt es passt nicht mehr, dann ein turn_left(). Hierzu sollen dann noch die gemessenen Werte der einzelnen Sensoren ausgegeben werden.


    LG

    Bastelstube

    Edited 2 times, last by Shaq ().