【Python】ラズパイでLチカ:LEDの取り扱い~抵抗値の計算
投稿日:
小型PCであるラズベリーパイ (Raspberry Pi, 以下ラズパイ) は、
GPIOが搭載されているため、電子工作に利用できます。
その基本中の基本としてLチカ(LEDチカチカ)をする方法を本記事でまとめました。
ラズパイのGPIOの基本や注意事項は下記の記事にまとめてあるのでご参考に。
>> ラズパイのGPIOの基本・ピン配置と制御方法【Linuxコマンド、Python】
LEDについて
発光ダイオード (light-emitting diode: LED) を扱う上での注意点は下記です。
- 極性(電源と接続する向き)がある
- 電流値が大きすぎると破損する
- LEDの色によって印加電圧値が異なる
極性
LEDには極性があり、直流電源とつなげるときのプラスとマイナスが決まっています。
極性を逆にして接続すると、破損する可能性があるので注意が必要です。
電源のプラスに接続する側をアノード、マイナスに接続する側をカソードと呼びます (Fig. 1)。
- アノード : 電源のプラスと接続、ピンの足が長い
- カソード : 電源のマイナスと接続、ピンの足が短い
ピンの足から極性が判断できますが、ピンが切ってあり判断できないときは、
発光部分の形状から判断することもできるかと思います。
金属部分の面積の小さい側がアノードである可能性が高いです (Fig. 1, 下) 。
電流値(順方向電流 $I_F$)
LEDに流す電流値(順方向電流値 $I_F$)が大きいほど、大きく発光します。
しかし定格の電流値よりも電流値を大きくすると、
寿命が急激に短くなり、さらに大きくすると破損(破裂)します。
定格の電流値は、各LEDごとのデータシートに記載されているはずです。
一般的には、2mA以上、20mA以下なので、よくわからない場合はこのぐらいを目安に電流値を設定すると良いでしょう。
ただし、ラズパイのGPIOは1ピンあたり16mA、全ピン合計50mAがMAXの電流値となるので、
ラズパイで光らせる場合には2~10mAあたりに調整しておくのが無難です。
電圧値(順方向電圧 $V_F$)
LEDは色によって必要となる電圧値(順方向電圧値 $V_F$)が異なります。
赤系から青系になっていくにつれて電圧が大きくなる傾向にあります。
- 赤、黄: 1.8~2.2V程度
- 緑、白、青: 2.7~3.6V程度
ラズパイのGPIOは3.3Vなので、青系のLEDでは電圧が足りずに光量が弱くなるかもしれません。
LEDとの接続回路
ラズパイのGPIOとLEDを接続して、Lチカするためのシンプルな回路を作ってみます。
必要部材
- Raspberry Pi(ここではRaspberry Pi 3 Model B+を使用)
- LED
- 抵抗器(必要な抵抗値の計算は後述)
- ジャンパー線
- ブレッドボード(あると便利)
ラズパイとLEDと抵抗器が必須の部材になります。
回路は、導線のはんだ付けやワニ口クリップの利用で作っても問題ありませんが、
お試しで回路を作る程度の場合はブレッドボードを使うと便利です。
部品の交換や分解も容易に行えます。
回路図
LEDを電源(ラズパイのGPIO)に接続することでLEDを光らせることができますが、
そのまま直結すると電流値が大きすぎるため、LEDが破損します。
これを防ぐため、抵抗器をLEDと直列に接続し、電流値を制限します (左図 or 上図)。
接続する抵抗値の計算は下記になります。
抵抗値の計算
回路に入れる抵抗器の値を決める算出の手順は下記の通りになります。
- LEDの電流値(順方向電流 $I_F$)を決める(例 $I_F = 2$mA)
- LEDの上限:約20mA
- ラズパイの上限(1ピンあたり):約16mA
- → 2~10mAを目安に
- LEDの電圧値(順方向電圧値 $V_F$)を決める(例 $V_F = 2.7$V)
- 赤、黄:1.8~2.2V程度
- 緑、白、青:2.7~3.6V程度
- 抵抗器の電圧値を計算する(例 3.3V – 2.7V = 0.6V)
- 抵抗器の電圧値:電源電圧 (3.3V) – $V_F$
- 抵抗器の電圧値と電流値から抵抗値を算出(例 0.6V / 0.002A = 300$\Omega$)
- 抵抗器の電流値:$I_F$
- → 抵抗値:$(3.3 – V_F)/I_F$
LEDの電流値(手順①)や電圧値(手順②)の定格値がデータシートに記載されている場合は、
その値を使用するとLEDの性能を十分に引き出すことができますが、ラズパイの上限値を超えないように注意が必要です。
結果的に、接続する抵抗器の値は 300~1k$\Omega$ がよく使われるようです。
手順③ではキルヒホッフの第2法則、手順④ではオームの法則を使っています。
ラズパイのGPIOは3.3V出力が標準であるため、ここでは電源電圧が3.3Vになっています。
抵抗器は4つまたは5つのラベルの色で抵抗値が表記されています (Fig.3)。
1つ目、2つ目のラベルが抵抗の大きさ、4つ目のラベルが誤差の大きさを示しています。
最初の3つが「橙・橙・茶」のときは330$\Omega$、「茶・黒・赤」のときは1k$\Omega$になります。
今回の回路は、抵抗値の多少の誤差は大した問題にならないので、
きっちりと計算した抵抗値のものを用意する必要はなく、計算値に近いものを使用すれば十分です。
たとえば、計算値が300$\Omega$のとき、100$\Omega$の抵抗器を3つ直列にしてもよいですが、
入手しやすい330$\Omega$抵抗器を使っても問題ありません。
Pythonコード
GPIOにLEDと抵抗器を接続し回路が作れたら、
あとはソフトウェア側からプログラムを走らせることでLチカができます。
前準備・ライブラリの確認
Raspberry Pi OSにはPythonが最初からインストールされているはずなので、
すぐにPythonを利用できます。
今回、GPIOの制御用にpigpio
ライブラリを使用するので、まだこちらのインストールができていない場合は、
下記の記事を参考にインストールしてください。
>> ラズパイのGPIOの基本・ピン配置と制御方法【Linuxコマンド、Python】
pigpiod -v # バージョン確認(pigpioがインストール済か確認)
端末(ターミナル)で上記のコマンドを入力したとき、
"command not found"等と出たらまだpigpio
がインストールされておらず、
バージョン(数字)が表示されればインストール済みであることが確認できます。
pigpio
をインストールしたはずにも関わらず、Pythonコードを実行しようとするとエラーが出る場合は、
デーモンが起動していない可能性があります。
そのときは下記を実行してください。
sudo pigpiod # pigpioデーモンの起動
サンプルコード
ラズパイのターミナルを起動し、Pythonのプログラムファイルを作成、実行してください。
デスクトップ画面の左上のアイコンからターミナル (LXTerminal) が開けます。
(Figure 4では、テキストエディターVimを使ってPythonプログラムを作成しています。
Vimでとりあえずコピペしたい方は下記をどうぞ。
>> Vim (Vi)でコピー&ペーストするコマンドまとめとエディタ外部間で行う方法)
Pythonを使ったLチカのサンプルコードは下記になります。
Ctrl+cを押すとプログラムが停止します。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pigpio
import time
LED_GPIO = 12
if __name__ == '__main__':
pi = pigpio.pi()
pi.set_mode(LED_GPIO, pigpio.OUTPUT) # 出力モードに設定
try:
while True:
pi.write(LED_GPIO, 1) # High (3.3V) 出力
time.sleep(1)
pi.write(LED_GPIO, 0) # Low (0V) 出力
time.sleep(1)
except KeyboardInterrupt: # Ctrl+c入力時
print("Interrupt")
print("end")
上記(左)コードでは、GPIO 12ピンを使用した例となります。
GPIOのピン配置の確認方法や、pigpio
の基本的な使い方は下記が参考になるかと思います。
>> ラズパイのGPIOの基本・ピン配置と制御方法【Linuxコマンド、Python】
サンプルコードで行っていることは、指定のピン (GPIO 12)を出力モードに設定し、
出力電圧を1秒おきにスイッチし、3.3Vと0Vを交互に切り替えています。
出力電圧の切り替えをwhile
でループし、Ctrl+cを入力すると
ループを脱出するコードとなっています。
まとめ
Lチカを行うための要点は下記になります。
- 回路構成
- LED
- 極性:足の長い方がアノード(電源のプラスに接続)、短い方がカソード(電源のマイナスに接続)
- 抵抗器
- 300~1k$\Omega$がよく使われる
- (ラズパイの電流上限:16mA、LEDの電流上限:約20mAを超えないように設定)
- LED
- プログラムの流れ
- GPIOの指定ピンを出力モードに切り替え
- High (3.3V) 出力とLow (0V) 出力をある時間間隔で交互に切り替える
- 2をループする