Seite 3 von 3

Re: Variable splitten

Verfasst: Freitag 30. November 2018, 14:59
von AngryJones
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!!")

Re: Variable splitten

Verfasst: Freitag 30. November 2018, 20:55
von AngryJones
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.)

Re: Variable splitten

Verfasst: Samstag 1. Dezember 2018, 12:50
von Sirius3
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.

Re: Variable splitten

Verfasst: Samstag 1. Dezember 2018, 13:07
von AngryJones
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?

Re: Variable splitten

Verfasst: Samstag 1. Dezember 2018, 13:10
von __deets__
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.

Re: Variable splitten

Verfasst: Samstag 1. Dezember 2018, 13:13
von AngryJones
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.

Re: Variable splitten

Verfasst: Samstag 1. Dezember 2018, 13:22
von __deets__
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.

Re: Variable splitten

Verfasst: Samstag 1. Dezember 2018, 13:38
von AngryJones
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.

Re: Variable splitten

Verfasst: Samstag 1. Dezember 2018, 13:50
von __deets__
Klar. Kann man so machen. Ist dann halt komplizierter und immer noch nicht besser. Aber gehen tuts.

Re: Variable splitten

Verfasst: Samstag 1. Dezember 2018, 15:38
von __deets__
Hier mal ein Modul, mit dem du “zeitgleiches” arbeiten erreichen kannst: https://docs.python.org/3/library/sched.html