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.
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

Hallo Zusammen!
Ich möchte eine Variable splitten (im Bild).
Dies klappt aber nur einmal und beim 2. Versuch erhalte ich den Error: 'list' object has no attribute 'split'.
Ich möchte die Variable so splitten, dass ich die reine Zahl habe, der nach Distance= angezeigt wird.
Bild
8)
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte keine Screenshots, sondern Code und Fehlermeldungen hier mit dem Code-Tag Posten.

Und dein Split ist so sinnlos, du splittest ja ohne Argument. Womit Python Whitespace nimmt, und an deinem Zeilenende splittet.

Nimm stattdessen

int(s.split(“=“)[-1])

und du solltest die Distanz haben.

turnOffMotors

ist ohne Klammern dahinter übrigens wirkungslos.
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

Danke für deine Antwort :)
Werde ich morgen mal ausprobieren.
Die anderen Funktionen braucht ihr nicht beachten. Das richtige Programm ist ein anderes. Dieses ist nur ein kleiner Test. Es geht mir gerade nur um das Splitten.
8)
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@AngryJones: Ist trotzdem schwer das zu ignorieren: ``int(1)`` ist sinnlos. Das ist das gleiche wie ``1``. Eine ganze Zahl wird durch `int()` nicht irgendwie noch ganzzahliger.

Wenn man ein `Serial`-Objekt erstellt und dabei die Schnittstelle angibt, dann ist das bereits offen. Da noch mal (zu versuchen) `open()` aufzurufen macht keinen Sinn. Wobei auch dort das gleiche Problem besteht das __deets__ schon angesprochen hat: Man muss so etwas auf *aufrufen*.

Das ``try``/``except KeyboardInterrupt:`` sollte die Funktionsdefinition nicht enthalten. Zudem ist der Inhalt vom ``except`` eher etwas für ein ``finally``, denn Du willst ja nicht nur bei Strg+C die serielle Verbindung schliessen und die Motoren abschalten, sondern wohl eher generell wenn der ``try``-Block verlassen wird, also zum Beispiel auch wenn da irgend eine andere Ausnahme ausgelöst wird.

`s` ist kein guter Name. `serial` oder `connection` wäre wesentlich besser, damit der Leser weiss was das ist.

`Serial`-Objekte sind sowohl Kontextmanager als auch iterierbar. Also sollte man die ``with``-Anweisung beim Erstellen verwenden und kann in einer ``for``-Schleife über die Zeilen iterieren.

Namenskonvention in Python ist kleinbuchstaben_mit_unterstrichen für alles ausser Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Und Funktionen werden üblicherweise nach der Tätigkeit benannt die sie durchführen. So etwas wie `Motor_Geschwindigkeit()` geht also gar nicht. Die alten Methoden auf `Serial`-Objekten, die gegen die Konventionen verstossen, sollte man nicht mehr verwenden. Die Getter/Setter für die Leitungen wurden mittlerweile durch Properties ersetzt. Also statt ``ser.setRTS(0)`` schreibt man ``ser.rts = 0`` und statt ``print(ser.getCTS())`` nur noch ``print(ser.cts)``.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

Hier noch einmal das ganze Programm (mit die Zeilen die ich in der oberen Version löschen musste, damit es auch auf dem PC funktioniert, statt auf dem Raspberry PI)
Das einzige, was nicht funktioniert ist weiterhin das splitten. Int(s.split(“=“)[-1]) funktioniert nicht. Der Arduino sendet ja über die Seriele Schnittstelle die Werte z.B: b'Distance=15\r\n'
Davon muss ich in diesem Fall die 15 in eine Variable splitten, um im nachfolgenden Programm damit arbeiten zu können.

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)
serial.open
time.sleep(5)  
try:


    def Split_Variablen():
        while True:
            try:
                response = serial.readline()
                print (response)
                f,uv,ur1,ur2 = response.split()

                Sensor_Vorne = uv
                Sensor_Rechts_1 = ur1
                Sensor_Rechts_2 = ur2
                Farbe = f
            except ValueError:
                print("Error")

            

    def Rechte_Hand():
        while True:
            try:
                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 
                
            except ValueError:
                print("Error")



    def Motor_Geschwindigkeit():
        while True:
            try:
                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 ValueError:
                print("Error")


    Split_Variablen()                                       #Funktionen werden gestartet
    Rechte_Hand()
    Motor_Geschwindigkeit()
    

except KeyboardInterrupt:
         s.close()
         turnOffMotors
8)
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was heisst denn "funktioniert nicht"? Ist das hier der Fehler den du bekommst:

Code: Alles auswählen

>>> s = b'Distance=15\r\n'
>>> int(s.split('=')[-1])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: a bytes-like object is required, not 'str'
? Wenn ja, dann ist die Loesung ein simples b vor dem "="

Code: Alles auswählen

>>> int(s.split(b'=')[-1])
15
Und wenn nicht, und ganz generell in der Zukunft: konkrete Fehlermeldungen und Beschreibungen, was erwartet wurde, und was nicht passiert. "Geht nicht" kann man nur sagen "schade".
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

Vielen Dank für deine Antwort.
Der neue Code hat super funktioniert.
8)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@AngryJones: Funktionen sind nicht so etwas wie Sprungmarken. Funktionen sind in sich abgeschlossene Bereiche, die sich mit ihrer Umgebung per Argumente und Rückgabewerte austauschen. Sie sollten am Anfang einer Datei stehen und nicht innerhalb eines try-Blocks.

