まずは汎用入出力からマスターしよう
近年、ラズパイ(Raspberry Pi)は、小型で低価格なシングルボードコンピューターとして、人気が出てきました。Linuxが動作することから、ネットワーク機器はもちろん、動画再生やゲーム機などにも応用されています。
長年、趣味でラズパイを触っていても、ハードウェアには興味を持たなかった方も多いのではないでしょうか?
ラズパイは、基板上に信号を入出力するピンがあらかじめ実装されていて、機能を簡単に拡張できるように設計されています。
この使い方をマスターすれば、ホームオートメーションや産業用ロボットの制御など、本格的な電子機器の開発も夢ではありません。
本記事では、その第一歩となる、入出力の学習を進めます。
目次
- ラズパイのGPIOは外の世界への入口!
- GPIOの概要
- GPIOピンは外部の機器と通信する
- GPIOをブレッドボードに接続しよう
- GPIOピンはPWMやシリアル通信などの機能を併せ持つ
- ハードウェアPWM
- シリアル通信
- プルダウン・プルアップ抵抗
- GPIOピンをプログラムで制御しよう
- プッシュボタンでLEDを操作しよう
- 準備
- ラズパイの電源をブレッドボードに接続
- プッシュボタンの接続
- プログラムでプッシュボタンの状態を知る
- LEDの接続
- プッシュボタンでLEDを操作
- まとめ
ラズパイ(Raspberry Pi)のGPIOは外の世界への入口!
ラズパイには「GPIO」と呼ばれるコネクタが搭載され、ほかのデバイスと、簡単に信号をやりとりできるよう設計されています。
このGPIOコネクタには40本のピンがあります。ラズパイの古いモデルは26本です。
GPIOの概要
このGPIOを構成するピンは、次の4つの主要な機能に分類できます。
- 電源ピン: 電源を供給するピンです。
- GNDピン: グランドピンです。
- DNC: ユーザが使用できないピン(do not connect)です。
- I/O: 汎用入出力ピンです。
電源ピンは、3.3Vと5Vを供給します。Power・3.3V・5Vなどと表記されます。
DNCは古いタイプのラズパイに存在しました。Reservedと表記されることもあります。現在ではI/Oとして使用できるように改良されました。
GPIOは「General Purpose Input/Output」の頭文字をとったもので、日本語では「汎用入出力」と訳されます。「汎用」とは、特定の用途に限定されず、ユーザが自由に信号の入出力に使用できるという意味です。
GPIOはラズベリーパイ以外の機器にも使われている一般的な名称です。
ラズパイのGPIOとは、正しくは上記のI/Oピンを指しますが、コネクタ全体を意味する場合もあります。明確な区別はありませんが、「GPIOピン」と呼ばれる場合は、I/Oピンの意味で使用されることが多いようです。
本記事では、「GPIO」はコネクタ全体、「GPIOピン」はI/Oピンの意味で使用します。
また、GPIOピンの特定の1本を指す場合は、GPIO25のようにGPIOと数字を合わせて表記します。
GPIOピンの出力電圧は3.3Vです。電圧を出力している状態を「HIGH」と呼びます。また0V(電圧を出力しない状態)が「LOW」です。
また、GPIOピンが入力に設定されているときは、ピンに電圧がかかる状態を「HIGH」、かからない状態を「LOW」と呼びます。
GPIOピンは外部の機器と通信する
GPIOは、「ほかのデバイスとの通信のため」に用意されているため、接続する機器には注意が必要です。
3.3Vの出力に設定されたGPIOピンは、全てのピンを合わせて約50mAの電流しか取り出せません。さらに、1本のGPIOピンが扱える電流は16mAまでです。この制限を超えると、ラズパイが破損します。
モータやリレーの駆動のような多くの電流を必要とするデバイスをGPIOピンで使用するには、駆動回路などが必要になります。
5Vの電源ピンは、ラズパイに接続されている電源が、ほぼ、そのまま使用可能です。
GPIOをブレッドボードに接続しよう
初めてGPIOを扱う場合は、ブレッドボードの使用をお勧めします。半田付けを行わなくても接続ができるので、回路の修正が簡単です。
ブレッドボードを使ったことがない方は、以下の動画(英語)で、標準的な使用方法を確認してください。
GPIO拡張基板と呼ばれる製品も販売されています。GPIOに接続して、ラズパイの機能を拡張しやすくする製品です。
数多くの種類がありますが、フラットケーブルでGPIOを延長し、ブレッドボードに接続するタイプが使いやすくてお勧めです。
ブレッドボードにも、大小さまざまな種類があります。
GPIOに実装されている全てのピンを、ブレッドボードに引き出すと、2×20ピン分のスペースが必要です。小さなブレッドボードでは、自由に電子部品を配置できません。十分なスペースを確保するためにも、大きいものを選ぶと良いでしょう。
GPIOピンはPWMやシリアル通信などの機能を併せ持つ
全てのGPIOピンはHIGH/LOWレベルの信号を入出力でき、プログラムから制御できます。
また、いくつかのGPIOピンは、特殊な機能を併せ持ち、プログラムから切り替えて使用できます。
以下がGPIOのピンアサインです。
GPIOn(nは数字)はGPIOピンです。また、GPIOピンに併記されている名前は、該当するピンが持つ特殊な機能です。
特殊な機能を持つピンの中で、よく使用されるものをいくつか紹介します。
ハードウェアPWM
PWMは「Pulse Width Modulation」の頭文字をとったものです。PWMは、高速にこの出力をON/OFFすることで、振幅が一定の波形を作り出したり、疑似的なアナログな出力調整を行ったりするための機能です。
PWMは、3.3VをON/OFFすることで作られるため、1.2V、2.4Vのような中間の値はありません。
このPWMによって作り出される波形は、LEDの明るさ調整など、デバイスの動作を微調整する用途に使えます。
LEDの例では、人間には気づかないほどの速さでON/OFFを繰り返すことで、人間には、半分程度の電圧がかかっているように薄暗く見えます。また、高速にON/OFFされた波形を、フィルター(「ローパスフィルター」と呼ばれます)に通すことで、アナログ的な波形を作ることも可能です。
これを利用すれば、ラズパイで音が作り出せますよ。ただし、あまり良い音ではないため、警報などの単調な音の生成に向いています。
PWMは、汎用的なGPIOピンを、ソフトウェア(プログラム)からON/OFFすることで作ることができます。
ただし、ラズパイに搭載されているOS(Linux)は、裏側でさまざまな処理を同時に実行しているため、正確な周期でのON/OFF切り替えが苦手です。
そこで、正確な周期の波形を作る機能として、ハードウェアPWMが使われます。ラズベリーパイではGPIO18(GPIOピンの12番)とGPIO19(GPIOピンの35番)が、ハードウェアPWMとして使用できます。
このピンは、ヘッドフォン端子から音声を出力する用途と併用されています。そのため、音声を出力するアプリケーションの実行中は、このピンをハードウェアPWMとして使用することができません。
シリアル通信
ラズパイは、I2CやSPI、UARTと呼ばれるシリアル通信の機能を持ち、ほかのデバイスと情報の送受信ができます。
それぞれは「プロトコル」と呼ばれる通信方式が違い、ほかのデバイスと接続する場合は、このプロトコルが一致していないと通信できません。
I2CとSPIは、ラズパイとGPIOに接続されたデバイスとの近距離通信に使われます。D/Aコンバータなど、ラズパイに機能を追加するデバイスとの通信に向いています。
UARTは、ラズパイの状態をパソコンに伝えたり、ほかの機器にコマンドを送って制御したりするなど、電線を通した機器間の通信によく使用されます。
内蔵プルダウン・内蔵プルアップ抵抗
ラズパイに接続したボタンやスイッチで、何かを制御するのは電子工作の基本です。
そこでラズパイは、簡単な配線で、このような使い方ができるように設計されています。
電源ピンからボタンを通してGPIOピンに接続すると、GPIOピンの入力がHIGHに変化するので、プログラムはボタンが押されたことを検知できます。
また電源ピンの代わりにGNDピンに接続すれば、GPIOピンの入力はLOWに変化します。
ここで問題が起こります。
ボタンが押されたときは、電源ピン/GNDピンのどちらに接続されているかを検出して、GPIOピンの入力をそれぞれHIGH/LOWと判別します。
ところが、ボタンが押されていないとき、GPIOピンは電源ピンやGNDピンの、どちらにも接続されていない状態になります。
この状態を「入力ピンが浮いている」と言います。入力ピンの電圧が不安定となり、プログラムがHIGH/LOWを誤って読み取ってしまうことがあります。
この状態を避けるための抵抗が、プルアップ/プルダウン抵抗です。
GPIOピンから、ボタンを通してGNDピンに接続する場合、ボタンが押されなければGPIOピンは浮いた状態になります。それを防ぐため、GPIOピンとボタンの間に、抵抗を通して電源ピンに接続する回路が、プルアップ抵抗です。
こうすることで、ボタンを押していないときのGPIOピンの入力はHIGHとなります。
反対にプルダウン抵抗は、電源ピンからボタンを通してGPIOピンにつながっている場合に使用します。この場合は、GPIOピンとボタンの間に、抵抗を通してGNDピンに接続します。
ボタンを押さないときのGPIOピンの入力はLOW、押したときはHIGHです。
GPIOピンを入力で使用する際には、大切なテクニックですが、自分で配線する必要はありません。
このプルアップ/プルダウン抵抗は、ラズパイの内部で、あらかじめ接続されているので外付けの抵抗は不要です。さらに、このプルアップ/プルダウン抵抗を、利用するかしないかを、プログラムで選択できるので、柔軟に回路を構成できます。
このプルアップ抵抗とプルダウン抵抗は、単に、それぞれプルアップ、プルダウンと呼ばれることがあります。意味は全く同じです。
GPIOピンをプログラムで制御しよう
ラズパイのGPIOピンを、プログラムから手軽に制御するには、GPIO Zeroと呼ばれる、Pythonのライブラリーを使用します。
Pythonでプログラムを作成した経験がある方なら、このライブラリーは簡単に利用できます。
もし、初めてPythonプログラミングを行うなら、最初にPythonのチュートリアルから始めましょう。
本記事では、後ほど、PythonでGPIOピンの制御を行います。簡単なコマンドなので、身構える必要はありません。記事の通りに進めれば問題ないでしょう。
Pythonのプログラミングを本格的に学習したい場合は、書籍退屈なことはPythonにやらせようがお勧めです。
原著(英語)はAutomate the Boring Stuff With Pythonです。WEB版は無料で読むことができます。
ライブラリーGPIO Zeroは、Raspbian(ラズパイのOSの一つ)にあらかじめインストールされているはずです。Raspbian Liteや、ほかのOSを使用している場合は、先にインストールしておいてください。
手順は、GPIO Zeroの公式ページ(英語)を参考に進めてください。
プッシュボタンでLEDを操作しよう
ここからは、GPIOピンの基本的な動作の入出力について学習します。
実際にラズパイでプログラムを作って、GPIOピンにつなげたLEDをプッシュボタンで操作してみましょう。
準備
次のものを用意してください。
上記に加え、次のものも必要です。
- 抵抗: LEDの電流を制限します。抵抗値は220〜1kΩです。
- USBキーボード、マウス: コマンドの入力に使用します。ネットワーク上からSSH接続で操作できる場合は不要です。
- 電線: ラズパイとブレッドボード、ブレッドボード上の電子部品をつなぎます。
- プッシュボタン
また、ラズパイとブレッドボードの接続には、GPIO拡張基板があると便利です。
ラズパイ(Raspberry Pi)の電源をブレッドボードに接続
最初に、ラズパイの電源ピンとブレッドボードの電源ラインを接続します。
ラズパイの3.3Vピンを電源ライン(+)に、ラズパイのGNDピンを電源ライン(-)に接続してください。
プッシュボタンの接続
プッシュボタンを、ブレッドボードの空きスペースの中央付近に置きます。いずれかの端子を、GPIOピンに接続します。GPIOn(nは数字)のピンであればどこでも構いません。
今回は、例としてGPIO13に接続します。
続いて、プッシュボタンの対角線上にある別のピンを、ブレッドボードの電源ライン(-)に接続します。ボタンを押すことで、GPIOピン>プッシュボタン>GNDピンと電流が流れます。
プッシュボタンを接続したGPIOピンの番号は、後ほどプログラムで使用します。忘れないようにしましょう。
プログラムでプッシュボタンの状態を知る
ここからは、ラズパイのプログラムが加わります。
プログラムとGPIOピンの関係が分かりやすいように、少しずつプログラムを試しながら電子部品を接続します。
ラズパイの画面に戻りPythonを起動しましょう。ターミナルを開いて、次のコマンドを入力してください。
python3
Pythonが起動したはずです。
ターミナル上に、Pythonのバージョン番号などが表示されて、プロンプトが「>>>」に変わっていれば正常に起動しています。
続いて、次のコマンドです。
from gpiozero import Button
もし「ImportError」と、エラーが表示された場合は、入力したコマンドを確認してください。Pythonは、大文字と小文字を区別します。
エラーメッセージが「ModuleNotFoundError」の場合は、GPIO Zeroがインストールされていません。
前の手順に戻って、GPIO Zeroをインストールしてください。
エラーメッセージが表示されなければ正常に進んでいるので、次に進みます。以下のコマンドを入力してください。
button = Button(13)
Button()はPythonのプログラムと、ラズパイのGPIOピンを関連付けるコマンドです。これ以降、プログラムの中のbuttonは、GPIOピンにつながるボタンを意味します。
Button()は自動的にGPIOピンに内蔵されているプルアップ抵抗を有効にします。
また、Button()の括弧内の数字13は、GPIO13を意味します。もし、プッシュボタンを、GPIO13以外に接続した場合は、読み替えてください。
ここで、プッシュボタンの状態が取得できるかテストします。次のコマンドを入力してください。
while True: if button.is_pressed: print('Sweet, the button works!') break
2行目から4行目の行頭には、空白記号が並んでいます。Pythonではこの空白を「インデント」と呼び、重要な意味があります。必ずこの通りに入力してください。
2行目は空白記号4個、3行目・4行目は空白記号8個です。
入力が終わったら、カーソルが行頭にある状態で[エンターキー]を押します。この操作によって作ったプログラムが実行されます。
プッシュボタンを押すと、ターミナル上に「Sweet, the button works!」とメッセージが表示され、プログラムが終了します。
もし、プッシュボタンを押しても、ターミナル上に何も表示されない場合は、プログラムのピン指定の誤りや配線などを確認してみてください。
[Ctrl+c]キーを押すと、強制的にプログラムの実行を中断できます。
LEDを接続してGPIOの出力も制御
回路にLEDを追加します。LEDには極性があるので、電線を接続する端子に注意してください。
LEDをよく見ると、2本の端子の長さが違うことに気付くでしょう。長い方の端子がプラス側(アノード)、短い方がマイナス側(カソード)です。
LEDをブレッドボードの空きスペースに挿します。ブレッドボードの電源ラインと端子が並行になるようにしてください。
LEDの長い方をGPIOピンに接続します。今回は、例としてGPIO26につなぎましょう。
LEDの電流を制限する抵抗をつなげます。抵抗に向きはありません。
抵抗をブレッドボードに挿し、片方の端子とLEDの短い方の端子を接続します。
抵抗のもう一方の端子を電源ライン(-)に接続します。
配線が終わったら、ラズパイの画面に戻ります。先ほどのターミナルから、次のコマンドを入力してください。
from gpiozero import LED led = LED(26)
この後、LEDの点灯・消灯を、ターミナル上から、次のコマンドで操作できます。
led.on() led.off()
コマンドの入力に合わせて、LEDが点灯・消灯しない時は、配線を確認してください。
プッシュボタンでLEDを操作
最後に、プッシュボタンに合わせて、LEDが点灯・消灯するようにします。
次のコマンドを入力してください。
button.when_pressed = led.on
ブレッドボード上のプッシュボタンを押すと、LEDが点灯するはずです。
ただし、プッシュボタンから手を離しても、LEDは点灯している状態が続きます。LEDを消灯する処理を入力しましょう。
button.when_released = led.off
もう一度、プッシュボタンを押してください。今度は、プッシュボタンの動作に合わせて、LEDが点灯・消灯するはずです。
これで完了です。
Pythonのコマンド入力状態を、次のコマンドで終了しましょう。
exit()
まとめ
今回は、簡単な実験を通して、ラズパイのGPIOピンをプログラムから制御する方法について学習しました。
GPIOピンの入出力は、単純な機能ですが、全ての機器制御の基礎になる必須のテクニックです。色々試して、マスターしてください。
また、本記事ではGPIOピンの「特殊な機能」について、一部を説明しました。
ラズパイのGPIOが、電子工作だけでなく、本格的な機器の作成に応用できるイメージは、伝わったかと思います。
小型ですが、パワフルなラズパイを使って、ぜひ、皆さんのアイデアを形にしてください。