樹莓派ubuntu系統RPi引腳庫權限問題 不使用sudo操控RPi庫方法
- 前言
- 一 、ubuntuRPi引腳庫權限問題
- 二、解決方法
- 總結
在使用樹莓派進行人臉識别雲台追蹤時遇見RPI庫和opencv不相容問題,于是提供一種不适應管理者權限操控rpi庫的方法
樹莓派雲台追蹤部落格:樹莓派雲台追蹤
因為筆者也是第一次在樹莓派上使用ubuntu鏡像 還是最新版,是以在編寫代碼時先對不同功能進行分塊測試。
1矯正舵機
這裡需要下載下傳RPi.GPIO庫并使用pwm控制舵機。
下載下傳完畢後在運作檔案時如果使用指令
pyrhon3 filename
會出現RPi.GPIO權限不夠問題 如果使用
sudo pyrhon3 filename
則可正常使用
2使用opencv測試攝像頭功能(僅僅打開攝像頭并顯示)
如果運作檔案時使用指令
sudo pyrhon3 filename
會出現找不到視訊的問題
如果使用
pyrhon3 filename
問題來了 當代碼融合後 這就無法使用,不管采用哪個指令都會報錯,于是在查閱資料後找到了一種不使用管理者權限操控RPi.GPIO庫的方法。
實際上 Raspbian上的Rpi.GPIO庫是可以在普通使用者下控制樹莓派的GPIO的,然而在ArchlinuxARM下,卻需要root使用者才行這就引起了沖突。
好在RPi.GPIO提供了一個擷取權限的腳本:create_gpio_user_permissions.py
然而這個腳本是沒法在ArchlinuxARM上直接運作的,因為Archlinux缺少adduser指令。
腳本如下
import grp
import subprocess
def ensure_gpiogroup():
try:
grp.getgrnam('gpio')
except KeyError:
print('GPIO group does not exist - creating...')
subprocess.call(['groupadd', '-f', '-r', 'gpio'])
subprocess.call(['adduser', 'pi', 'gpio'])
# in future, also for groups:
# spi
# i2c
add_udev_rules()
def add_udev_rules():
with open('/etc/udev/rules.d/99-gpio.rules','w') as f:
f.write("""SUBSYSTEM=="bcm2835-gpiomem", KERNEL=="gpiomem", GROUP="gpio", MODE="0660"
SUBSYSTEM=="gpio", KERNEL=="gpiochip*", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:gpio /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:gpio /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'"
""")
if __name__ == '__main__':
ensure_gpiogroup()
那麼我們手動執行腳本就行。
(以下指令請在終端操作)
1
首先建一個gpio組:
groupadd -f -r gpio
2
然後把目前使用者加入到gpio組
(如果你沒有建立過使用者,username就是pi)
gpasswd -a username gpio
然後建立udev的規則檔案:/etc/udev/rules.d/99-gpio.rules
進入目錄下
cd /etc/udev/rules.d/
然後建立一個名為99-gpio.rules的檔案
touch 99-gpio.rules
記得給它權限
sudo chmod +777 99-gpio.rules
SUBSYSTEM=="bcm2835-gpiomem", KERNEL=="gpiomem", GROUP="gpio", MODE="0660"
SUBSYSTEM=="gpio", KERNEL=="gpiochip*", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:gpio /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:gpio /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'"