Posted at

Raspberry Pi のGPIOをPythonから利用する

More than 1 year has passed since last update.


GPIOのピン番号や状態を取得する

GPIOの状態は$gpio readallで見れる

pi@raspberrypi:~ $ gpio readall

+-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5v | | |
| 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 0 | IN | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 1 | IN | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 |
| 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | |
| 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 |
| | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 |
| 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | |
| 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
| 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 |
| | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 |
| 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 |
| 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | |
| 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 |
| 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | |
| 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 |
| 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 |
| | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+

それぞれの欄は下記のような意味

- BCM : GPIO番号

- wPi : Wiring Piというライブラリを使う場合の番号

- Name : 一般的な端子名称

- Mode : 入力か出力か

- V : 現在の端子にかかってる電圧

- Physical : 40Pin端子の物理的な端子番号

参考

http://jellyware.jp/kurage/raspi/led_chikachika.html

shellスクリプトで書く場合は、wPiの番号になります。

Pythonで使う場合は、BCMとPhysicalのどちらの番号でも指定できます。


GPIOのライブラリ

GPIOを操作するライブラリは3種類ある


  • pigpio

  • RPi.GPIO

  • WiringPi

今回使ったのは、RPi.GPIO

参考

http://karaage.hatenadiary.jp/entry/2017/02/10/073000


スイッチ入力を検出するPythonプログラム

スイッチの状態を検出するには、プログラムでずっと監視するか、スイッチの状態が変わったイベントを取得するか、の2つの方法があります。

以下でそれぞれの方法について説明します。


無限ループ使ったスイッチ検出

スイッチの状態を監視して、LEDを点灯させるプログラムは下記になります。


LED_Loop.py

import RPi.GPIO as GPIO  #GPIOにアクセスするライブラリをimportします。                                          

import time

GPIO.setmode(GPIO.BCM) #GPIOへアクセスする番号をBCMの番号で指定することを宣言します。
GPIO.setup(15,GPIO.OUT) #BCMの15番ピン、物理的には10番ピンを出力に設定します。
GPIO.setup(2,GPIO.IN) #BCM 2番ピンを入力に設定します。

try:
while True:
if GPIO.input(2) == GPIO.LOW:
GPIO.output(15,GPIO.HIGH)
else:
GPIO.output(15,GPIO.LOW)
time.sleep(0.1)
except KeyboardInterrupt:
GPIO.cleanup()


参考

http://robocad.blog.jp/archives/678444.html

https://www.raspberrypi.org/forums/viewtopic.php?t=121182

下記のコマンドで実行します。

pi@raspberrypi:~/pythonSandBox $ python3 ledLoop2.py 

python コマンド実行すると、ディフォルトでUTF-8に対応しないので、のコメントアウトがうまく処理されず、下記のようなエラーになります。

pi@raspberrypi:~/pythonSandBox $ python ledLoop2.py 

File "ledLoop2.py", line 1
SyntaxError: Non-ASCII character '\xe3' in file ledLoop2.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details


イベント駆動型

無限ループかっこ悪いので、

イベント駆動型だと以下のような感じ

押した瞬間だけ光る

import RPi.GPIO as GPIO

import time

#callback関数の定義
def switch_callback(gpio_pin):
print(gpio_pin)
GPIO.output(15,GPIO.HIGH)

GPIO.setmode(GPIO.BCM) #GPIOへアクセスする番号をBCMの番号で指定することを宣言します。
GPIO.setup(15,GPIO.OUT) #BCMの15番ピン、物理的には10番ピンを出力に設定します。
GPIO.setup(2,GPIO.IN) #BCM 2番ピンを入力に設定します。

GPIO.add_event_detect(2, GPIO.FALLING,bouncetime=100)
GPIO.add_event_callback(2, switch_callback) #スイッチ入力端子の状態ををcallbackのトリガとして指定します。

try:
while True:
GPIO.output(15,GPIO.LOW)
time.sleep(0.1)
except KeyboardInterrupt:
GPIO.cleanup()

参考

http://lab.siio.jp/index.php?How2RaspberryPi

http://blog.livedoor.jp/sce_info3-craft/archives/8930600.html