49
63

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

##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

49
63
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
49
63

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?