Taktung von Threads (Ampelsteuerung)

  • Ein schönes Einsteigerproblem mit GPIO und Python ist eine Ampelsteuerung.


    Ich habe zwei Ampeln (Hauptstrasse und 90 Grad dazu die Nebenstrasse) auf meinem Breadboard per GPIO verfügbar und steuere die momentan über einen Thread pro Ampel. Das läuft auch sehr gut - aber da irgendwann die beiden Threads mit ihrem Timing auseinanderlaufen werden, muss ein gemeinsamer Taktgeber her. Ich denke das läuft auch in der Realität so.


    Welche Methode sollte man dazu benutzen? signals sind wohl nicht der richtige Weg.


    Anbei mein momentaner Ampelcode mit Threading und Classes (es fehlt noch der 'Inaktivstatus' - also wenn nur die mittlere Lampe ständig blinkt ... kommt aber noch):

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert :fies: Bei mir tut das raspiBackup automatisch :shy:

    Edited once, last by framp ().

  • > und steuere die momentan über einen Thread per Ampel.
    Warum ein Thread pro Ampel ?


    Wenn eine Ampel grün ist, muss die andere rot sein. Die sind nicht unabhaengig !


    > aber da irgendwann die beiden Threadsmit ihrem Timing auseinanderlaufen werden,
    Warum sollten sie ?


    So lange beide weniger als einen Time-Slice brauchen, muessten sie absolut synchron
    laufen. Und ein Bit zu setzen dauert sicher weniger lang als ein Time-Slice.

  • Du hast natürlich Recht - und so habe ich auch angefangen: Die beiden Ampeln liefen einfach synchron ohne Threads. In der Realität sind die Ampeln aber physisch verteilt und sicherlich auch ansynchron gesteuert. Deshalb suche ich nach einem Weg wie ich programmatisch einen Taktgenerator erstellen kann um asynchron remote die Ampeln zu steuern und zu snychronisieren.


    Klar, in real World wird das nicht in einem Prozess laufen und wohl eher per AJAX, REST oder sonst ein Netzwerkprotokoll laufen - aber ich will ja einfach anfangen und nur alles in einem Prozess laufen lassen :)

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert :fies: Bei mir tut das raspiBackup automatisch :shy:

    Edited once, last by framp ().

    • Official Post

    Python und Threads...eine Geschichte voller Kopfschmerztabletten. Events/ Conditions (relativ weit unten) könnten in dem Fall ne Möglichkeit sein.


    btw. deine Varibalennamen haben mich zum Anfang extrem verwirrt (hier in der forenansicht) Trafficlight in aller Arten und Formen :). Im richtigen Texteditor gings dann

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Edited once, last by dbv ().

  • Danke für den Link. Der Event sieht aus als wäre es das richtige Konstrukt für den Ampeltaktgeber.


    Jetzt kann ich mich auch wieder weiter mit dem richtigen Keyword durchsuchen im Netz :)


    Wenn Interesse besteht kann ich ja dann mal den finalen taktgebergesteuerten Ampelsteuerungscode posten.
    [hr]

    ...btw. deine Varibalennamen haben mich zum Anfang extrem verwirrt (hier in der forenansicht) Trafficlight in aller Arten und Formen :). Im richtigen Texteditor gings dann

    Willst Du mir damit sagen dass ich sie n1, abc und xyz nennen soll :lol: ... ich verstehe ich ganz wo Dein Problem liegt mit den Variablennamen

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert :fies: Bei mir tut das raspiBackup automatisch :shy:

    Edited once, last by framp ().

    • Official Post

    Immer her mit dem fertigen code. Threads lassen mir die letzten verbleidenden Haare ausfallen.

    Code
    trafficLight1=[18,22,7]
    trafficLight2=[13,15,16]
    class TrafficLightThread(Thread)
         self.trafficLight=trafficLight
    class TrafficLight


    und das nur in den ersten Zeilen. Ich war nur am schauen was wohin gehört :lol:

  • ...Immer her mit dem fertigen code. Threads lassen mir die letzten verbleidenden Haare ausfallen...

    Ich stifte Dir noch meine 3 letzten :D


    Im Ernst ... Threading ist tricky - und deshalb will ich da ja mal mit meinem Ampeln rumspielen damit ich dann asynchrone Kontentransaktionen auch noch richtig hinbekomme :lol:

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert :fies: Bei mir tut das raspiBackup automatisch :shy:

  • Hi framp,


    ... Der Event sieht aus als wäre es das richtige Konstrukt für den Ampeltaktgeber.
    ...


    ich denke, mit zwei Threads bist Du zu kurz gesprungen ...
    Ich würde da noch eine Steuerungsebene drüberlegen, die das Management übernimmt ( das wird im realen Leben wohl ähnlich sein).
    Ampeln sind "dumm" und ich würde denen nicht mehr Intelligenz implantieren wie nötig.
    Es kann ja auch z.B. mal sein, dass eine Ampel "ausfällt" ... was dann?
    Bei zweien mag das ja noch überschaubar sein, was aber, wenn es um z.B. die "grüne Welle" meinetwegen im München am mittleren Ring geht ;) ...


    just my 2 cent,
    -ds-

  • > Klar, in real World wird das nicht in einem Prozess laufen
    Wahrscheinlich in einer primitiven Sicherheits-SPS


    > und wohl eher per AJAX, REST oder sonst ein Netzwerkprotokoll laufen
    Wie bringt man ein Sicherheitskonzept mit solchem Zeug durch den TUEV ??!


    Und wenn es durchkommt: wer wagt sich, einen Sicherheitsnachweis dafuer zu schreiben ????


    Falls es wider erwarten doch versucht wird: wie lange wird es dauern bis all die Ordner gefuellt,
    vom TUEV studiert und akzeptiert sind ? Kleinere Firmen sind pleite bevor das durch ist ...


  • Python und Threads...eine Geschichte voller Kopfschmerztabletten.


    :D:D:D


    External Content www.youtube.com
    Content embedded from external sources will not be displayed without your consent.
    Through the activation of external content, you agree that personal data may be transferred to third party platforms. We have provided more information on this in our privacy policy.


    External Content www.youtube.com
    Content embedded from external sources will not be displayed without your consent.
    Through the activation of external content, you agree that personal data may be transferred to third party platforms. We have provided more information on this in our privacy policy.

  • Hallo dreamshader,



    ich denke mal, das trifft auf Python in seiner Gesamtheit zu :lol:


    100% Zustimmung

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Edited once, last by Andreas ().

  • Ach, nur weil ihr Python nicht versteht ist es nicht automatisch schlecht - ihr C geschädigten :lol:


    Aber back to Topic:


    Die meisten Licht-Signal-Anlagen (Ampeln) werden zentral gesteuert, was aber nicht bedeutet das da jemand sitzt und die Ampeln manuell steuert sondern die Steuerungseinheit befindet sich vor Ort und Stelle.


    Wenn du das also 'originalgetreu' nach bauen möchtest brauchst du eigentlich nur eine Server-Anweisung (Zentrale) welche die Client-Anweisungen (Ampel) entsprechend anspricht, und schon brauchst du auch keinen Taktgeber mehr.


    Ausgangssituation:
    Jede Ampel weiß wie viel Zeit sie zwischen dem Umschalten Rot/Gelb/Grün haben muss. Mehr brauch diese nicht zu wissen/machen.
    Ampel-1 ist auf Grün. Ampel-2 ist auf Rot.
    Zentrale gibt Ampel-1 die Anweisung auf Rot zu schalten und Ampel-2 auf Grün.
    Die beiden Ampeln schalten entsprechend um.
    Nach 30 Sekunden gibt die Zentrale die Anweisung das Ampel-1 auf Grün und Ampel-2 auf Rot schalten soll.
    usw.




    Moderne Anlagen greifen auch auf Induktionsschleifen, Bewegungsmelder oder Videokameras zu um das aktuelle Verkehrsaufkommen reibungsloser zu regeln, um die Grünphase zu verlängern damit nicht son heftiger Feierabend-Stau entsteht. Dabei sind aber trotzdem Grenzwerte festgelegt die nicht überschritten werden dürfen.

  • Whow, scheint ja interessant das Thema zu sein. Vielen Dank für Eure Beiträge :thumbs1:


    Als Hintergrundinfo: Ihr könnt noch beruhigt auf Ampeln zufahren. Meine Steuerung wird nicht in Produktion gehen :lol: Nur war das blinken den beiden Ampeln schnell linear programmiert und man konnte sich erfreuen. Aber ich suche da eine etwas anspruchsvollere Lösung mit Threading und Snychronizing.
    1) Die Ampel soll autark in einen Notbetrieb fallen wenn die Ampelzentralsteuerung ausfällt (gelbe LED blinkt).
    2) Niemals sollen beide Ampeln grün zeigen falls mal bei einer der Synchronisationsimpuls ausbleibt


    ...Warum ein Thread pro Ampel ?

    Weil die Ampel auch blinken soll wenn sie nicht gesteuert wird bzw die Steuerung ausgefallen ist und die gelbe LED ständig blinkt.

    Quote

    > aber da irgendwann die beiden Threadsmit ihrem Timing auseinanderlaufen werden,
    Warum sollten sie ?

    Ich habe die beiden Threads mal über Nacht laufen lassen. Am Morgen war deutlich zu sehen wie sie ohne snchronisation auseinandergelaufen sind.


    Quote from ds

    ich denke, mit zwei Threads bist Du zu kurz gesprungen ...

    Glaube ich nicht. Aber ich habe noch nicht konkret darüber nachgedacht wie der Controller arbeiten wird. Speziell Anforderung (2) wird vermutlich weitere Threads benötigen.


    Quote from Tell

    > und wohl eher per AJAX, REST oder sonst ein Netzwerkprotokoll laufen
    Wie bringt man ein Sicherheitskonzept mit solchem Zeug durch den TUEV ??!

    Wird sicherlich ein Spass :lol:


    Quote from meigrafd

    ...Wenn du das also 'originalgetreu' nach bauen möchtest brauchst du eigentlich nur eine Server-Anweisung (Zentrale) welche die Client-Anweisungen (Ampel) entsprechend anspricht, und schon brauchst du auch keinen Taktgeber mehr....

    Das ist auch ein Ansatz und macht die Lösung von Anforderung (2) vermutlich leichter. Dann sitzt aber die gesamte Intelligenz im Controller und ich möchte gerne, dass die Ampel auch etwas Intelligenz besitzt. So wie ein Dirigent seine Musiker dirigiert bzw orchestriert und synchronisiert soll der Dirigent nicht wissen wie man die jeweiligen Noten auf dem Instrument spielt. :)
    [hr]
    dbv: Interessant das Video - speziell da das primary Thema dort auch das interessante Thema Generators ist.

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert :fies: Bei mir tut das raspiBackup automatisch :shy:

    Edited once, last by framp ().

  • Eine andere Möglichkeit wäre auch das nicht über ein einziges Script laufen zu lassen sondern auf zu splitten:
    * Ein Controller-Prozess
    * Für jede Ampel ein Ampel-Prozess


    Die Ampeln verbinden sich zum Controller und verschicken regelmäßig ein "ping". Falls sie die Verbindung verlieren, oder ein "Ping timout" haben, agieren sie selbstständig bzw verbinden sich ggf zu anderen Ampeln damit nicht 2 Fahrtrichtungen gleichzeitig auf Grün schalten :D