天天看點

樹莓派ubuntu系統RPi引腳庫權限問題 不使用sudo操控RPi庫方法

樹莓派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'"