ラズパイとセンサで楽しむお手軽IoT
ここでは「ラズパイとセンサで楽しむお手軽IoT」と称して、外部からデバイスを操作したり、外部からセンサの情報を読み取ったりする方法を紹介します。
Raspberry PiでLEDを光らせたり、センサーで取得したデータの可視化を行います。
Raspberry Piは、「GPIO」と呼ばれるコネクタを介して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ピンの出力電圧は3.3Vです。電圧を出力している状態を「HIGH」と呼びます。また0V(電圧を出力しない状態)が「LOW」です。
また、GPIOピンが入力に設定されているときは、ピンに電圧がかかる状態を「HIGH」、かからない状態を「LOW」と呼びます。
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は、ラズパイの状態をパソコンに伝えたり、ほかの機器にコマンドを送って制御したりするなど、電線を通した機器間の通信によく使用されます。