入門者向け

ラズパイ(Raspberry Pi)のGPIOを再確認!

まずは汎用入出力からマスターしよう

 

近年、ラズパイ(Raspberry Pi)は、小型で低価格なシングルボードコンピューターとして、人気が出てきました。Linuxが動作することから、ネットワーク機器はもちろん、動画再生やゲーム機などにも応用されています。

長年、趣味でラズパイを触っていても、ハードウェアには興味を持たなかった方も多いのではないでしょうか?

ラズパイは、基板上に信号を入出力するピンがあらかじめ実装されていて、機能を簡単に拡張できるように設計されています。
この使い方をマスターすれば、ホームオートメーションや産業用ロボットの制御など、本格的な電子機器の開発も夢ではありません。

本記事では、その第一歩となる、入出力の学習を進めます。

raspberrypi-gpio-01

ラズパイとブレッドボード

 

目次

 

ラズパイ(Raspberry Pi)のGPIOは外の世界への入口!

ラズパイには「GPIO」と呼ばれるコネクタが搭載され、ほかのデバイスと、簡単に信号をやりとりできるよう設計されています。
このGPIOコネクタには40本のピンがあります。ラズパイの古いモデルは26本です。

GPIOの概要

このGPIOを構成するピンは、次の4つの主要な機能に分類できます。

  • 電源ピン: 電源を供給するピンです。
  • GNDピン: グランドピンです。
  • DNC: ユーザが使用できないピン(do not connect)です。
  • I/O: 汎用入出力ピンです。

電源ピンは、3.3V5Vを供給します。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と数字を合わせて表記します。

raspberrypi-gpio-02

ラズパイのGPIO

 

GPIOピンの出力電圧は3.3Vです。電圧を出力している状態を「HIGH」と呼びます。また0V(電圧を出力しない状態)が「LOW」です。
また、GPIOピンが入力に設定されているときは、ピンに電圧がかかる状態を「HIGH」、かからない状態を「LOW」と呼びます。

GPIOピンは外部の機器と通信する

GPIOは、「ほかのデバイスとの通信のため」に用意されているため、接続する機器には注意が必要です。
3.3Vの出力に設定されたGPIOピンは、全てのピンを合わせて約50mAの電流しか取り出せません。さらに、1本のGPIOピンが扱える電流は16mAまでです。この制限を超えると、ラズパイが破損します。

モータやリレーの駆動のような多くの電流を必要とするデバイスをGPIOピンで使用するには、駆動回路などが必要になります。
5Vの電源ピンは、ラズパイに接続されている電源が、ほぼ、そのまま使用可能です。

GPIOをブレッドボードに接続しよう

初めてGPIOを扱う場合は、ブレッドボードの使用をお勧めします。半田付けを行わなくても接続ができるので、回路の修正が簡単です。
ブレッドボードを使ったことがない方は、以下の動画(英語)で、標準的な使用方法を確認してください。

raspberrypi-gpio-03

標準的なブレッドボードの使用方法

 

GPIO拡張基板と呼ばれる製品も販売されています。GPIOに接続して、ラズパイの機能を拡張しやすくする製品です。
数多くの種類がありますが、フラットケーブルでGPIOを延長し、ブレッドボードに接続するタイプが使いやすくてお勧めです。

ブレッドボードにも、大小さまざまな種類があります。
GPIOに実装されている全てのピンを、ブレッドボードに引き出すと、2×20ピン分のスペースが必要です。小さなブレッドボードでは、自由に電子部品を配置できません。十分なスペースを確保するためにも、大きいものを選ぶと良いでしょう。

 

GPIOピンはPWMやシリアル通信などの機能を併せ持つ

全てのGPIOピンはHIGH/LOWレベルの信号を入出力でき、プログラムから制御できます。
また、いくつかのGPIOピンは、特殊な機能を併せ持ち、プログラムから切り替えて使用できます。

以下がGPIOのピンアサインです。
GPIOn(nは数字)はGPIOピンです。また、GPIOピンに併記されている名前は、該当するピンが持つ特殊な機能です。

raspberrypi-gpio-04

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をプッシュボタンで操作してみましょう。

準備

次のものを用意してください。

ラズパイ本体RaspbianがインストールされたSDカード

raspberrypi-gpio-05

ブレッドボード

raspberrypi-gpio-06

LED

raspberrypi-gpio-07

上記に加え、次のものも必要です。

  • 抵抗: LEDの電流を制限します。抵抗値は220〜1kΩです。
  • USBキーボード、マウス: コマンドの入力に使用します。ネットワーク上からSSH接続で操作できる場合は不要です。
  • 電線: ラズパイとブレッドボード、ブレッドボード上の電子部品をつなぎます。
  • プッシュボタン

また、ラズパイとブレッドボードの接続には、GPIO拡張基板があると便利です。

raspberrypi-gpio-08

ラズパイとブレッドボードを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が、電子工作だけでなく、本格的な機器の作成に応用できるイメージは、伝わったかと思います。
小型ですが、パワフルなラズパイを使って、ぜひ、皆さんのアイデアを形にしてください。

アバター画像

エレクトロニクスやメカトロニクスを愛するみなさんに、深く愛されるサイトを目指してDevice Plusを運営中。

https://deviceplus.jp

NHK学生ロボコン2016 出場ロボット解剖計画