外は暑くて工房の作業も億劫になります。工房で作業するなら生命維持装置(クーラー)が必要です。というわけで、先回に続きRaspberry Piを使って遊びます。
Raspberry Pi 入門キットの購入
実はRaspberry Piの購入と合わせてラズパイキットも購入(¥7,360)していました。
開梱すると、ケースで入っており保管しやすくなっています。
2段式になっており、上段には、ブレッドボード、プロペラ、16進キー、LED、スイッチ、7セグメントLED、ICチップ、サーボモーターなどが入っています。
下段には、帯電防止袋に入ったセンサーモジュールや様々な基盤が詰め合わせされています。
取り出してみるとこんなに詰まっています。元に戻せるかなあ(笑)
なんか駄菓子屋でいろんなお菓子を買った気分です。
パッキングリストです。いろいろ入っています。すぐに試すことができるようになっています。使い方はオンラインサイトに掲載されています。オンラインサイトでは、英語、ドイツ語、スペイン語、フランス語、日本語から選択できます。欧州系言語の中にあって日本語が用意されているのがすごい。ニーズが多いのですね。
Lチカをやってみる
電子工作の世界では、「LEDをチカチカさせる」ということを「Lチカ」と言うそうです。プログラミング言語の世界では、「Hello world!」を画面に表示させるというはじめの一歩と同じようなことを指すようです。ちなみに英語では「Blinking Led」というそうです。
Lチカの回路図です。Raspberry PiのGPIOを使って、LEDを点滅するための回路図です。GPIOの3.3VピンとGPIO17ピンを使い、LEDと保護抵抗220Ωを入れた簡単な回路です。
LED(Light Emitting Diodeの略)で、発光ダイオードの意味です。実物のLEDには長い線と短い線の2本の線が出ています。長い線側をアノード(Anode)、短い線側をカソード(cathode)と呼びます。アノードは、外部回路から電流が流れ込む電極で、カソードは外部回路へ電流が流れ出す電極です。
LEDはアノードからカソードに電流が流れると発光します。LEDの回路記号の矢印方向で発光する、と覚えるとわかりやすいですね。
保護抵抗とは
回路図を見ると抵抗器(R1 220Ω)が入っています。何でいるの?と自分も思っていました。直接LEDに3.3Vから電流を流してあげればよいのでは?だって、小学生のときに乾電池に豆電球を繋げて光らせていたよね。
そこで、LEDの保護抵抗で調べてみました。簡単にまとめると以下の3点のようです。3点を理解するために、まずは保護抵抗値を算出してみて、LEDの特性を理解したいと思います。
保護抵抗値の算出
保護抵抗値を算出してみます。以下のようなLEDの電流電圧特性曲線があった場合、電源電圧E=3.3VでLEDに流れる電流値If=10mAとして保護抵抗Rの値を求めます。発光する方向に流れる電流を順電流や順方向電流といいます。また、反対向きの電流を逆電流やが逆方向電流といいます。
図からLEDの電流電圧特性曲線と順電流値If=10mAとの交点を求めると、その時の電圧Vfは1.5Vになります。交点をLEDが点燈する動作点といいます。その動作点(Vf, If)=(1.5V, 10mA)と(Vf, If)=(3.3V, 0mA)の点を通る線(青線)を引きます。青線の式はキルヒホッフの第2法則(※)から一次式として導くことができます。
※電気回路の任意の閉路において、電圧の向きを一方向にとったとき、各区間の電圧の上昇の総和と、電圧の降下の総和は等しくなります(全ての総和は0となります)。
\(\begin{align*}
If&=\dfrac{E}{R}-\dfrac{Vf}{R}\\[5pt]
&=\dfrac{E-Vf}{R}
\end{align*}\)
以上から左辺にRが来るように式変形して、値を入れると保護抵抗値Rは、以下のとなります。
\(\begin{align*}
R&=\dfrac{E-Vf}{If}\\[5pt]
&=\dfrac{3.3-1.5}{0.01}\\[5pt]
&=180\left(\Omega\right)
\end{align*}\)
※10mAをアンペア単位に換算すると0.01Aですね。
算出した保護抵抗値R=180Ωのものが、実際に販売されていればそれを購入することができますが、例えば計算値が190Ωとなった場合、残念ながら抵抗器の規格にないため入手できません。その際は許容誤差を考慮してその前後の抵抗器を選定します。例えばE24系(許容誤差5%)の抵抗器であれば、180Ω、200Ωがあります。許容誤差5%なので180Ωでは171Ω~189Ωのばらつきがあります。また、200Ωでは、190Ω~210Ωのばらつきがあります。これだけの情報であれば、許容誤差範囲に入っている200Ωを選定します。
あと、補足として、抵抗器180Ωを使った場合の抵抗器の負荷(使用可能な電力W数)を考えます。抵抗器にはIf=10mAの電流が流れ、電圧は1.8V(=3.3-1.5)かかります。抵抗器の電力は、0.018W(=1.8V×0.01A)と計算できます。購入する際は、0.018Wより大きいものを選定します。市販の抵抗器では、1W、1/2W、1/4Wが用意されていますので、1/4W(=0.25W)のもので十分ですね。仮に0.018Wより小さいものを使用すると発熱して損傷してしまいます。
LEDを保護するとは
保護抵抗値の算出方法が分かったので、保護抵抗の役割を順に確認したいと思います。まず、LEDを保護する役割についてです。
図1で動作点における抵抗値と順方向電圧と順方向電流の関係がわかりました。そこで、図2に抵抗値を変えたときの動作点の変化を示します。図2から抵抗値を大きくすると順方向電流値が小さくなり、抵抗値を小さくすると順方向電流値が大きくなることがわかります。さらに、抵抗値が0ΩになるとLEDの特性曲線との交点がなくなり短絡状態(ショート)と同じになり極めて大きな電流が流れます。LEDには定格の順方向電流値が決まっており、その値は数10mA~100mAです。定格を超えた電流を流し続けるとLEDを壊してしまう可能性があります。LEDを壊さないように点燈させるためには抵抗器を入れる必要があることがわかります。
LEDの光量を安定させるとは
次に、LEDの光量を安定させる役割について確認します。
電源電圧が変動した場合
電源電圧が変動しても、LEDの光量を安定させる必要があります。電源電圧が変動した場合、どのような影響があるか見ていきます。
図3は、順方向電圧がΔVfだけ変動した時に抵抗値の大小によって、順方向電流値の変化を示した図です。
抵抗値が大きい時は、順方向電流値はΔIf1だけの変化ですが、抵抗値が小さい時は、ΔIf2の幅が大きくなっていることがわかります。LEDの光量は、順方向電流が大きいほど大きくなり明るく点燈します。つまり、抵抗値が大きいとΔIf1の変化が小さく、LEDの明るさの変化は小さく安定します。逆に、抵抗値が小さいとΔIf2の変化が大きく、LEDの明るさの変化が大きくなりチラつきの原因になります。電源が変動しても抵抗値を大きくしておけば、LEDは安定して点燈させることができます。
周囲温度が変化した場合
回路はいろんな環境に置かれます。LEDの動作温度は一般に-10℃~+85℃という範囲です。LEDの素子は半導体で作られています。半導体には、温度によって電気抵抗率が変化する性質があり、温度が高くなると電気抵抗率が低下して電気が通りやすくなります。
したがって、LEDが置かれている周囲温度によってLEDの特性曲線に影響を受けます。また、LEDの製造によるバラツキもLEDの特性曲線に影響があると思います。図4は、LEDの特性曲線が変動した時に抵抗値の大小によって、順方向電流値の変化を示した図です。抵抗値が大きい時は、順方向電流値の変化はΔIf1だけの変化ですが、抵抗値が小さくなるにつれて、ΔIf2、ΔIf3と変化が大きくなっているのがわかります。
電圧変動と同様に、抵抗値が大きい方が温度変化に対してLEDは安定して点燈し、抵抗値が小さいほど温度変化に対してLEDの明るさが変化してしまいます。
電源、回路を保護するとは
最後に、電源、回路を保護する役割について、確認します。実は、これについてはすでに確認しています。図2で示したように抵抗値が0Ωの場合、短絡状態(ショート)と同じで極めて大きな電流が流れてしまうことを話しました。これは、保護抵抗がLEDを保護するだけでなく、電源や回路も保護していることを示しています。
保護抵抗の意味がようやくわかりました。
Lチカの回路の構築
キットの部品を使ってLチカの回路を構築します。
Raspberry Pi本体とブレッドボードを40ピンのバスケーブルで接続します。ブレッドボード上のT字の赤い基板はT字拡張ボードです。これが便利なボードで、40ピンのバスケーブルとブレッドボードの間をつなげてくれるボードです。さらにT字拡張ボードの表面にGPIOの40ピンの名称が記載されているので、ジャンパーケーブルをどこに挿したらよいか一目瞭然です。
プログラム作成の環境構築
プログラムを作成して実行するための環境を構築します。プログラム作成用のエディタは慣れているVisual Studio Code(以後、VSCodeと呼ぶ)を使用するためにインストールしました。VSCodeはWindows上でもLinux上でも動くので便利ですね。さらにRaspberry Pi上でも以下のaptコマンドでインストールできるので楽ちんです。
sudo apt update
sudo apt install code
VSCode上でPythonを使いやすくするために以下の拡張機能をインストールしました。これで、VSCode上でプログラム編集とデバッグや実行を行うことができます。
VNCを使ってパソコン画面にRaspberry Pi画面を表示させて作業します。
左のウィンドウがVSCodeの画面で、Lチカのプログラムを表示させいるところです。右のウィンドウはターミナル画面です。
プログラム作成
プログラムはPythonで作成します。GPIOをコントロールするライブラリが利用できます。
#!/usr/bin/env python3
import RPi.GPIO as GPIO # GPIO操作用のライブラリをインポート
import time # 時間制御用にtimeパッケージをインポート
LedPin = 17
def setup():
# GPIOモードにBCM番号を設定
GPIO.setmode(GPIO.BCM)
# LEDピンモードに出力を,初期値レベルにHigh(3.3v)を設定
GPIO.setup(LedPin, GPIO.OUT, initial=GPIO.HIGH)
# main関数の定義
def main():
while True:
print ('...LED ON')
# LEDを点燈
GPIO.output(LedPin, GPIO.LOW)
time.sleep(0.5)
print ('LED OFF...')
# LEDを消燈
GPIO.output(LedPin, GPIO.HIGH)
time.sleep(0.5)
# destroy関数を定義
def destroy():
# LEDを消燈
GPIO.output(LedPin, GPIO.HIGH)
# GPIOインスタンスのリソース解放
GPIO.cleanup()
# If run this script directly, do:
if __name__ == '__main__':
setup()
try:
main()
# 'Ctrl+C'で終了
except KeyboardInterrupt:
destroy()
プログラムの実行
VSCodeのメニュー「実行」>「デバッグなしで実行」をクリックして、実行します。
VSCode画面下部にターミナルウィンドウがあり、ここで実行されます。
ターミナル上に「LED OFF・・・」、「・・・LED ON」、…が繰り返されて実行されていることがわかります。
LEDが点燈しました。0.5秒おきにON、OFFを繰り返します。Lチカができました。
まとめ
Raspberry Piを使ってLEDを点滅させることができました。簡単な回路ですが、なぜ保護抵抗が必要か、なぜ220Ωなのか保護抵抗値の算出方法も理解することができました。
また、Raspberry Pi上でのプログラム作成、実行環境も構築できました。
今度は、センサーを付けて、センサーからの入力を取得できるようにしたいと思います。