概要
Raspberry Piがただの小型PCでは無い大きな特徴の1つがこのGPIOです。 これにより、LEDを光らせたり、センサーから情報を読み取ったり、モーターを動かしたりと 自作機器の管理が簡単に可能になります。
基本構造
一列20個のピンが2列(合計40個)が基板上に配置されています。
それらのピンの役割は大きく分けると、”電源”、”GND”、”GPIOピン”の3つ。
- 電源ピン
- 3.3Vや5Vの電圧を供給
- 自作機器の電源に使用可。(消費電力に注意。大きな電力を必要とする機器は不可)
- GNDピン グランド。
- GPIOピン
- GPIO0から27の28本。3.3Vロジック。
- GPIO0、1はHAT(Hardware Attached on Top)用
- GPIO2,3はプルアップ固定。その他のピンはソフトで設定可能。
- PWM用ピン
- Software PWM available on all pins
- Hardware PWM available on GPIO12, GPIO13, GPIO18, GPIO19
- SPI用ピン
- SPI0: MOSI (GPIO10); MISO (GPIO9); SCLK (GPIO11); CE0 (GPIO8),CE1 (GPIO7)
- SPI1: MOSI (GPIO20); MISO (GPIO19); SCLK (GPIO21); CE0 (GPIO18);CE1 (GPIO17); CE2 (GPIO16)
- I2C用ピン
- Data: (GPIO2); Clock (GPIO3)
- EEPROM Data: (GPIO0); EEPROM Clock (GPIO1)
- Serial用ピン:TX (GPIO14); RX (GPIO15)
GPIO0,1の使用を避けて自由に使えるのは26本。 デフォルトピン(I2C、SPI用)が有るがソフトで変更可能。
使い方
ピン番号の指定方法
- GPIO.BCM(Broadcom SOC Channel
- デフォルトの設定。
- 機能に依存した呼び方。
- GPIO.BOARD
- 物理ピン番号。
- コネクタ上に並ぶピンの物理的な番号を指定する方法。
使用前
Raspberry PiのOSは、「root(管理者)以外のユーザーはハードウェアに直接触れさせない」 というルールが有る為GPIOにアクセスする時に。
- 管理者としてアクセスする。 sudo ....。
- ユーザーをgpioグループに登録する: $ sudo usermod -a -G gpio $USER
使用後
GPIO.cleanup()を行う。(RPi.GPIOのみ)
- GPIOピンを安全な『入力』状態(デフォルト)に戻す。
- プログラムが占有していたリソースを解放するのが目的。
- 行わないと「Channel already in use」警告が出る
ライブラリ
主なライブラリとして”RPi.GPIO”と、”gpiozero”が有ります。
| 特徴 | RPi.GPIO | gpiozero |
|---|---|---|
| 設計思想 | ピン番号をベースにした 低レイヤー操作 | コンポーネント(LED、ボタン等) をベースにした抽象化 |
| 学習難易度 | 若干複雑(初期設定が多い) | 非常に簡単(初心者向け) |
| クリーンアップ | GPIO.cleanup() が必須 | 自動で行われる |
| コードの短さ | 長くなりがち | 非常に短い |
RPi.GPIO
gpiozero
RPi.GPIOと違い直接入出力を指定しない。コンポーネントで指定。
| カテゴリ | クラス名 | 主な用途・特徴 |
|---|---|---|
| 基本入力 | Button InputDevice | スイッチ、ボタン。プルアップ/ダウン設定が可能。 汎用的な入力。 |
| 基本出力 | LED PWMLED DigitalOutputDevice | LEDの単純なON/OFF制御。 LEDの明るさ調整(0.0〜1.0)。 汎用的な出力。リレーや単純な信号送信に。 |
| 高度な表示 | RGBLED Buzzer LEDBarGraph | フルカラーLED。(R, G, B) で色を指定。 ブザー。beep() メソッドで断続音も可能。 複数のLEDを並べた音量メーターのような表示。 |
| センサー | MotionSensor DistanceSensor LightSensor | PIR人感センサー。動きを検知。 超音波距離センサー(HC-SR04など)。 フォトレジスタ(LDR)を使用した明るさ検知。 |
| モーター | Motor Servo Robot | DCモーターの回転方向と速度制御。 サーボモーターの角度制御(-1〜1) 2つのモーターを組み合わせた走行ロボットの制御。 |
簡単なプログラム
9番ピン(GND)と 11番ピン(GPIO17)を使ってLEDを点滅させるプログラム。
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM) # GPIO番号指定
GPIO.setup(17, GPIO.OUT) # LEDピンを出力に設定
GPIO.output(17,0) # LED消灯
for a in range(10):
GPIO.output(17, 1) # LED点灯
time.sleep(1) # 1秒待機
GPIO.output(17, 0) # LED消灯
time.sleep(1) # 1秒待機
GPIO.cleanup() # GPIOを解放
最後に
GPIOはRaspberry PIの魅力です。