Variable splitten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

@AngryJones: warum schreibst und postest Du die gesamte Zeit ungetesteten Code? So funktioniert Programmieren nicht. Man schreibt eine Funktion, testet die ausführlich und macht sich dann an die nächste Funktionalität. Wenn man so viel geschrieben hat, ohne zu wissen ob es auch funktioniert, wird man nie zu einem Ziel kommen.
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

Sirius3 hat geschrieben: Samstag 24. November 2018, 17:52 @AngryJones: warum schreibst und postest Du die gesamte Zeit ungetesteten Code? So funktioniert Programmieren nicht. Man schreibt eine Funktion, testet die ausführlich und macht sich dann an die nächste Funktionalität. Wenn man so viel geschrieben hat, ohne zu wissen ob es auch funktioniert, wird man nie zu einem Ziel kommen.
Jetzt funktioniert es ja.
8)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das bezweifele ich. Das ganze Motor_Links.Stop etc gedöns funktioniert 💯 nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 14028
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@AngryJones: Das erste worüber das fallen dürfte ist das `run()` in Zeile 29 was nirgends definiert ist. Das kommt also gar nicht erst zur Hauptschleife womit alles in den ”Funktionen” sowieso schon mal nicht ausgeführt wird, ob das nun funktionieren würde oder nicht. Falls damit die `run()`-Methode auf einem `Adafruit_DCMotor`-Objekt gemeint sein sollte, wäre es zudem relativ sinnfrei `Vorwaerts`, `Rueckwaerts`, und `Stop` mit dem Rückgabewert zu initialisieren, weil der `None` ist.

Die ”Funktionen” haben aber auch alle ihre Probleme die sie nicht durchlaufen lassen. In `Split_Variablen()` sind `ur1`, `ur2`, und `f` nicht definiert und führen zu einem `NameError`. Ebenso in `Rechte_Hand()` wo `Sensor_Rechts_2` und `Sensor_Vorne` undefiniert sind. Neben dem Problem was __deets__ schon angesprochen hat. Und in `Motor_Geschwindigkeit()` sind ebenfalls `Sensor_Rechts_1` und `Sensor_Rechts_2` undefiniert und führen zu einer Ausnahme.

`atexit` ist ziemlich übertrieben für etwas das man einfach über einen ``finally``-Zweig abfrühstücken kann.

Einige von den Importen sind überflüssig, da sie nicht verwendet werden.

Was soll der komische ``#OLAF OS//OLAF OS//OLAF OS//[…]``-Kommentar?

Und auf andere Verbesserungsvorschläge bist Du auch überhaupt nicht eingegangen.

Speziell was die Namensschreibweisen angeht, solltest Du Dir auf keinen Fall den Adafruit-Code als Vorbild nehmen. Der ist massiv „unpythonisch“ und so oft wie da Adafruit in den Namen vorkommt, hatte da wohl auch die Marketingabteilung der Firma ihre Finger im Spiel/Code.

Wenn ich den Code so anschaue fehlen IMHO einfach ein paar Python-Grundlagen. Zum Beispiel wie Funktionen und Namensräume in Python funktionieren.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

