我在这里获取了 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 和我的项目可以在受控的隔离虚拟环境中运行!gpio
sudo
几天后,登录运行程序,程序失败。结果/dev/gpiomem
又恢复了root root
。
我的问题是 A)有没有更好的方法让 ubuntu 访问/dev/gpiomem
B)有没有办法确保组保持不变(假设 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