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

Hier nochmal das Programm vom Raspberry PI. Das funktioniert zu 100% (hab ich auch getestet).
Ich habe jetzt das nötige Equipment zuhause.

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 = 25
ur1 = 0
ur2 = 15


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

Die Werte die ich angezeigt bekomme sind nicht mehr synchronisiert, sobald ich eine time.sleep hinzufüge.
Die sind für mein Programm allerdings notwendig. Hat jemand Ideen wie ich die Werte in Python zeitnah angezeigt bekomme?
(Threading ist ja anscheinend nicht so gut.)
8)
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

AngryJones hat geschrieben: Freitag 30. November 2018, 14:59Das funktioniert zu 100% (hab ich auch getestet).
Man muß nur den Code lesen, um zu sehen, dass Du nicht gründlich genug getestet hast. Außerdem hat es immer noch sinnlose Zeilen drin, die schon seit dem ersten Post hier bemängelt wurden. Du machst nicht den Eindruck, dass Du hier etwas lernen willst.

Wen mehrere Ereignisse gleichzeitig abgearbeitet werden sollen, braucht man eine Ereignisschleife, die nicht irgendwo durch sleep oder read blockiert werden darf.
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

Man muß nur den Code lesen, um zu sehen, dass Du nicht gründlich genug getestet hast.
Ich wüsste jetzt nicht was an dem Code grundsätzlich falsch sein sollte. Das einzige Problem ist immer noch, dass
der Arduino die Werte puffert. Ich hab es schon mit flushInput() versucht, allerdings werden dann keine neuen Werte mehr angezeigt.
Auch nicht mit einer time.sleep hinter flushInput(). Gibt es irgendwie eine Möglichkeit die letzte readline aufzurufen?
8)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na das IST das grundsätzlich falsche an deinem Code. Der kann eben nicht damit umgehen, daten zu verarbeiten während er eine zeitabhängige Steuerung hinbekommen muss. Um das zu ändern ist grundsätzliches Umdenken notwendig.
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

Wäre es dann nicht am einfachsten einen Thread für die Werte zu erstellen und einen für den Rest? Der Thread für die Werte sollte dann ja kann Problem für das Motor Hat sein, oder?
Er sendet ja gar keine Befehle an die Motoren.
8)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Worte “einfach” und “Thread” in einem Satz zu gebrauchen ist immer ein Fehler. Threads sind nicht einfach.

Und in diesem Fall ist der Beleg dafür ja einfach zu erbringen: egal ob du die Werte der seriellen Schnittstelle nun in einem Thread einliest oder erst wenn die Hauptschleife wieder erreicht wird - ein keinem der beiden Fälle erfolgt die BEARBEITUNG währen der verschlafenen Zeit.

Da du ja keine guten Namen für deine Variablen wählst, und keine Funktionen mit guten Namen hast, kann man ja nur raten, was da passieren soll. Aber ich vermute mal, die Sensoren sollen zb einen Stopp auslösen, wenn sie eine kollision wahrnehmen. Das passiert aber niemals rechtzeitig, wenn du zwischendurch schläfst.

Was du brauchst ist eine Schleife die schnell und nur mit geringer Verzögerung die Sensordaten einliest. Und zb einen Zustandsautomaten, der bestimmt, was gerade für ein Befehl abgearbeitet werden soll, aber jederzeit den Eingriff erlaubt das zu ändern.
AngryJones
User
Beiträge: 25
Registriert: Freitag 23. November 2018, 19:56

Könnte man nicht theoretisch vom Raspberry einen Wert an den Arduino senden (z.b serial.write("Bereit")). Wenn dieser vom Arduino erkannt wird sendet er einmal den aktuellen US-Wert an den Raspberry und wartet dann bis der Rasberry wieder bereit ist und z.b die Aktion Rechts abbiegen, welche 2 sek. dauert, beendet hat. Nachdem der Raspberry die Aktion beendet hat sendet er dann wieder "Bereit" an den Arduino, wodurch dieser wieder den aktuellen Wert einmal sendet.
8)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Klar. Kann man so machen. Ist dann halt komplizierter und immer noch nicht besser. Aber gehen tuts.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hier mal ein Modul, mit dem du “zeitgleiches” arbeiten erreichen kannst: https://docs.python.org/3/library/sched.html
Antworten