Die ”Funktionen” haben aber auch alle ihre Probleme die sie nicht durchlaufen lassen. In `Split_Variablen()` sind `ur1`, `ur2`, und `f` nicht definiert und führen zu einem `NameError`. Ebenso in `Rechte_Hand()` wo `Sensor_Rechts_2` und `Sensor_Vorne` undefiniert sind. Neben dem Problem was __deets__ schon angesprochen hat. Und in `Motor_Geschwindigkeit()` sind ebenfalls `Sensor_Rechts_1` und `Sensor_Rechts_2` undefiniert und führen zu einer Ausnahme.
Habe ich jetzt ausgebessert, indem ich alle Funktionen entfernt habe und alles in eine while True gepackt habe. `ur1`, `ur2`, und `f` sind erstmal egal und wurden "gehashtagt"
Das erste worüber das fallen dürfte ist das `run()` in Zeile 29 was nirgends definiert ist. Das kommt also gar nicht erst zur Hauptschleife womit alles in den ”Funktionen” sowieso schon mal nicht ausgeführt wird, ob das nun funktionieren würde oder nicht. Falls damit die `run()`-Methode auf einem `Adafruit_DCMotor`-Objekt gemeint sein sollte, wäre es zudem relativ sinnfrei `Vorwaerts`, `Rueckwaerts`, und `Stop` mit dem Rückgabewert zu initialisieren, weil der `None` ist.
Hm... ich dachte ich könnte einfach den run Befehl durch z.B Vorwärts ersetzen. Wie müsste ich es denn richtig machen?
Es einfach viel einfacher zu schreiben Motor_Seite. Richtung/Stop

Das Programm sieht jetzt so aus. Bitte kritisiert mich für die Fehler nicht zu stark. Ich lerne Python erst seit kurzem in der Schule in einer AG.

Code: Alles auswählen

# -*- coding: utf-8 -*-

import serial                    #OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//
import time
import RPi.GPIO as GPIO
import atexit
from Adafruit_MotorHAT import Adafruit_MotorHAT, Adafruit_DCMotor


# create a default object, no changes to I2C address or frequency
mh = Adafruit_MotorHAT(addr=0x60)


# recommended for auto-disabling motors on shutdown!
def turnOffMotors():
    mh.getMotor(1).run(Adafruit_MotorHAT.RELEASE)
    mh.getMotor(2).run(Adafruit_MotorHAT.RELEASE)

atexit.register(turnOffMotors)


#DC motor test
#Links
Motor_Rechts = mh.getMotor(1)
#Rechts
Motor_Links = mh.getMotor(2)

Vorwaerts = run(Adafruit_MotorHAT.FORWARD)              #Variablen werden definiert
Rueckwaerts = run(Adafruit_MotorHAT.BACKWARD)           
Stop = run(Adafruit_MotorHAT.RELEASE)
Abbiegezeit = 1


Motor_Rechts.setSpeed(100)
Motor_Links.setSpeed(100)


#import serial
#ser = serial.Serial(0)
#ser.is_open
#True
#ser.setRTS(1)
#ser.setRTS(0)
#print(ser.getCTS())
#False
#ser.close()

 
serial = serial.Serial('/dev/ttyACM0', 9600)    #Für Arduino
#serial = serial.Serial('COM3', 9600)            #Für PC
serial.open
time.sleep(1)

while True:
    try:

    #Split Variablen

        try:
            response = serial.readline()
            #print (response)
            uv = int(response.split(b'=')[-1])
            
            Sensor_Vorne = uv
            #Sensor_Rechts_1 = ur1
            #Sensor_Rechts_2 = ur2
            #Farbe = f
            print(Sensor_Vorne)

        except ValueError:
            print("ValueError")


    #Rechte Hand

        if Sensor_Rechts_2 < 20 and Sensor_Vorne < 20:
            Motor_Rechts .Vorwaerts
            Motor_Links .Vorwaerts
            time.sleep(2)
            Motor_Rechts .Stop
            Motor_Links .Stop
            Motor_Rechts .Rueckwaerts
            Motor_Links .Rueckwaerts
            time.sleep(1)
            Motor_Rechts. Vorwaerts
            time.sleep(Abbiegezeit)
            Motor_Rechts. Vorwaerts
            Motor_Links. Vorwaerts
            time.sleep(1.5)

        elif Sensor_Rechts_2 > 20 and Sensor_Vorne > 20:
            Motor_Rechts .Rueckwaerts
            Motor_Links .Vorwaerts
            time.sleep(Abbiegezeit)
            Motor_Rechts .Vorwaerts
            Motor_Links .Vorwaerts
            time.sleep(1.5)
                
        elif Sensor_Rechts_2 > 20 and Sensor_Vorne < 20:
            Motor_Rechts .Vorwaerts
            Motor_Links .Vorwaerts
            time.sleep(2)
            Motor_Rechts .Stop
            Motor_Links .Stop
            Motor_Rechts .Rueckwaerts
            Motor_Links .Rueckwaerts
            time.sleep(1)
            Motor_Rechts .Rueckwaerts
            Motor_Links .Vorwaerts
            time.sleep(Abbiegezeit)
            Motor_Rechts .Vorwaerts
            Motor_Links .Vorwaerts
            time.sleep(1.5)

        elif Sensor_Rechts_2 < 20 and Sensor_Vorne > 20:
            Motor_Rechts .Vorwaerts
            Motor_Links .Vorwaerts 
                

    #Motor Geschwindigkeit


        if Sensor_Rechts_1 > Sensor_Rechts_2:
            Motor_Links. setSpeed(150)
            Motor_Rechts. setSpeed(100)

        elif Sensor_Rechts_1 < Sensor_Rechts_2:
            Motor_Links. setSpeed(100)
            Motor_Rechts. setSpeed(150)

        elif Sensor_Rechts_1 == Sensor_Rechts_2:
            Motor_Rechts. setSpeed(100)
            Motor_Links. setSpeed(100)




    except KeyboardInterrupt:
        print("Error")
