루트없이 GPIO 핀에 액세스하십시오. / dev / mem에 액세스 할 수 없습니다. 루트로 실행 해보십시오!


33

RPi.GPIO 라이브러리를 사용하여 파이썬 스크립트를 만들었습니다. 루트없이 실행해야하지만 "python ./script.py"로 실행할 때이 오류가 발생합니다.

No access to /dev/mem. Try running as 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!

루트로 실행하면 작동합니다.


sudo adduser my_new_user gpio는 정확하지만 그룹 멤버십을 업데이트하려면 다시 로그인해야하므로 로그 아웃했다가 다시 로그인해야합니다.
Blindfreddy

답변:


48

루트 사용자가 아닌 사용자로 RPi.GPIO를 사용하려면 Raspbian을 실행해야하며 아마도 jessie 여야합니다.

않는 /dev/gpiomem존재 하는가? 그렇다면 RPi.GPIO는이 장치를 사용하여 GPIO에 액세스해야합니다. /dev/gpiomem존재하지 않는 경우 다음을 시도하십시오.

sudo rpi-update

최신 커널을 사용하고 있는지 확인하십시오.

sudo apt-get update
sudo apt-get upgrade

최신 RPi.GPIO를 사용하고 있는지 확인하십시오.

또한 gpio그룹 의 구성원인지 확인해야합니다 .

sudo adduser pi gpio

추가 편집

Raspbian 시스템은 유동 상태 인 것으로 보입니다. 그것이 Raspbian 또는 raspberrypi.org 문제인지 확실하지 않습니다.

/ dev / gpiomem에 올바른 권한이 있는지 확인하십시오.

$ ls -l /dev/gpiomem
crw-rw---- 1 root gpio 244, 0 Dec 28 22:51 /dev/gpiomem

그렇지 않으면 다음과 같이 올바른 권한을 설정하십시오

sudo chown root.gpio /dev/gpiomem
sudo chmod g+rw /dev/gpiomem

4
그래도 작동이 안되는. 모든 것이 업데이트되고 / dev / gpiomem이 존재하며 사용자를
gpio

3
@JoeyCK : 그룹 멤버쉽을 변경해도 이미 실행중인 프로세스에는 영향을 미치지 않습니다. id쉘의 현재 그룹을 나열하기 위해 실행 하고, gpio나열되지 않으면 다시 로그인하거나 재부팅하십시오.
deltab

@JoeyCK RPi.GPIO는 어떤 버전을보고합니까?
joan

@joan 버전 0.5.11
JoeyCK

1
@mjwittering Raspbian은 Pi에서 더 잘 지원 될 것입니다. Ubuntu를 선호한다면 부팅 할 때마다 변경 사항을 적용해야합니다. crontab의 부팅 스크립트 또는 재부팅 항목을 사용하여 자동으로 수행 할 수 있습니다.
joan

7

나는이 문제를 즉시 가지고 있었고 이것으로 해결했다.

sudo adduser my_new_user gpio

이를 통해 "my_new_user"사용자가 gpio 그룹에 추가되므로 gpio 그룹의 모든 사용자가 GPIO 핀에 액세스 할 수 있습니다.


1
/ dev / gpiomem을 의미합니다 (/ dev / mem 아님).
joan

둘 다 실제로 / dev를 살펴보면 두 장치가 모두 존재하고 질문 주제는 / dev / mem에 관한 것입니다.
Иван Андреевич Черногоров

1
아니요. 그룹 gpio의 구성원은 / dev / mem에 액세스 할 수 없습니다.
joan

오른쪽 kmkm 회원, 솔루션은 다음과 비슷합니다
Иван Андреевич Черногоров

2
알았지 만 요점은 안전하고 루트가없는 GPIO에 대한 액세스를 제공하는 것입니다. kmem을 그룹화하기 위해 사용자를 추가하는 것은 안전하지 않으며 GPIO에 액세스 할 수 없습니다.
joan

5

나는 이것에 대답 할 수있다.

sudo chown root.gpio /dev/mem

이것은의 소유자 및 그룹 변경 /dev/memroot하고 gpio각각을.

sudo chmod g+rw /dev/mem

그런 다음 그룹에이 /dev/mem개체에 대한 읽기 권한을 부여 합니다.

