Linux,Unix,BSD

[ROCK5b] python - "Exporting GPIO: Permission denied" error

채윤아빠 2023. 12. 27. 09:38
728x90
반응형

문제점 및 증상

ROCK5b 보드에서 파이썬으로 GPIO를 다루는 간단한 예제를 다음과 같이 작성하였습니다.

from periphery import GPIO

from time import sleep


LED_Pin = 105 # pin 36 of 40pin header
gpio105 = GPIO(LED_Pin, "out")

while True:
    try:
        gpio105.write(True)
        print("LED ON!")
        sleep(1)
        gpio105.write(False)
        print("LED OFF!")
        sleep(1)
    except KeyboardInterrupt:
        gpio105.write(False)
        print("User keyboard interrupted!!!")
        break
    except Exception as e:
        print(f"error: {e}")

gpio105.close()

위 소스를 실행하면 다음과 같이 "periphery.gpio.GPIOError: [Errno 13] Exporting GPIO: Permission denied" 오류가 발생하였습니다.

Exception has occurred: GPIOError
[Errno 13] Exporting GPIO: Permission denied
PermissionError: [Errno 13] Permission denied: '/sys/class/gpio/export'

During handling of the above exception, another exception occurred:

  File "/home/hanwh/python/demo/gpio_pin5.py", line 13, in 
    gpio115 = GPIO(LED_Pin, "out")
periphery.gpio.GPIOError: [Errno 13] Exporting GPIO: Permission denied

해결 방안

가장 손쉬운 해결 방은은 프로그램을 "root" 권한으로 실행하는 것입니다. 하지만, 보안 상의 문제로 무조건 "root" 권한을 부여하여 실행할 수가 없었습니다.

그래서 이런 저런 방법을 찾던 중에, https://stackoverflow.com/questions/46535003/ 를 참고하여 GPIO용 udev rules 파일 작성하고, 재부팅하여 문제를 해결하였습니다.

$ sudo vi /etc/udev/rules.d/30-rock5b.gpio-common.rules

DRIVER=="rockchip-gpio", KERNEL=="*.gpio", GROUP="dialout", MODE="0660"
SUBSYSTEM=="gpio", KERNEL=="gpiochip*", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:dialout /sys/class/gpio/export /sys/class/gpio/unexport ; chmod 220 /sys/class/gpio/export /sys/class/gpio/unexport'"
SUBSYSTEM=="gpio", KERNEL=="gpio*", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:dialout /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value ; chmod 660 /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value'"

그리고 GPIO를 이용하는 계정을 "dialout" 그룹에 포함시킨 뒤에, 파이썬 프로그램을 실행하면 권한문제 없이 GPIO를 제어할 수 있습니다.

$ sudo usermod -a -G dialout $USER

참고자료