Я сделал скрипт на Python, используя библиотеку RPi.GPIO. Мне нужно запустить его без рута, но я получаю эту ошибку при запуске с "python ./script.py":
No access to /dev/mem. Try running as root!
Я читал во многих местах, что вам больше не нужен root с последней версией библиотеки, но я все равно получаю сообщение об ошибке после обновления. У меня есть версия RPi.GPIO 0.6.0a3
Вот код:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(18,GPIO.OUT)
print "LED on"
GPIO.output(18,GPIO.HIGH)
time.sleep(1)
print "LED off"
GPIO.output(18,GPIO.LOW)
И полная ошибка:
pi@raspberrypi ~/Desktop/python $ python ./sensors.py
Traceback (most recent call last):
File "./sensors.py", line 5, in <module>
GPIO.setup(18,GPIO.OUT)
RuntimeError: No access to /dev/mem. Try running as root!
Когда я запускаю его как root, он работает.
Ответы:
Возможно, вам нужно запустить Raspbian, чтобы использовать RPi.GPIO от имени пользователя, не являющегося пользователем root, возможно, это должна быть и Джесси.
Существует
/dev/gpiomem
? В этом случае RPi.GPIO должен использовать это устройство для доступа к GPIO. Если/dev/gpiomem
не существует, попробуйте:чтобы убедиться, что вы используете последнее ядро, и
чтобы убедиться, что вы используете недавний RPi.GPIO.
Вам также необходимо убедиться, что вы являетесь членом
gpio
группы:ИЗМЕНЕНО ДЛЯ ДОБАВЛЕНИЯ
Система Распбиана, кажется, находится в состоянии изменения. Я не уверен, что это проблема Raspbian или (более вероятно) raspberrypi.org.
Убедитесь, что / dev / gpiomem имеет правильные разрешения.
Если это не так, установите правильные разрешения следующим образом
источник
id
чтобы увидеть список текущих групп вашей оболочки, и, если ихgpio
нет в списке, войдите в систему или перезагрузите компьютер.У меня была эта проблема сразу и решил именно с этим:
При этом пользователь «my_new_user» добавляется в группу gpio, поэтому все пользователи в группе gpio могут получить доступ к контактам GPIO.
источник
Я могу ответить на это.
Это меняет владельца и группу
/dev/mem
наroot
иgpio
соответственно.затем дает группе право на чтение и запись для этого
/dev/mem
объекта./dev/mem
Объект в основном все пространство памяти в системе. Это означает, что теперь группаgpio
, и все в ней, могут читать и записывать в область памяти.Теперь в пространстве памяти много вещей, включая регистры процессора. Когда вы переключаете контакты GPIO, вы меняете немного в одном из этих регистров. Важно то, что вы должны быть уверены, что делаете все правильно, иначе с вашей системой могут случиться плохие вещи.
Чтобы помочь защитить все пространство памяти, мощности, которые должны быть сопоставлены только частям памяти, с которыми нам нужно работать с битами GPIO
/dev/gpiomem
. Это фактически маскирует / экранирует остальную часть пространства памяти от доступа и позволяет только доступ к битам GPIO. Это обеспечивает доступ к адресам памяти GPIO и запрещает любые другие части памяти, например, память, используемую в настоящее время любыми другими программами.По сути, это пробивает дыры в защите как безопасности, так и стабильности системы, чтобы разрешить доступ к компонентам GPIO, а также к остальной памяти, но только пользователям группы GPIO, членом которой является Пи.
В будущем драйверы, такие как
bcm2835
библиотека,wiringPi
будут обновляться чаще (некоторые обновления уже происходят), а приложения, построенные на основе этих инструментов, будут обновляться, а затем в будущем, будем надеяться, что все эти проблемы GPIO будут выполняться как root. исчезают.До тех пор у вас есть два варианта: открыть группу
/dev/mem
to сgpio
правами чтения / записи или запустить с правами суперпользователя, которая имеет полное чтение и запись для всех/dev/mem
.Надеюсь, что это имеет смысл.
В настоящее время все еще есть много проблем, по которым вам все еще нужно работать как
root
. Например, используяnode-red-contrib-dht-sensor
модуль, который зависит от тогоnode-dht-sensor
, который зависит от BCM2835. Он обнаруживает неисправности, используя/dev/gpiomem
некоторые ошибки, как внутри, такnode-dht-sensor
и внутри,/dev/gpiomem
или способ, которым они работают вместе. Я не знаю, в чем дело, но со временем все получится. Когда BCM2835 работает как «не-root» и/dev/gpiomem
существует, он пытается использовать/dev/gpiomem
вместо/dev/mem
, поэтому открытие/dev/mem
группыgpio
не помогает. Облом.источник
Просто используйте следующую команду в терминале:
источник
/dev/mem
и/dev/gpiomem
?/dev/mem
его,/dev/gpiomem
вы получите то же разрешение на использование,/dev/mem
что и у вас/dev/gpiomem
Ни один из ответов выше не включает все этапы. Мне нужно было выполнить следующие шаги, чтобы получить не-root доступ к выводам GPIO. Мне пришлось создать новую группу, добавить своего пользователя в эту группу, а затем изменить разрешения (как в предыдущих сообщениях).
источник
Если вы строите в geany, просто измените команды сборки.
Команды Java для компиляции должны быть
и команда execute должна быть
источник