/dev/mem객체는 기본적으로 시스템의 전체 메모리 공간입니다. 이는 이제 그룹 gpio과 그룹의 모든 사람이 메모리 공간을 읽고 쓸 수 있음을 의미합니다 .

이제 메모리 공간에는 CPU 레지스터를 포함하여 많은 것들이 있습니다. GPIO 핀을 토글하면 이러한 레지스터 중 하나에서 비트가 변경됩니다. 키커는 올바르게 수행해야합니다. 그렇지 않으면 시스템에 나쁜 일이 발생할 수 있습니다.

전체 메모리 공간을 보호하기 위해 GPIO 비트로 작업하는 데 필요한 메모리 부분 만 매핑됩니다 /dev/gpiomem. 이는 사실상 나머지 메모리 공간이 액세스되지 않도록 마스크 / 차폐하며 GPIO 비트 만 액세스 할 수 있도록합니다. 이를 통해 GPIO 메모리 주소에 액세스 할 수 있으며 현재 다른 프로그램에서 사용중인 메모리와 같은 메모리의 다른 부분은 허용되지 않습니다.

실제로, 이것은 보안 및 시스템 안정성 보호 모두에서 GPIO 항목 및 나머지 메모리에 대한 액세스를 허용하지만 Pi가 구성원 인 GPIO 그룹의 사용자에게만 허용됩니다.

미래에는 bcm2835라이브러리와 같은 드라이버 wiringPi가 더 많이 업데이트되고 (일부 업데이트가 이미 진행 중임) 해당 도구를 기반으로 구축 된 앱이 추가로 업데이트 된 후 향후이 GPIO의 모든 번거 로움이 사라지다.

그때까지 두 가지 선택을 할 수있을 때까지 읽기 / 쓰기로 /dev/memto 그룹 gpio을 열거 나 root로 실행하십시오.이 루트는 모두에 대한 전체 읽기 쓰기를 갖습니다 /dev/mem.

이해가 되길 바랍니다.

현재로 계속 실행해야하는 몇 가지 문제가 여전히 있습니다 root. 예를 들어, BCM2835에 node-red-contrib-dht-sensor의존 하는 모듈을 사용합니다 node-dht-sensor. 그것은 사용-결함에 세그먼트 /dev/gpiomem에 하나 아직도 약간의 버그가로 node-dht-sensor또는에서 /dev/gpiomem또는 길들이 함께 노력하고 있습니다. 어떤 경우인지 모르겠지만 결국에는 해결 될 것입니다. BCM2835가 '비 루트'로 실행되고 /dev/gpiomem존재하는 경우 /dev/gpiomem대신 대신 사용하려고 /dev/mem하므로 /dev/memto 그룹을 여는 gpio것이 도움이되지 않습니다. 버머.


1

터미널에서 다음 명령을 사용하십시오.

sudo chown root.gpio /dev/mem && sudo chmod g+rw /dev/mem

2
이 명령이 무엇을하는지, 왜 joan의 대답 과 다른지 설명 할 수 있습니까? 차이점은 무엇이며 /dev/mem그리고 /dev/gpiomem?
Greenonline

당신이 사용자가 변경할 수없는 경우, 조안의 답변을 사용하는 것이 좋습니다 수있는 경우 /dev/mem/dev/gpiomem이 사용하는 당신에게 동일한 권한을 얻을 것이다 /dev/mem당신이 가지고/dev/gpiomem
NATIM

보다 외과적인 접근이 질문에 대답 할 때 모든 / dev / mem에 대한 액세스를 제공하는 것은 안전하지 않습니다.
브라이스

1

위의 답글에 모든 단계가 포함되어 있지 않습니다. GPIO 핀에 루트가 아닌 액세스 권한을 얻으려면 다음 단계를 완료해야합니다. 새 그룹을 생성하고이 그룹에 사용자를 추가 한 다음 이전 게시물과 같이 권한을 변경해야했습니다.

sudo groupadd gpio
sudo usermod -a -G gpio user_name
sudo grep gpio /etc/group
sudo chown root.gpio /dev/gpiomem
sudo chmod g+rw /dev/gpiomem

1

geany에서 빌드하는 경우 빌드 명령을 변경하십시오.

컴파일 할 Java 명령은

sudo pi4j --compile "%f"

실행 명령은

sudo pi4j --run "%e" 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.