Acesse pinos GPIO sem raiz. Sem acesso a / dev / mem. Tente executar como root!

34

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.

JoeyCK
fonte
sudo adduser my_new_user gpio está correto, mas lembre-se de fazer logoff e logon novamente, pois a atualização da associação ao grupo exige um novo login para se tornar ativo.
Blindfreddy

Respostas:

49

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/gpiomemnão existir, tente:

sudo rpi-update

para se certificar de que você está usando um kernel recente, e

sudo apt-get update
sudo apt-get upgrade

para se certificar de que você está usando um RPi.GPIO recente.

Você também precisará se certificar de que você é um membro do gpiogrupo:

sudo adduser pi gpio

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.

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

Caso contrário, defina as permissões corretas da seguinte maneira

sudo chown root.gpio /dev/gpiomem
sudo chmod g+rw /dev/gpiomem
joan
fonte
4
Ainda não funciona. Tudo é atualizado, / dev / gpiomem existe e quando tento adicionar o usuário ao grupo GPIO ele diz que já é um membro
JoeyCK
3
@ JoeyCK: observe que a alteração da associação ao grupo não afeta os processos que já estavam em execução. Execute idpara listar os grupos atuais do seu shell e, se gpionão estiver listado, efetue login novamente ou reinicie.
Deltab
@JoeyCK Qual versão é relatada pelo RPi.GPIO?
joana
@joan versão 0.5.11
JoeyCK
1
@mjwittering Raspbian invariavelmente será melhor suportado no Pi. Se você preferir o Ubuntu, precisará aplicar as alterações a cada inicialização. Você poderia fazer isso automaticamente com um script de inicialização ou uma entrada de reinicialização em um crontab.
Joan
7

Eu tive esse problema imediatamente e resolvi apenas com isso:

sudo adduser my_new_user gpio

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
1
Você quer dizer / dev / gpiomem (não / dev / mem).
7286 joanJan
tanto na verdade, se você olhar em / dev você verá que ambos os dispositivos existe, e o tópico da pergunta era sobre / dev / mem
Иван Андреевич Черногоров
1
Não. Um membro do grupo gpio não tem acesso a / dev / mem.
Joan
direita, membro da kmem não, a solução é, então, simmilar
Иван Андреевич Черногоров
2
Ok, mas o objetivo é dar acesso seguro e sem raízes ao GPIO. Adicionar um usuário ao grupo kmem não é seguro e não daria acesso ao GPIO.
9686
5

Eu posso responder isso.

sudo chown root.gpio /dev/mem

Isso altera o proprietário e o grupo de /dev/mempara roote gpiorespectivamente.

sudo chmod g+rw /dev/mem

depois, fornece ao grupo acesso de gravação e leitura a esse /dev/memobjeto.

O /dev/memobjeto é basicamente todo o espaço da memória no sistema. Isso significa que agora o grupo gpio, 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 bcm2835biblioteca wiringPiserã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/memgrupo gpiocomo 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 o node-red-contrib-dht-sensormódulo, que depende do node-dht-sensor, que depende do BCM2835. Ele falha com o uso /dev/gpiomem, pois ainda existem alguns bugs, dentro node-dht-sensorou dentro, /dev/gpiomemou 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/gpiomemexiste, ele tenta usar em /dev/gpiomemvez de /dev/mem, portanto, abrir o /dev/memgrupo para gpionão ajuda. Vadio.

Karl Easterly
fonte
1

Basta usar o seguinte comando no terminal:

sudo chown root.gpio /dev/mem && sudo chmod g+rw /dev/mem
harkirat1892
fonte
2
Você poderia fornecer uma explicação sobre o que esse comando faz e por que difere da resposta de joan ? Qual é a diferença entre /dev/meme /dev/gpiomem?
Greenonline 20/03/16
Se você pode é melhor usar a resposta de Joan, no entanto, se você não pode mudar /dev/mempara /dev/gpiomemisso vai te o mesmo permissão para o uso /dev/memque você tem com/dev/gpiomem
Natim
Não é seguro oferecer acesso a todos os / dev / mem, quando uma abordagem mais cirúrgica responde à pergunta.
Bryce
1

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

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
fonte
1

Se você estiver construindo no geany, basta alterar os comandos de construção.

Os comandos Java para compilar devem ser

sudo pi4j --compile "%f"

e o comando execute deve ser

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