Accédez aux broches GPIO sans racine. Pas d'accès à / dev / mem. Essayez de courir en tant que root!

34

J'ai créé un script python à l'aide de la bibliothèque RPi.GPIO. Je dois l'exécuter sans root mais j'obtiens cette erreur en l'exécutant avec "python ./script.py":

No access to /dev/mem. Try running as root!

J'ai lu dans de nombreux endroits que vous n'avez plus besoin de root avec la dernière version de la bibliothèque, mais le message d'erreur s'affiche toujours après la mise à jour. La version que j'ai est RPi.GPIO 0.6.0a3

Voici le 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)

Et l'erreur complète:

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!

Quand je le lance en tant que root, cela fonctionne.

JoeyCK
la source
sudo adduser my_new_user gpio est correct, mais n'oubliez pas de vous déconnecter et de vous reconnecter, car l'actualisation de l'appartenance à un groupe nécessite une nouvelle connexion pour devenir active.
Blindfreddy

Réponses:

49

Vous devez probablement exécuter Raspbian pour utiliser RPi.GPIO en tant qu’utilisateur non root, mais probablement aussi jessie.

/dev/gpiomemExiste- t- il? Si tel est le cas, RPi.GPIO doit utiliser ce périphérique pour accéder au GPIO. Si /dev/gpiomemn'existe pas, essayez:

sudo rpi-update

pour vous assurer que vous utilisez un noyau récent, et

sudo apt-get update
sudo apt-get upgrade

pour vous assurer que vous utilisez un RPi.GPIO récent.

Vous devrez également vous assurer que vous êtes membre du gpiogroupe:

sudo adduser pi gpio

Édité pour ajouter

Le système Raspbian semble être dans un état de flux. Je ne sais pas s'il s'agit d'un problème de Raspbian ou (plus probablement) de Raspberrypi.org.

Vérifiez que / dev / gpiomem dispose des autorisations appropriées.

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

Si ce n'est pas le cas, définissez les autorisations appropriées comme suit

sudo chown root.gpio /dev/gpiomem
sudo chmod g+rw /dev/gpiomem
joan
la source
4
Ne fonctionne toujours pas. Tout est mis à jour, / dev / gpiomem existe et lorsque j'essaie d'ajouter l'utilisateur au groupe gpio, il dit que c'est déjà membre
JoeyCK
3
@ JoeyCK: notez que la modification de l'appartenance à un groupe n'affecte pas les processus déjà en cours d'exécution. Exécuter idpour répertorier les groupes actuels de votre shell. Si ce gpion'est pas le cas, connectez-vous à nouveau ou redémarrez.
Deltab
@JoeyCK Quelle version est rapportée par RPi.GPIO?
joan
@joan version 0.5.11
JoeyCK
1
@mjwittering Raspbian sera toujours mieux supporté sur le Pi. Si vous préférez Ubuntu, vous devrez appliquer les modifications à chaque démarrage. Vous pouvez le faire automatiquement avec un script de démarrage ou une entrée de redémarrage dans une crontab.
joan
7

J'ai eu ce problème tout de suite et résolu juste avec ceci:

sudo adduser my_new_user gpio

Avec cela, l'utilisateur "my_new_user" est ajouté au groupe gpio. Tous les utilisateurs du groupe gpio peuvent donc accéder aux broches GPIO.

Иван Андреевич Черногоров
la source
1
Vous voulez dire / dev / gpiomem (pas / dev / mem).
joan
à la fois en fait, si vous regardez dans / dev voir que les deux vous en aurez des dispositifs existent, et le sujet de question portait sur / dev / mem
Иван Андреевич Черногоров
1
Non. Un membre du groupe gpio n'a pas accès à / dev / mem.
joan
droit, membre de kmem ne, la solution est alors simmilar
Иван Андреевич Черногоров
2
D'accord, mais le but est de donner un accès sécurisé, sans racine, au GPIO. L'ajout d'un utilisateur au groupe kmem n'est pas sûr et ne donnerait pas accès au GPIO.
joan
5

Je peux répondre à cela.

