Verzögerung ansteuerung der gpio

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Im Einsatz habe ich Raspberry Pi B (512MB) mit Linux raspberrypi 3.6.11+ Raspbian “wheezy”

    Mein Pi läuft als Web-Server für eine Tennishalle. Die Mitarbeiter können anhand von checkboxen angeben wann auf welchem Platz das licht brennen soll. eine Box ist jeweils für 50 Minuten (30 Minuten Platzmiete plus 10 Minuten vorher und 10 Minuten nachher). Durch auslesen der /sys/class/gpio/gpioxx wird angezeigt dass das Licht auf dem Platz brennt. Das ganze läuft ohne Probleme.:denker:

    Nun habe ich folgendes Phänomen. Die erste Schaltung am Tag läuft nicht richtig. Danach ist alles in Ordnung. Auf der Webseite sehe ich die Aktuelle Zeit, diese stimmt. Die Seite wird all Minute neu aufgebaut.
    Laut /sys/class/gpio/gpioxx sollte der Ausgang geschaltet sein. Das stimmt aber nicht. Der Ausgang ist low. erst mit einer Verzögerung bis zu 20 Minuten wird der Ausgang auf High gesetzt.
    Das Passiert aber nur bei der ersten Schaltung am Tag. Egal zu welcher Zeit. Alle darauf folgenden Schaltungen sind dann korrekt.

    Wo kann das Problem liegen das unter /sys/class/gpio/gpioxx ein Ausgang geschaltet sein sollte, aber der Ausgang nicht auf High ist.:@

  • Die gpio werden wie folgt gesetzt

    shell_exec("echo \"0\" > /sys/class/gpio/gpio22/value"

    Das wird bei jedem durchlauf neu gesetzt solange wie der Ausgang high sein sollte.

    Auf der Hompage wird mit folgendem Befehl ausgegeben ob der Ausgang gesetzt ist.

    $val_gpio22 = trim(@shell_exec("cat /sys/class/gpio/gpio22/value"));

    <td><font size="+3">
    Platz 1
    </td>
    <?php if ($val_gpio22==0): ?>
    <td bgcolor="#FFFF00">
    <?php else: ?>
    <td>
    <?php endif ?>
    <font size="+3">

    Das Feld ist Gelb wenn das Licht brennt. Also gpio high ist.

    Das Problem ist beim ersten Schaltvorgang ist, das der Wert 0 beträgt, aber der Ausgang nicht high ist.

    Wie gesagt nur beim ersten schalten des Ausganges pro Tag.:wallbash:

    Das Programm müsste sauber laufen, da der Wert beim auslesen 0 ist.

    Meiner Meinung nach liegt der Fehler in der Verarbeitung des Wertes.
    Was ist zuständig das der Wert unter /sys/class/gpio/gpio22/value den Ausgang
    high oder low schaltet?
    Kann das an der Linux Version liegen?
    Oder liegt das an dem 24h Dauerbetrieb?
    Das Netzteil liefert 2A, sollte also ausreichend sein.

  • Du solltest lieber so viel wie möglich mit nativem PHP Code arbeiten - sprich das auslesen von Dateien nicht über bash Befehle bewerkstelligen sondern mit PHP functions ;)

    Könnte dann zB so aussehen:[PHP]$Value = trim(file_get_contents("/sys/class/gpio/gpio".$pin."/value"));[/PHP]

    Das wär auch schneller ;)

    Und bei der PHP / HTML mischung würde ich das so bauen:
    [code=php]
    <td><font size="+3">Platz 1</td>
    <?php
    if ($val_gpio22==0):
    echo '<td bgcolor="#FFFF00">';
    else:
    echo '<td>';
    endif
    ?>
    <font size="+3">
    [/php]


    Aber ersteres is denk ich wichtiger um auszuschliesen das der "cat" vielleicht nicht richtig funktioniert (das @ vor dem shell_exec unterdrückt ja auch ne Fehlermeldung..)

    Und zu dem "verzögern" is halt wichtig das der GPIO pin auch vor dem high/low setzen exportiert also aktiviert wurde, vielleicht gibts da bei dir noch ein Code-Problem

  • Vielen dank für die Schnelle Antwort

    Das mit dem Auslesen habe ich angepasst.

    Die gpio wurden Aktiviert, jedoch nicht aus dem Programm, sonder separat.

    Bin leider ein rasperry Pi Anfänger. Habe den Code übernommen und abgeändert.

    Soll ich die gpio vor dem setzen low/high jeweils vorher aktivieren?

    Wie würdest du das machen?

  • Du könntest das über deine Webseite zum Beispiel so regeln:

    • Ganz oben im Script festlegen welche GPIO pins du benutzt:
      PHP
      $GPIOpins = "22,23,24,27";[/php]
    • PHP
      Dann noch die Richtung (direction) festlegen die für die Pins genutzt werden soll:[code=php]$DIRECTION = "out";[/php]
    • PHP
      Anschliesend prüfen ob die GPIO pins aktiviert sind und falls nicht diese aktivieren:[code=php]foreach (explode(",",$GPIOpins) AS $pin) {  if (!file_exists("/sys/class/gpio/gpio".$pin."")) {    exec('sudo /usr/local/bin/gpio export '.$pin.' '.$DIRECTION.'',$output,$error);  }}[/php][/list]Das würde aber vorraussetzen das du wiringPi installiert hast und über /etc/sudoers dem www-data Benutzer erlaubst den [b]gpio[/b] Befehl auszuführen - da standardmässig nur root das Recht hat die Pins zu exportieren/aktivieren.. Also müsstest du in [b]/etc/sudoers[/b] folgendes eintragen:[code]www-data ALL=NOPASSWD:/usr/local/bin/gpio


      wiringPI installieren:

      Code
      apt-get install git-coregit clone git://git.drogon.net/wiringPicd wiringPi/./build

      Alternativ dazu könntest du auch in /etc/sudoers dem www-data Benutzer erlauben echo auszuführen:

      Code
      www-data ALL=NOPASSWD:/bin/echo


      ABER das wär nicht soo schön und auch nicht sicher...
      Dann sähe aber der exec(); entsprechend so aus:[code=php]exec('sudo /bin/echo '.$pin.' > /sys/class/gpio/export',$output,$error);[/php]


      Wenn es einen Fehler gab wird das in $error geschrieben. Eine Ausgabe würde in Form eines Arrays in $output geschrieben.

  • ;) Danke für die Hilfe.
    Leider habe ich zur zeit keinen direkten zugriff zum Internet und das ganze läuft aktiv.
    Kann erst morgen früh das ganze Installieren und Testen, aber schon einmal vielen dank im voraus.

  • Leider habe ich nun problehme mit etc/sudoers
    :no_sad:
    Ich bekomme die Meldung:

    root@raspberrypi:~# sudo apt-get upgrade
    sudo: parse error in /etc/sudoers near line 9
    sudo: no valid sudoers sources found, quitting
    sudo: unable to initialize policy plugin

    Meine sudoers

    #
    # This file MUST be edited with the 'visudo' command as root.
    #
    # Please consider adding local content in /etc/sudoers.d/ instead of
    # directly modifying this file.
    #
    # See the man page for details on how to write a sudoers file.
    #
    Defaults env_reset
    Defaults mail_badpass
    Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

    # Host alias specification

    # User alias specification

    # Cmnd alias specification

    # User privilege specification
    root ALL=ALL:ALL) ALL

    # Allow members of group sudo to execute any command
    %sudo ALL=ALL:ALL) ALL

    # See sudoers(5) for more information on "#include" directives:

    #includedir /etc/sudoers.d
    pi ALL=ALL) NOPASSWD: ALL

    www-data ALL=NOPASSWD:/usr/local/bin/gpio

    Hat jemand einen Typ?

  • Ja, du hast anscheint mehr verändert als du solltest:

    Da fehlen etliche (

    Normalerweise sieht die Datei so aus:

  • Die Daten im sudoers sind richtig. Die ( sind beim kopieren raus gefallen.
    Die Fehlermeldung habe ich aber immer noch.

    Der Fehler kommt erst seit ich unten

    www-data ALL=NOPASSWD:/usr/local/bin/gpio

    eingefügt habe.

    Habe ich da was falsch gemacht?

  • Nein der Eintrag ist richtig.. Sonst lösch die Zeile doch und guck ob der Fehler weg is

    Womit hast du die Datei denn bearbeitet?

    Ansonsten die komplette Datei leeren (mit nano öffnen und STRG+K gedrückt halten bis alle Zeilen weg sind) und alles neu eintragen (in PuTTY fügt man mit der rechten Maustaste ein, oder SHIFT+EINFG)

  • Ich hatte die Datei mit Wordpat über FTP bearbeitet.

    Das ist der grösste Fehler den du machen kannst!

    Linux Dateien niemalsnie mit Windows Editoren wie notepad oder sogar Wordpad bearbeiten - Windows nutzt andere Zeilenumbruch Zeichen die Linux aber nicht versteht. Diese Zeilenumbruch-Zeichen von Windows werden in nano aber auch nicht angezeigt - und in Windows sind die ebenfalls unsichtbar....

    Ausserdem änderst du beim Überschreiben der Datei die Dateiattribute, also wem die Datei gehört und die Lese/Schreib/Ausführ-rechte

    Also wenn dann mit Linux Kompatiblen Editoren wie notepad++ oder Proton oder UltraEdit arbeiten - aber am aller besten direkt mit Linux und dessen Editoren wie zB nano , vi oder joe usw... Oder wenns unbedingt grafisch sein muss mit leafpad


    Dh du musst jetzt die Datei löschen:

    Code
    rm -f /etc/sudoers

    Und anschliesend bitte mit nano neu erzeugen:

    Code
    nano /etc/sudoers

    Um so früher du dich daran gewöhnst mit den Linux Werkzeugen zu arbeiten, um so leichter fällt es dir irgendwann damit umzugehen

  • :D
    Danke für den Typ bezüglich Windows.

    Datei Gelöscht und mit nano neu erzeugt.
    Alles wunderbar.

    Bezüglich der Verzögerung muss ich nun die nächsten Tage beobachten. Werde mich dann wieder melden.

Jetzt mitmachen!

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