8)
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich kritisiere Dich nicht wegen Deiner Fehler, höchstens wegen Deiner Einstellung zu behaupten, alles würde funktionieren, obwohl es das nicht tut.

Statt Syntax zu raten, solltest Du lernen, wie man was ausdrückt. Z.B. dass man das was Du willst, mit Funktionen beschreibt:

Code: Alles auswählen

def vorwaerts(motor)
    motor.run(Adafruit_MotorHAT.FORWARD)

...
vorwaerts(Motor_Rechts)
Ein Grundgerüst könnte so aussehen:

Code: Alles auswählen

# -*- coding: utf-8 -*-
import serial
import time
from Adafruit_MotorHAT import Adafruit_MotorHAT as MotorHAT

def vorwaerts(motor):
    motor.run(MotorHAT.FORWARD)

def rueckwaerts(motor):
    motor.run(MotorHAT.BACKWARD)           

def stop(motor):
    motor.run(MotorHAT.RELEASE)

def loop(serial, motor_rechts, motor_links):
    # hier hin kommt das innere der while-Schleife
    pass

def main():
    mh = MotorHAT(addr=0x60)
    motor_rechts = mh.getMotor(1)
    motor_links = mh.getMotor(2)

    serial = serial.Serial('/dev/ttyACM0', 9600)    #Für Arduino
    # serial = serial.Serial('COM3', 9600)            #Für PC
    try:
        while True:
            loop(serial, motor_rechts, motor_links)
    except KeyboardInterrupt:
        pass
    finally:
        motor_rechts.run(MotorHAT.RELEASE)
        motor_links.run(MotorHAT.RELEASE)

if __name__ == '__main__':
    main()
Benutzeravatar
__blackjack__
User
Beiträge: 14028
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@AngryJones: Das läuft ganz sicher immer noch nicht und wird genau am gleichen unbekannten `run()` scheitern wie die Version davor. Es gibt nicht *den* `run()`-Befehl, das ist wie schon gesagt eine Methode auf einem `Adafruit_DCMotor`-Objekt. Man muss dazu also erst einmal so ein Objekt haben um darauf eine Methode aufrufen zu können. Und dann möchte man die ja nicht an der Stelle aufrufen wo Du Deinen `run()`-Aufruf hast, sondern erst dann wenn man wirklich möchte das der Motor zum Beispiel vorwärts läuft. Dazu könnte man eine Funktion definieren die so ein `Adafruit_DCMotor`-Objekt als Argument übergeben bekommt und die beispielsweise `run_forward()` nennen. Oder man kapselt so einen `Adafruit_DCMotor` in einem eigenen Objekt dem man entsprechende Methoden verpasst, dann könnte man den Aufruf zumindest so ähnlich schreiben wie Du das geraten hast wie es vielleicht aussehen könnte.

