電子工作分野のHello World!とも呼ばれるLチカ(LED点灯)をやってみます。ラズパイを使うとPythonでGPIOを使ったプログラミングが可能です。ただ光らせるだけだと面白くないので、この記事ではLEDを順番に光らせる「流れるウィンカー」をつくりながら動作原理を確認します。
こんにちは。wat(@watlablog)です。ラズパイを買ったらまずLEDを光らせるのでは?というほどN番煎じですが、Lチカをやってみます!
Lチカについて
Lチカ(LEDチカチカ)とは、電子工作を始める人が誰しも最初に行う簡単な工作です。プログラミングの分野では画面に「Hello World!」と出力することが第一歩とされますが、電子工作におけるHello World!がこのLチカであるといっても過言ではありません。
この記事ではLチカをラズパイ(Raspberry Pi)を使って、かつPythonによるGPIOプログラミングで行います。GPIOとは、General Purpose Input/Output(汎用入出力)のことです。GPIOをプログラミング言語であるPythonで制御することで、自由にLEDの点灯と消灯を操ることができます。せっかくプログラミングで点灯を制御できるので、単なるLチカではなく、流れるウィンカー(自動車の方向指示器)っぽいものをつくるところまでやってみましょう。
用意するもの
この記事では電子工作を行います。そのためいくつかのハードが必要です。今回使った物は次の通りです。
ラズベリーパイ(ラズパイ)
筆者はラズパイ4を使いましたが、最近発売されているラズパイ5でも良いと思います。後述するピン配置の調べ方を把握していればどんなラズパイを使っても良いでしょう。
ラズパイの初期設定とPythonプログラミング環境の準備
ラズパイは購入したばかりの段階ではOSすら入っていません。以下の記事を参考に初期セットアップを行っておいてください。
・ラズパイ4の概要とセットアップしてPythonを使うまでの備忘録
また、ラズパイにおけるPythonプログラミングについては以下の記事で紹介しているvenvとVSCodeによる環境構築をしておくと快適に作業ができます。
・ラズパイのPythonを最新にしてvenvとVSCodeを使う時のメモ
ブレッドボード
ブレッドボードははんだ付け不要で素子を実装できる便利グッズです。これがあればLEDや抵抗を再利用して色々な回路を組むことができるので電子工作の必須アイテムといえるでしょう。
LED
LED(Light Emmiting Diode)は日本語では発光ダイオードと呼びます。今回は赤色のLEDを使いますが、安いので色々な色のLEDを買っておくのもありです。
抵抗
抵抗もLチカには必要です。こちらも色々な抵抗値の抵抗器がネットで売っているので購入しておきましょう。
ジャンパー線
ジャンパー線はブレッドボードやラズパイのピンを電気的に繋ぐために使います。適当な針金等で繋いでしまうと不意にショートしてしまう危険があるため、被覆がしっかりされたものを選びましょう。
ラズパイのGPIOピンからブレッドボードに繋げるジャンパー線は片方がメス、もう一方がオスになっているタイプがあると便利です。
ブレッドボードの上で使うジャンパー線はオス-オスのタイプが良いです。
以上で準備完了です!早速電子工作を開始しましょう!
ラズパイでLチカを行う方法
ラズパイのピン配列をチェックする
ラズパイの初期設定やPythonプログラミング環境構築が済んだ状態になりましたか?いきなり配線を始める前に、ラズパイのピン配列を調べておきましょう。ラズパイからターミナルを起動して以下のコマンドを実行します。
1 |
pinout |
ターミナルにラズパイの簡易図(下図左)とピン配列が出力されます。ここで、ラズパイの基板を模した図の左上にあるのが全40本あるピンを示しています。ここで、1つだけ「1」と書かれていますが、これが1番ピンです。
ターミナルを下にスクロールすると、各ピンの番号と名称のリスト(下図右)が出力されています。先ほどの図とこのピン配列を参照することで、実際のラズパイのどこが何のピンなのかがわかるようになっています。毎回 pinoutで配列を確認し、誤配線しないように気をつけましょう(誤配線は故障の原因になります)。
実際のラズパイ4も以下に写真を示します。ここが1番ピンです。
回路図の確認と抵抗の選定
配線を行う前に回路図を確認しておきましょう。専門ではないので適当ですが、下図はEagleというソフトで描いた回路図です。今回はこれを配線します。
ラズパイのGPIOピンを出力として使うと3.3[V]が出力されます。その先に抵抗と発光ダイオード(LED)を直列に繋ぎます。LEDは抵抗を使わずに電流を流すと、過電流が流れてしまいすぐに壊れてしまいます。抵抗を使うことで電流を制限してLEDを安全に使うことができます。
LEDの動作電流は物により異なりますが、今回は20[mA](=0.02[A])の物を使用します。さらにLEDには順方向電圧\(V_{f}\)があります。LEDはアノード(A)からカソード(K)に電流を流す機能を持ちます。
カソードはCathodeと書きますが、ドイツ語のKathodeの頭文字をとってKと表示するのが一般的のようです。
逆方向に電流を流さないということですが、順方向にも一定の電圧をかけなければ電流は流れません。この電圧のことを順方向電圧\(V_{f}\)と呼びます。これらの情報を使って最適な抵抗を求めてみましょう。
電源電圧\(V_{s}\)、LEDの動作電流\(I\)、順方向電圧\(V_{f}\)を使います。ラズパイのGPIOから出力される電源電圧\(V_{s}\)は3.3[V]、自分の持っているLEDの順方向電圧\(V_{f}\)は2.0[V]、動作電流\(I\)が20[mA]だったので、設定すべき抵抗値は次の式(1)から求めることができます。
抵抗の最適値として65[Ω]が出ましたが、実際は温度ばらつきや安全率、LEDの寿命等を考え、標準的に330[Ω]や200[Ω]を使うのが良いらしいです(先ほどの計算値は参考)。今回は手持ちの300[Ω]の抵抗器を使ってみました。
ブレッドボードとラズパイ、抵抗とLEDの接続方法は回路図の通り繋げば良いですが、実際には下図のように配線します。抵抗の位置ですが、ネットの記事によってはLEDのカソード側に繋げるものがあります。今回のLED点灯回路は直列回路であり、抵抗は電流を制限するために設置するのでアノード側とカソード側のどちらに設置しても問題ありません。
ラズパイからは今回GPIO 18番を出力ピンに設定し、もう一方はGNDを使っています。
実際にはこのように配線してみました。
LチカさせるためのPythonコード
仮想環境下における注意点:GPIOのインストール
この記事では「ラズパイのPythonを最新にしてvenvとVSCodeを使う時のメモ」でセットアップしたPython環境を使います。つまり、venvという仮想環境を使うということですが、この環境の場合はひと手間かける必要があります。
ラズパイにもともと入っているPythonを使えばGPIOを使う外部ライブラリは既にインストールされていますが、仮想環境を作った場合は自分でインストールしないといけません。次のコマンドで RPi.GPIOをインストールしましょう。
1 |
pip install RPi.GPIO |
Pythonコード
次のコードがLチカを行うPythonコードです。 GPIO.setmode()でモードを設定し、 GPIO.setup()でピンを登録します。 on_timeでLEDを点灯させる時間、 off_timeでLEDを消灯させる時間を設定します。この設定で今回は2秒点灯→1秒消灯を無限に繰り返すプログラムにしています。LEDの点滅を止める場合はキーボードで Ctrl+Cを入力します(VSCodeのターミナルをアクティブにして入力してください)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
import RPi.GPIO as GPIO import time def led_blink(on_time, off_time): """LEDの点滅を制御する関数""" # GPIOのモードを設定 GPIO.setmode(GPIO.BCM) # GPIO出力に使うピンを設定 LED_PIN = 18 GPIO.setup(LED_PIN, GPIO.OUT) try: while True: # LEDを点灯 GPIO.output(LED_PIN, GPIO.HIGH) time.sleep(on_time) # LEDを消灯 GPIO.output(LED_PIN, GPIO.LOW) time.sleep(off_time) except KeyboardInterrupt: # Ctrl+Cで終了する際にGPIOをクリア GPIO.cleanup() return on_time = 2 off_time = 1 led_blink(on_time, off_time) |
実行結果はYouTube動画に上げておきました。狙い通りLEDが点滅していますね。
ラズパイで複数のLチカによる流れるウィンカーをつくる方法
それでは流れるウィンカーをつくってみましょう。と言っても既に察しが付いている読者が多くいると思いますが、LEDを複数並べて順番に光らせるだけです。
回路図
早速回路図を確認しましょう。今回GPIOは17, 18, 22, 23を使っています。ちなみにGPIOの番号によっては特定のバス機能のためのデフォルトで3.3[V]がかかっているピンがあります。今回はそれらの用途ではない汎用GPIOのピンを選定しています(デフォルトで3.3[V]がかかっているピンでも、出力ピンとして設定すると出力前は0[V]になります)。
抵抗器とLEDは4つずつ必要ですが、各LEDのカソードは共通のGNDに接続可能です(ラズパイとの接続例の図は割愛!)。
Pythonコード
次のPythonコードで4つのLEDを制御します。 LED_PINSをリストで作成し、 forで出力モードの設定を行なっています。 whileの中で forを使っている部分がLEDを順番に光らせている部分です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
import RPi.GPIO as GPIO import time def led_blink(on_time, off_time): """4つのLEDを順番に点滅させる関数""" # GPIOのモードを設定 GPIO.setmode(GPIO.BCM) # GPIO出力に使うピンを設定 LED_PINS = [17, 18, 22, 23] # 各ピンを出力モードに設定 for pin in LED_PINS: GPIO.setup(pin, GPIO.OUT) try: while True: for pin in LED_PINS: # LEDを点灯 GPIO.output(pin, GPIO.HIGH) time.sleep(on_time) # LEDを消灯 GPIO.output(pin, GPIO.LOW) time.sleep(off_time) except KeyboardInterrupt: # Ctrl+Cで終了する際にGPIOをクリーンアップ GPIO.cleanup() on_time = 0.05 off_time = 0.05 led_blink(on_time, off_time) |
こちらの動画が実行結果です。0.05[s]ずつ点灯と消灯を繰り返して、流れるウィンカーっぽいものができました。
まとめ
ネットの海に無数にあるラズパイによるLチカ記事をまた1つ増やしてしまいました…。ただ、WATLABブログに足りなかったハードをいじる系の記事を書いてみたかったこともあります。実際にやってみると、PythonからGPIOに命令を出す方法がよくわかりました。
GPIOからは3.3[V]の電圧が出力されること、LEDの順方向電圧の話や抵抗の選定等色々やってみて理解したことは多かったと思います。
Lチカは小手調べです。今回久しぶりにラズパイを触ったのは別につくりたい物ができてきたからなので、まだまだ続きます。
ラズパイのLチカを習得しました!
Xでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!