2021年07月31日 更新
どうも、クラゲです。
今回はラズパイでLチカを行います!
「Lチカ」とは「LEDチカチカ」の略でLEDを点滅させることです。プログラミングでいうところのHello, world
と同じで、初心者がIoTを始める際に最初に取り組む例題です。
色々な言語での方法があると思いますが、今回はRaspberry Pi OSに最初から入っているPythonパッケージのRPi.GPIO
を使って行います。
[TOC]
今回はRaspberry Pi 4 B を使用しました。別のラズパイでも問題ありません。
ラズパイ以外に必要な部品は以下4点です。
LEDの色は何でもOKです。
抵抗は1kΩを使いましたが、330Ω~1kΩくらいの間であればOKです。
回路の結線は以下の通りです。
ラズパイ側は、左上から数えて6番目のピン(GPIO 17
)と、右上から数えて3番目のピン(Ground
)を使います。
注意事項としては、LEDは +
と -
の向きがあります。足の長いほうが +
側、短いほうが -
側です。今回の場合は足の長いほうをGPIO17
側に繋ぎます。
ちなみに抵抗は向きがありません。
ピン番号は以下の図を参考にしてください。
画像引用元:Raspberrypi.org
小さな黒丸の中に書いてある1
~40
の番号が「端子番号」です。
その端子がGPIOの場合はGPIO 17
のように横に番号が書いてあります。これが「GPIO番号」です。
GPIO 2(SDA)
のようにカッコ()と文字列が書いてある端子もありますが、これはGPIO以外の用途としても使える信号線(例えばシリアル信号など)です。
これで回路は完了です。
わずかにLEDが光っているかもしれませんが、気にしなくて大丈夫です。
まずコードを書いて保存しましょう。
LXTerminalを開いてnanoを立ち上げます。ファイル名はled.py.py
としました。
nano led.py
以下のコードをコピペしてください。
#timeモジュールをインポート
import time
#RPi.GPIOモジュールをインポート
import RPi.GPIO as GPIO
# BCM(GPIO番号)で指定する設定
GPIO.setmode(GPIO.BCM)
# GPIO17を出力モード設定
GPIO.setup(17, GPIO.OUT)
while True:
# GPIO17の出力を1にして、LED点灯
GPIO.output(17, 1)
# 0.5秒待つ
time.sleep(0.5)
# GPIO17の出力を0にして、LED消灯
GPIO.output(17, 0)
# 0.5秒待つ
time.sleep(0.5)
保存して終了します。
Ctrl + O
で保存、ファイル名はそのままなのでEnter
、Ctrl + X
で終了。
以下の実行します。
python3 led.py
これで無限ループのLチカが出来ました!
終了させる場合は Ctrl + C
です。
import time
time.sleep
を使うためにtime
モジュールを読み込んでいます。
import RPi.GPIO as GPIO
RPi.GPIO
モジュールを読み込んでいます。これ以後は省略してGPIO
として使えます。
GPIO.setmode(GPIO.BCM)
プログラム中でGPIOを「端子番号」で指定するか「GPIO番号」で指定するかの設定です。今回は「GPIO番号」で設定しています。
GPIO.setup(17, GPIO.OUT)
GPIO17
を「入力」にするか「出力」にするかの指定です。今回はGPIO.OUT
で「出力」に設定しています。ざっくり言うとLEDなどのときは「出力」、スイッチなどのときは「入力」に設定します。通常、同じプログラムの中で変化させることはしません。
while True:
無限ループです。
GPIOの設定関連は無限ループより前に書き、GPIOを変化させる処理をこの中に書きます。
GPIO.output(17, 1)
GPIO17
の出力状態を1
に設定しています。
GPIO出力の状態は1
と0
の2通りあって、1
の場合が3.3V出力、0
の場合が0V出力と言う意味です。3.3Vの電圧を出力することによりLEDが点灯します。逆に0Vの電圧を出力すると電流が流れなくなるため消灯します。
time.sleep(0.5)
time.sleep(sec)
でsec
秒間だけプログラムが一時停止します。今回は0.5秒毎に点滅させたかったので0.5
としています。
2回目以降の実行時、以下のようなワーニングが出てくる場合があります。
RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
これはGPIO設定を、プログラミング実行後にクリアしていないために発生します。
気分が悪いので、対策します。
先ほどのled.py
を以下のようにtry〜except
を使って修正します。
ちなみにnanoではCtrl + K
で1行が削除されます。押し続けることで連続で行を削除できます。
#timeモジュールをインポート
import time
#RPi.GPIOモジュールをインポート
import RPi.GPIO as GPIO
# BCM(GPIO番号)で指定する設定
GPIO.setmode(GPIO.BCM)
# GPIO17を出力モード設定
GPIO.setup(17, GPIO.OUT)
try:
while True:
# GPIO17の出力を1にして、LED点灯
GPIO.output(17, 1)
# 0.5秒待つ
time.sleep(0.5)
# GPIO17の出力を0にして、LED消灯
GPIO.output(17, 0)
# 0.5秒待つ
time.sleep(0.5)
except KeyboardInterrupt:
# GPIO設定クリア
GPIO.cleanup()
これで Ctrl + C
が押された時にexcept
となり、GPIOを設定をクリアしてからプログラムを終了することが出来るようになりました!
以上、RaspberryPiでLチカでした。