Programmieren ist aber kein Raten. Und es macht keinen Sinn zu programmieren ohne das tatsächlich laufen zu lassen und zu testen ob das tatsächliche Programmverhalten mit dem Erwarteten übereinstimmt. Das Dein Code schon wieder ziemlich weit am Anfang 100%ig in den gleichen `NameError` läuft, zeigt das Dein gesamtes Vorgehen so nicht sinnvoll ist. Selbst wenn Du diesen Fehler behebst, weisst Du ja nicht ob Du ihn tatsächlich wirklich behoben hast, ohne das Programm laufen zu lassen.

Falls Du das nicht laufen lassen kannst weil Du die nötige Hardware zu Hause nicht hast, weil die nur in der Schule in der AG zur Verfügung steht, dann kannst Du dafür zuhause gar nicht oder nur sehr eingeschränkt programmieren, denn wie schon gesagt, besteht programmieren, neben der Planung, hauptsächlich aus abwechselnd Code für eine (Teil)Funktionalität schreiben, und testen ob der bisherige Code tatsächlich funktioniert. Und erst dann neuen Code dazu schreiben, wenn der bisherige funktioniert. Sonst hat man am Ende Code, wie Du jetzt, bei dem alles voller Fehler ist. Die man ohne Testläufe selbst nicht finden kann, wenn sie einem nach aufmerksamen Korrekturlesen nicht auffallen. Und wir sind hier eigentlich nicht dazu da das System, auf dem das am Ende laufen soll, in unseren Köpfen zu simulieren, um Dir dann Sachen zu sagen, die Du als Programmierer selbst herausfinden musst und ja auch leicht kannst.

Und andere Sachen solltest Du selbst bemerken. Wie zum Beispiel, dass Du jetzt die Definition von `Sensor_Rechts_1` und `Sensor_Rechts_2` auskommentiert hast, aber im Code weiterhin versucht wird darauf zuzugreifen. Was offensichtlich wieder zu `NameError`-Ausnahmen führen wird. Oder was dachtest Du welchen Wert diese Variablen annehmen sollten, ohne das man das irgendwo in Form von Code festlegt?

Statt Funktionen zu entfernen, solltest Du besser den Umgang damit lernen. Denn weniger Funktionen bedeuten hier auch eindeutig schlechterer Code, denn nun ist ja im Grunde *fast alles* Hauptprogramm und müsste eigentlich in einer Funktion stehen, die aber deutlich zu lang wäre. Faustregel ist das eine Funktion nur eine in sich geschlossene Aufgabe erledigt und in der Regel max. 25 bis 50 Zeilen Code enthält. Also überschaubar einzeln betrachtet werden kann.

Was Du zuhause machen kannst, ist unabhängig von dem Projekt die Grundlagen von Python lernen. Und so etwas wie den Style Guide for Python Code verinnerlichen. Und dann in der Schule das gelernte auf das Projekt anwenden.

@Sirius3: Da wir ja schon die `stop()`-Funktion haben, könnte man die im ``finally`` benutzen. :-)
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

@Sirius3 Danke für deinen guten Tipp mit den Motoren. Den habe ich direkt mal eingebaut.
Nächsten Donnerstag sollte eigentlich alles so laufen. Ich melde mich dann nochmal.
8)
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

Ich habe in meiner readline nun folgendes stehen (jeweils in einer eigenen line und abwechselnd): b'US1=6\r\n' und b'US2=100\r\n'
Ich müsste nun den Wert US1 und US2 jeweils in eine Variable packen.
Bis jetzt habe ich das hier:

Code: Alles auswählen

# -*- coding: utf-8 -*-

