##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を点灯させるプログラムは下記になります。
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