Hoch- und runterfahren mittels Taster (incl. Status-LED)

  • Also einen Taster einzubauen, um den Pi sauber runterzufahren, ist wirklich eine sehr gute Idee. Und dafür eine alte Maus zu benutzen, ist genial! :thumbs1:


    Aber als ich das mit der Maus las, fiel mir ein, daß es früher, zu Zeiten von PS/2-Mäusen, die Möglichkeit gab, Linux herunterzufahren, indem man beide Maustasten für 3 Sekunden oder so zusammen gedrückt hält.


    Ich will die ganze Bastelarbeit auf keinen Fall entwerten! Das ist wirklich toll und quasi noch richtige Pionierarbeit.


    Aber wäre es möglich, diese Art des Runterfahrens auch mit einer USB-Maus auszuführen, also ohne Lötarbeiten?


  • Aber wäre es möglich, diese Art des Runterfahrens auch mit einer USB-Maus auszuführen, also ohne Lötarbeiten?


    Wer nicht basteln will, muß halt programmieren. :lol:


    Man nehme:


    Python.
    Sollte sowieso schon installiert sein.
    Und dann, weil es in der Doku des benötigten Paketes drinsteht, noch python-dev hinterher:


    Code
    $ sudo apt-get install python-dev


    Und jetzt kommt das wichtige Paket:
    evdev
    http://python-evdev.readthedocs.org/en/latest/index.html
    Mit diesem Paket kann man (alles?) abfragen, was sich unter /dev/input tummelt. Und das ist z.B. die Maus.


    Zur installation von evdev habe ich mir folgenden Weg zusammengesucht:

    Code
    $ mkdir ~/temp
    $ cd ~/temp
    $ wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py
    $ sudo python get-pip.py
    $ sudo pip install evdev


    Dann braucht man halt noch ein Python-Script wie dieses hier:


    Um herauszufinden, welches event für Dich gilt, schaust Du zuerstmal, wieviele "event" devices es gibt:

    Code
    $ cat /dev/input


    Die devices probierst Du in der Konsole mit "cat /dev/input/event0" durch (Zahl ersetzen).
    Bei dem relevanten kommt bei Bewegung der Maus dann ein Zeichensalat auf dem Bldschirm.
    Mit CTRL-C abbrechen und die richtige Zahl in das Script eintragen.


    Wie Du jetzt das ganze noch Zeitabhängig machst und im Hintergrund laufen läßt, kann ich Dir leider nicht sagen.


    Disclaimer: Wie man vielleicht an dem Python-Script erkennen kann, habe ich eher wenig Ahnung von Python und habe mir das Script zusammengeklaut :blush: und auf meine Bedürfnisse zusammengestammelt. Für die weitere Verfeinerung bitte ich die Python-Cracks an die Front.


    PS.: Sollte ich mit meiner Beschreibung zu detailliert sein und Dich durch die Erwähnung von Selbstverständlichkeiten "beleidigen", bitte ich das zu entschuldigen. Aber vielleicht findet jemand anderes diese Beschreibung interessant und hat nicht das nötige Vorwissen. :daumendreh2:

    Edited once, last by Oerks ().

  • bekomme folgende fehler beim ausführen.
    inhalt ist wie auf seite 1


    pi@raspberrypi ~ $ sudo /home/pi/shutdown.py
    /home/pi/shutdown.py: 5: /home/pi/shutdown.py: import: not found
    /home/pi/shutdown.py: 6: /home/pi/shutdown.py: import: not found
    /home/pi/shutdown.py: 7: /home/pi/shutdown.py: import: not found
    /home/pi/shutdown.py: 11: /home/pi/shutdown.py: Syntax error: word unexpected (expecting ")")


  • Wer nicht basteln will, muß halt programmieren. :lol:


    Vergiss bitte nicht, daß es auch Leute gibt, bei denen die Augen oder die Hände nicht mehr mitspielen, wenn es um solch filigrane Arbeiten geht. Das hat nichts mit Faulheit zu tun.


    Quote


    Man nehme:
    ...
    Dann braucht man halt noch ein Python-Script wie dieses hier:
    ...


    Dein Skrip in allen Ehren, aber ich habe herausgefunden, daß das ganze viiiiiiiiiiel einfacher geht. Die Lösung heißt gpm, die Mausanwendung für die Konsole. Aus der Anleitung dazu:



    Also: USB-Maus dranhängen, das Kommando


    Code
    gpm -S "::/sbin/halt"


    loslassen, den rechten Mausknopf betätigen, und der Pi fährt runter. :)

    Edited once, last by PInguin ().


  • Vergiss bitte nicht, daß es auch Leute gibt, bei denen die Augen oder die Hände nicht mehr mitspielen, wenn es um solch filigrane Arbeiten geht. Das hat nichts mit Faulheit zu tun.


    Ups, so war das nicht gemeint, sorry.


    Quote

    Dein Skrip in allen Ehren, aber ich habe herausgefunden, daß das ganze viiiiiiiiiiel einfacher geht. Die Lösung heißt gpm, die Mausanwendung für die Konsole.
    [...]
    loslassen, den rechten Mausknopf betätigen, und der Pi fährt runter. :)


    Für Deine Anwendung sicher nicht schlecht.


    Mein Ansatz kommt aber auch daher, daß ich mir gedacht habe, die Tasten und das Mausrad als Eingabegerät für z.B. ein Webradio mit LCD zu benutzen (Rad: Senderliste durchscrollen, links: Sender auswählen, rechts: zurück).


  • Ups, so war das nicht gemeint, sorry.


    Nicht schlimm. Bei mir geht's ja noch so einigermaßen. ;)


    Quote


    Mein Ansatz kommt aber auch daher, daß ich mir gedacht habe, die Tasten und das Mausrad als Eingabegerät für z.B. ein Webradio mit LCD zu benutzen (Rad: Senderliste durchscrollen, links: Sender auswählen, rechts: zurück).


    Das geht auch mit gpm, Du kannst die Befehle, die bei Betätigung jeder Maustaste ausgeführt werden, selber bestimmen. Und das Rad ist nichts anders als Taste 4 und 5. :)

  • So, für alle, die zum Basteln entweder zu faul sind (wie ich ;)), oder denen die Zeit und Gelegenheit fehlt, hier eine kleine Anleitung, wie die Himbeere sich runterfahren lässt, ohne etwas an dem Gerät zu verändern.


    Man nehme ein Pfund Butter... neh, das war was anderes. :D


    Es wird eine alte USB-Maus benötigt, die vom System erkannt wird. Ob sie erkannt wird oder nicht, ist im Syslog zu sehen: wenn dort keine Fehlermeldung auftaucht, oder die Maus so viel Strom zieht, daß die Versorgung zusammenbricht, ist alles in Ordnung.


    Dann muss das Paket gpm installiert werden, wenn es nicht schon installiert ist. In der Datei /etc/gpm.conf trägt man folgende Zeile in, bzw verändert die vorhandene entsprechend:



    Code
    append='-S""'


    Wichtig ist dabei die richtige Reihenfolge der Anführungszeichen und der leere String, der übergeben wird, sonst gibt's Fehlermeldungen!


    Danach startet mal mit

    Code
    sudo /etc/init.d/gpm start


    den Maus-Server. Jetzt kann man den Pi runterfahren, in dem man


    1. die rechte Maustaste gedrückt hält,
    2. mit der linken einen Dreifachklick macht,
    3. beide Tasten loslässt,
    4. und noch einmal links klickt.


    Das hört sich komplizierter an, als es ist. Wer es ein-, zweimal ausprobiert hat, und auch sonst mit der Maus keine haptischen Probleme hat, schafft auch diese Befehlsfolge nach einigen Versuchen.

  • Das ist auch keine schlechte Idee :thumbs1:


    Man kann über die -S Option auch eigene "special commands" einstellen, wobei immer die ersten 3 Punkte überall gleich sind:

    • die eine Maustaste gedrückt halten und
    • mit der anderen Taste einen Dreifachklick machen
    • beide Tasten los lassen
    • ... special-command Taste ...

    Ob man erst die rechte Taste gedrückt hält und dann mit der linken Taste 3x klickt, oder andersherum - spielt keine Rolle...
    Wichtig ist aber das man nach dem loslassen innerhalb von 3 Sekunden dann die richtige Taste drückt um den gewünschten Effekt auszulösen


    Standardmäßig sind 3 "special commands" voreingestellt:


    Mehr dazu kann man in der manual Page für das Programm nachlesen:

    Code
    man gpm
  • Hallo zusammen,
    entschuldigt bitte, wenn ich blöd frage, aber ich habe nicht ganz verstanden, wie ich den Eintrag in die "rc.local" machen muss. In der Anleitung steht:
    "Der Aufruf muss vor der Zeile exit 0 stehen. Am Ende sollte es dann so aussehen:"
    sudo python /home/pi/shutdown.py &
    exit 0
    Heißt das, ich muss die Zeile sudo python... ... .py & in die Zeile vor exit 0 eintragen?
    Ich habe das gemacht und bekomme dann beim Hochfahren des Raspi eine Fehlermeldung am Ende des Bootvorganges.
    Danke für Eure Hilfe im Voraus!
    Gruß
    Micha

  • sudo wird in /etc/rc.local nicht benötigt da die Datei bereits als root ausgeführt wird und somit auch alle im Script befindlichen Befehle


    Aber ja, du musst dein Script vor, also oberhalb von exit 0 einfügen... Das exit beendet das Script, würdest du dein Script erst danach einfügen würde es also niemalsnie ausgeführt werden -> Script Dateien werden immer von oben nach unten abgearbeitet


    Erst kommt die Zeile in der dein Script steht - danach kommt die Zeile mit exit 0 ... NICHT alles in einer Zeile!


    Was eine Zeile beziffert weißt du?



    WELCHE Fehlermeldung musst du uns schon verraten - oder uns ne Glaskugel schenken

  • Hallo,


    vielen erstmal Dank für die schnelle Antwort!
    Da ich es mit dem "Glaskugeln" ja auch nicht so habe, versuche ich mein Problem etwas präziser zu schildern:
    Die Fehlermeldung beim Bootvorgang sieht ungefähr so aus:


    ---------------------------------------------------------------------
    My IP address is 192.168.....

    Raspbian GNU/Linux 7 raspberrypi tty1

    raspberrypi login: File "/home/pi/shutdown.py", line 5
    import RPi.GPIO as GPIO
    ^
    IndentationError: unexpected indent
    ---------------------------------------------------------------------



    Meine „rc.local“ sieht folgendermaßen aus:


    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.


    # Print the IP address
    _IP=$(hostname -I) || true
    if [ "$_IP" ]; then
    printf "My IP address is %s\n" "$_IP"
    fi


    python /home/pi/shutdown.py &


    exit 0
    ------------------------------------------------------------------------



    Danke nochmals für einen Tipp!
    Micha

  • Der Fehlermeldung entsprechend ist der Fehler im Python Script


    Führ das Script mal manuell aus und stell sicher dass das funktioniert - wenn das nämlich manuell schon nicht geht, kann es über /etc/rc.local auch nicht gehen



    PS: Das nächste mal bitte Dateien in Code-blöcken posten (im Editor oben in der Toolsleiste auf Kode)

  • Hallo,
    danke für den "Kode"-Hinweis.
    Es ist das erste Mal, dass ich hier im Forum poste.
    Bin zwar nicht mehr der Jüngste, hab aber irgendwie Spaß am Raspi gefunden...


    Aber zurück zum Text: beim manuellen Ausführen des Skriptes kommt exakt der gleiche Fehler.


    Habe eigentlich versucht, alles nach Anleitung von Seite 1 zu machen...


    Ich werd dann mal das ganze nochmals durchgehen. Kann es daran liegen, dass ich keinen Vorwiderstand an der LED angebracht hab? Kaum, oder?


    Ich hab es immerhin geschafft, 2x aus dem Ruhezustand zu booten. Alles kan also nicht im Eimer sein;-)


    Micha


  • Hallo Micha,


    der Vorwiderstand hat seinen Grund: Er reduziert den Strom, zum einen, damit die LED nicht durchbrennt - zum anderen beim Raspberry deswegen, weil der nur (abgesehen von exotischen Stromversorgungen) über die GPIO-Schnittstelle nur 50 mA zur Verfügung stellt. Ohne Vorwiderstand wird dieser Strom auf jeden Fall überschritten werden.


    Beste Grüße


    Andreas

    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.

  • Aber zurück zum Text: beim manuellen Ausführen des Skriptes kommt exakt der gleiche Fehler.


    Bei Python ist es extrem wichtig die Abstände von links (Einrückungen) einzuhalten. Ich vermute mal das du beim Code-block auf "Alles markieren" geklickt hast? Markier mal stattdessen alles selber mit der Maus und achte darauf das "import" bündig an der linken Seite ohne Leerzeichen steht - dann sollte das klappen


    der Vorwiderstand hat seinen Grund: Er reduziert den Strom, zum einen, damit die LED nicht durchbrennt - zum anderen beim Raspberry deswegen, weil der nur (abgesehen von exotischen Stromversorgungen) über die GPIO-Schnittstelle nur 50 mA zur Verfügung stellt. Ohne Vorwiderstand wird dieser Strom auf jeden Fall überschritten werden.


    Dem muss ich etwas widersprechen.


    Reduziert der Widerstand nicht auch die Spannung? ;)


    Der Vorwiderstand von LEDs wird eigentlich für die entsprechende Farbe benötigt..
    Wenn man einen GPIO pin als Ausgang konfiguriert, kommen da 3.3V raus aber nicht jede LED verträgt 3.3V... Laut > dieser Seite < haben die verschieden Farbigen LEDs folgende Betriebsspannung:

    • Rot: 2.1V
    • Gelb: 2.2V
    • Grün: 3.7V
    • Blau: 3.1V
    • Weiß: 3.5V


    Es gibt aber unterschiedliche LEDs, normalerweise steht es beim Hersteller/Verkäufer dabei was die LED verträgt


    [hr]


    Zum Thema max. 50mA über GPIO gibt es leider auch widersprüchliche Aussagen.
    Dazu hol ich mal etwas weiter aus damit man "das ganze" versteht:


    Man muss hierbei zwischen Power-Pins und GPIO-Pins unterschieden.
    Die P1 Stiftleiste hat insg. 26 Pins wovon 5x für GND, 2x für 5V, 2x für 3V3 und die restlichen 17 sind GPIO Pins
    P5 stellt weitere 8 Pins zur Verfügung (Stiftleiste muss selber verlötet werden) wovon 2x für GND, 1x für 5V, 1x für 3V3 und die restlichen 4 Pins sind GPIO.


    Die GPIO-Pins vertragen nicht mehr als 3.3V und geben auch als Ausgang nur 3V3 aus..


    50mA soll angeblich das Maximum der 3V3 Power-Pins sein.
    Laut verbreiteter Meinung kann ein einzelner GPIO Pin von 2mA bis zu 16mA ausgeben; was rein rechnerisch bei 17 GPIO Pins dann 272mA wären... Aber die GPIO Pins werden (als Ausgang) über die 3V3 Schiene versorgt, die aber angeblich maximal 50mA ausgibt..


    Dazu kommt das der PI so konstruiert wurde das er über microUSB insg. maximal 1A aufnimmt. Die Nackte Hardware benötigt aber bereits 700mA also stünde für alles andere (USB, HDMI, Kamera, GPIO usw) nur noch insg./maximal 300mA zur Verfügung.


    Aufgrund dieser Tatsache wurde bei der Entwicklung vom RaspberryPI mit einem durchschnitt von 3mA pro GPIO Pin gerechnet und so kommt dann auch dieses " 50mA Limit " zustande:
    17 x 3mA = 51mA
    Aber ob dieses Limit als solches tatsächlich besteht weiß eigentlich keiner so richtig.


    Die 5V Power-Pins sind zudem direkt vom USB durchgeschliffen da es sich beim RaspberryPI um ein sog. 3V3 Gerät handelt: Über USB werden 5V eingespeist, es gibt aber auf der RPI Platine nur Spannungswandler für 3.3V, 2.5V und 1.8V


    ABER: Es wurde keinerlei Schutz für die GPIO Geschichte auf der Platine verbaut! Es gibt also weder einen Kurzschluss- noch einen Überlastungs-Schutz!


    Ich hatte das mal versucht in folgendem Beitrag zusammen zu fassen: http://www.forum-raspberrypi.d…rt-die-gpio-schnittstelle


    Dazu stehen auch auf folgenden Seiten ein paar Infos:
    http://elinux.org/RPi_Low-level_peripherals#Power_pins
    http://raspberrypi.stackexchan…-the-gpio-pins-can-output
    http://raspberrycenter.de/handbuch/technische-daten



    Eigene Tests haben bei mir kein solches Limit bestätigt sondern vielmehr das allgemeine " max 1A " Limit aufgrund der Begrenzung von der Polyfuse - dem normalen PI stehen halt nur ca. 300mA (eher ein bisschen weniger) für Anschlüsse zur Verfügung und damit muss man halt auch über die GPIO Leisten und USB usw auskommen....


    Wer noch ein bisschen Strom sparen will kann zB den HDMI Port abschalten und spart dadurch ca. 20mA (der ist nämlich auch ohne angeschlossenem HDMI Monitor/TV permanent an):

    Code
    /opt/vc/bin/tvservice -off


    Wer noch mehr Strom rausholen will kann den 3V3 Spannungswandler RG2 austauschen, denn der ist nicht allzu effektiv und verheizt ca. 1 Watt in Wärme . Wie das geht findet ihr über die Forumsuche oben rechts nach " PI Tuning " heraus ;)

  • Bei Python ist es extrem wichtig die Abstände von links (Einrückungen) einzuhalten. Ich vermute mal das du beim Code-block auf "Alles markieren" geklickt hast? Markier mal stattdessen alles selber mit der Maus und achte darauf das "import" bündig an der linken Seite ohne Leerzeichen steht - dann sollte das klappen


    Danke für die Hilfe!
    Das war das Problem!!!


    Ihr seid echt klasse!


    Micha


    :danke_ATDE:

  • Noch mal kurz zum Thema Vorwiderstand - dieser ist unbedingt nötig!
    Der Grund ist einfach erklärt: Der Widerstand stellt den Strom der LED ein. Berechnet wird er mit Betriebsspannung (hier 3,3V) minus Flussspannung LED (z.B. 2,1V für rot) geteilt durch den gewünschten Strom. Als Formel...


    RVorwiderstand = (UBetrieb - ULED) / I


    Jetzt mal angenommen, wir wollen den Strom ohne Vorwiderstand berechnen. Dann müssen wir die Formel nach I umstellen...


    I = (UBetrieb - ULED) / RVorwiderstand


    Da R jetzt seeehr klein ist, wird das Ergebnis sehr hoch. Anders ausgedrückt, die LED nimmt sich so viel Strom wie sie kriegen kann. Und aus diesem Match geht entweder die LED oder die Spannungsquelle als Verlierer hervor ;)