import serial                 
import time
import atexit

 
serial = serial.Serial('COM3', 9600)
serial.open
time.sleep(1)  
try:


    def Split_Variablen():
        while True:
            try:
                response = serial.readline()
                print (response)
                uv =int(response.split(b"1=")[-1])
                #print(uv)
                #print(ur1)

     
            except ValueError:
                print("Error")

    Split_Variablen()

except KeyboardInterrupt:
         s.close()
         turnOffMotors
Weiss jemand wie ich das schaffe?
8)
Benutzeravatar
noisefloor
User
Beiträge: 4187
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Weiss jemand wie ich das schaffe?
Ja, Python-Tutorial lesen. Wurde dir weiter oben ja bereits empfohlen.
Schau dir an, welchen Datentyp die `split` Methode von Strings bzw. Bytestrings zurück liefert und schau dann nach, wie man auf Elemente der Datenstruktur zugreift. Das Stichwort heißt: Indexzugriff. Bzw. hier ginge auch Mehrfachzuweisung.

Code: Alles auswählen

serial = serial.Serial('COM3', 9600)
serial.open
Ist immer noch nicht richtig. Warum, hat dir __blackjack__ weiter oben erklärt...

Wenn du in einem Support-Forum nach Hilfe fragst, aber Antworten scheinbar komplett ignorierst -> dann kannst du das Fragen auch direkt sein lassen. Zumal die Hilfswilligen auch relativ schnell weg sind, wenn beim Hilfesuchenden null Eigenmotivation erkennbar ist, was besser zu machen.

Gruß, noisefloor
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

@noisefloor
Ist immer noch nicht richtig.
Also bis jetzt funktioniert das sehr gut. Warum sollte ich also daran etwas ändern?
8)
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

@AngryJones: niemand hier glaubt Dir, dass es sehr gut funktioniert, weil alles was Du bisher gezeigt hast, nicht funktionierender Code war. Also entweder vera*** Du uns hier, zeigst absichtlich Quatsch, lebst in einem Paralleluniversum, wo es eine andere Art Python gibt oder hast eine sehr seltsame Ansicht von "funktioniert", weil Du das Programm noch nie ausgeführt hast.
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

Folgendes Programm funktioniert perfekt:

Code: Alles auswählen

# -*- coding: utf-8 -*-

import serial                 
import time
import atexit

 
serial = serial.Serial('COM3', 9600)
serial.open
time.sleep(1)  
try:


    def Split_Variablen():
        uv = 0
        ur1 = 0
        ur2 = 0
        while True:
            try:
                response = serial.readline()
                #print (response)            
                if response == b'US1\r\n':
                    response = serial.readline()
                    uv =int(response.split(b"=")[-1])
                elif response == b'US2\r\n':
                    response = serial.readline()
                    ur1 =int(response.split(b"=")[-1])
                elif response == b'US3\r\n':
                    response = serial.readline()
                    ur2 =int(response.split(b"=")[-1])
                print("UV=" ,uv)
                print("UR1=" ,ur1)
                print("UR2=" ,ur2)
     
            except ValueError:
                print("Error")

    Split_Variablen()

except KeyboardInterrupt:
         s.close()
         turnOffMotors
Hier ein Bild:
Bild
8)
Benutzeravatar
__blackjack__
User
Beiträge: 14028
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@AngryJones: Und es enthält trotzdem Fehler die bereits angesprochen wurden.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

@AngryJones: ... bis man Strg-C drückt und einen NameError bekommt.
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

Achso, ihr meint das mit s.close.
Ja gut, finde ich zwar nicht so schlimm diesen Error als letzte Aktion von dem Programm zu
erhalten, aber habe ich jetzt geändert. Ist mir sonst auch nicht so aufgefallen, weil ich das Programm immer
direkt "kille".
8)
Benutzeravatar
noisefloor
User
Beiträge: 4187
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

`turnOffMotors` lässt dein gezeigtes Programm auch crashen. `serial.open` ist auch falsch, lässt dein Programm aber immerhin nicht crashen.

