Raspberry Pi3 GPIO 制御2

先のブログにも書いたように参考にする書籍によって使用しているGPIO制御モジュールが2種類あります。

"RPi.GPIO" と "wiringpi" 

その2つの違いは何なんでしょうか。

以前に買った書籍「電子部品ごとの制御を学べる!RaspberryPi電子工作」だと "wiringpi" が使用されており、Raspberry Pi に Raspbian をインストールすればwiringpi も含まれており何もしなくても使える、という旨の事が書いてありますが、書籍の中に紹介されているサンプルプログラムをそのまま入力して実行させてみると、この様なエラーになりました。

 

>>> %Run Raspberry_Pi3_GPIO_wiringpi.py

Traceback (most recent call last):
File "/home/pi/soc/Raspberry_Pi3_GPIO_wiringpi.py", line 4, in <module>
import wiringpi as GPIO
ImportError: No module named 'wiringpi'

 

'wiringpi'が見つからない旨のエラーメッセージなので、 綴り誤りだと思って何度も確認しましたがあっているようです(笑)
ならば、という事で'wiringpi'をインストールしてみました。

 

pi@raspberrypi:~ $ pip3 search wiringpi
ledDriver (1.0) - Python LED light strip and PWM drivers using the
WiringPi2 library.
wiringpi (2.44.4) - A python interface to WiringPi 2.0 library which allows
for easily interfacing with the GPIO pins of the
Raspberry Pi. Also supports i2c and SPI.
wiringpi2 (2.32.3) - A python interface to WiringPi 2.0 library which allows
for easily interfacing with the GPIO pins of the
Raspberry Pi. Also supports i2c and SPI

 

wiringpiとwiringpi2の違いは何?全く同じ説明が書かれてます。
違いが判りませんが版数の新しいほう wiringpi を入れてみることにしました。


pi@raspberrypi:~ $ pip3 install wiringpi
Collecting wiringpi
Downloading wiringpi-2.44.4-cp35-cp35m-linux_armv7l.whl (256kB)
100% |████████████| 266kB 803kB/s Installing collected packages: wiringpi
Successfully installed wiringpi-2.44.4
pi@raspberrypi:~ $

 

インストールは難なく成功したようなので、LEDを点灯させてみます。
5秒点灯して消灯させます。

★まずはRPi.GPIOを使う例

#Raspberry Pi3 GPIO 出力1RPi.GPIOを使う実験
#ライブラリの読み込み
import RPi.GPIO as GPIO
from time import sleep
LED_PIN = 23

#初期化
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

#出力モード設定
GPIO.setup (LED_PIN,GPIO.OUT,initial = GPIO.LOW)

#出力設定
GPIO.output (LED_PIN,GPIO.HIGH)
sleep(5)
GPIO.output (LED_PIN,GPIO.LOW)

#GPIOリセット終了
GPIO.cleanup()

 

★つぎはwiringpiを使う例

#Raspberry Pi3 GPIO 出力1wiringpiを使う実験
#ライブラリの読み込み
import wiringpi as GPIO
from time import sleep
LED_PIN = 23

#初期化
GPIO.wiringPiSetupGpio()


#出力モード設定
GPIO.pinMode (LED_PIN,GPIO.OUTPUT)

#出力設定
GPIO.digitalWrite (LED_PIN,GPIO.HIGH)
sleep(5)
GPIO.digitalWrite (LED_PIN,GPIO.LOW)

 

どちらも、ほぼ同じなのですが初期化の部分で wiringpi には、GPIO番号指定なのか物理位置番号指定なのかを宣言することや、.setwarnings のようなワーニングメッセージを抑止するようなものがありません。また、wiringpi では終るときに明確にGPIOを開放する指定が無いような気がします。それらを考えると、初心者なら wiringpi を使うよりRPi.GPIOを使った方が安全なような気がします。

 

PWMで疑似アナログ出力する場合での RPi.GPIOを使う場合とwiringpiを使う場合の違いを確認してみました。

★まずはRPi.GPIOを使う例

