Help us understand the problem. What is going on with this article?

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした