2021年07月31日 更新

Raspberry PiでLチカ

どうも、クラゲです。
今回はラズパイで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

小さな黒丸の中に書いてある140の番号が「端子番号」です。 その端子が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で保存、ファイル名はそのままなのでEnterCtrl + 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出力の状態は10の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チカでした。