Ich habe ein Python-Skript mit der RPi.GPIO-Bibliothek erstellt. Ich muss es ohne root ausführen, aber ich bekomme diesen Fehler, wenn ich es mit "python ./script.py" ausführe:
No access to /dev/mem. Try running as root!
Ich habe an vielen Stellen gelesen, dass Sie mit der neuesten Version der Bibliothek kein root mehr benötigen, aber nach dem Update erhalte ich immer noch den Fehler. Die Version, die ich habe, ist RPi.GPIO 0.6.0a3
Hier ist der Code:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(18,GPIO.OUT)
print "LED on"
GPIO.output(18,GPIO.HIGH)
time.sleep(1)
print "LED off"
GPIO.output(18,GPIO.LOW)
Und der volle Fehler:
pi@raspberrypi ~/Desktop/python $ python ./sensors.py
Traceback (most recent call last):
File "./sensors.py", line 5, in <module>
GPIO.setup(18,GPIO.OUT)
RuntimeError: No access to /dev/mem. Try running as root!
Wenn ich es als root ausführe, funktioniert es.
Antworten:
Sie müssen wahrscheinlich Raspbian ausführen, um RPi.GPIO als Nicht-Root-Benutzer zu verwenden. Möglicherweise muss es sich auch um Jessie handeln.
Gibt
/dev/gpiomem
es In diesem Fall sollte RPi.GPIO dieses Gerät verwenden, um auf das GPIO zuzugreifen. Wenn/dev/gpiomem
nicht vorhanden, versuchen Sie:um sicherzustellen, dass Sie einen aktuellen Kernel verwenden, und
um sicherzustellen, dass Sie ein aktuelles RPi.GPIO verwenden.
Sie müssen außerdem sicherstellen, dass Sie Mitglied der
gpio
Gruppe sind:BEARBEITET ZUM HINZUFÜGEN
Das Raspbian-System scheint sich im Fluss zu befinden. Ich bin nicht sicher, ob es sich um ein Raspbian- oder (wahrscheinlicher) ein raspberrypi.org-Problem handelt.
Stellen Sie sicher, dass / dev / gpiomem die richtigen Berechtigungen hat.
Wenn dies nicht der Fall ist, stellen Sie die richtigen Berechtigungen wie folgt ein
quelle
id
Sie den Befehl aus, um die aktuellen Gruppen Ihrer Shellgpio
aufzulisten. Wenn dies nicht der Fall ist, melden Sie sich erneut an oder starten Sie den Computer neu.Ich hatte dieses Problem sofort und löste es einfach so:
Damit wird der Benutzer "my_new_user" zur gpio-Gruppe hinzugefügt, sodass alle Benutzer in der gpio-Gruppe auf die GPIO-Pins zugreifen können.
quelle
Ich kann das beantworten.
Dadurch ändert sich die Eigentümer und die Gruppe
/dev/mem
zuroot
undgpio
sind.Anschließend erhält die Gruppe Lese- und Schreibzugriff auf dieses
/dev/mem
Objekt.Das
/dev/mem
Objekt ist im Grunde der gesamte Speicherplatz auf dem System. Dies bedeutet, dass jetzt die Gruppegpio
und jeder in ihr den Speicherplatz lesen und beschreiben kann.Im Speicherbereich befinden sich nun viele Dinge, einschließlich der CPU-Register. Wenn Sie die GPIO-Pins umschalten, ändern Sie ein wenig in einem dieser Register. Der Kicker ist, Sie müssen sicher sein, dass Sie es richtig machen, oder es können schlimme schlimme Dinge mit Ihrem System passieren.
Um den gesamten Speicherplatz zu schützen, werden die zuzuordnenden Kräfte nur den Speicherteilen zugeordnet, an denen wir mit den GPIO-Bits arbeiten müssen
/dev/gpiomem
. Dies maskiert / schützt den restlichen Speicherplatz vor dem Zugriff und ermöglicht nur den Zugriff auf die GPIO-Bits. Dies ermöglicht den Zugriff auf die GPIO-Speicheradressen und sperrt alle anderen Teile des Speichers, z. B. den Speicher, der derzeit von anderen Programmen verwendet wird.Tatsächlich ist dies eine Lücke in den Sicherheits- und Systemstabilitätsschutz, um den Zugriff auf die GPIO-Inhalte sowie den Rest des Speichers zu ermöglichen, jedoch nur für die Benutzer in der Gruppe GPIO, bei der Pi Mitglied ist.
In Zukunft werden Treiber wie die
bcm2835
Bibliothek undwiringPi
mehr aktualisiert (einige Aktualisierungen finden bereits statt) und die Apps, die auf diesen Tools basieren, werden weiter aktualisiert, und in Zukunft wird hoffentlich all dieser GPIO-Aufwand als Root auftreten verschwinden.Bis dahin haben Sie zwei Möglichkeiten: Öffnen Sie die
/dev/mem
Gruppe "to"gpio
als "read / write" oder führen Sie sie als "root" aus, bei der "read write" für alle ausgeführt wird/dev/mem
.Hoffe das macht Sinn.
Derzeit gibt es noch viele Probleme, unter denen Sie noch ausgeführt werden müssen
root
. Zum Beispiel mit demnode-red-contrib-dht-sensor
Modul, das von dem abhängtnode-dht-sensor
, das von BCM2835 abhängt. Es kann Fehler verursachen,/dev/gpiomem
da es noch einige Fehler innode-dht-sensor
oder in/dev/gpiomem
der Art und Weise hat, wie sie zusammenarbeiten. Ich weiß nicht, was der Fall ist, aber irgendwann wird es klappen. Wenn BCM2835 als "Nicht-Root" ausgeführt wird und/dev/gpiomem
vorhanden ist, wird dies/dev/gpiomem
anstelle von verwendet/dev/mem
. Das Öffnen der/dev/mem
Gruppe "Zu"gpio
hilft also nicht. Schade.quelle
Verwenden Sie einfach den folgenden Befehl im Terminal:
quelle
/dev/mem
und/dev/gpiomem
?/dev/mem
,/dev/gpiomem
erhalten Sie die gleiche Erlaubnis,/dev/mem
die Sie für die Verwendung haben/dev/gpiomem
Keine der obigen Antworten enthält alle Schritte. Ich musste die folgenden Schritte ausführen, um nicht-root-Zugriff auf die GPIO-Pins zu erhalten. Ich musste eine neue Gruppe erstellen, meinen Benutzer dieser Gruppe hinzufügen und dann die Berechtigungen ändern (wie in den vorherigen Beiträgen).
quelle
Wenn Sie in Geany bauen, ändern Sie einfach die Build-Befehle.
Die zu kompilierenden Java-Befehle sollten sein
und der Ausführungsbefehl sollte sein
quelle