概要
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 件のコメント:
コメントを投稿