Hi,
kleiner Tipp: wenn mal absolut keine Beschreibung, kein Datenblatt und kein Aufdruck da ist, ist Pin #1 immer der, der statt einem runden ein quadratisches Lötauge hat.
cu,
-ds-
Hi,
kleiner Tipp: wenn mal absolut keine Beschreibung, kein Datenblatt und kein Aufdruck da ist, ist Pin #1 immer der, der statt einem runden ein quadratisches Lötauge hat.
cu,
-ds-
Habe eine Seite gefunden, welche die Thematik mit den GPIOs gut erklärt und im Tut verlinkt.
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.
Man nehme:
Python.
Sollte sowieso schon installiert sein.
Und dann, weil es in der Doku des benötigten Paketes drinsteht, noch python-dev hinterher:
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:
$ 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:
from evdev import InputDevice
from select import select
left = 0
right = 0
dev = InputDevice('/dev/input/event0') # check event number
while True:
r,w,x = select([dev], [], [])
for event in dev.read():
# The event.code for a scroll wheel event is 8, left button 272, right button 273, wheel button 274
if event.code == 8:
if event.value == 1:
dir = "up"
elif event.value == -1:
dir = "down"
print "wheel " + dir
print(event.value)
elif event.code == 274:
print "wheel button"
print(event.value)
elif event.code == 272:
print "left button"
print(event.value)
if event.value == 1:
left = 1
elif event.value == 0:
left = 0
elif event.code == 273:
print "right button"
print(event.value)
if event.value == 1:
right = 1
elif event.value == 0:
right = 0
if (left == 1) and (right == 1):
print "Both buttons pressed, exiting"
exit()
Display More
Um herauszufinden, welches event für Dich gilt, schaust Du zuerstmal, wieviele "event" devices es gibt:
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 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.
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.
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:
QuoteDisplay More
...
Special commands are toggled by triple-clicking the left and right button -- an
unlikely event during normal mouse usage. The easiest way to triple-click is
pressing one of the buttons and triple-click the other one. When special process‐
ing is toggled, a message appears on the console (and the speaker beeps twice, if
you have a speaker); if the user releases all the buttons and presses one of them
again within three seconds, then the special command corresponding to the button
is executed.
The default special commands are:
left button
Reboot the system by signalling the init process
middle button (if any)
Execute `/sbin/shutdown -h now'
right button
Execute `/sbin/shutdown -r now'
The `-S' command line switch enables special command processing and allows to
change the three special commands. To accept the default commands use `-S ""'
(i.e., specify an empty argument). To specify your own commands, use a colon-sep‐
arated list to specify commands associated to the left, middle and right button.
If any of the commands is empty, it is interpreted as `send a signal to the init
process'. This particular operation is supported, in addition to executing exter‐
nal commands, because sometimes bad bugs put the system to the impossibility to
fork; in these rare case the programmer should be able to shutdown the system any‐
ways, and killing init from a running process is the only way to do it.
As an example, `-S ":telinit 1:/sbin/halt"', associates killing init to the left
button, going single user to the middle one, and halting the system to the right
button.
Also: USB-Maus dranhängen, das Kommando
loslassen, den rechten Mausknopf betätigen, und der Pi fährt runter.
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.
QuoteDein 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.
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:
Wichtig ist dabei die richtige Reihenfolge der Anführungszeichen und der leere String, der übergeben wird, sonst gibt's Fehlermeldungen!
Danach startet mal mit
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:
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:
The default special commands are:
left button
Reboot the system by signalling the init process
middle button (if any)
Execute `/sbin/shutdown -h now'
right button
Execute `/sbin/shutdown -r now'
Display More
Mehr dazu kann man in der manual Page für das Programm nachlesen:
Hm... was ist jetzt an Deiner Aussage neu zu dem, was ich am 08.03.2014 08:44 schrieb? :s
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
Display More
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
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:
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):
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
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