#author("2020-01-20T00:00:49+00:00","default:mizutu","mizutu")
[[私的AI研究会]] > [[ラズパイ覚書]]

* GPIO General Purpose Input/Output [#k811322a]
#contents

** ピンアサイン [#x9ab71a9]
> USB/LAN コネクタを下側にした基板上のコネクタ 
|CENTER:COLOR(red):BCM|CENTER:名称|CENTER:Pin|CENTER:Pin|CENTER:名称|CENTER:COLOR(red):BCM|h
|RIGHT:  |RIGHT:BGCOLOR(#FF9933):3.3V |BGCOLOR(#FF9933):RIGHT:1 |LEFT:BGCOLOR(#FF3333): 2 |LEFT:BGCOLOR(#FF3333): 5V |RIGHT: |
|RIGHT:2 |RIGHT:I2C SDA (8) |RIGHT:3 |LEFT:BGCOLOR(#FF3333): 4 |LEFT:BGCOLOR(#FF3333): 5V |RIGHT: |
|RIGHT:3 |RIGHT:I2C SCL (9)|RIGHT:5 |LEFT:COLOR(#FFFFFF):BGCOLOR(#000000): 6 |LEFT:COLOR(#FFFFFF):BGCOLOR(#000000): GND |RIGHT: |
|RIGHT:4 |RIGHT:(GPIO 7) |RIGHT:7 |LEFT: 8 |LEFT: (15) UART TxD |RIGHT:14 |
|RIGHT: |RIGHT:COLOR(#FFFFFF):BGCOLOR(#000000):GND |RIGHT:COLOR(#FFFFFF):BGCOLOR(#000000):9 |LEFT:10 |LEFT: (16)UART RxD |RIGHT:15 |
|RIGHT:17 |RIGHT:(GPIO 0) |RIGHT:11 |LEFT:12 |LEFT: (GPIO 1)|RIGHT:18 |
|RIGHT:27 |RIGHT:(GPIO 2) |RIGHT:13 |LEFT:COLOR(#FFFFFF):BGCOLOR(#000000):14 |LEFT:COLOR(#FFFFFF):BGCOLOR(#000000): GND|RIGHT: |
|RIGHT:22 |RIGHT:(GPIO 3) |RIGHT:15 |LEFT:16 |LEFT: (GPIO 4)|RIGHT:23 |
|RIGHT: |RIGHT:BGCOLOR(#FF9933):3.3V |RIGHT:BGCOLOR(#FF9933):17 |LEFT:18 |LEFT: (GPIO 5)|RIGHT:24 |
|RIGHT:10 |RIGHT:SPI MOSI (12) |RIGHT:19 |LEFT:COLOR(#FFFFFF):BGCOLOR(#000000):20 |LEFT:COLOR(#FFFFFF):BGCOLOR(#000000): GND|RIGHT: |
|RIGHT:9 |RIGHT:SPI MOSO (13) |RIGHT:21 |LEFT:22 |LEFT: (GPIO 6)|RIGHT:25 |
|RIGHT:11 |RIGHT:SPI SCLK (14) |RIGHT:23 |LEFT:24 |LEFT: (10) SPI CE0|RIGHT:8 |
|RIGHT: |RIGHT:COLOR(#FFFFFF):BGCOLOR(#000000):GND |RIGHT:COLOR(#FFFFFF):BGCOLOR(#000000):25 |LEFT:26 |LEFT: (11) SPI CE1|RIGHT:7 |
|RIGHT:0 |RIGHT:ID SD (30) |RIGHT:27 |LEFT:28 |LEFT: (31) ID SC|RIGHT:1 |
|RIGHT:5 |RIGHT:(GPIO 21) |RIGHT:29 |LEFT:COLOR(#FFFFFF):BGCOLOR(#000000):30 |LEFT:COLOR(#FFFFFF):BGCOLOR(#000000): GND|RIGHT: |
|RIGHT:6 |RIGHT:(GPIO 22) |RIGHT:31 |LEFT:32 |LEFT: (GPIO 26)|RIGHT: 12|
|RIGHT:13 |RIGHT:(GPIO 23) |RIGHT:33 |LEFT:COLOR(#FFFFFF):BGCOLOR(#000000):34 |LEFT:COLOR(#FFFFFF):BGCOLOR(#000000): GND|RIGHT: |
|RIGHT:19 |RIGHT:(GPIO 24) |RIGHT:35 |LEFT:36 |LEFT: (GPIO 27)|RIGHT: 16|
|RIGHT:26 |RIGHT:(GPIO 25) |RIGHT:37 |LEFT:38 |LEFT: (GPIO 28)|RIGHT: 20|
|RIGHT: |RIGHT:COLOR(#FFFFFF):BGCOLOR(#000000):GND |RIGHT:COLOR(#FFFFFF):BGCOLOR(#000000):39 |LEFT:40 |LEFT: (GPIO 29)|RIGHT: 21|
|CENTER:COLOR(red):BCM|CENTER:名称|CENTER:Pin|CENTER:Pin|CENTER:名称|CENTER:COLOR(red):BCM|f
- (  ) → wPI ピン・アサイン (C言語ライブラリ用 ?)~
- COLOR(red){BCM → GPIO番号}
- Pin → 実際のピンアサイン

** GPIO コマンド [#h19da230]
 GPIOを操作する「gpio」コマンドは「Wiring Pi」ライブラリを使用する。(通常は標準実装されている。)

- コマンドのバージョンを調べる~
 $ gpio -v
ここでの出力に Type: Unknown が表示されている場合古いライブラリの可能性あり。~
参照 → [[GPIO エラー:配線ライブラリの古いバージョン?>ラズパイ覚書]]

- GPIOポートの状態を調べる~
COLOR(green){gpio readall}
 $ gpio readall
 +-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+
 | 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  | 1 | 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 4B--+---+------+---------+-----+-----+

-- "Physical"は物理的な番号
-- 両端の"BCM"は GPIO番号
-- "Mode"は現在のピンのモード(IN/OUT)~
初期状態ではすべてのピンは入力に設定されている。
-- "V"はピンの値(1ならON、0ならOFF)

- GPIOからの入力~
COLOR(green){gpio -g read (GPIO番号)}
 $ gpio -g read 16
-- ON であれば 1  OFF であれば 0 が出力される。

- GPIO のモード変更~
COLOR(green){gpio -g mode (GPIO番号) in/out}~
 $ gpio -g mode 16 out

- GPIOへの出力~
COLOR(green){gpio -g write (GPIO番号) 0/1}~
 $ gpio -g write 16 1

** RPI.GPIO 制御ライブラリ [#wd773735]
> RPI.GPIO は [[Python Software Foundation>https://www.python.org/]] からリリースされている GPIO を制御するパッケージ~
使用するには、Pythonのプログラムの先頭で import 宣言をする。~
 $ import RPi.GPIO as GPIO
RPi.GPIO を呼び出す場合、RPi.GPIO.setup() というようにドット(.)で呼び出す。毎回 RPI.GPIO と書くのは長なるので、importする際に別名を付けることができる。別名は「as 別名」で指定。
 $ import RPi.GPIO as GPIO
以後、GPIO.setup() というように呼び出すことができる。

*** RPI.GPIO 関数 [#v6a89423]
- GPIO番号指定モードの設定~
GPIO番号の指定方法の設定 (GPIO番号/基板の物理ピン番号) を設定する。
 $ GPIO.setmode(GPIO.BCM)        # GPIO番号を設定
 $ GPIO.setmode(GPIO.BOARD)      # 基板の物理ピン番号を設定

- GPIO の入出力の設定~
GPIO端子の入力/出力設定、プルアップ、プルダウン抵抗の設定。~
 $ GPIO.setup(ピン番号, GPIO.OUT) # 出力指定
 $ GPIO.setup(ピン番号, GPIO.IN)  # 入力指定
例: GPIO 21ピンを出力に設定~
 $ GPIO.setup(21, GPIO.OUT)       # GPIO21番ピンを出力に設定

- GPIO の出力制御~
GPIOピンを出力モードに設定すると、出力を 0 か 1 を指定することにより、0V、3.3V に制御できる。~
 $ GPIO.output(ピン番号, 1)       # ピンの出力を3.3Vにする
 $ GPIO.output(ピン番号, 0)       # ピンの出力を0Vにする
例: GPIO 21ピンを3.3V出力に設定^
 $ GPIO.output(21, 1)             # GPIO21番ピンに3.3V出力する

- GPIO の入力読み取り~
GPIOピンを入力モードに設定すると、ピンの電圧状態を 0 か 1 で読み取ることができる。~
 $ GPIO.input(ピン番号)           # ピンの電圧状態読み取る
実際にはピンの電圧状態が返るので、結果を変数に入れたり表示する。
 $ print GPIO.input(ピン番号)     # ピンの電圧状態を得る

- GPIO の設定リセット
GPIO を使い終わったら、GPIO の設定をリセットする。=
 $ GPIO.cleanup()                # GPIO設定をリセット

#br

* 参考資料 [#g1bb8cc0]
** 参考サイト [#md690c61]
- [[コマンドラインからGPIOを操作する>http://tomaberry.hatenablog.com/entry/2017/02/12/155910]]
** ドキュメント [#z6e6f5c4]
- [[公式ドキュメント>https://www.raspberrypi.org/documentation/usage/gpio-plus-and-raspi2/README.md]]
#br