Es wäre also sehr überraschend, wenn der neue Code überhaupt funktioniert.
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

Sirius3 hat geschrieben: Samstag 24. November 2018, 11:54 @AngryJones: Funktionen sind nicht so etwas wie Sprungmarken. Funktionen sind in sich abgeschlossene Bereiche, die sich mit ihrer Umgebung per Argumente und Rückgabewerte austauschen. Sie sollten am Anfang einer Datei stehen und nicht innerhalb eines try-Blocks.

Es wäre also sehr überraschend, wenn der neue Code überhaupt funktioniert.
Also bis jetzt funktioniert er sehr gut... XD
8)
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und tut er das auch auf dem PI? Oder nur an deinem PC? Denn ausser die serielle Schnittstelle zu bedienen wird dein Code nix tun. "while True" in "Split_Variablen" verhindert, dass danach irgendwas anderes tut.
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

Habe jetzt alle 3 Funktionen in Threads verpackt (ganz unten). Sollte so doch parallel nebeneinander ablaufen, oder?

Code: Alles auswählen

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

import threading
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)
serial.open
time.sleep(5)  
try:


    def Split_Variablen():
        while True:
            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
            except ValueError:
                print("Error")

            

    def Rechte_Hand():
        while True:
            try:
                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 
                
            except ValueError:
                print("Error")



    def Motor_Geschwindigkeit():
        while True:
            try:
                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 ValueError:
                print("Error")


    Split_Variablen()                                       #Funktionen werden gestartet
    Rechte_Hand()
    Motor_Geschwindigkeit()

    Split_Variablen = threading.Thread(target = Split_Variablen)                #Funktionen werden in Threads verpackt
    Split_Variablen.start()

    Rechte_Hand = threading.Thread(target = Rechte_Hand)
    Rechte_Hand.start()

    Motor_Geschwindigkeit = threading.Thread(target = Motor_Geschwindigkeit)
    Motor_Geschwindigkeit.start()

except KeyboardInterrupt:
         s.close()
         turnOffMotors
8)
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wuerde mich ueberraschen. Das einlesen der seriellen Schnittstelle kannst du theoretisch so machen. Einen Effekt hat das uebrigens auch nicht, denn deine Variablen sind lokal zu deiner Funktion.

Spaetestens aber bei den Motoren wird dir das aller Vorraussicht nach auf die Fuesse fallen - mit mehreren Threads auf dem Motor-Hat rumzuhaemmern wird mindestens mal komisches Verhalten erzeugen weil du widerspruechliche Befehle sendest, und im schlimmsten Fall einfach irgendwann abstuerzen, weil der Code des IO-Boards halt nicht thread-safe ist.
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

Schade. Hat denn jemand eine Idee wie ich 3 parallel ablaufende Threads bekomme, die sich nicht gegenseitig widersprechen?
8)
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja, besser programmieren. Indem du deine Aufgaben mit einer gemeinsamen Hauptschleife nacheinander und in Abhaengigkeit der Steuerkommandos, Sensor-Feedback und Ablauf der Zeit abarbeitest.
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

Ja, nur ich bevorzuge eigentlich immer Threads, da sich diese immer bei den Robotern die ich früher programmiert bewährt haben.
Alle Tasks liefen unabhängig und konnten die anderen starten/ bzw. stoppen. (Hab früher mit NXC programmiert.)
Dies hatte den Vorteil, dass es innerhalb des Programms zu keinen Verzögerungen gekommen ist und man z.B Linienfolgen, während ein anderer Fall eingetreten ist (z.B Rechts Abbiegen),
bequem deaktivieren konnte.
8)
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann benutz Threads. Die Tage war hier wer mit einem ähnlichen Board, dem ist das auseinander geflogen. Vielleicht hast du Glück, und dir passiert das nicht.

Was ich allerdings bei NXC an “Threads” sehe sind Tasks. Und das ist etwas fundamental anderes. Die laufen immer garantiert exklusiv. Und mit klaren Übergabepunkten. Nicht gleichzeitig wie (in Grenzen) parallel, und an beliebigen stellen unterbrochen, wie bei Python.
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

Ok wenn einem dabei so leicht alles auseinander fliegen kann lass ich es lieber.
Habe jetzt noch einmal alles in eine while True Schleife geschrieben.

Code: Alles auswählen

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

import threading
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)
serial.open
time.sleep(1)  
try:
    while True:

        def Split_Variablen():

            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)
            

        def 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 
                


        def 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)
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also jetzt rufst du ja nix auf. Es passiert also genau gar nichts. Und deine Funktionen gehören auch nicht verschachtelt, und bei jedem schleifendurchlauf neu definiert, sondern EINMAL auf oberster Modulebene.
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

Ok Danke.
Hab bis jetzt noch nie mit den Funktionen gearbeitet XD.
8)
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

So jetzt aber:

Code: Alles auswählen

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

import threading
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)




def Split_Variablen():                                  #Definiere alle Funktionen
    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")


def 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 
                


def 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)



try:                                            #Starte alle Funktionen
    while True:
        
        Split_Variablen()
        Rechte_Hand()
        Motor_Geschwindigkeit()
        

except KeyboardInterrupt:
    print("Error")
8)
Antworten