sudo chown root.gpio /dev/mem

Cela change le propriétaire et le groupe de /dev/memà rootet gpiorespectivement.

sudo chmod g+rw /dev/mem

puis donne au groupe un accès en lecture / écriture à cet /dev/memobjet.

L' /dev/memobjet est essentiellement la totalité de l'espace mémoire sur le système. Cela signifie qu’à présent, le groupe gpioet tous ses membres peuvent lire et écrire dans l’espace mémoire.

Maintenant, dans la mémoire, il y a beaucoup de choses, y compris les registres de la CPU. Lorsque vous basculez les broches GPIO, vous modifiez un bit dans l'un de ces registres. Le kicker est, vous devez être sûr de le faire correctement ou de mauvaises choses peuvent arriver à votre système.

Pour aider à protéger tout l’espace mémoire, les puissances à mapper se limitent aux parties de la mémoire sur lesquelles nous devons travailler avec les bits GPIO /dev/gpiomem. Cela masque / protège le reste de l’espace mémoire et ne permet qu’un accès aux bits GPIO. Cela permet d'accéder aux adresses de la mémoire GPIO et interdit toute autre partie de la mémoire, telle que la mémoire en cours d'utilisation par d'autres programmes.

En fait, cela bloque les protections de sécurité et de stabilité du système pour permettre l'accès au contenu GPIO, ainsi qu'au reste de la mémoire, mais uniquement aux utilisateurs du groupe GPIO, dont Pi est membre.

À l’avenir, des pilotes tels que la bcm2835bibliothèque wiringPiseront mis à jour davantage (certaines mises à jour sont déjà en cours) et les applications construites à partir de ces outils seront mises à jour, puis dans le futur, espérons-le disparaître.

Jusque-là, vous avez deux choix: ouvrir le /dev/memgroupe to gpioen lecture / écriture ou exécuter en tant que root, qui dispose d'une écriture complète en lecture /dev/mem.

J'espère que cela a du sens.

Il y a encore de nombreux problèmes pour lesquels vous devez toujours vous lancer root. Par exemple, en utilisant le node-red-contrib-dht-sensormodule, qui dépend de node-dht-sensor, qui dépend de BCM2835. Il commet des fautes /dev/gpiomemcar il y a encore des bugs dans node-dht-sensorou dans /dev/gpiomemla manière dont ils travaillent ensemble. Je ne sais pas quel est le cas, mais ça finira par être réglé. Lorsque le BCM2835 s'exécute en tant que "non-root" et qu'il /dev/gpiomemexiste, il essaie de l'utiliser /dev/gpiomemau lieu de /dev/mem, de sorte que l'ouverture du /dev/memgroupe à gpion'aide pas. Bummer.

Karl Easterly
la source
1

Utilisez simplement la commande suivante dans le terminal:

sudo chown root.gpio /dev/mem && sudo chmod g+rw /dev/mem
harkirat1892
la source
2
Pourriez-vous expliquer ce que fait cette commande et pourquoi elle diffère de la réponse de joan ? Et quelle est la différence entre /dev/memet /dev/gpiomem?
Greenonline
Si vous pouvez , il est préférable d'utiliser la réponse de Joan, si vous ne pouvez pas changer /dev/memà /dev/gpiomemcela vous obtenir la même autorisation d'utilisation /dev/memque vous avez avec/dev/gpiomem
NATIM
Il est dangereux d'offrir un accès à l'ensemble de / dev / mem, lorsqu'une approche plus chirurgicale répond à la question.
Bryce
1

Aucune des réponses ci-dessus n'inclut toutes les étapes. Je devais effectuer les étapes suivantes pour obtenir un accès non root aux broches GPIO. Je devais créer un nouveau groupe, ajouter mon utilisateur à ce groupe, puis modifier les autorisations (comme dans les messages précédents).

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
la source
1

Si vous construisez dans geany, changez simplement les commandes de construction.

Les commandes Java à compiler doivent être

sudo pi4j --compile "%f"

et la commande execute devrait être

sudo pi4j --run "%e" 
Francesca Bannister
la source