Hice un script de Python usando la biblioteca RPi.GPIO. Necesito ejecutarlo sin root pero recibo este error cuando lo ejecuto con "python ./script.py":
No access to /dev/mem. Try running as root!
He leído en muchos lugares que ya no necesita root con la última versión de la biblioteca, pero sigo recibiendo el error después de la actualización. La versión que tengo es RPi.GPIO 0.6.0a3
Aquí está el código:
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)
Y el error completo:
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!
Cuando lo ejecuto como root, funciona.
Respuestas:
Probablemente necesite ejecutar Raspbian para usar RPi.GPIO como usuario no root, posiblemente también tenga que ser jessie.
¿Existe
/dev/gpiomem
? Si es así, RPi.GPIO debería usar este dispositivo para acceder al GPIO. Si/dev/gpiomem
no existe, intente:para asegurarse de que está utilizando un núcleo reciente y
para asegurarse de que está utilizando un RPi.GPIO reciente.
También deberá asegurarse de ser miembro del
gpio
grupo:EDITADO PARA AGREGAR
El sistema Raspbian parece estar en un estado de cambio. No estoy seguro de si es un problema Raspbian o (más probablemente) un raspberrypi.org.
Verifique que / dev / gpiomem tenga los permisos correctos.
Si no es así, configure los permisos correctos de la siguiente manera
fuente
id
para enumerar los grupos actuales de su shell, y sigpio
no está en la lista, inicie sesión nuevamente o reinicie.Tuve este problema de inmediato y lo resolví solo con esto:
Con esto, el usuario "my_new_user" se agrega al grupo gpio, por lo que todos los usuarios en el grupo gpio pueden acceder a los pines GPIO.
fuente
Puedo responder esto.
Esto cambia el propietario y el grupo de
/dev/mem
aroot
ygpio
respectivamente.luego le da al grupo acceso de lectura y escritura a este
/dev/mem
objeto.El
/dev/mem
objeto es básicamente todo el espacio de memoria en el sistema. Esto significa que ahora el grupogpio
, y todos en él, pueden leer y escribir en el espacio de la memoria.Ahora, en el espacio de la memoria hay muchas cosas, incluidos los registros de la CPU. Cuando alterna los pines GPIO, está cambiando un poco en uno de estos registros. El truco es que debes asegurarte de hacerlo correctamente o de lo contrario pueden sucederle cosas malas a tu sistema.
Para ayudar a proteger todo el espacio de memoria, las potencias que se asignan solo a las partes de memoria en las que necesitamos trabajar con los bits GPIO
/dev/gpiomem
. En efecto, esto enmascara / protege el resto del espacio de memoria para que no se acceda y solo permite acceder a los bits GPIO. Esto permite el acceso a las direcciones de memoria GPIO y no permite ninguna otra parte de la memoria, como la memoria utilizada actualmente por otros programas.En efecto, esto abre un agujero en las protecciones de seguridad y estabilidad del sistema para permitir el acceso a las cosas de GPIO, así como al resto de la memoria, pero solo a los usuarios del grupo GPIO, del que Pi es miembro.
En el futuro, los controladores como la
bcm2835
biblioteca ywiringPi
se actualizarán más (algunas actualizaciones ya están ocurriendo) y las aplicaciones que se construyen sobre esas herramientas se actualizarán aún más y luego, en el futuro, con suerte todo este problema de GPIO como root será desaparecer.Hasta entonces, tiene dos opciones: abrir el
/dev/mem
grupogpio
para leer / escribir, o ejecutar como root, que tiene lectura de escritura completa para todos/dev/mem
.Espero que tenga sentido.
Actualmente todavía hay algunos problemas en los que aún debe ejecutarse
root
. Por ejemplo, usando elnode-red-contrib-dht-sensor
módulo, que depende denode-dht-sensor
, que depende de BCM2835. Se seg-falla utilizando/dev/gpiomem
ya que tiene algunos errores, ya sea ennode-dht-sensor
o en/dev/gpiomem
la forma en que trabajan juntos. No sé cuál es el caso, pero eventualmente se resolverá. Cuando BCM2835 se ejecuta como 'no root' y/dev/gpiomem
existe, intenta usarlo en/dev/gpiomem
lugar de hacerlo/dev/mem
, por lo que abrir el/dev/mem
grupogpio
no ayuda. Gorrón.fuente
Simplemente use el siguiente comando en la terminal:
fuente
/dev/mem
y/dev/gpiomem
?/dev/mem
de/dev/gpiomem
esta manera se consigue que el mismo permiso de uso/dev/mem
que tiene con/dev/gpiomem
Ninguna de las respuestas anteriores incluye todos los pasos. Necesitaba completar los siguientes pasos para obtener acceso no root a los pines GPIO. Tuve que crear un nuevo grupo, agregar mi usuario a este grupo y luego cambiar los permisos (como en las publicaciones anteriores).
fuente
Si está construyendo en geany simplemente cambie los comandos de construcción.
Los comandos de Java para compilar deberían ser
y el comando de ejecución debería ser
fuente