RaspberryPi : GPIOの制御方法にふれる

ネットを検索すれば、いくらでも出てくるGPIOの制御方法だが、調べた結果を自分なりにまとめておく。

Raspberry PiのGPIO一覧

とりあえず、RaspberryPi2のGPIO一覧

ハードウェアPWMはGPIO18のみという投稿をよく見るが、ほかに3つある。Audioで使用されると言われるポートもあるが、使ってないときはどうなるのかが気になる。後ほど、調べてみる予定。
( 2017/8/12 追記: ハードウェアPWMは2基あり、同時に異なる矩形波の生成が可能だった。詳細は、Raspberry Pi : ハードウェアPWMについて で検証結果を投稿 )

GPIOの制御方法

RaspberryPiのGPIOピンの制御方法は以下の3つ。

  1. echoコマンドでGPIOのデバイスファイルに記述
  2. PythonのRPi.GPIOライブラリ
  3. Wiring Piライブラリ

結果からいうと、Wiring Piを使うのが定番らしい。

echo コマンドでGPIOを制御する

GPIOのデバイスファイルに直接値を書き込んで制御する方法。
正直手間でやらないと思うが、やれることぐらいは知っておく必要があるかも。

> ls /sys/class/gpio/
export*  gpiochip0@  unexport*

GPIO18番ポートのデフォルト状態を調べてみると、IN(入力)でLOW(0)であることがわかる。

> sudo echo "18" > /sys/class/gpio/export
> ls
export*  gpio18@  gpiochip0@  unexport*
> cd gpio18
> ls
active_low*  device@  direction*  edge*  power/  subsystem@  uevent*  value*
> cat cat active_low direction edge value
0
in
none
0

GPIO18ピンに何も繋いでない状態(デフォルトでは内部プルダウン)で、GPIO18とGND間の電位は、ほぼ0Vになっている。value=0と一致する。
ちなみにIN設定の状態で、valueに値を設定しようとするとエラーになる。

ちなみに抵抗値を測定すると、内部プルダウン抵抗の50kΩとほぼ一致する。

次に3.3VとGPIO18間に470Ωの抵抗を繋ぐとプルアップ状態になって、電位は3.3Vで、value=1になる。

> cat cat active_low direction edge value
0
in
none
1

次にGPIO18を出力(OUT)に変更する。値はLOW(0)になっている。

> sudo echo out > direction
> cat cat active_low direction edge value
0
out
none
0

3.3V電源とGPIO18間に電位が発生して、LEDが点灯した。

次に出力をHIGH(1)に変更してLEDが消灯することを確認する。

> sudo echo 1 > value
> cat cat active_low direction edge value
0
out
none
1

GPIO18の電位が3.3Vになり、電源間で電流が流れなくなるので、LEDが消灯する。

使い終わったGPIOポートは、unexportで終了する。そうすると、さきほどまであったgpio18のディレクトリが消えて終了する。

> sudo echo 18 > unexport

ざっくり使い方は、わかった。非常に処理がめんどくさいが、仕組みは覚えておく必要がある。

WiringPiでGPIO制御する

現状、プログラムで制御する場合の定番ライブラリである。C言語、Python、Ruby、PHPなどから利用可能らしい。(たぶんほかにもある)

とりあえず、コマンドラインとPythonから利用できるようにする。

WiringPi@github
WiringPi-Python

WiringPiをビルドするときにlibi2c-devが必要とのことなので、インストールしておく。(今のwiringpiにはそういった記載がないがとりあえずいれておく)

> sudo apt install libi2c-dev python-dev

WiringPiをGithubからクローンして、ビルドする。

> git clone https://github.com/WiringPi/WiringPi.git
> cd WiringPi
> sudo ./build
wiringPi Build script
=====================

WiringPi Library
[UnInstall]
[Compile] wiringPi.c
[Compile] wiringSerial.c
[Compile] wiringShift.c
[Compile] piHiPri.c
[Compile] piThread.c

これでコマンドラインツールのgpioが利用可能になる。

> type -a gpio
gpio is /usr/local/bin/gpio

> gpio -v
gpio version: 2.44
Copyright (c) 2012-2017 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Pi 2, Revision: 01, Memory: 1024MB, Maker: Sony
  * Device tree is enabled.
  *--> Raspberry Pi 2 Model B Rev 1.1
  * This Raspberry Pi supports user-level GPIO access.

現在のGPIOの状態は、gpio readallで確認できる

> gpio readall
 +-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 | ALT0 | 1 |  3 || 4  |   |      | 5v      |     |     |
 |   3 |   9 |   SCL.1 | ALT0 | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | ALT0 | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | ALT0 | 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 | ALT0 | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO | ALT0 | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK | ALT0 | 0 | 23 || 24 | 1 | OUT  | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | OUT  | 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 2---+---+------+---------+-----+-----+

さきほどのLED点灯・消灯をやってみると、同じように制御できることが確認できた。(GPIO18番をOUT設定、LOW、HIGHに変更)
ちなみに、-gを指定すると、

> gpio -g mode 18 out
> gpio -g write 18 0
> gpio -g write 18 1

PWM出力をやってみる

https://raspberrypi.stackexchange.com/questions/4906/control-hardware-pwm-frequency/9725#9725

PWMのモードはmark-spaceモードに設定する。balanceモードもあるが制御しづらい?ようで、ほとんどの参考サイトはmark-spaceらしい。

> gpio mode 1 pwm
> gpio pwm-ms
> gpio pwmc 100
> gpio pwmr 200
> gpio pwm 1 100

> gpio pwm 1 50

> gpio pwm 1 150