Raspberry PI 的 GPIO 组

Raspberry PI 的 GPIO 组

我在这里获取了 Raspberry PI 上的 Ubuntu 图像https://ubuntu.com/download/raspberry-pi通过虚拟环境以 ubuntu 用户身份加载 L928N python 程序,出现错误。经过一番挖掘和测试,结果发现是 ubuntu 组无法访问,/dev/gpiomem属于root root

因此,我剩下的选择是以 root 身份运行我的 python 程序,但 virtualenv 并没有真正隔离我的程序。它似乎sudo从 root 的全局 python 设置中提取了所有内容。当我在 raspberry pi 上运行几个项目时,如果让它们重叠,我会沮丧地度过几个晚上,试图理解为什么会出现问题(当 dep 为一个项目更新而另一个项目没有更新时)。

所以我创建了一个 ubuntu 用户所属的/dev/gpiomem组。Viola python、pip、virtualenv 和我的项目可以在受控的隔离虚拟环境中运行!gpiosudo

几天后,登录运行程序,程序失败。结果/dev/gpiomem又恢复了root root

我的问题是 A)有没有更好的方法让 ubuntu 访问/dev/gpiomemB)有没有办法确保组保持不变(假设 A 为否)。

答案1

在 Ubuntu 上,不要将用户添加到 gpio 组,而是将其添加到该dialout组,以便您可以访问 GPIO 引脚。

(这记录在包/usr/share/doc/rpi.gpio-common/README.Debian安装的文件中rpi.gpio-common。)

正如 4xy 指出的那样,安装该rpi.gpio-common软件包将设置 udev 规则。

rpi.gpio-common安装并将我的用户添加到组后,我必须重新启动我的 Pi dialout,然后我才能以普通用户的身份访问 GPIO 引脚。


综合起来:

sudo apt install rpi.gpio-common
sudo adduser "${USER}" dialout
sudo reboot

答案2

我刚刚遇到了这个问题。我添加了组 gpio,并将 root 和我的用户添加到该组。然后我从 raspbian 映像中复制了 udev 规则 99-com.rules。重新启动后一切正常。我已将规则文件粘贴到这里以保证完整性。这是基金会的做法,所以一定是正确的。;)

SUBSYSTEM=="input", GROUP="input", MODE="0660"
SUBSYSTEM=="i2c-dev", GROUP="i2c", MODE="0660"
SUBSYSTEM=="spidev", GROUP="spi", MODE="0660"
SUBSYSTEM=="bcm2835-gpiomem", GROUP="gpio", MODE="0660"

SUBSYSTEM=="gpio", GROUP="gpio", MODE="0660"
SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c '\
        chown -R root:gpio /sys/class/gpio && chmod -R 770 /sys/class/gpio;\
        chown -R root:gpio /sys/devices/virtual/gpio && chmod -R 770 /sys/devices/virtual/gpio;\
        chown -R root:gpio /sys$devpath && chmod -R 770 /sys$devpath\
'"

KERNEL=="ttyAMA[01]", PROGRAM="/bin/sh -c '\
        ALIASES=/proc/device-tree/aliases; \
        if cmp -s $ALIASES/uart0 $ALIASES/serial0; then \
                echo 0;\
        elif cmp -s $ALIASES/uart0 $ALIASES/serial1; then \
                echo 1; \
        else \
                exit 1; \
        fi\
'", SYMLINK+="serial%c"

KERNEL=="ttyS0", PROGRAM="/bin/sh -c '\
        ALIASES=/proc/device-tree/aliases; \
        if cmp -s $ALIASES/uart1 $ALIASES/serial0; then \
                echo 0; \
        elif cmp -s $ALIASES/uart1 $ALIASES/serial1; then \
                echo 1; \
        else \
                exit 1; \
        fi \

答案3

无需手动添加这些规则。

sudo apt install rpi.gpio-common

相关内容