Gruß, noisefloor
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

@noisefloor Danke für deine Antwort. Hab ich bereits behoben. Ich bekomme auch keinen Error mehr. Auch nicht bei Ctrl + C.

Code: Alles auswählen

import serial                 
import time
import atexit

 
serial = serial.Serial('COM3', 9600)
serial.open
time.sleep(1)  
try:


    def Split_Variablen():
        uv = 0
        ur1 = 0
        ur2 = 0
        while True:
            try:
                response = serial.readline()
                #print (response)            
                if response == b'US1\r\n':
                    response = serial.readline()
                    uv =int(response.split(b"=")[-1])
                elif response == b'US2\r\n':
                    response = serial.readline()
                    ur1 =int(response.split(b"=")[-1])
                elif response == b'US3\r\n':
                    response = serial.readline()
                    ur2 =int(response.split(b"=")[-1])
                print("UV=" ,uv)
                print("UR1=" ,ur1)
                print("UR2=" ,ur2)
     
            except ValueError:
                print("Error")

    Split_Variablen()

except KeyboardInterrupt:
         serial.close()
Das Ganze hab ich nun auch in das eigentliche Programm eingebaut.
Mir ist klar das dort noch ein paar Elemente fehlen können.
Hier ein kleiner Zwischenstand (Das Programm nutzt einen Arduino, einen Rapberry PI und ein Motor Hat.) :

Code: Alles auswählen

# -*- coding: utf-8 -*-

import serial                    #OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//
import time
import RPi.GPIO as GPIO
import atexit
from Adafruit_MotorHAT import Adafruit_MotorHAT, Adafruit_DCMotor


# create a default object, no changes to I2C address or frequency
mh = Adafruit_MotorHAT(addr=0x60)


# recommended for auto-disabling motors on shutdown!
def turnOffMotors():
    mh.getMotor(1).run(Adafruit_MotorHAT.RELEASE)
    mh.getMotor(2).run(Adafruit_MotorHAT.RELEASE)

atexit.register(turnOffMotors)


#DC motor test
#Links
Motor_Rechts = mh.getMotor(1)
#Rechts
Motor_Links = mh.getMotor(2)

Abbiegezeit = 1


Motor_Rechts.setSpeed(100)
Motor_Links.setSpeed(100)

 
serial = serial.Serial('/dev/ttyACM0', 9600)    #Für Arduino
#serial = serial.Serial('COM3', 9600)            #Für PC
serial.open
time.sleep(1)


def Vorwarts(motor):                                            #Definiere Funktionen der Motoren
    motor.run(Adafruit_MotorHAT.FORWARD)

def Ruckwarts(motor):
    motor.run(Adafruit_MotorHAT.BACKWARD)

def Stop(motor):
    motor.run(Adafruit_MotorHAT.RELEASE)


uv = 0
ur1 = 0
ur2 = 0


