Seite 1 von 1

Bitte einmal drüber schauen kleiner Fehler

Verfasst: Sonntag 19. Februar 2017, 17:38
von ralle15
Ein Hallo in die Runde

Ich bin dabei mir eine Steuerung für ein Art Sushi Transportband zu Basteln.
Der Code ist soweit fertig, aber läuft noch nicht einwandfrei (es kommt vor das das Band gestoppt wird wo es eigentlich laufen sollte).
Ich besitze keinen Widerstand und hab mich für die „pull_up_down“ Version entschieden.
Könnte bitte mal einer darüber schauen und mir vielleicht ein Tipp geben was man anders oder besser machen könnte.

Kurze Erklärung:
ich starte in einen Magazin wo die Produkte gesammelt werden, diese sollen in einen gleichmäßigen mindest abstand (in Sekunden) auf das Transportband gefördert werden.
- eine Lichtschranke prüft ob Eingang belegt ist
- wenn die Lichtschranke nach Besetzt wieder frei ist wird gewartet ob sie wieder innerhalb der vorgabe Zeit Besetzt wird
- wenn ein Produkt versucht aufs Band zukommen bevor die Vorgabezeit um ist, wird der Schütz für die Restzeit gestoppt.

Ich hoffe dass ich mich verständlich ausgedrückt habe. Danke schön.
Ach ja ich bin noch ein Frischling in Python.

[codebox=python file=Unbenannt.txt]#!/usr/bin/env python
#coding: utf8

import RPi.GPIO as GPIO
import sys
import time

# Zählweise der Pins festlegen
GPIO.setmode(GPIO.BOARD)

# (GPIO 25) als Ausgang festlegen
Schuetz_GPIO = 22
GPIO.setup(Schuetz_GPIO, GPIO.OUT)
# (GPIO 27) als Eingang festlegen
LSensor_GPIO = 13
GPIO.setup(LSensor_GPIO, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)

# Wenn Sensor wieder belegt ab zur zeit Prüfung
def belegt():
# Schleifenzähler
i = 0
# Endlosschleife
while 1:
if GPIO.input(LSensor_GPIO) == GPIO.LOW:
time.sleep(0.05)
abgehtes()
else:
time.sleep(0.05)
i = i + 1

# Wird Sensor wären der Schleife belegt Schütz stoppen
def abgehtes():
# Variable Takt in Sekunden initialisieren
poem =open("/home/pi/MMMProgi/takt.txt").read()
durchlauf = float(poem)
while durchlauf > 0:
if GPIO.input(LSensor_GPIO) == GPIO.LOW:
time.sleep(0.99)
print durchlauf
durchlauf = durchlauf-1
if durchlauf == 0:
main()
else:
time.sleep(0.5)
print "stop "
# (GPIO 25) ein Schalten
GPIO.output(Schuetz_GPIO, GPIO.LOW)

# Programm Start und auf erste freizeichen reagieren
def main():
# (GPIO 25) aus Schalten
GPIO.output(Schuetz_GPIO, GPIO.HIGH)
print "start "
# Schleifenzähler
i = 0
# Endlosschleife
while 1:
if GPIO.input(LSensor_GPIO) == GPIO.LOW:
i = i + 1
else:
belegt()

main()
# Ausgänge wieder freigeben
GPIO.cleanup()
[/code]

Re: Bitte einmal drüber schauen kleiner Fehler

Verfasst: Sonntag 19. Februar 2017, 18:54
von __deets__
Verstehe ich das richtig - das ist im Grunde wie so ein Gepaeckfoerderband? Und die Lichtschranke erfasst, ob ein Gepaeck/Fischstueck gerade beim Eingang vorbeifaehrt?

Dann ist die Logik doch viel simpler. Sobald die Lichtschranke *frei* ist, gibt es einen Zeitpunkt in der Zukunft, ab dem die Zufoerderung wieder anlaufen darf. So lange muss man warten, und falls zwischendurch wieder Lichtschranke zu geht, geht das Spiel von vorne los.

Stimmt das so?

Und was soll diese Textdatei?

Re: Bitte einmal drüber schauen kleiner Fehler

Verfasst: Sonntag 19. Februar 2017, 19:13
von ralle15
Von Prinzip hast du recht, es ist nur wichtig das jedes Gepäckstück einen mindest abstand von Beispiel 5 Sekunden hat. In der Textdatei steht die zeit die gewartet werden soll, so kann ich die Wartezeit wären das Programm läuft ändern.

Re: Bitte einmal drüber schauen kleiner Fehler

Verfasst: Montag 20. Februar 2017, 15:31
von __deets__
Na, dann kann man das ganze doch so etwas kompakter und verstaendlicher ausdruecken:

Code: Alles auswählen

import time
import datetime


def belegt():
    return bool(GPIO.input(LSensor_GPIO))


def band_an(an_oder_aus):
    GPIO.output(an_oder_aus)


def sperrzeit():
    # einfach jetzt plus die definierte Zeit in der Zukunft.
    with open("/die/sperrzeitdatei.txt") as inf:
        return  datetime.datetime.now() + datetime.timedelta(seconds=int(inf.read()))


def main():
    oeffen_zeitpunkt = sperrzeit()
    while True:
        if belegt():
            # solange belegt ist, schiebt sich der oeffnungs-zeitpunkt immer weiter
            # raus
            band_an(False)
            oeffen_zeitpunkt = sperrzeit()
        elif datetime.datetime.now() >= oeffen_zeitpunkt:
            band_an(True)
        time.sleep(.1)


if __name__ == '__main__':
    main()
Es fehlt ein bisschen GPIO-Initialisierung, das darfst du selbst dazubauen.

Re: Bitte einmal drüber schauen kleiner Fehler

Verfasst: Montag 20. Februar 2017, 16:31
von ralle15
Super Danke schnoen, und so einfach, ich hab noch viel zu lernen.