Bitte einmal drüber schauen kleiner Fehler

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.
Antworten
ralle15
User
Beiträge: 3
Registriert: Montag 13. Februar 2017, 19:14

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]
Zuletzt geändert von Anonymous am Sonntag 19. Februar 2017, 18:36, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

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?
ralle15
User
Beiträge: 3
Registriert: Montag 13. Februar 2017, 19:14

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

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.
ralle15
User
Beiträge: 3
Registriert: Montag 13. Februar 2017, 19:14

Super Danke schnoen, und so einfach, ich hab noch viel zu lernen.
Antworten