はじめに
お疲れ様です。秋並です。
ラズパイ+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にアクセスされてしまいます。 ↩