Acceda a los pines GPIO sin root. Sin acceso a / dev / mem. ¡Intenta correr como root!

34

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.

JoeyCK
fuente
sudo adduser my_new_user gpio es correcto, pero recuerde cerrar la sesión y volver a iniciarla porque la actualización de la membresía del grupo requiere volver a iniciar sesión para activarse.
Blindfreddy

Respuestas:

49

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/gpiomemno existe, intente:

sudo rpi-update

para asegurarse de que está utilizando un núcleo reciente y

sudo apt-get update
sudo apt-get upgrade

para asegurarse de que está utilizando un RPi.GPIO reciente.

También deberá asegurarse de ser miembro del gpiogrupo:

sudo adduser pi gpio

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.

$ ls -l /dev/gpiomem
crw-rw---- 1 root gpio 244, 0 Dec 28 22:51 /dev/gpiomem

Si no es así, configure los permisos correctos de la siguiente manera

sudo chown root.gpio /dev/gpiomem
sudo chmod g+rw /dev/gpiomem
joan
fuente
44
Sigue sin funcionar. Todo está actualizado, / dev / gpiomem existe y cuando trato de agregar al usuario al grupo gpio dice que ya es miembro
JoeyCK
3
@JoeyCK: tenga en cuenta que cambiar la membresía del grupo no afecta los procesos que ya se estaban ejecutando. Ejecute idpara enumerar los grupos actuales de su shell, y si gpiono está en la lista, inicie sesión nuevamente o reinicie.
deltab
@JoeyCK ¿Qué versión informa RPi.GPIO?
joan
@joan versión 0.5.11
JoeyCK
1
@mjwittering Raspbian siempre será mejor compatible con Pi. Si prefiere Ubuntu, deberá aplicar los cambios en cada arranque. Puede hacerlo automáticamente con un script de inicio o una entrada de reinicio en un crontab.
joan
7

Tuve este problema de inmediato y lo resolví solo con esto:

sudo adduser my_new_user gpio

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
1
Te refieres a / dev / gpiomem (no / dev / mem).
joan
tanto de hecho, si nos fijamos en / dev VERAS que ambos dispositivos existe, y el tema pregunta fue sobre / dev / mem
Иван Андреевич Черногоров
1
No. Un miembro del grupo gpio no tiene acceso a / dev / mem.
joan
derecha, miembro de kmem no, la solución entonces es simmilar
Иван Андреевич Черногоров
2
Está bien, pero el punto es dar acceso seguro y sin raíz al GPIO. Agregar un usuario al grupo kmem no es seguro y no daría acceso al GPIO.
joan
5

Puedo responder esto.

sudo chown root.gpio /dev/mem

Esto cambia el propietario y el grupo de /dev/mema rooty gpiorespectivamente.

sudo chmod g+rw /dev/mem

luego le da al grupo acceso de lectura y escritura a este /dev/memobjeto.

El /dev/memobjeto es básicamente todo el espacio de memoria en el sistema. Esto significa que ahora el grupo gpio, 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 bcm2835biblioteca y wiringPise 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/memgrupo gpiopara 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 el node-red-contrib-dht-sensormódulo, que depende de node-dht-sensor, que depende de BCM2835. Se seg-falla utilizando /dev/gpiomemya que tiene algunos errores, ya sea en node-dht-sensoro en /dev/gpiomemla 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/gpiomemexiste, intenta usarlo en /dev/gpiomemlugar de hacerlo /dev/mem, por lo que abrir el /dev/memgrupo gpiono ayuda. Gorrón.

Karl Easterly
fuente
1

Simplemente use el siguiente comando en la terminal:

sudo chown root.gpio /dev/mem && sudo chmod g+rw /dev/mem
harkirat1892
fuente
2
¿Podría dar una explicación de lo que hace este comando y por qué difiere de la respuesta de Joan ? ¿Cuál es la diferencia entre /dev/memy /dev/gpiomem?
Greenonline
Si se puede, es mejor utilizar la respuesta de Joan, sin embargo si no se puede cambiar /dev/memde /dev/gpiomemesta manera se consigue que el mismo permiso de uso /dev/memque tiene con/dev/gpiomem
Natim
No es seguro ofrecer acceso a todos los / dev / mem, cuando un enfoque más quirúrgico responde a la pregunta.
Bryce
1

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).

sudo groupadd gpio
sudo usermod -a -G gpio user_name
sudo grep gpio /etc/group
sudo chown root.gpio /dev/gpiomem
sudo chmod g+rw /dev/gpiomem
Mark Tyers
fuente
1

Si está construyendo en geany simplemente cambie los comandos de construcción.

Los comandos de Java para compilar deberían ser

sudo pi4j --compile "%f"

y el comando de ejecución debería ser

sudo pi4j --run "%e" 
Francesca Bannister
fuente