🐝

ESP32とSSR(Solid State Relay)で100V電球を制御

2024/11/26に公開


はじめに

この記事は、AC100Vの商用電源に接続された60W程度の電球をSSR(Solid State Relay:半導体リレー)とESP32を使って制御する方法について記述しています。

今回は便宜上、60W程度の電球を使用しましたが、他の負荷に置き換えても大丈夫です。ただし、使用する電力によってはSSRからの出る熱を放熱する必要があるかもしれません。

使用している言語はMicropythonです。

In English

This article describes how to drive a SSR(Solid State Relay) with PWM connected to ESP32 using Micropython in Japanese.

SSRとは

ESP32やRaspberry PiのGPIOポートはLEDを点灯させる程度の微弱な電力しか取り出すことができません。
一般的に、大きな電力を必要とする装置の制御にはリレーモジュールやSSRとよばれる外部部品を使用します。

リレーについて

リレーは電磁石の原理を応用して大きな接点容量のスイッチをON/OFFする装置です。
リレーの詳細についてはリンクを参照して下さい。リレーとは
リレーモジュールは下図のように、GPIOの信号によりリレーを制御するようにした製品でAmazon等で500円程度で売られています。

Altリレーモジュル
*画像引用元:'https://m.media-amazon.com/images/I/613Tod1Cy1L.AC_SX679.jpg'*

SSRについて

SSR(Solid State Relay)は無接点リレーともよばれ、一般的なリレーが有接点であるのに対して、接点の代わりに半導体を使用してON/OFFを制御しています。
SSRは有接点リレーに対して次のような特徴があります。

  • 機械的な接点がないのでON/OFF時の音がしない。
  • 高速にON/OFFの切り替えができる。
  • 接点の摩耗がないので耐久性に優れている。

SSRの詳細についてはリンクを参照して下さい。

この記事で使用するSSR(SSR-25 DA)を下図に示します。1,000円前後で市販されています。
この製品は仕様書によると、最大380Vまでの交流電圧で、最大25Aまでの電流の制御ができます。

AltSSR
画像引用元:https://akizukidenshi.com/catalog/g/g114017/

結線

回路図

AltSSR

ブレッドボード図

AltSSR

サンプルコード1

SSRが接続されたGPIOポートを単純にON/OFFするサンプルコードです。
1秒毎にON/OFFを3回繰り返し、3秒停止を無限に繰り返します。

ssr_onoff.py
# Lamp color control by SSR
# Mar.29th 2024 (C) iot101 at zenn.dev

from machine import Pin
import time

SSR = 26  # SSR is connected to GPIO26

# Make LED instance
ssr = Pin(SSR, Pin.OUT)

try:
    while True:
        for d in range(3):
            print("ON")
            ssr.on()
            time.sleep(1)

            print("OFF")
            ssr.off()
            time.sleep(1)
        time.sleep(3)

except KeyboardInterrupt:
    ssr.off()
    print("stopped")

サンプルコード2

SSRをPWMで制御しています。
デューティー比を0%から100%まで2%毎に変化させています。

ssr_pwm.py
# Lamp(bulb) PWM color control by SSR
# Mar.29th 2024 (C) iot101 at zenn.dev

from machine import PWM, Pin
import time

FREQ = 60

SSR = 26  # SSR is connected to GPIO26

# Make LED instance
ssr = PWM(Pin(SSR), FREQ)
ssr.duty(0)  # Turn OFF the bulb

try:
    while True:
        for d in range(0, 102, 2):
            print("Duty =", d)
            ssr.duty(int(d / 100 * 1023))
            time.sleep(0.1)

        time.sleep(3)

except KeyboardInterrupt:
    ssr.duty(0)
    print("stopped")


Discussion