以前の記事、「ラズパイ(Raspberry Pi)のGPIOを再確認! まずは汎用入出力からマスターしよう」では、ラズパイのGPIOピンを、Pythonから制御する方法を解説しました。
その中でGPIO Zeroと呼ばれる、2016年に発表された、新しいライブラリを紹介しています。
GPIO ZeroはGPIOピンを手軽に制御できるライブラリですが、まだまだ情報が少ないようです。そこで今回は、GPIO Zero以前から使用されている、RPi.GPIOを紹介します。
さまざまなライブラリを用途に合わせて利用できるPythonと、ラズパイの組み合わせは最強です。早速、学習を進めましょう。
目次
- RPi.GPIOは細かいハードウェアの制御ができる
- RPi.GPIOを使ってプログラミングを始めよう
- ライブラリのインポート
- GPIOピンのピン番号を指定する方法
- GPIOピンの初期設定
- GPIOピンの入出力
- ピンに分かりやすい名前をつける
- 後片付けを忘れずに
- LEDを使って実験しよう
- 準備
- GPIO拡張基板とブレッドボードの接続
- 赤色LEDの接続
- 赤色LEDのテスト
- 黄色LED、緑色LEDの接続とテスト
- PythonからLEDを順番に点灯する
- 後片付け
- まとめ
1. RPi.GPIOでは細かいハードウェアの制御に対応
以前の記事、「ラズパイ(Raspberry Pi)のGPIOを再確認! まずは汎用入出力からマスターしよう」では、GPIO Zeroライブラリを使用して、Pythonからラズパイ(Raspberry Pi)のGPIOピンを制御する方法を解説しました。
本記事では、前回のGPIO Zeroと並んで人気の高いPythonのライブラリ、RPi.GPIOについて紹介します。
2016年にGPIO Zeroが発表される前まで、ラズパイのGPIOピンをPythonから制御するには、RPi.GPIOを使用するのが一般的でした。
RPi.GPIOは、GPIOピンの細かい部分の制御まで対応できるのが特徴ですが、習得が難しい難点があります。
そこで、初心者でも簡単にGPIOピンを扱えるように、GPIO Zeroが開発されました。GPIO Zeroは、プルアップ抵抗の自動有効設定のような、電子工作に慣れていない初心者の方でも、簡単に活用できるように難しい所をカバーしたライブラリです。
一見すると、RPi.GPIOよりGPIO Zeroの方が優れているようですが、そうとも限りません。
Pythonを使用したプログラミングに慣れてくると、「自動的に」何かをしてくれるかどうかより、「自分で調整したい」ケースも多くなります。
また、RPi.GPIOは、既に多くの開発現場で利用されている実績もあり、ソースコードやチュートリアルも数多く公開されているので、RPi.GPIOをマスターすれば、多くの資産を活用することができるでしょう。
Pythonのプログラミングに慣れていないうちから、GPIO ZeroとRPi.GPIOの両方を覚えるのは大変だと思われるかもしれません。
GPIO Zeroは、ライブラリの内部でRPi.GPIOを使用しているので、RPi.GPIOの難しい処理を隠すように機能を追加することで、初心者でも扱いやすくしています。
そのため、GPIO Zeroでできることは、RPi.GPIOでも同じことが実現できます。さらにGPIO Zeroでできないことは、RPi.GPIOで実現できる場合もあるでしょう。
興味のある方は、RPi.GPIOからスタートすると、効率よく学習が進みます。
本記事は、簡単な実験を通して、RPi.GPIOの概要を説明します。
2. RPi.GPIOを使ってプログラミングを始めよう
RPi.GPIOを使って、ラズパイのGPIOピンを制御する、プログラミングの方法を解説します。
ここでは、全体の流れとコマンドの意味を把握するところから始めます。実際のコマンド入力は、後ほどLEDを使った実験で行います
ライブラリのインポート
Pythonから、RPi.GPIOを使用するには、次のコマンドを入力します。
import RPi.GPIO as GPIO
import文は、必要なライブラリを、Pythonから使用できるようにするコマンドです。Pythonでは、ライブラリのことをモジュールと呼びます。import文の詳細は、公式ドキュメント、モジュールの解説を参照してください。
GPIOピンのピン番号を指定する方法
PythonからラズパイのGPIOピンにアクセスするには、ソースコードから対象のピン番号を指定します。
RPi.GPIOには、ピン番号を指定する方法が2種類あります。
一つは、コネクタ上に並ぶ、ピンの物理的(Physical pin)な番号を指定する方法です。物理ピン番号と呼びます。
RPi.GPIOでは、GPIO.BOARDと設定します。
もう一つは、物理的なピンの並びとは全く関係ない、機能に依存した呼び方です。
ラズパイのCPUを設計しているBroadcom社の名前をとって、BCM(Broadcom SOC Channel)ピン番号と呼ばれています。BCMピン番号では、GPIOピンをGPIOn(nは数字)のように表記します。
RPi.GPIOの設定は、GPIO.BCMです。
どちらでも好きな方法で指定できるので、RPi.GPIOのsetmode()関数では、用途に合わせて次のように設定します。
GPIO.setmode(GPIO.BOARD) GPIO.setmode(GPIO.BCM)
プログラムの中で、GPIOピンを制御する時は、前もってピンの指定方法を設定してください。忘れると、エラーが発生します。
インターネット上で公開されている情報の多くは、BCMピン番号で記述されています。ピンの持つ機能が分かりやすいからでしょう。
特別な理由がなければ、BCMピン番号の使用をお勧めします。
本記事では、BCMピン番号を使用し、GPIO25のように表記します。GPIO25は物理ピン番号の22番を表します。
ターミナル上で、Pythonのコマンドを入力している最中に、どちらの方法でピン番号を指定しているのか忘れてしまったら、以下のコマンドを入力します。
GPIO.getmode()
現在の設定によって、GPIO.BOARDかGPIO.BCMが表示されます。まだ設定されていない場合はNoneと表示されます。
GPIOピンの初期設定
ピン番号を指定する方法を設定した後、GPIOピンの動作を設定します。GPIOピンは、個別に入力/出力の動作を選択できます。
GPIO.setup(11, GPIO.OUT) GPIO.setup(12, GPIO.IN)
ピン番号の指定がBCMピン番号の場合、1行目はGPIO11を「出力」に、2行目はGPIO12を「入力」に設定します。
GPIOピンを入力として使用する場合は、「入力ピンが浮いている状態」を避けるため、回路に合わせて、プルアップ/プルダウン抵抗のどちらかを指定します。
GPIO.setup(12, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(12, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
1行目はGPIO12の「プルアップ抵抗」を有効に、2行目は「プルダウン抵抗」を有効にしています。
GPIOピンの入出力
入力に設定したGPIOピンの状態を読み取るには、次のコマンドを入力します。
GPIO.input(12)
出力に設定したGPIOピンの状態を、HIGH/LOWに設定するには、次のように指定します。
GPIO.output(11, True) GPIO.output(11, False)
ピンに分かりやすい名前をつける
ソースコードを読みやすくするために、変数を使って、ピン番号を具体的な機能の名前に置き換えます。
例えば、GPIO11に赤色LED、GPIO12にプッシュボタンを接続している場合は、次のように記述すると読みやすくなります。
redLED = 11 button = 12 GPIO.setup(redLED, GPIO.OUT) GPIO.setup(button, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.output(redLED, True) GPIO.input(button)
ソースコード中に、11や12と直接書くより、redLEDやbuttonのように機能や役割を表すように記述する方が、後のメンテナンスなどの役に立ちます。
自分で書いたソースコードでも、どのように動いているかわからなくなってしまうことも珍しいことではありません。また、ほかのプログラマーが修正することもあり、ソースコードを見やすくすると、メンテナンス性を大きく向上できます。
この程度のソースコードでは、手間が増えるだけであまり便利に見えないかもしれませんが、短いソースコードでも、後々のために名前をつけることをお勧めします。
後片付けを忘れずに
プログラムからGPIOピンを使用しなくなったら、トラブルを防ぐために、GPIOピンを解放することを忘れないようにしましょう。
GPIO Zeroは、プログラムの終了時に、自動的に割り当てたGPIOピンを解放します。RPi.GPIOでは、次のようにして、GPIOピンを解放してください。
GPIO.cleanup()
このcleanup()関数は、プルアップ/プルダウン抵抗を無効にして、GPIOピンの動作を「入力」に戻します。
影響を受けるのは、ソースコードの中で割り当てた、全てのGPIOピンです。
もし、特定のGPIOピンだけ解放したい場合は、次のように、使用しなくなったものだけ指定します。
GPIO.cleanup(redLED) GPIO.cleanup([redLED, button])
1行目はredLEDのみ、2行目はredLEDとbuttonを解放します。
3. LEDを使って実験しよう
ここまでの説明で、RPi.GPIOの概要がつかめたと思います。
それでは、ラズパイにLEDをつないで、PythonでLEDの点灯状態を制御する簡単な実験をしてみましょう。
準備
次のものを用意してください。
ラズパイ本体
RaspbianがインストールされたSDカード
ブレッドボード
GPIO拡張基板
スイッチサイエンス製(互換可)
LED
緑・黄・赤
GPIO拡張基板はAdafruit製(海外)や、スイッチサイエンス製(国内)が入手しやすそうです。
ほかにも、さまざまな製品が販売されているので、使いやすいものを皆さんがご自身で探してみるのも良いでしょう。
上記に加えて、次のものも必要です。
- 抵抗(3本): LEDの電流を制限します。抵抗値は220〜1kΩです。
- USBキーボード、マウス: コマンドの入力に使用します。SSH接続ができる場合は不要です。
- 電線: ブレッドボード上の電子部品をつなぎます。
GPIO拡張基板とブレッドボードの接続
最初にラズパイのGPIOピンにGPIO拡張基板を装着し、ブレッドボードに接続します。
次に、拡張基板のGNDピンを、ブレッドボードの電源ライン(-)に接続してください。
赤色LEDの接続
回路にLEDを追加します。LEDには極性があるので、接続する端子の向きに注意してください。
LEDをよく見ると、2本の端子の長さが違うことに気付くでしょう。長い方の端子がアノード(プラス側)、短い方がカソード(マイナス側)です。
アノード(長い方)はGPIOピンに、カソード(短い方)は抵抗を通して、ブレッドボードの電源ライン(-)に接続します。
赤色LEDを、ブレッドボードのGPIO拡張基板の近くに挿してください。
LEDの端子は、ブレッドボードの電源ラインに並行で、アノードがGPIO拡張基板側です。
その後、電線でGPIOピンとアノードを接続します。今回はGPIO13に接続します
LEDのカソードには、抵抗の一端を接続します。抵抗のもう一端はブレッドボードの電源ライン(-)に接続します。
LEDには電流を制限する機能がありません。抵抗を接続しないと、規定値以上の電流が流れてラズパイかLEDが破損してしまいます。注意して配線してください。
赤色LEDのテスト
ここで赤色LEDを、Pythonから制御できるかテストします。
ラズパイの画面から、ターミナルを起動して、次のコマンドを入力してください。
python3
Pythonが起動したはずです。
ターミナル上に、Pythonのバージョン番号などが表示されたあと、プロンプトが「>>>」に変わったら正常に起動しています。
次にRPi.GPIOをインポートします。Pythonは、大文字と小文字を区別するので、注意が必要です。
import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM)
2行目で、ピン番号の指定方法を設定しています。BCMピン番号を選択します。
次に、変数を使って、ピン番号を分かりやすい名前にします。
redLED = 13
これ以降、GPIO13をredLEDと呼ぶことができます。
redLEDピンの動作を出力にします。
GPIO.setup(redLED, GPIO.OUT)
これで、PythonからLEDを点灯/消灯できるようになりました。次のコマンドを入力してください。
GPIO.output(redLED, True) GPIO.output(redLED, False)
1行目が点灯、2行目が消灯です。
もし、動作しない場合は、LEDの配線を確認してください。
黄色LED、緑色LEDの接続とテスト
ブレッドボードの赤色LEDの右側に、黄色LEDを挿してください。端子の向きはブレッドボードの電源ラインと並行にし、アノードをGPIO拡張基板側にします。
その後、赤色LEDと同じように、電線でGPIOピンとアノードを接続します。黄色LEDはGPIO16です。抵抗の接続も忘れないでください。
ラズパイの画面に戻ります。ターミナル上から、以下のコマンドを入力してください。
yellowLED = 16 GPIO.setup(yellowLED, GPIO.OUT) GPIO.output(yellowLED, True) GPIO.output(yellowLED, False)
上記は、GPIO16の名前付けから、点灯/消灯までを行っています。
上手く動きましたか? もしLEDが点灯しない場合は、配線を確認してください。
続いて、赤色LED・黄色LEDと同様に、緑色LEDも配線します。
ブレッドボード上に既にある赤色LED・黄色LEDの右側に、緑色LEDを挿してください。端子の向きはブレッドボードの電源ラインと並行にし、アノードをGPIO拡張基板側にします。
その後、電線でGPIOピンとアノードを接続します。緑色LEDはGPIO21です。抵抗も忘れずに接続してください。
ラズパイの画面に戻り、ターミナル上からコマンドを入力してください。
greenLED = 21 GPIO.setup(greenLED, GPIO.OUT) GPIO.output(greenLED, True) GPIO.output(greenLED, False)
緑色LEDの名前付けから、点灯/消灯までを行っています。
これで、配線とテストは終わりです。
PythonからLEDを順番に点灯する
プログラムで、順番にLEDを点灯/消灯するには、sleepコマンドを使って、一つのLEDを点灯した後、一時的にプログラムの動作を停止する必要があります。
プログラムを止めないと、一瞬で実行が終了するので、順に点灯し消灯する動作を見ることができません。
以下を入力して、sleepコマンドが使用できるようにします。
from time import sleep
3つのLEDを、Pythonのタプルを使って、一括で管理します。
Pythonのタプルは、ほかの言語では「配列」と呼ばれる機能に近い構文です。
LEDs = (redLED, yellowLED, greenLED)
タプルを使用することで、LEDをループ(繰り返し)処理で操作することができます。
for i in range(100): GPIO.output(LEDs[i % 3], True) sleep(2) GPIO.output(LEDs[i % 3], False)
2行目から4行目の行頭には、空白記号が並んでいます。この空白をPythonでは「インデント」と呼び、重要な意味があります。必ずこの通りに入力してください。
空白記号は4個です。
入力が終わったら、カーソルが行頭にある状態で[エンターキー]を押します。
2秒ごとに、点灯するLEDが、左から右に移動するはずです。
しばらく点灯/消灯を繰り返した後に、プログラムは終了します。
[Ctrl+c]キーを押すと、強制的にプログラムの実行を中断できます。
今回のソースコードで使用した、Pythonの構文の詳細な説明を確認する場合には、公式ドキュメントを参照してください。
後片付け
プログラム中で割り当てたGPIOピンを、忘れずに解放します。
GPIO.cleanup()
これで完了です。
Pythonのコマンド入力状態を、次のコマンドで終了しましょう。
exit()
[Ctrl+d]キーでも、同様に終了できます。
4. まとめ
今回は、ラズパイでPythonを使うためのRPi.GPIOライブラリを紹介しました。
パワフルな機能を持つため、GPIOピンを制御するほかのライブラリも内部でRPi.GPIOを使用しています。
PythonからGPIOピンを制御するためのライブラリは、何種類かありますが、どれから始めようか迷っているのなら、RPi.GPIOをお勧めします。
GPIOピンの細かい設定ができるので、RPi.GPIOの使い方をマスターすれば、本格的な機器をラズパイで作成する際にも役立つでしょう。
初心者には少し難しい操作もありますが、このライブラリは人気が高く、参考資料も多く公開されているので、学習しやすいはずです。ぜひ試してください。