while True:
    try:

    #Split Variablen

        try:
            response = serial.readline()
            #print (response)            
            if response == b'US1\r\n':
                response = serial.readline()
                uv =int(response.split(b"=")[-1])
            elif response == b'US2\r\n':
                response = serial.readline()
                ur1 =int(response.split(b"=")[-1])
            elif response == b'US3\r\n':
                response = serial.readline()
                ur2 =int(response.split(b"=")[-1])

            print("UV=" ,uv)
            print("UR1=" ,ur1)
            print("UR2=" ,ur2)

            Sensor_Vorne = uv
            Sensor_Rechts = ur1
            Sensor_Rechts_2 = ur2


        except ValueError:
            print("ValueError")


    #Rechte Hand

        if Sensor_Rechts_2 < 20 and Sensor_Vorne < 20:
            Vorwarts(Motor_Rechts)
            Vorwarts(Motor_Links)
            time.sleep(2)
            Stop(Motor_Rechts)
            Stop(Motor_Links)
            Ruckwarts(Motor_Rechts)
            Ruckwarts(Motor_Links)
            time.sleep(1)
            Vorwarts(Motor_Rechts)
            time.sleep(Abbiegezeit)
            Vorwarts(Motor_Rechts)
            Vorwarts(Motor_Links)
            time.sleep(1.5)

        elif Sensor_Rechts_2 > 20 and Sensor_Vorne > 20:
            Ruckwarts(Motor_Rechts)
            Vorwarts(Motor_Links)
            time.sleep(Abbiegezeit)
            Vorwarts(Motor_Rechts)
            Motor_Links .Vorwaerts
            time.sleep(1.5)
                
        elif Sensor_Rechts_2 > 20 and Sensor_Vorne < 20:
            Vorwarts(Motor_Rechts)
            Vorwarts(Motor_Links)
            time.sleep(2)
            Stop(Motor_Rechts)
            Stop(Motor_Links)
            Ruckwarts(Motor_Rechts)
            Ruckwarts(Motor_Links)
            time.sleep(1)
            Ruckwarts(Motor_Rechts)
            Vorwarts(Motor_Links)
            time.sleep(Abbiegezeit)
            Vorwarts(Motor_Rechts)
            Vorwarts(Motor_Links)
            time.sleep(1.5)

        elif Sensor_Rechts_2 < 20 and Sensor_Vorne > 20:
            Vorwarts(Motor_Rechts)
            Vorwarts(Motor_Links) 
                

    #Motor Geschwindigkeit


        if Sensor_Rechts_1 > Sensor_Rechts_2:
            Motor_Links. setSpeed(150)
            Motor_Rechts. setSpeed(100)

        elif Sensor_Rechts_1 < Sensor_Rechts_2:
            Motor_Links. setSpeed(100)
            Motor_Rechts. setSpeed(150)

        elif Sensor_Rechts_1 == Sensor_Rechts_2:
            Motor_Rechts. setSpeed(100)
            Motor_Links. setSpeed(100)




    except KeyboardInterrupt:
        turnOffMotors()
        serial.close()
        print("Programm wurde gestoppt!!")
8)
Benutzeravatar
__blackjack__
User
Beiträge: 14028
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und wieder ein Programm das nicht funktioniert weil es mit einem `NameError` abbricht, was Du also wieder nicht ausprobiert hast…
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

@blackjack Also das erste funktioniert auf jeden Fall. Das zweite habe ich heute ausprobiert und die Fehler behoben.
Das 2. Programm funktioniert jetzt zwar, jedoch nicht so wie es sollte. Der Arduino scheint im voraus Werte in die Serial.readline zu schreiben, wodurch eine Verzögerung entsteht.
Z.B realisiert das Programm es erst 5 sek. später, wenn ich meine Hand vor den US- Sensor halte.
Hab jetzt nicht korrekte Version hier rein kopiert, weil diese auf dem Raspberry Pi liegt.
Allerdings habe ich glaube ich alle Fehler die aufgetreten sind auch hier ausgebessert.
Falls trotzdem noch ein Error auftreten sollte kopiere mir bitte mal den ganzen Fehlercode.

Wie gesagt war im oberen Beitrag die obere Version die getestete und die untere die ungetestete.

Code: Alles auswählen

# -*- coding: utf-8 -*-

import serial                    #OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//OLAF OS//
import time
import RPi.GPIO as GPIO
import atexit
from Adafruit_MotorHAT import Adafruit_MotorHAT, Adafruit_DCMotor


# create a default object, no changes to I2C address or frequency
mh = Adafruit_MotorHAT(addr=0x60)


# recommended for auto-disabling motors on shutdown!
def turnOffMotors():
    mh.getMotor(1).run(Adafruit_MotorHAT.RELEASE)
    mh.getMotor(2).run(Adafruit_MotorHAT.RELEASE)

atexit.register(turnOffMotors)