#Raspberry Pi3 GPIO PWM 出力 RPi.GPIOを使う実験

#ライブラリの読み込み
import RPi.GPIO as GPIO
from time import sleep

LED_PIN = 23

#初期化
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

#出力モード設定
GPIO.setup (LED_PIN,GPIO.OUT,initial = GPIO.LOW)

#出力設定
p2 = GPIO.PWM(LED_PIN,200)
p2.start(0)

try:
    while True:
        for dc2 in range(0,101,10):
            p2.ChangeDutyCycle(dc2)
            print(dc2)
            sleep(0.3)

#例外処理
except KeyboardInterrupt:
    print ( 'CTRL + C' )
    pass

p2.stop()

#GPIOリセット終了
GPIO.cleanup()

 

★続いてwiringpiを使う例

#Raspberry Pi3 GPIO PWM 出力 wiringpiを使う実験

#ライブラリの読み込み
import wiringpi as GPIO
from time import sleep

LED_PIN = 23

#初期化
GPIO.wiringPiSetupGpio()


#出力モード設定
GPIO.pinMode (LED_PIN,GPIO.OUTPUT)

#出力設定
GPIO.softPwmCreate (LED_PIN,0,100)

try:
    while True:
        for dc2 in range(0,101,10):
            GPIO.softPwmWrite(LED_PIN,dc2)
            print(dc2)
            sleep(0.3)

#例外処理
except KeyboardInterrupt:
    print ( 'CTRL + C' )
    pass 

 

疑似アナログ出力をするケースでも RPi.GPIOを使う場合とwiringpiを使う場合の違いは、デジタル出力のケースと同じでした。

つまり あえて"wiringpi"を使った方がいい理由は僕にはわかりませんでした。

 

という事で定番のRPi.GPIOを使ってLEDを順番につけてみるスクリプトを作ってみました。

#Raspberry Pi3 GPIO 出力

#ライブラリの読み込み
import RPi.GPIO as GPIO
from time import sleep

 

#初期化
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

 

#出力モード設定
for LED_PIN in [23,24,25,16,20,21]:
GPIO.setup (LED_PIN,GPIO.OUT,initial = GPIO.LOW)

 

#出力設定
try:
    while True:
        for LED_PIN in [23,24,25,16,20,21]:
            GPIO.output (LED_PIN,GPIO.HIGH)
            sleep(0.1)
            GPIO.output (LED_PIN,GPIO.LOW)

        sleep(0.1)

        for lp in range(3):
            for LED_PIN in [23,24,25,16,20,21]:
                GPIO.output (LED_PIN,GPIO.HIGH)

            sleep(0.1)

            for LED_PIN in [23,24,25,16,20,21]:
                GPIO.output (LED_PIN,GPIO.LOW)

            sleep(0.1)

except KeyboardInterrupt:
    print ( 'CTRL + C' )
    pass

 

#GPIOリセット終了
GPIO.cleanup()

 

f:id:osadamao:20180211142818j:plain

 

 

 

LEDの点灯制御についてはうまくできるようになったので、今度はスイッチのON、OFFを読み出すようなプログラムも整理しました。

 

#Raspberry Pi3 GPIO 入力1
#ライブラリの読み込み
import RPi.GPIO as GPIO
from time import sleep

SW_PIN = 4

#初期化
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

#GPIO4を入力モードとして設定
GPIO.setup (SW_PIN,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)

#コントロールCが押されるまでループ

try:
    while True:
        if GPIO.input(SW_PIN) == GPIO.HIGH : #GPIO.LOW または GPIO.HIGHを得る
            print ( 'SW on:GPIO' + str(SW_PIN) + ' HIGH' )
        else :
            print ( 'SW off:GPIO' + str(SW_PIN) + ' LOW' )

        sleep (1)

#例外
except KeyboardInterrupt :
    print ( 'CTRL + C' )
    pass


#GPIOのリセット終了
GPIO.cleanup()

 

 

 

 

参考にさせていただいたサイト

ag.hatenablog.com