Abfragen von Sensoren

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Guten Morgen Jungs,

    sorry, dass ich euch zur Zeit etwas "nerve", aber ich denke, dafür gibt es ja dieses Forum, um Fragen zu stellen, die von Leuten beantwortet werden, die mehr Ahnung vom Thema haben :)

    Nachdem das Auslesen der Schalter und das Ansteuern der LEDs sehr gut mit dem Raspberry klappt, möchte ich mich an die OneWire-Sensoren wagen.

    Ich habe nun meine Schaltung umgebaut, sodass ich momentan 3 OneWire-Temperatursensoren und 1 OneWire-Hallsensor (für Drehzahlerfassung) betreibe.


    Mit folgendem Befehl (laut Tutorial) möchte ich nun die Werte einlesen, was hoffentlich auch klappen wird (gerade keinen Raspberry zur Hand)..:

    Zitat


    cat /sys/bus/w1/devices/w1_bus_master1/28-000004118a7f/w1_slave

    Dieser Befehl liefert mir dann die Temperatur des Sensors "28-000004118a7f".


    Beim Hallsensor werde ich wohl genauso vorgehen, nur dass es dann eben keine Temperatur sein wird :)


    Nun aber zur eigentlichen Frage.

    Da das Ganze ein Projekt für meine Schule wird, möchte ich die 4 OneWire-Sensoren sowie die beiden Schalter (die an den GPIOs angeschlossen sind) zyklisch abfragen.
    Da ich aus der Mikrocontrollerwelt schon etwas gelesen habe, wäre mein Verfahren "polling".
    Darunter verstehe ich, dass man die Sensoren endlos (Schleife) abfragt. Da in Linux ja alles eine Datei ist, werden die letzten Daten quasi immer gepuffert, sodass man nicht zum Zeitpunkt des Eintritts eines Ereignisses reagieren muss, richtig? (Im Beispiel der OneWire: Temperaturen werden ja quasi in eine Datei geschrieben, die man danach einfach nur mit "cat" ausliest).

    Allerdings habe ich Bedenken, dass es ziemlich rechenintensiv sein wird, wenn man ständig diese Schalter abfragt.
    Ach übrigens: eine Abfragezeit von 1 Sek. der gesamten Sensoren/Schalter wäre völlig ausreichend.

    Es soll außerdem überprüft werden, ob in einer Datenbank ein Bit ("flag") gesetzt wurde, damit eine LED eiongeschaltet werden soll.

    Nebenbei (Interrupt?) soll dann auch noch die Motordrehzahl (über den Hallsensor) erfasst werden. Das habe ich unten mit der Interrupt-Routine gekennzeichnet. Allerdings weiß ich nciht wie ich das umsetzen kannn.

    Gibt es da eine andere Möglichkeit? Ich weiß leider noch nicht wie sich das verhält, da ich es noch nicht testen konnte. Vielleicht aber ist auch die Sekunde nicht so rechenintensiv?


    Das Ganze sollte übrigens am besten in Perl realisiert werden.


    Hier mal mein Beispielcode, wie ich es machen würde:


    Vielen Dank und Gruß

    Einmal editiert, zuletzt von anamollo (1. März 2013 um 09:40)

  • Polling von Temperatursensoren im Sekundentakt ist Unsinn. Du hast im Sensor schon eine Wandelzeit von 780ms, damit kommst Du bei Zyklischer Abfrage bei 4 Sensoren schon auf 3,12 Sekunden. Temperaturmessung ist keine hektische Sache, Meßzyklen von 30sec bis 1Min ist für solche Sensoren schon schnell.
    Was für einen Hallsensor benutzt Du für den 1W-Bus? Eigendlich ist der Bus mit seinen 16,3kbit/s zu langsam für Drehzahlmessungen. Außerdem hat der Pi keine Unterstützung für 1W-Hallsensoren und würde Dir auch kein Device anlegen.
    Schalter läßt man am besten einen Interrupt auslösen und sieht dann nach, was gedrückt wurde, das ist am Recourcenschonensten. Allerdings hab ich mit Perl noch nie Interrupts abgearbeitet.

    Einmal editiert, zuletzt von orb (1. März 2013 um 10:42)

  • Ok, die Temperaturen sind auch nicht so wichtig und reichen, wenn sie einmal in der Minute abgefragt werden.

    Da ich keine OneWire-Hallsensoren gefunden habe, habe ich mir soeben folgende "nicht-OneWire"-Sensoren bestellt, die laut Datenblatt wie Schalter funktionieren, was die Abfragen hoffentlich wie normale Schalter aussehen lassen.

    ( Datenblatt des gekauften Hallsensors: http://docs-europe.electrocomponents.com/webdocs/0f3d/0900766b80f3dbe2.pdf )


    Zu den Interrupts:
    Ich habe vorhin folgenden Artikel durchgelesen: https://projects.drogon.net/raspberry-pi/wiringpi/functions/
    Mir scheint er ziemlich gut zu sein, ebenfalls über die wiringPi-Lib die Interrupts auszulösen.

    Wäre das was für mich?


    Wie machst du das mit den Interrupts?


    Gruß und Danke!

    Einmal editiert, zuletzt von anamollo (1. März 2013 um 11:12)

  • Der Sensor erscheint wie ein Schalter der gegen Masse schaltet. Um die Drehzahl zu ermitteln mußt Du die Frequenz des Schaltens bzw die Zeit zwischen zwei Schaltereignissen messen. Das funktioniert, wenn überhaupt, nur mit Interupts einigermassen genau.Du hast mit dem Pi kein Echtzeitsystem, wenn grad viel übers Netzwerk übertragen werden muß kann das System Dein Programm jederzeit bremsen oder zurückstellen was Deine Messung jedesmal kaputt macht.
    Mit den Interruptfunktionen von WiringPi sollte das gehen wenn Du die Zeit zwischen zwei Interrupts misst, ich würde auf die fallende Flanke triggern.

  • Ok das klingt gut.


    Nun habe ich mir folgendes überlegt.


    Ich schreibe mir mittels wiringPi ein C-Programm, welches einzig und allein die Drehzahl ermittelt und diese Drehzahl in eine Datei (motordrehzahl.txt) schreibt.

    In Perl rufe ich bei Eintritt in die while-Schleife zu allererst dieses C-Programm auf. Nun läuft das im Hintergrund los und schreibt alle Minuten in die 'motordrehzahl.txt' den ermittelten Drehzahlwert (1/min).
    Das Perlskript holt sich dann den Inhalt diesr Datei und schreibt ihn in die mySQL_Datenbank.


    Also quasi so:


    +-----------------+ +------------------------------+
    | C- Programm | >>-------------------- -------------------->> | Perlskript |
    | | | | | |
    +-----------------+ | | +------------------------------+
    | |
    schreibt in Datei: motordrehzahl.txt


    Eventuell könnte man auch von C aus eine Datenbank nur mit dem Wert motordrehzahl befüllen, da ich Angst habe, dass irgendwann eine Speicherzugriffsverletzung auftritt, wenn das C-programm im selben Moment in die "motordrehzahl.txt" schreiben will, während das Perlskript die Datei lesen will.

    Einmal editiert, zuletzt von anamollo (1. März 2013 um 11:57)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!