16.入出力の実験 (2015.3.19)

最初にGPIOを使用する上で最も基本となる入出力の実験を行います。出力はLEDを使用して点滅を、入力はスイッチを使って状態をチェックします。両方を組み合わせれば、スイッチが押されたらLEDを点滅させるような実験ができます。

LEDというデバイスについては、テキストで詳細に説明されているので割愛し、まずはLEDを点灯させる回路を組みます。ブレッドボードがあれば今後の実験回路を組むのも楽なので、一通り揃えておくと良いと思います。必要無ければ簡単な回路なので、部品を直接ハンダ付けしても構いません。ただし、Raspberry PiのGPIO端子に直接ハンダ付けするのはまずいので、リード線で外部に引き出してそこに部品を付けます。

私は今後の実験とその後の応用も考慮して、GPIOコネクタと同じものを別のボードに付けて、間をフラットケーブルで結ぶことにしました。これならRaspberry Pi自身には何も手を加えないので安心です。経由先のボードは普通の蛇の目基板で構いません。ピンソケットを使って手製のブレッドボードを作るのも良いでしょう。

当初はそう考えていましたが、amazonでケーブルとブレッドボード、LED等の部品類がセットになったものが1,980円(送料・税込)で売られていたので、手っ取り早く購入してしまいました。個別に購入してもそれなりに費用がかかることを考えれば、かえってこの方が面倒が無くて良さそうです。

●実験用のセット例
昔なら手作りするところですが、今は本当に便利になったものです。当初予定の自作ボードは、いずれ本格的な実験をする時に作ることにしましょう。

B+基板のGPIOコネクタは40ピンなので、IDEケーブルと同じです。ただ、実際のIDEケーブルは、20ピンが誤挿入防止のため埋められていて、残念ながらそのままでは使えません。

LEDを点灯させるための回路は、テキストの(b)の方法をとることにします。一般的に信号出力の負荷を避けるため、低レベル側(L)になった時にLEDを点灯させる(GPIO側で電流を引き込む形)ことが多いからです。LEDを駆動する場合は数ミリアンペア程度電流を流すのが普通です。セットの付属品が1Kオームなので近い値になります。スイッチ回路はプルアップ抵抗を使い、スイッチを押した時に低レベル側になるようにします。

●ブレッドボードにコネクタを付けたところ
入手したボードの端子にはポート名等が書いてあって、わかり易くできています。簡単な実験なら、これで間に合うでしょう。

ところが、いざセットを使用する段階になって、信号線の名前が標準と違うことが判明しました。しかもピン番号順ではなく独自の配列(ポート順で見方によってはこちらの方がわかり易いのですが)になっています。結局テスターで当たって対照表を作る羽目になりました。(怒!)

●コンピューターのケーブル接続状態
左端がGPIOコネクタで、フラットケーブルでブレッドボードと結びます。ついでに無線LANを使えるようにしました。写真では奥になるので見えませんが、Buffalo製のWLI-UC-GNMをUSB端子に挿してあります。別途ドライバは不要で挿せば認識します。

プログラムで拡張コネクタを使用する場合は、Pythonに用意されているRPi.GPIOライブラリを利用します。早速テキストに従ってLEDの点滅実験を始めましょう。まずは出力端子を使ったLEDのオン/オフ(点滅)です。テキストではLEDをGPIOの出力電圧で点灯していますが(テキストの(q)の回路)、ここでは一般的な使い方としてテキストの(b)のようにGPIO出力を引き込みで使用しLEDを駆動します。つまりテキストのプログラム例とはLEDのオン/オフが逆になるわけです。

●ブレッドボード上の配線
まとまった横1列が繋がっているので、それを利用して回路を組みます。今回はGPIOコネクタの11番ピンを使います。手元のT型変換コネクタではP0(GPIOではP17に対応)と書かれていました。プログラムを実行すると、写真左下のLEDが点滅します。
●制御プログラム
保存をするために新しいウインドウを開いてプログラムを記述します。 点滅はタイマーを使って0.5秒間隔でLEDをオン・オフすることで実現しています。無限ループになっているので、プログラムを実行すればずっとLEDが点滅し続けます。これを終了させるために、無限ループの例外処理で、キーボードによる割り込み(Ctrl+Cキー)を許可しています。そして、最後はGPIOを開放して終了します。

LEDが点滅することがわかったので、次はブレッドボードにボタンを用意して制御入力とし、ボタンのオン/オフによってLEDの点灯、消灯を行います。単純な事例ですが、両者を組み合わせることで入力の状態によって出力の状態を変える、基本的な入出力をマスターできます。

●ブレッドボード上の配線
LEDの回路は前回のものをそのまま使用します。今回のボタン入力にはGPIOコネクタの12番ピンを使います。手元のT型変換コネクタではP1(GPIOではP18に対応)と書かれていました。プログラムを実行するとLEDを消灯したまま待機状態となります。ボタンを押すとその間だけLEDが点灯し、離すと消灯します。このような単純なテストでは関係ありませんが、実際のスイッチはチャタリングと言って、ボタンを押したり離した瞬間にオン/オフを短時間繰り返す性質があります。チャタリングの影響を除去するために、ハードウェアではコンデンサと抵抗で急峻な振動波を平滑します。また、ソフトウェアではボタンの状態が変化したごく短時間後に再度ボタンの状態をチェックし、同じであれば変化したことを確定します。チャタリングは時として重大な障害になることもあるので、実際の応用時には注意すべきことです。
●制御プログラム
保存をするために新しいウインドウを開いてプログラムを記述します。 無限ループによって常にボタン入力をチェックして、押されたら(入力がH→Lになる)LEDを点灯(出力をH→Lに)します。逆に離れたら(入力がL→HになるLEDを消灯(出力をL→Hに)します。入力の状態は値が0ならL、1ならHなので、条件分岐でLEDのオンとオフの処理を選択しています。

テスト回路は最終的には下図のようにしています。ボタン側の回路にはプルアップのR2の他にR3を追加しました。ボタンの状態チェックにはGPIOを入力ポートとして使いますが、万一誤って出力にセットされた場合、R3が無いとボタンを押した時に出力がショートされてしまうため、安全対策として入れています。必須ではありませんが、どこで何が起こるかわからないので、常に安全を考えながら回路を組むべきだと個人的には考えています。