Eu criei um script python usando a biblioteca RPi.GPIO. Preciso executá-lo sem raiz, mas recebo este erro ao executá-lo com "python ./script.py":
No access to /dev/mem. Try running as root!
Li em muitos lugares que você não precisa mais fazer root com a versão mais recente da biblioteca, mas ainda assim recebo o erro após a atualização. A versão que tenho é RPi.GPIO 0.6.0a3
Aqui está o 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)
E o erro 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!
Quando eu o executo como root, ele funciona.
Respostas:
Você provavelmente precisa estar executando o Raspbian para usar o RPi.GPIO como um usuário não root, possivelmente também precisa ser o jessie.
Existe
/dev/gpiomem
? Nesse caso, o RPi.GPIO deve usar este dispositivo para acessar o GPIO. Se/dev/gpiomem
não existir, tente:para se certificar de que você está usando um kernel recente, e
para se certificar de que você está usando um RPi.GPIO recente.
Você também precisará se certificar de que você é um membro do
gpio
grupo:EDITADO PARA ADICIONAR
O sistema Raspbian parece estar em um estado de fluxo. Não tenho certeza se é um problema do Raspbian ou (mais provável) do raspberrypi.org.
Verifique se / dev / gpiomem possui as permissões corretas.
Caso contrário, defina as permissões corretas da seguinte maneira
fonte
id
para listar os grupos atuais do seu shell e, segpio
não estiver listado, efetue login novamente ou reinicie.Eu tive esse problema imediatamente e resolvi apenas com isso:
Com isso, o usuário "my_new_user" é adicionado ao grupo gpio, para que todos os usuários do grupo gpio possam acessar os pinos GPIO.
fonte
Eu posso responder isso.
Isso altera o proprietário e o grupo de
/dev/mem
pararoot
egpio
respectivamente.depois, fornece ao grupo acesso de gravação e leitura a esse
/dev/mem
objeto.O
/dev/mem
objeto é basicamente todo o espaço da memória no sistema. Isso significa que agora o grupogpio
, e todos os que estão nele, podem ler e escrever no espaço da memória.Agora, no espaço da memória há muitas coisas, incluindo registros da CPU. Ao alternar os pinos GPIO, você está alterando um pouco em um desses registros. O problema é que você precisa ter certeza de que faz isso corretamente ou que coisas ruins e ruins podem acontecer ao seu sistema.
Para ajudar a proteger todo o espaço da memória, os poderes que são mapeados apenas as partes da memória nas quais precisamos trabalhar com os bits GPIO
/dev/gpiomem
. Com efeito, isso oculta / impede o acesso ao restante do espaço da memória e permite apenas o acesso aos bits GPIO. Isso permite o acesso aos endereços de memória GPIO e não permite outras partes da memória, como a memória atualmente sendo usada por outros programas.Com efeito, isso abre um buraco nas proteções de segurança e estabilidade do sistema para permitir o acesso ao material GPIO, bem como ao restante da memória, mas apenas aos usuários do grupo GPIO, do qual Pi é membro.
No futuro, drivers como a
bcm2835
bibliotecawiringPi
serão atualizados mais (algumas atualizações já estão acontecendo) e os aplicativos criados sobre essas ferramentas serão atualizados ainda mais e, no futuro, esperamos que todo esse problema GPIO como root desaparecer.Até então, você tem duas opções, abra o
/dev/mem
grupogpio
como leitura / gravação ou execute como raiz, que possui gravação de leitura completa para todos/dev/mem
.Espero que isso faça sentido.
No momento, ainda existem muitos problemas nos quais você ainda precisa executar
root
. Por exemplo, usando onode-red-contrib-dht-sensor
módulo, que depende donode-dht-sensor
, que depende do BCM2835. Ele falha com o uso/dev/gpiomem
, pois ainda existem alguns bugs, dentronode-dht-sensor
ou dentro,/dev/gpiomem
ou da maneira como eles estão trabalhando juntos. Não sei qual é o caso, mas será resolvido eventualmente. Quando o BCM2835 é executado como 'não raiz' e/dev/gpiomem
existe, ele tenta usar em/dev/gpiomem
vez de/dev/mem
, portanto, abrir o/dev/mem
grupo paragpio
não ajuda. Vadio.fonte
Basta usar o seguinte comando no terminal:
fonte
/dev/mem
e/dev/gpiomem
?/dev/mem
para/dev/gpiomem
isso vai te o mesmo permissão para o uso/dev/mem
que você tem com/dev/gpiomem
Nenhuma das respostas acima inclui todas as etapas. Eu precisava concluir as etapas a seguir para obter acesso não raiz aos pinos do GPIO. Eu tive que criar um novo grupo, adicionar meu usuário a esse grupo e alterar as permissões (como nas postagens anteriores).
fonte
Se você estiver construindo no geany, basta alterar os comandos de construção.
Os comandos Java para compilar devem ser
e o comando execute deve ser
fonte