Я взял образ для Ubuntu на Raspberry PI здесь https://ubuntu.com/download/raspberry-pi загрузил программу Python L928N через virtualenv в качестве ubuntu пользователь и получил ошибку. Я немного покопался, и некоторые тесты показали, что группа ubuntu не может получить доступ к / dev / gpiomem
, который принадлежит root root
. Таким образом, у меня остался вариант: запустить мою программу python как root, но тогда virtualenv на самом деле не изолировал мои программы. Оказалось, что sudo
извлекает все из глобальной настройки python root. Видя, как я запускаю пару проектов на Raspberry Pi, у которых они перекрываются, у меня могут возникнуть ночи разочарования, пытаясь понять, почему что-то сломалось (когда депо обновляется для одного проекта, а не для другого).
Итак, я создал / dev / gpiomem
группу gpio
, в которую входит пользователь ubuntu. Viola python, pip, virtualenv и мой проект работали без sudo
в управляемом изолированном virtualenv!
Теперь, через пару дней, запустите программу, и она не работает. Оказывается, / dev / gpiomem
вернулся к root root
.
У меня есть следующие вопросы: A) есть ли лучший способ предоставить ubuntu доступ к / dev / gpiomem
B) есть ли способ гарантировать, что группа останется прежней (при условии, что A - нет).
Я только что столкнулся с этим. Я добавил группу gpio и добавил root и моего пользователя в эту группу. Затем я скопировал правило udev 99-com.rules из образа raspbian. Перезагружаемся и все работает. Я вставил сюда файл правил для полноты картины. Вот как это делает фонд, поэтому он должен быть правильным. ;)
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 \
Нет необходимости добавлять эти правила вручную.
sudo apt install rpi.gpio-common
В Ubuntu вместо группы gpio добавьте пользователя в группу dialout
, чтобы получить доступ к контактам GPIO.
(Это задокументировано в файле /usr/share/doc/rpi.gpio-common/README.Debian
, который устанавливается пакетом rpi.gpio-common
. )
Как указал 4xy, установка пакета rpi.gpio-common
установит правила udev.
Мне пришлось перезагрузить Pi после установки rpi.gpio-common
и добавления моего пользователя в группу dialout
, после чего я смог получить доступ к контактам GPIO как обычно. Пользователь.
Подводя итог:
sudo apt install rpi.gpio-common
sudo adduser "${USER}" dialout
sudo reboot