WiringPi2 for Python でLチカ (without sudo)


注意:電子工作素人の記事です

Raspberry Pi Model B+のGPIOをブラウザから操作できるようにするという目的のための関連記事一覧

  1. Raspberry PiにWiringPiをインストール
  2. Raspberry PiにWiringPi2 for Pythonをインストール
  3. WiringPi2 for Python でピンの指定
  4. WiringPi2 for Python でLチカ (with sudo)
  5. 今回 > WiringPi2 for Python でLチカ (without sudo)
  6. WiringPi2 for Python + CGIHTTPServer でLチカ
  7. WiringPi2 for Python + PWM + non-root
  8. WiringPi + CGIHTTPServer + PWM

注意

  • WiringPiがインストールされていること。
  • pythonスクリプトからはGPIOピンの使用有無は制御できません。
  • 事前準備としてsudoで__使用したいGPIOピン__に対してゴニョゴニョして使えるようにします。
  • wiringPiSetupSys()でセットアップすること。
  • python3で動きません。

作業内容

  • シェルスクリプト(set_gpio_pins.sh)を作成
  • set_gpio_pins.shのパーミッションを変更
  • シェルスクリプト実行
  • Lチカ (without sudo)
  • Lチカ (without sudo) 失敗するスクリプト

使いたいGPIOピンをsudoなしで利用可能な状態にする

$
$ nano set_gpio_pins.sh

$
$ chmod 744 set_gpio_pins.sh

$
$ sudo ./set_gpio_pins.sh

$
$ python wiringpi2test_without_sudo.py

$
$ python wiringPi2test_without_sudo_err.py
Segmentation fault


使用する(出力にする)PINのGPIO番号をpinsに指定すること

set_gpio_pins.sh

#!/bin/bash

# set GPIO pin numbers
# e.g. pins=( 18 22 24 ) # use GPIO18,GPIO22,GPIO24
pins=( 18 22 24 )

for pin in ${pins[@]}; do
   /usr/local/bin/gpio export $pin out
   chown -R www-data:pi /sys/devices/virtual/gpio/gpio$pin
   chmod -R g+w /sys/devices/virtual/gpio/gpio$pin
done


動くコード

GPIOのピン番号の指定方法は選べません。wiringPiSetupSys()のみ。

  • ng -> WiringPi番号 -> wiringPiSetup()
  • ng -> GPIO番号 -> wiringPiSetupGpio()
  • ng -> Pin番号 -> wiringPiSetupPhys()
  • OK -> GPIO番号 -> wiringPiSetupSys()
wiringPi2test_without_sudo.py


import time
import wiringpi2 as pi
from multiprocessing import Process

def f(i):
        status = 1
        if 1 == pi.digitalRead(18) : # GPIO18
                status = 0

        print status
        pi.digitalWrite(18,status)   # GPIO18

if __name__ == '__main__':
        pi.wiringPiSetupSys()

        for num in range(10):
                Process(target=f, args=(num,)).start()
                time.sleep(0.5)

動かないコード(GPIOがオンになるけどオフにならない)

参考サイト using wiringPi2-python (non root) segmentation fault catching for GPIO

wiringPi2test_without_sudo_err.py


import wiringpi2 as pi
pi.wiringPiSetupSys()
pi.digitalWrite(18,1) # 処理される
                      # Segmentation faultで止まる
print 9999            # 処理されない
pi.digitalWrite(18,0) # 処理されない

Written on February 1, 2015