はじめに
お疲れ様です。秋並です。
ラズパイ+ubuntuでRPi.GPIO
を使用してpythonコードを実行しようとすると、RuntimeError: No access to /dev/mem. Try running as root!
と表示されるため、
sudo python3 ****.py
と sudo
をつけないと実行できません。
わざわざ sudo
を付けなくてはいけないのは面倒なので、sudo
なしでRPi.GPIO
を使用する方法を紹介します。
以下の環境で動作確認しました。
- デバイス:Raspberry Pi4 ModelB 4GB
- OS : ubuntu Desktop 22.04.3 LTS (64bit)
RPi.GPIO
パッケージのインストール
最初に、RPi.GPIO
パッケージをインストールしていない方は以下コマンドでインストールしてください。
sudo apt update -y && sudo apt install -y \
python3-rpi.gpio
グループの追加
次に、gpioグループに[username]([username]はご自身のユーザー名に置き換えてください)を追加します。
なお、私の環境ではgpioグループ自体が存在しなかったのでgpioグループを作成したのちに、ユーザーを追加しています。
sudo groupadd gpio
sudo usermod -a -G gpio [username]
ファイルの所有者の変更
ubuntuでRPi.GPIO
を使用すると、dev/mem
というところにアクセスしようとする1のですが、dev/mem
は管理者権限がないとアクセスできない(=sudo
を付けないといけいない)ようになっています。
そこで、管理者権限がなくてもアクセスできるdev/gpiomem
に所有者を変更します。
sudo chown root.gpio /dev/gpiomem
/dev/gpiomemの権限を変更
デフォルトの/dev/gpiomem
の権限では、sudo
なしで実行できないので権限を変更します。
sudo chmod a+rw /dev/gpiomem
udevルールの追加
上記の方法で、sudo
なしでRPi.GPIO
を使用することが出来るのですが、この場合、毎回「ファイルの所有者の変更」「/dev/gpiomemの権限を変更」のコマンドを入力する必要がでてくるため、少し面倒です。
そこで、udevルールファイルと呼ばれるファイルに上記2種類のコマンドに相当するルールを記述することで、毎回コマンドを打たなくてもよいようにします。
ルールファイルを作成します。
sudo nano /etc/udev/rules.d/99-gpiomem.rules
以下の内容をファイルに記述し、保存します。
KERNEL=="gpiomem", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:gpio /dev/gpiomem'"
KERNEL=="gpiomem", GROUP="gpio", MODE="0666"
ルールを反映させます。
sudo udevadm control --reload-rules
sudo udevadm trigger
ルールを反映させたら、ラズパイを再起動します。
これで、sudoなしでもRPi.GPIO
を使用したpythonファイルが実行できるようになっているはずです。
最後に
今回は、ubuntu+ラズパイでsudoなしでGPIOを使う方法を紹介しました。
私は、ROSを使うのでラズパイでubuntuが使用できるのは非常に便利なのですが、RaspberryPi OSと比較すると追加で必要な設定が結構多く、設定周りで詰まることが多いです。
個人的には、環境構築で時間が取られるのはもったいないと思っているので、この記事が少しでも皆さんの参考になれば幸いです。
-
RaspberryPi OSは何もしなくても
dev/gpiomem
にアクセスされるっぽいのですが、ubuntuはデフォルトではdev/mem
にアクセスされてしまいます。 ↩