【Lesson5】徐々に明るく・徐々に暗く PWM制御を学ぶ Breathing LED

0
3160

通常LEDの点灯点滅は、HIGHにするLOWにするなどのON、OFFで制御しているため、明るさを徐々に大きく、徐々に小さくと、アナログ的に変化させたりできませんが、PWM制御という方法でコントロールすることで、デジタルなのにアナログのような振る舞いをすることができます。

その制御をプログラム上で実現できますので、今回はその方法を紹介します。

使用する部品

  • Raspberry Pi 3 Model B × 1
  • 電源アダプター5V 2.5A × 1
  • ブレットボード × 1
  • LED × 1
  • 抵抗 220Ω × 1
  • ジャンプワイヤー(オス/オス) × 2

※これらの部品はFabshopがふるさと納税で提供している「ふるさと納税Raspberry Piスターターキット」もしくは当サイトで購入可能な「Raspberry Pi スターターキット」の電子工作キットに同梱されています。

実体配線図

回路の接続は至ってシンプルなLEDの点灯・消灯のプログラムの時と同様なものですが、プログラム側での制御によりその振る舞いが大きく変わります。

プログラムのコピーと保存

画面左上の「ラズベリーパイメニュー」から「プログラミング」-「Geany」と移動してPythonコードの打ち込みの準備をします。

メニューバーから「ファイル」→「新規」をクリックします。

【Lesson1】のときと同じように、この下にある「breathing LEDのプログラム」の枠右上に並んだアイコンの内、右から2番目のアイコンをクリックします。(マウスをアイコンに近づけると”Copy”の表示が現れます)

すると、プログラムの文字列が全て選択されるので、「Ctrl」と「C」キーを同時に押してコピーします。

import RPi.GPIO as GPIO
import time

LedPin = 12

GPIO.setmode(GPIO.BOARD)
GPIO.setup(LedPin, GPIO.OUT)
GPIO.output(LedPin, GPIO.LOW)  

p = GPIO.PWM(LedPin, 1000)
p.start(0)

try:
    while True:
        for dc in range(0, 101, 4):
            p.ChangeDutyCycle(dc)
            time.sleep(0.05)
        time.sleep(1)
        for dc in range(100, -1, -4):
            p.ChangeDutyCycle(dc)
            time.sleep(0.05)
        time.sleep(1)

except KeyboardInterrupt:
    p.stop()
    GPIO.output(LedPin, GPIO.HIGH)
    GPIO.cleanup()

プログラム解説

今回のプログラムはLesson 1 からのプログラムと大きく変わっています。それは関数を定義せずに上から順にPythonのコードをそのまま実行していっているという点です。

今回はLEDをホタルの光のように徐々に明るく、徐々に暗くを繰り返すだけのシンプルなプログラムです。

まず、LedPinの番号指定やGPIOのセットアップは今まで通りですが、個々の部分が今まではdef setup()と関数にしていましたが、今回はそのままソースコードを実行することにします。

アナログ出力を実現するために・・・

RPi.GPIOライブラリでPWM制御によりアナログ出力を実現するためには、周波数、デューティー比を指定します。周波数はそのままにして、デューティー比を少しずつ変化させていく事でゆっくり明かりが変化していきます。

p =GPIO.PWM(LedPin, 1000) は Ledpinを1000Hzの周波数でPWM制御しますよ。という設定です。

p.star(0) でデューティー比0でスタートしますという初期値の設定です。あとはこのpのデューティー比を少しづつ挙げていく事でゆっくり明るくなるという事です。その部分を try : 以降のwhile文の中で繰り返しています。

While文の中にはforループが2つあります。1つ目のforループでデューティー比が上がっていき、これを抜けたら2つ目のforループでデューディー比を下げて行き徐々にLEDが暗くなっていきます。この2つのforループがwhileでさらに繰り返されていきます。

最初のforループでは range関数を使ってデューティー比を0から101までの範囲に区切って4ずつ増やしていき、その増やす速度はtime.sleep(0.05)という事になります。デューティー比が100%、つまりLEDの明るさ最大でtime.sleep(1)を実行し、今度はデューティー比を下げていきまた0まで持っていきます。

try: とセットのexceptは、try内を実行中にキーボードによる強制終了という例外処理が行われたら、プログラムとGPIOをリセットして終了するというものです。

新たに開いたタブ「untitled×」の1行目にマウスカーソルを置いて右クリックして出てくるメニューから「貼り付け」を選択します。

Geanyのメニューバーから「ファイル」→「別名で保存」をクリックします。

新たに「ファイルを保存」画面が現れるので、左ペインの「デスクトップ」をクリックします。

「ファイルを保存」画面の1番上の項目「名前:」の入力欄に拡張子”.py”でプログラム名を入力し、「保存」ボタンをクリックします。

プログラムの実行

Geanyの画面に戻って、ツールバーの紙飛行機のようなアイコンをクリックします。

新たに「ターミナル」画面が開き、LEDが蛍のように点滅を繰り返します。「Ctrl」と「C」キーを同時に押すとプログラムが停止します。