ルートなしでGPIOピンにアクセスします。/ dev / memにアクセスできません。ルートとして実行してみてください!


34

RPi.GPIOライブラリを使用してPythonスクリプトを作成しました。ルートなしで実行する必要がありますが、「python ./script.py」で実行するとこのエラーが発生します。

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

ライブラリの最新バージョンでrootが不要になったことを多くの場所で読みましたが、更新後もエラーが発生します。私が持っているバージョンはRPi.GPIO 0.6.0a3です

コードは次のとおりです。

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)

そして完全なエラー:

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!

ルートとして実行すると動作します。


sudo adduser my_new_user gpioは正しいですが、グループメンバーシップを更新するにはアクティブにするには再ログインが必要なので、ログアウトしてから再度ログインすることを忘れないでください。
ブラインドフレディ

回答:


49

非ルートユーザーとしてRPi.GPIOを使用するには、おそらくRaspbianを実行する必要があります。おそらくjessieである必要があります。

ない/dev/gpiomem存在?その場合、RPi.GPIOはこのデバイスを使用してGPIOにアクセスする必要があります。もしは/dev/gpiomem試して存在しません。

sudo rpi-update

最新のカーネルを使用していることを確認するため、および

sudo apt-get update
sudo apt-get upgrade

最新のRPi.GPIOを使用していることを確認してください。

また、gpioグループのメンバーであることを確認する必要があります。

sudo adduser pi gpio

追加するように編集されました

Raspbianシステムは流動的な状態にあるようです。それがRaspbianなのか、それとも(おそらく)raspberrypi.orgの問題なのかわかりません。

/ dev / gpiomemに正しい権限があることを確認してください。

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

そうでない場合は、次のように正しい権限を設定します

sudo chown root.gpio /dev/gpiomem
sudo chmod g+rw /dev/gpiomem

4
まだ動かない。すべては、更新されたの/ dev / gpiomem存在し、私はそれはそれはすでにメンバーだと言うGPIOグループにユーザーを追加しようとする
JoeyCK

3
@JoeyCK:グループメンバーシップを変更しても、既に実行されているプロセスには影響しません。実行idしてシェルの現在のグループをリストし、リストされてgpioいない場合は、再度ログインするか、再起動します。
deltab

@JoeyCK RPi.GPIOによって報告されるバージョンは何ですか?
ジョアン

@joanバージョン0.5.11
JoeyCK

1
@mjwittering Raspbianは常にPiでより適切にサポートされます。Ubuntuを好む場合は、ブートごとに変更を適用する必要があります。ブートスクリプトまたはcrontabの再起動エントリを使用して、自動的に実行できます。
ジョアン

7

私はすぐにこの問題を抱えており、これで解決しました:

sudo adduser my_new_user gpio

これにより、ユーザー「my_new_user」がgpioグループに追加されるため、gpioグループ内のすべてのユーザーがGPIOピンにアクセスできます。


1
/ dev / gpiomemを意味します(/ dev / memではありません)。
ジョアン

あなたに見れば両方実際には、/ dev you'll両方のデバイスが存在し、質問のトピックでは、/ dev / memの程度であったことがわかり
ИванАндреевичЧерногоров

1
いいえ。グループgpioのメンバーは/ dev / memにアクセスできません。
ジョアン

右のkmemのメンバーは、次いで、この溶液をsimmilarあるん
ИванАндреевичЧерногоров

2
わかりましたが、ポイントはGPIOへの安全でルートレスなアクセスを与えることです。グループkmemにユーザーを追加することは安全ではなく、GPIOにアクセスできません。
ジョアン

5

これに答えることができます。

sudo chown root.gpio /dev/mem

これは、の所有者とグループに変更/dev/memするとrootし、gpioそれぞれます。

sudo chmod g+rw /dev/mem

次に、グループにこの/dev/memオブジェクトへの読み取り書き込みアクセス権を付与します。

/dev/memオブジェクトは、基本的には、システム上の全メモリ空間です。これは、グループgpioとその中の全員がメモリスペースの読み取りと書き込みができるようになったことを意味します。

現在、メモリ空間には、CPUレジスタを含む多くのものがあります。GPIOピンを切り替えると、これらのレジスタのいずれかのビットが変更されます。キッカーは、あなたがそれを正しく行うか、システムに悪い悪いことが起こることを確認する必要があります。

メモリ空間全体を保護するために、GPIOビットを使用して作業する必要があるメモリ部分のみをマップするパワー /dev/gpiomem。これは事実上、メモリ空間の残りの部分がアクセスされないようにマスク/シールドし、GPIOビットへのアクセスのみを許可します。これにより、GPIOメモリアドレスへのアクセスが許可され、現在他のプログラムで使用されているメモリなど、メモリの他の部分が許可されなくなります。

事実上、これはセキュリティとシステム安定性の両方の保護に穴を開け、GPIOスタッフとメモリの残りへのアクセスを許可しますが、PiがメンバーであるグループGPIOのユーザーのみにアクセスできます。

将来的には、bcm2835ライブラリやwiringPiさらに更新され(一部の更新は既に行われています)、これらのツールの上に構築されたアプリはさらに更新され、将来的には、このGPIOのすべてが面倒になります姿を消す。

それまでは2つの選択肢があり、/dev/memtoグループgpioを読み取り/書き込みとして開くか、rootとして実行し/dev/memます。

それが理にかなっていることを願っています。

現在、まだ実行する必要があるいくつかの問題がまだありますroot。たとえば、BCM2835に依存するにnode-red-contrib-dht-sensor依存するモジュールを使用しますnode-dht-sensor/dev/gpiomemいくつかのバグがまだあるか、node-dht-sensorまたは/dev/gpiomemそれらが一緒に動作しているため、セグメンテーションエラーが発生します。どちらが当てはまるかはわかりませんが、最終的には解決します。BCM2835が「非ルート」として実行され、/dev/gpiomem存在する場合、の/dev/gpiomem代わりに使用しようとする/dev/memため、/dev/memtoグループを開くgpioことは役に立ちません。残念。


1

ターミナルで次のコマンドを使用します。

sudo chown root.gpio /dev/mem && sudo chmod g+rw /dev/mem

2
このコマンドが何をするのか、そしてなぜそれがjoanの答えと異なるのかについて説明してください 違いは何である/dev/memとは/dev/gpiomem
Greenonline

あなたはそれはあなたが変更できない場合は、ジョアンの答えを使用することをお勧めしますができれば/dev/mem/dev/gpiomem、この使用にあなたに同じ権限を取得する/dev/memあなたが持っていること/dev/gpiomem
Natim

より外科的なアプローチが質問に答える場合、すべての/ dev / memへのアクセスを提供することは安全ではありません。
ブライス

1

上記の返信には、すべてのステップが含まれていません。GPIOピンへの非ルートアクセスを取得するには、次の手順を完了する必要がありました。新しいグループを作成し、ユーザーをこのグループに追加してから、アクセス許可を変更する必要がありました(以前の投稿と同様)。

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

1

geanyでビルドする場合は、ビルドコマンドを変更するだけです。

コンパイルするJavaコマンドは

sudo pi4j --compile "%f"

実行コマンドは

sudo pi4j --run "%e" 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.