2021年11月26日金曜日

RaspberryPi4 で PWM 入門 (Lフワ)

RaspberryPi4 で PWM 入門 (Lフワ)

概要

LED を PWM というアナログ信号を使ってゆっくり点滅させてみます
サンプルコードと回路を紹介します

環境

  • RaspberryPi4 8GRAM
  • RaspberryPiOS 5.10.17 armv7l
  • Python 2.7.16
    • pigpio 1.78

サンプルコード

後述でポイントを紹介しています
処理の概要はコメントにて記載しています

  • vim test_pwm.py
# -*- coding: utf-8 -*-
"""PWMのテストをするモジュール."""
import time
import RPi.GPIO as GPIO
import logging

from logging import getLogger


class TestPWM():
    """PWMのテストをするクラス."""

    def __init__(self):
        """GPIOやピン初期化を行います."""
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(12, GPIO.OUT)
        # channel=12 frequency=50Hz
        self.pin = GPIO.PWM(12, 50)
        logging.basicConfig(level=logging.INFO)
        self.logger = getLogger(__name__)

    def start(self):
        """pinをスタートさせます."""
        self.pin.start(0)
        self.logger.info('Started a pin for pwm.')

    def blink(self):
        """LEDをPWMで点滅させます."""
        self.logger.info('Started led blinking loop.')
        try:
            while True:
                # 5 刻みでデューティー比を変更します 0 -> 100
                for dc in range(0, 101, 5):
                    self.pin.ChangeDutyCycle(dc)
                    time.sleep(0.1)
                # 5 刻みでデューティー比を変更します 100 -> 0
                for dc in range(100, -1, -5):
                    self.pin.ChangeDutyCycle(dc)
                    time.sleep(0.1)
        except KeyboardInterrupt:
            pass
        finally:
            self.cleanup()

    def cleanup(self):
        """クリーンアップ処理をします."""
        self.pin.stop()
        GPIO.cleanup()
        self.logger.info('The pin cleanup process was completed.')


if __name__ == "__main__":
    pwm = TestPWM()
    pwm.start()
    pwm.blink()

ポイント

ピンを PWM 用として使う場合に GPIO.setup したあとに GPIO.PWM を呼び出します

周波数は高いほどより電力を必要とするアクチュエータなどを動かすことができます
今回は LED なので 50Hz ほどで十分です

ChangeDutyCycle で明るさを調整します
0 から 100 までで指定することができ 0 が暗くなり 100 が明るくなります
モーターなどの場合だと 0 が遅く、100 が速く回ります

処理が終了した際に必ずピンをもとに戻す必要があるので finally でクリーンアップしましょう

回路とサンプル動画

RaspberryPi の 6 ピンが GND になっています
12 ピンを LED のアノード側に 220 オームの抵抗を挟んで接続しています

実際にスクリプトを動作させると以下のように点滅するのが確認できると思います

最後に

RaspberryPi の場合ソフトウェア PWM という仕組みで PWM を出力しています
オシロスコープがある場合は波形を確認するとちゃんとした矩形波が出ていることが確認できると思います

自分は試していませんが RaspberryPi の周波数の上限は 8,000Hz ほどのようです
DC モーターなどは何とかなりそうですがステッピングモーターなど大きなモーターの場合にはモータドライバなどを使ったほうが良いでしょう

参考サイト

0 件のコメント:

コメントを投稿