ラズベリーパイでの電子工作を学ぶ基礎としてLEDを点灯させるというものがあります。LEDを点滅させたりしてチカチカと光ることから「Lチカ」なんて略されることがあります。
LEDを点灯させたり消したりするという作業は電気を学ぶ第一歩です。電気が通っているかどうかをランプの光で確認できます。今回はそんな電子工作の第一歩を踏み出してみましょう。
ラズベリーパイにはGPIOとよばれる入力・出力(I/O)のポートがついています。このポートに配線を行い、プログラムを書いて実行させることで、ラズベリーパイにつないだ電子回路をコントロールできます。今回はLEDと抵抗というとてもシンプルな回路ですが、まずは基本を押さえます。
プログラムを書くためのエディタ「Geany」
ラズベリーパイにはプログラムを書くためのエディタが沢山用意されていますが、今回は様々なプログラミング言語に対応しているGeany(ジーニー)を使ってコードを書いてみます。この講座ではPython(パイソン)言語によってコードを書きますが、コードについての詳細は後回しにしてとりあえず、まずはPythonのコードを書き写して動作させてみましょう。
使用する部品
- Raspberry Pi 3 Model B × 1
- 電源アダプター5V 2.5A × 1
- ブレットボード × 1
- LED × 1
- 抵抗 220Ω × 1
- ジャンプワイヤー(オス/メス) × 2
※これらの部品はFabshopがふるさと納税で提供している「ふるさと納税Raspberry Piスターターキット」もしくは当サイトで購入可能な「Raspberry Pi スターターキット」の電子工作キットに同梱されています。
実体配線図
GPIOポートの確認と配線
ラズベリーパイについているGPIOポートですが、このポートの役割はどうなっているのでしょうか?それを調べるためには、ターミナルからGPIOポートの役割を表示させるコマンドを打つのが便利です。配線図の様にGPIOを上側にしてラズベリーパイを見た場合、今回2段ある下段の一番左側と下段左から6番目に配線しています。
GPIOピンの番号や機能を調べるには画面左上の「ラズベリーパイ」メニューをクリックして「アクセサリ」-「LXTerminal」をクリックし、以下のコマンドを入力します。
$ gpio readall
とコマンドを打つと、図のようにGPIOのリストが表示されます。今回はRPi.GPIOというライブラリを使っていますので、Phisicalの部分に書かれている番号を使います。
実はちょっと変わった配線です!
さて、ここでこの配線についてちょっと解説しておきます。LEDには極性と呼ばれるプラスマイナスがあります。足が長い方をとアノード呼び+(プラス)、足が短い方をカソード呼び―(マイナス)につなぎます。
電気を学ぶときには確かに+:プラスと―:マイナスという考え方をし、プラスから電流が流れてマイナスにもどるという考え方が一般的です。
電気の世界では「電圧」と「電流」というものがあり、イメージとしては電圧が高い方から低い方へと電流が流れる。という考え方をします。つまり、今回の回路では、プラス(+)と言うのは電圧が高い方で、マイナス(-)は低い方という考え方もします。
Geanyの起動とプログラムの保存
スタートメニューから「プログラミング」→「Geany」をクリックして開きます。
プログラムの考え方
今回の配線はちょっと変わっていますとお話ししました。今回LEDを点灯させる場合、LEDの足が長い方(アノード)が3.3Vの位置に接続されています。反対側はPin番号11のところに配線されています。多くの書籍などは今回の様にLEDを点滅させる場合は、LEDの足が短い方(カソード)を0V(GNDとも言う)にして足が長い方をPin番号11に接続しているものが多いです。
今回の接続方法の場合は11番のピンを0Vにすることで、3.3Vという高い電圧から0Vという低い電圧に向かって電流が流れるためLEDが点灯します。LEDの明かりを消したい場合は11番のピンの電圧を3.3Vにすることで同じ電圧になるため、電圧に差が生まれないために電流が流れなくなります。
この下にある「Blinking LEDのプログラム」の枠右上に並んだアイコンの内、右から2番目のアイコンをクリックします。(マウスをアイコンに近づけると”Copy”の表示が現れます) プログラムの文字列が全て選択されるので、「Ctrl」と「C」キーを同時に押してコピーします。
import RPi.GPIO as GPIO import time LedPin = 11 def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(LedPin, GPIO.OUT) GPIO.output(LedPin, GPIO.HIGH) def loop(): while True: print ('...led on') GPIO.output(LedPin, GPIO.LOW) time.sleep(0.5) print ('led off...') GPIO.output(LedPin, GPIO.HIGH) time.sleep(0.5) def destroy(): GPIO.output(LedPin, GPIO.HIGH) GPIO.cleanup() if __name__ == '__main__': setup() try: loop() except KeyboardInterrupt: destroy()
Pythonソースコードについての解説
最初の2行にimportというコードがあります。Pythonだけでなくいろいろなプログラミング言語にはライブラリと呼ばれるプログラムを実行させるための機能があらかじめ用意されているリストのようなものがあります。これらをプログラムをスタートさせる最初に読み込んでおくことで、1から全てプログラムを書かなければならないところをすでにある機能として使う事ができます。
ここでは、「RPi.GPIO as GPIO」と「time」という2つのライブラリを読み込んで利用します。
RPi.GPIOというライブラリはラズベリーパイのGPIOポートをコントロールするための機能が用意されているため、短いコードでGPIOの設定や制御をするためのライブラリです。つまりこれを読み込んでおかないとプログラムを1からすべて書かなければならないため、上記ソースコードが倍以上の量になってしまいます。
具体的には GPIO.semode(GPIO.BOARD) などがこの機能になります。
timeライブラリも同様にLEDを点滅させるために、何秒間隔でチカチカさせるかなどを設定するための「時間」に関するコントロールを行うためのプログラムが入っています。
具体的には time.sleep(0.5) で、0.5秒間待つという指示になります。これはtimeライブラリをインポートしていないと使えない機能という事になります。
Python関数の定義
プログラムの中に大きく分けて3つの「def」で始まる部分があります。これらはdefineの略で今回使う機能を作りますよとコンピュータに教えてあげている部分です。
まず変数の部分ですが、適当にLedPinという変数を作りました。ここに11という数字を入れておきます。
LedPin = 11
ピン番号をこのLedPinというところに格納しておくことで、今は11番ピンを使っているけれど、やっぱり違うピン番号の場所を使いたいという場合はここを書き換えることでプログラムすべてに適応されるので、変数として最初に設定しておきます。
def setup() についてはこのあとの3行で書かれている部分でGPIOのポートの設定をしています。先ほど最初にGPIOのポートの役割を $ gpio readall というコマンドで調査しました。
最初に GPIO.setmode(GPIO.BOARD) とすることで、Physicalのピン番号になります。一覧の一番左側にBCMとありますので、この番号を使いたい場合はGPIO.setmode(GPIO.BCM)とすることでこちらの番号になり、11番だった場所はBCMだと17番になります。
Physicalの11番のところを見ると初期値が0Vで、MODEがIN、つまり入力になっています。
プログラム全体の流れと意味
このプログラムは大きく分けて3つの構成に分かれています。
- ライブラリのインポート
- 関数を定義
- プログラムを実行
2の関数の定義では、まずdef setup()ではGPIOの初期値などの設定を行う関数を用意しています。
次にdef loop()の部分ではLEDを点灯したときには「…led on」という文字も画面上に表示したい。0.5秒後にLEDをOFFにしたときには「led off…」と文字で表示するというのを繰り返すという関数です。
while True : 以下の段落に書かれているものをずっと繰り返すという設定です。
3つ目の関数は def destroy() : で、途中キーボードから強制終了の信号「Ctrl」+「C」キーが押されたら、LEDの点灯を消して使っていたGPIOポートを開放してプログラムを終了させるという関数です。このGPIO.cleanupというのを最後にやっておかないと、次にプログラムを動かしたときに、すでにGPIOポートが使われていてプログラムが正常に動かなかったりする場合があるため、非常に重要な後処理になります。
Pythonプログラムは上から順に実行される
プログラムのここまでは関数を定義したり初期設定をしたりといわば準備です。ここで作った関数を次々に実行していくのが次のパートで
if __name__ == ‘__main__’:ってなんだろう?
からの部分です。先程設定した関数の名前が次々に実行されていきます。まずこのif __name__ == ‘__main__’: の部分ですが、通常パイソンのプログラムはコマンドラインから実行します。今回なら
$ python blinkingled.py
というコマンドを打ちます。__name__という変数はもともとPythonにある特別な変数で、コマンドラインから上記コマンドを入力するとこの変数に__main__という文字列が入ります。ここでのif文は「もし、__name__に__main__という文字列が入っていたら以下のプログラムを実行する」という命令です。今回はコマンドラインからのプログラム実行なので、プログラムが動き始めます。このif文は毎回よく書くことから「おまじない」的に必ず書くものみたいに紹介してある書籍などもありますが、一応ちゃんと意味があります。
try , exceptで例外処理をチェック
try: 以下の部分ではloop()関数を実行しています。この部分でLEDが点滅しled on… …led offの文字を繰り返していますが、これらを実行している際に強制終了などの例外処理が起こった場合にどうするかの処理をexcept以降に書いています。
ここでは、except KeyboardInterrrupt: となっているので、キーボードから強制終了の信号が入ってきたらdestroy()関数を実行して、ちゃんと終了処理をしましょうというものです。
プログラムには様々なしきたりがあります。今回のLED Blinkingでは基本的なものを学びましたが、これらは今後毎回のように使うものが多いのでしっかり理解しましょう!
GPIOの入力IN と出力OUT
GPIOの役割として大きく分けると電気信号などを入れる入力INの役割をするのか、それとも出力OUTの役割をするのかを決めないといけません。これをI/O (入出力)の設定といいますが、今回はGPIOの11番に電圧をかけて信号を「出す」ためOUTという事になります。現状はINに設定されているので、GPIO.setup(LedPin, GPIO.OUT)という書き方でLedPinのポート、つまり11番をOUTに設定します。
続けて GPIO.output(LedPin, GPIO.HIGH) HIGHというのは電圧をかけるという意味です。ここでは高い電圧を11番ピンに出力するという命令になります。
この状態でLEDの状態はどうなるでしょうか? LEDのアノード側には3.3Vという高い電圧の設定になっていて、カソード側にも高い電圧が加わっているため、両方とも高い状態なので、電位差が無いため電流が流れません。という事で、この初期設定ではLEDが点灯していない状態になるという事です。
開いたGeanyのタブ「untitled×」の1行目にマウスカーソルを置いて右クリックして出てくるメニューから「貼り付け」を選択します。
Geanyのメニューバーから「ファイル」→「別名で保存」をクリックします。
新たに「ファイルを保存」画面が現れるので、左ペインの「デスクトップ」をクリックします。
「ファイルを保存」画面の1番上の項目「名前:」の入力欄に拡張子”.py”でプログラム名「blinkingled.py」と入力して「保存」ボタンをクリックします。
プログラムの実行
Geanyの画面に戻って、ツールバーの紙飛行機のようなアイコンをクリックします。
新たに「ターミナル」画面が開き、LEDの点滅に合わせて”led on”と”led off”が交互に出力されます。「Ctrl」と「C」キーを同時に押すとプログラムが停止します。