ネットを検索すれば、いくらでも出てくるGPIOの制御方法だが、調べた結果を自分なりにまとめておく。
Raspberry PiのGPIO一覧
とりあえず、RaspberryPi2のGPIO一覧
ハードウェアPWMはGPIO18のみ
という投稿をよく見るが、ほかに3つある。Audioで使用されると言われるポートもあるが、使ってないときはどうなるのかが気になる。後ほど、調べてみる予定。
( 2017/8/12 追記: ハードウェアPWMは2基あり、同時に異なる矩形波の生成が可能だった。詳細は、Raspberry Pi : ハードウェアPWMについて で検証結果を投稿 )
GPIOの制御方法
RaspberryPiのGPIOピンの制御方法は以下の3つ。
- echoコマンドでGPIOのデバイスファイルに記述
- PythonのRPi.GPIOライブラリ
- 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