2 Sensoren simultan auslesen

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Hallo Experten,

    kann ein RPi 2 PIR's gleichzeitig auslesen ? Evtl. mit Threads ?


    Ich frage aus folgendem Grund: Habe ein älteres Projekt einer Heim

    Überwachung mit PIR und PiCamera reaktiviert. Das Konzept besteht in

    einem durch einen PIR ausgelöstes Foto (mit IR Beleuchtung), das mir per

    e-mail zugeschickt wird inkl. einer Benachrichtigung per SMS (Script s.u.).


    Der PIR wird immer wieder spontan aktiviert, durch externe "Störungen/Signale".

    Um das zu verhindern habe ich mit überlegt 2 PIR's zu benützen, einen davon

    thermisch abgeschirmt. Werden beide PIR's gleichzeitig aktiviert heisst das

    falsche Auslösung und es soll kein Foto etc. ausgelöst werden. Wird nur der

    nicht abgeschirmte PIR ausglöst wird das Script ausgeführt.


    Mein Script:

    https://github.com/luemar/onMotion_img.py

  • Hast du das Script aus dem Thread schon getestet?

    Das motion_sensor.when_motion läuft automatisch in einem eigenen Thread.

    Wenn die Dinger immer Mal wieder selbst auslösen musst du mit den Einstellungen rumspielen.

    Unter GpioZero kann man auch noch was einstellen. Schau dir da queue_len an.

  • Also, ich halte den Ansatz für falsch. Hast du auch zwei Rauchmelder, bei dem einen Klebst du die Schlitze zu und wenn beide Alarm geben, ist es ein Fehlalarm? Das ist irgendwie nicht sinnig.

    Einen zweiten Pir blind zu machen und zu hoffen, dass Fehler immer parallel auf beiden PIR-Anschlüssen auftauchen, ist ein seltsames Herangehen.


    Der PIR ändert bei Bewegung sein Ausgangssignal (vermutlich von low auf auf high). Wenn das halbwegs vernünftig umgesetzt ist, wird er das für eine gewisse Zeit tun, oder sehr kurze Signale sind dir egal, weil relevante Bewegungen länger dauern und daher auch längere Signale geben - das gesuchte Signal wird also nicht extrem kurz sein. Die Störungen, die du gelegentlich hast, vermutlich durch Lichtschalter, Motoren oder ähnliches, dürften aber deutlich kürzer sein. Du kannst also anhand der Signaldauer entscheiden, ob die Auslösugn relevant ist.

    Als Lösung kannst du schauen, wie lange das Signal des PIR anliegt und wie lange diese Störsignale dauern. Die verschiedenen Signaldauern kannst du dann in der Software abfangen. Oder du schaltest einen Tiefpassfilter (RC-Glied) davor, das kurze Störungen rausfiltert. Wie der Filter dimensioniert werden muss, hängt von den Signallängen ab - besonders von der Signaldauer des PIR bei ordnungsgemäßer Funktion. Am besten versuchst du erst mal, die Signaldauern zu messen

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • vielen Dank für die Hinweise...

    Spontane oder Fehlauslösungen des PIR sind ein bekanntes Problem,

    es gibt einige Beiträge dazu auf dem Internet.


    Mit meinem - beschränkten - physikalischem Wissenstand kann ich mir

    rein theoretisch nur thermische - z.B. das Anspringen der Heizung -

    oder elektromagnetische Störimpulse vorstellen.


    Thermische fallen bei mir weg, die sind auch angesichts der repetitiven

    Auslösungen sehr sehr unwahrscheinlich.


    Bleiben die elektromagnetischen: Hatte bis anhin ein 5V Netzteil für den

    RPi und ein 12V Netzteil für die IR Beleuchtung im selben Gehäuse

    untergebracht. Nach deren "Auslagerung" sind die Fehlauslösungen fast

    vollständig verschwunden.


    Habe natürlich die beiden Potentiometer verschieden eingestellt: Der linke

    ist für die Empfindlichkeit und dürfte irrelevant sein. Der rechte steuert die

    Zeitdauer wie lange der PIR 3.3V abgibt, Jumper auf single gestellt.M.W. spricht

    aber das Modul MotionSensor auf die Anstiegsflanke des PIR Ausgangs an, dh.

    sobald 2.7V (oder ähnlich) erreicht sind und nicht auf die Dauer. Wenn dem so

    ist, wie könnte dann die Länge des "PIR Auslösers" eine Rolle spielen ?


    Zur Messung der Länge der Ausgangssignale bräuchte ich einen Oszillografen,

    den ich nicht habe.


    Mit der qeue_len habe auch schon "herumprobiert.

  • habe obige Seit schon x-mal durchgelesen, das steht über

    when_motion:

    "The function to run when the device changes state from inactive to
    active."

    Das hilft mir aber beim Unterscheiden eines Eingangssignal das

    vom PIR kommt von dem, das von einer Störquelle kommt, am

    entsprechenden Pin, nicht weiter.
    Man könnte argumentieren, ein Störsignal muss mindestens solange

    dauern bis - wahrscheinlich im Verbindungsdraht - 2.7V erreicht sind.


    Ist aber z.Z. nur von "akademischer" Bedeutung, da seit Auslagerung

    der Netzteile auf ca. 1m keine Störsignale mehr auftreten.

  • [...] ein Störsignal muss mindestens solange

    dauern bis - wahrscheinlich im Verbindungsdraht - 2.7V erreicht sind.

    Das ist so nicht zutreffend. Der Eingang am Pi reagiert nicht auf verschiedene Spannungshöhen und es dauert auch nicht eine Gewisse Zeit, bis eine Spannung erreicht wird (sofern nicht größere Kapazitäten im Spiel sind - siehe weiter unten). Vielmehr schaltet der Eingang, sobald eine gewisse Spannungsschwelle (ca. 2 Volt) überschritten oder (ca. 0,8 Volt) unterschritten werden. Es ist ja nicht so, dass eine Störung weniger Spannung hat als ein Signal des Sensors. Ob es eine Störung ist oder ein gewolltes Signal, kannst du bestenfalls an der Dauer des Signals unterscheiden. Dafür bietet when_motion aber möglicherweise gar keine Funktionalität. Eine vernünftige Library für Eingänge sollte für binäre Signale (und das ist es ja hier) zwei Parameter anbieten, nämlich eine minimale Signaldauer bis zur Reaktion (damit kann man kurze Signale rausfiltern wie mit einem Tiefpassfilter) und eine Entprellung (damit kann man prellende Schalter oder andere unstete Signale bändigen). GpioZero hat meines Wissens zwar einen Entprellparameter aber keine Filterung. Im Zweifel hilt dir hier ein Tiefpassfilter aus einem Kondensator und einem Widerstand. Da man ohnehin in vielen Fällen einen 1000 Ohm Schutzwiderstand vor einen GPIO schalten sollte, brauchst du also nur noch einen Kondensator zustätzlich (z. B. 47 µF entspricht dann 47 ms Zeitkonstante - bis zu dieser Signaldauer wird gar nicht reagiert und die Entprellung ist übrigens auch gleich mit drin). Natürlich muss die Signaldauer des Sensors größer sein als die Zeitkonstante des Filters. Wenn der Sensor Signale liefert, die ohnehin kürzer sind als die Störsignale, ist das Ganze zum Scheitern verurteilt. Die erste Frage, die zu klären ist, wäre also die nach der Dauer der Sensorsignale.


    Interessant, dass die Störungen offenbar von deinen Netzteilen kamen. Was für Netzteie sind das? Ein vernünftiges, geschlossenes Schaltnetzteil sollte eigentlich solche Störungen nicht verursachen.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Ich habe mal ein paar einfache Tests gemacht:

    mit folgendem Ergebnis:

    Es ist also IMHO eher sinnlos eine Störung an Dauer des Signals festzumachen.

  • Verstehe ich was falsch? 1407814153 ns sind doch 1,4 Sekunden. Störungen dürften sehr deutlich kürzer sein. Warum soll es also sinnlos sein, die Störung auszufiltern, indem man kurze Signale (in dem Fall vielleicht unter ein paar Hundert ms) ausfiltert?

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Warum soll es also sinnlos sein, die Störung auszufiltern, indem man kurze Signale (in dem Fall vielleicht unter ein paar Hundert ms) ausfiltert?

    Es ist nicht sinnlos die Störung rauszufiltern, ganz im Gegenteil(!), es ist nur sinnlos auf diesem Weg (per gpiozero) die Störung erkennen zu wollen.

    Ich habe mich da jetzt nicht in die Tiefen der Klassen des Moduls gegraben, aber mit gpiozero werden u.a. queue gefüllt, Mittelwerte errechnet und daraus erst reagiert. Unter einer Sekunde passiert da in dem Fall garnichts. Kurze Störungen gehen da m.M.n. einfach unter.


    Ach und was ich noch vergessen hatte: Um Störsignale zu empfangen brauchts auch keinen PIR. Da einfach reicht ein (längerer) Draht als Antenne an einem GPIO.

  • [..] Unter einer Sekunde passiert da in dem Fall garnichts. Kurze Störungen gehen da m.M.n. einfach unter.

    Das würde heißen, dass man mit GPIOzero auf keinerlei Singnal unter einer Sekunde reagieren kann... Das ist doch nicht dein Ernst, oder? Außerdem entspricht eine Sekunde auf dem Pi einskommaebbes Millionen Taktzyklen. Da würde das Ding aber reichlich Mittelwerte bilden. Woher hast du denn diese Aussagen?

    Was du gemessen hast, ist die Dauer des Signals, das der Pir sendet, nicht die Dauer, die der Pi braucht, um ein Signal zu erkennen und darauf zu reagieren. Oder sehe ich das falsch?


    GPIOzero kann das nicht - das hab ich ja gesagt. Was aber nicht heißt, dass man es nicht per Software abfangen kann. Mit der einfachsten aller Störfilterprozeduren - kommt ein Signal, wartet man 200 ms und schaut dann nach, ob das Signal immer noch da ist. Wenn ja, ist es ein Signal, wenn nicht, war es eine Störung.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Das würde heißen, dass man mit GPIOzero auf keinerlei Singnal unter einer Sekunde reagieren kann

    Das habe ich nicht gesagt. Ich schrieb

    auf diesem Weg (per gpiozero)

    und meinte damit konkret gpiozero.MotionSensor.


    Woher hast du denn diese Aussagen?

    Lies den Link in #9!


    Was du gemessen hast, ist die Dauer des Signals, das der Pir sendet, nicht die Dauer, die der Pi braucht, um ein Signal zu erkennen und darauf zu reagieren.

    Das ist so nicht ganz richtig! Es ist nämlich egal wie lange oder langsam ich die Hand vor dem PIR bewege. Das Signal ist immer über eine Sekunde, egal was ich mache. (Edit: Oder meinst Du der PIR sendet eine Sekunde lang sein Signal? :conf: )


    Wenn Du nur rauslesen willst, was Dir passt, dann tut es mir mittlerweile echt nicht mehr leid für Dich! Ich werde mich jedenfalls nicht weiter erklären.

  • Nach allem, was ich lese kann man entweder die Queue auf 0 setzen, dann ist das alles kein Problem oder man arbeitet ganz gezielt mit den Mittelwerten und kann somit auch Störungen durch Mittelung rausfiltern. Also, so richtig nachvollziehen kann ich deine Aussage, dass das mit gpiozero nicht machbar sein soll, wirklich nicht. Und notfalls macht man es eben nicht über motion, sondern als Button, dann gehts ohnehin.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Nach allem, was ich lese kann man entweder die Queue auf 0 setzen, dann ist das alles kein Problem oder man arbeitet ganz gezielt mit den Mittelwerten ...

    Damit habe ich rumgespielt, aber bringt alles nichts.


    Wenn gpiozero, dann über (Digital)InputDevice oder gleichwertig, aber dann muss man, wie oben geschrieben, auch keinen PIR , sondern nur einen Draht am GPIO anklemmen.