#DC motor test
#Links
Motor_Rechts = mh.getMotor(1)
#Rechts
Motor_Links = mh.getMotor(2)

Abbiegezeit = 1


Motor_Rechts.setSpeed(100)
Motor_Links.setSpeed(100)

 
serial = serial.Serial('/dev/ttyACM0', 9600)    #Für Arduino
#serial = serial.Serial('COM3', 9600)            #Für PC
serial.open
time.sleep(1)


def Vorwarts(motor):                                            #Definiere Funktionen der Motoren
    motor.run(Adafruit_MotorHAT.FORWARD)

def Ruckwarts(motor):
    motor.run(Adafruit_MotorHAT.BACKWARD)

def Stop(motor):
    motor.run(Adafruit_MotorHAT.RELEASE)


uv = 0
ur1 = 0
ur2 = 0


while True:
    try:

    #Split Variablen

        try:
            response = serial.readline()
            #print (response)            
            if response == b'US1\r\n':
                response = serial.readline()
                uv =int(response.split(b"=")[-1])
            elif response == b'US2\r\n':
                response = serial.readline()
                ur1 =int(response.split(b"=")[-1])
            elif response == b'US3\r\n':
                response = serial.readline()
                ur2 =int(response.split(b"=")[-1])

            print("UV=" ,uv)
            print("UR1=" ,ur1)
            print("UR2=" ,ur2)

            Sensor_Vorne = uv
            Sensor_Rechts_1 = ur1
            Sensor_Rechts_2 = ur2


        except ValueError:
            print("ValueError")


    #Rechte Hand

        if Sensor_Rechts_2 < 20 and Sensor_Vorne < 20:
            Vorwarts(Motor_Rechts)
            Vorwarts(Motor_Links)
            time.sleep(2)
            Stop(Motor_Rechts)
            Stop(Motor_Links)
            Ruckwarts(Motor_Rechts)
            Ruckwarts(Motor_Links)
            time.sleep(1)
            Vorwarts(Motor_Rechts)
            time.sleep(Abbiegezeit)
            Vorwarts(Motor_Rechts)
            Vorwarts(Motor_Links)
            time.sleep(1.5)

        elif Sensor_Rechts_2 > 20 and Sensor_Vorne > 20:
            Ruckwarts(Motor_Rechts)
            Vorwarts(Motor_Links)
            time.sleep(Abbiegezeit)
            Vorwarts(Motor_Rechts)
            Vorwarts(Motor_Links)
            time.sleep(1.5)
                
        elif Sensor_Rechts_2 > 20 and Sensor_Vorne < 20:
            Vorwarts(Motor_Rechts)
            Vorwarts(Motor_Links)
            time.sleep(2)
            Stop(Motor_Rechts)
            Stop(Motor_Links)
            Ruckwarts(Motor_Rechts)
            Ruckwarts(Motor_Links)
            time.sleep(1)
            Ruckwarts(Motor_Rechts)
            Vorwarts(Motor_Links)
            time.sleep(Abbiegezeit)
            Vorwarts(Motor_Rechts)
            Vorwarts(Motor_Links)
            time.sleep(1.5)

        elif Sensor_Rechts_2 < 20 and Sensor_Vorne > 20:
            Vorwarts(Motor_Rechts)
            Vorwarts(Motor_Links) 
                

    #Motor Geschwindigkeit


        if Sensor_Rechts_1 > Sensor_Rechts_2:
            Motor_Links. setSpeed(150)
            Motor_Rechts. setSpeed(100)

        elif Sensor_Rechts_1 < Sensor_Rechts_2:
            Motor_Links. setSpeed(100)
            Motor_Rechts. setSpeed(150)

        elif Sensor_Rechts_1 == Sensor_Rechts_2:
            Motor_Rechts. setSpeed(100)
            Motor_Links. setSpeed(100)




    except KeyboardInterrupt:
        turnOffMotors()
        serial.close()
        print("Programm wurde gestoppt!!")
8)
Antworten