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]
Bitte einmal drüber schauen kleiner Fehler
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?
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?
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.
Na, dann kann man das ganze doch so etwas kompakter und verstaendlicher ausdruecken:
Es fehlt ein bisschen GPIO-Initialisierung, das darfst du selbst dazubauen.
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()