気の向くままに辿るIT/ICT/IoT
IoT・電子工作

Arduinoでリレーを使ってAC100V家電を制御

ホーム前へ次へ
Arduinoって?

Arduinoでリレーを使ってAC100V家電を制御

Arduinoでリレーを使ってAC100V家電を制御

2017/09/20

 Arduinoとリレー、コンセント等を使って挿すとAC100V家電をON/OFFできる装置を自作してみるページ。

 家庭の配電盤にもリレーが入っていてこれで制御しているはずですが、リレー(モジュール)を使うと小さな電圧・電流で大きな電圧・電流の、また、DC(Direct Current/直流)電源からAC(Alternating Current/交流)電源のON/OFFを制御することができるようになります。

 ということは、仕様上、DC3.3VやDC5V出力のArduinoからでもリレーを使えば、AC100Vを要する家電のON/OFF制御することもできます。

リレーの種類

 従前、リレーといえば、電磁式・機械式で物理的な接点があり、ON/OFF時にカチッと音のする一般に箱型のものでしたが、今も流通はしているものの、現在の主流は、半導体でこれを実現し、より小型(省スペース)にして物理的には無接点で音がせず(静音)、長寿命(高耐久性)、ひいてはメンテナンスコストも低減できるはずのSSR/Solid State Relay(ソリッドステートリレー)である模様。

 SSRも形状は三端子や端子が4つあるもの、太い配線の接続を考慮してかソーラーシステムに使われるような入出力ともネジ止めの大きめの箱型のものもあったりするようです。

入力電圧仕様の確認

 また、リレーには入力電圧別にも5V/12V/24Vなどいろいろあるので昇圧モジュールなどを使うことなく「Arduinoから直接電源をとる場合」には、入力電圧が5Vで動作するリレーを選択する必要があります。

リレーモジュールのチャンネル数

 リレーが1個載ったモジュールを1チャンネル、2個載ったものを2チャンネル...などと呼ぶことがあり、制御したい機器の数に応じて選びます。

電源は2系統用意する

 DC-ACはもちろんのこと、ArduinoでDCモータを制御するときと同様にDC-DCでも電源は、それぞれに用意する必要があります。

リレーモジュールには一般にNC/COM/NO出力がある

 リレーモジュールには一般にNC(Normarlly Close・通常ON・回路閉)/COM(Common・共通)/NO(Normarlly Open・通常OFF・回路開)出力があり、初期状態をどうしたいかによってNC/COM、NO/COMの何れか2端子を使って配線します。

AC100Vを扱う際は特に慎重の上にも慎重に

 尚、AC100Vというのは、甘く見ていると感電や火事など事故につながる可能性をも伴う高い電圧であることに加え、Arduinoなどから操作する際には、逆流するとArduino含む回路が損傷すること必至なのでダイオードで逆流を防止したり、オプトカプラ(フォトカプラ)付きのリレーモジュールを使う、また、100V側にはヒューズを付けるなど過電流や逆流防止策の他、一時的なテストだからと銅線・芯線など配線をむき出しにすることなく、接触による感電や変なところでショートすることのないように被覆や接続に気を遣うなど十分過ぎるくらいの注意を以て扱う必要があるので、月並みな言い方ですが、やってみる場合は、自己責任で。

Arduino+機械式リレーモジュールでAC100VをON/OFFするのに必要なもの

 ここではちょっと手抜きをしますが、安全に対して十分に注意を払うことを忘れなければ、やることは、簡単で用意するものは、以下の通りでAmazon/HiLetgo相応価格、USBケーブルはUnoのUSB BでもNanoのmini USBでも、AC電源用延長コードも70cm程度のものを100円ショップで調達するならプラス216円108円で1000円前後といったところかと。

 もちろん、これに加えて操作・制御される側のAC100Vで機能する家電が必要。

 配線・接続は、Arduinoボードから5VとGNDをとってブレッドボード上でリレーモジュールとセンサを使うならセンサのプラスマイナスを、センサのS(Signal)をArduinoボードのアナログに、入力値に応じたスケッチを書き、出力用のデジタルピンのHIGH/LOWを出力できるようにして、これをリレーモジュールのS(Signal)とつなげば、入力側はOK。

[2018/02/24]

 よく見ると、少なくとも、ここで挙げた3つのリレーモジュールの入力側端子の印字は、S(Signal)/+/-、DC+/DC-/IN、DC+/DC-/CH1と3者3様でモジュールによって表現が違った...ちなみにSとINとCH1は、Arduinoで言うところの(HIGH/LOW信号の)出力ピンと接続することになります。

AC100V用延長コードとリレーモジュールを接続

 AC100V用のコンセント付き延長ケーブルは、(普段は、コンセント側で自動認識されるため、意識する必要はありませんが、)プラスとマイナスの2本の線からなっており、2本の線からなっていますが、おおまかに言うと交流(AC)ではプラス・マイナスの極性が特定されず、一方がプラスの時、他方がマイナスとなる性質がある(≒基本、プラスマイナスを意識する必要はない)のでリレーモジュールを噛ませるために、何れかの線を切断、切断部のそれぞれをリレーモジュールのCOMと、NCかNOにつなぎます。

[2018/02/24]

 少なくとも、ここで挙げた3つのリレーモジュールの出力側端子の印字はNO/(無印)/NC、NO/COM/NC、A1/B1と3者3様でモジュールによって表現が違う模様...ちなみに3つ出力があって内2つがNC/NOであれば残り1つは[共通]端子であり、モジュールによっては[COM]といった印字や(無印)などの場合があり、A1/B1など出力端子が2つしかない場合には、NOかNC専用モジュールと考えられます。

 A1/B1とあったSSRモジュールの場合、基板裏面のA1とB1とある印字の間に[開/Open/OFF]となっていると思しきスイッチの絵(回路図)があり、NO専用であることがわかります。

 一方、NO/(無印)/NCやNO/COM/NCのように3端子ある場合には、ケーブルを挿す位置によってNO/NCを使い分けられるようになっていることがわかります。

 たいていモジュールを見れば、判断がつくはずですが、そうでない場合には、モジュールの名称や型番、出力端子がNO/(無印)/NCとあった37センサーモジュールのセット品なら、当該キットがオリジナルならその仕様書などの資料、互換品などなら販売店の提示するものや元になった37センサーキットの資料を探すか、実験・検証して自分で確認するといった作業が必要になるでしょう。

[2018/02/24]

 また、機械式リレーにせよ、SSRにせよ、リレーモジュールには、High Level Triger/Low Level Triger(何れか、または、両対応)のものがあります。

 これは、出力信号がHIGH/LOW何れの場合にリレーがONとなるかを表わしており、High Level Trigerは出力信号がHIGHの時、Low Level Trigerは、出力信号がLOWの時にリレーがONとなります。

 尚、この出力が3端子あった手持ちの2つのリレーの内、NO/COM/NCとあったフォトカプラ付きのリレーモジュールは、High/Low両対応でモジュール上にH(High)/(無印)/L(Low)のジャンパピンが立っており、ジャンパで切り替えできるようになっています。

 最近のものは、ダブルコード状になっているので配線の長さ方向のどの場所であってもコードに沿って接着しているその部分をカッターなどでなぞるか、一部刃を入れて手で引っ張れば簡単に分断できる(尤もそういう構造でないとしたら、たぶん被覆で2本まとめてあるだけなのでを被覆を剥けば済む)でしょう。

 100均でも買っては来たのですが、結局、今回は、たまたまあった古いタップを使ったものの、なければ、100円ショップDaisoにも70cm 108円、1.5m 216円など長さに応じて数種類あったので、対象機器のケーブルを切断するのに抵抗があるなら、これらを使うのも手でしょう。

 今回使った手持ちのコードは、被覆が黒で被覆を剥いてみると白黒2本のケーブルが入っており、何も考えずに(なんの根拠もなく、)黒い方を切断してリレーを入れましたが、たぶんどっちでも問題ないと思います。

NEC 2705絶縁保護フォトカプラ付きSRD-05VDC-SL-C 1チャンネル リレーモジュール
[2017/09/24]

 今日、届いたので追加掲載しますが、実際には、光接点により、入出力が電気的に絶縁保護されたオプトカプラ(写真のフォトカプラはNEC 2705)付きのリレーモジュール(写真のリレーはSRD-05VDC-SL-C)を使うのが安全であり賢明。

 

 ただ、前述の通り、主流は、オプトカプラ付きのSSRである模様。

 SSRも同時に発注し、一緒に届きました。

 より安価なものを求める、むしろ切り替え音がして欲しくてたまらないというなら機械式リレーですが、価格差もさほどでもないため、静音、長寿命というだけでもソリッドステートリレーを選択するメリットは十二分にあるでしょう。

Arduino+機械式リレーモジュールでAC100V用扇風機・ファンを回す例

Arduinoで温度センサとリレーモジュールを使ってAC100V用ファンをON/OFF

 残暑の季節となり、既に季節は秋となってしまいましたが、今回は、ArduinoボードにUno、リレーに37センサーキットに入っていたSRD05VDC-SL-Cを1つ搭載した1チャンネルのモジュール、センサに、やはり、同キットに入っていた温度センサを使い、温度が30度を超えたらAC100V用の小型クリップ式扇風機・ファンの電源が入るようにしてみました。

 温度センサも確認済みではありますが、映像のみの動画では、短時間ではわかりにくいので先の動画では、最初、Arduino Unoのリセットボタン押下で扇風機が回り出し、続いてUnoのジャンパワイヤの内、5Vのものを挿抜、更にAC100V電源側のスイッチ付きコンセントの当該スイッチをON/OFFにすることで扇風機がON/OFFする様子を撮影。(ちなみに撮影時、ハードウェアとしてはUSB/Webカメラ、ソフトウェアにはCheeseを使用。)

 このファンは、デスク下の棚の下段にあるホームゲートウェイ(ONU一体型光回線用ルータ)、サーバにしているラズパイ用ストレージで2TBの外付けHDD、もう1台古い外付けHDDを置いてある場所の冷却用。

 ただ、WD 2TBの外付けHDDは不思議なことに全くというほど熱をもたないし、古いIO-DATA 160GBの外付けHDDは、使うと相当熱くなりますが、今となっては、まず使うことはない、光ルータもそんなに熱くなるわけでもないため、機器から発する熱対策というよりも、周囲の熱を冷まし、機器の動作環境を良好にするためのものといったところですが、実際のところ、使うことは滅多にない...ので検証のみで以後、この回路を常設するつもりもない...が、100V家電全般で応用は効くので、思いつけば、どこかで使いたいと思います。

 個別スイッチ付きの白いコンセントは、AC100V供給用(家にある延長コードがほぼ全て個別スイッチ付きなだけで、こういう風に使う場合は、常時ONにしておくのでスイッチ式である必要はない)、また、リレー1個なのに無駄に3口ある薄緑のタップ付き延長コードが、リレーを噛ませたもので、ここに扇風機のコンセントを挿してあり、扇風機のくるくるコードの向こうにあるのがUno、手前にあるのがミニブレッドボードとそれに繋がっている温度センサ、Unoの右横にある白枠の丸い温度計は、検証にあたっての飾り。

#define sigout  A0
#define sigon 5
unsigned int temp = 0;
 
void setup() {
  Serial.begin(9600);
  pinMode(sigout, INPUT_PULLUP);
  pinMode(sigon, OUTPUT);
  digitalWrite(sigon, HIGH);
}
 
void loop() {
  unsigned int out = analogRead(sigout);
  temp = out * 500 / 1024 - 10;
 
  if(temp > 29 && digitalRead(sigon) == LOW) {
    digitalWrite(sigon, HIGH);
  } else if(temp <= 29 && digitalRead(sigon) == HIGH) {
    digitalWrite(sigon, LOW);
  } else {
    ;
  }
  if(temp >= 45) {
    delay(1000);
  } else {
    delay(300000);
  }
}

 今回は、アナログ入力ピンはA0、HIGH/LOW(ON/OFF制御用)の出力ピンはD5とし、こんなスケッチにしてみました。

 改良・修正の余地は多分にあるでしょうが、晒しておきます。

 状態が不定になるのとは直接関係なさそうな気がするのですが、デバグ時、シリアルモニタを眺めていたら、プルアップしておかないと、なぜか、カウントアップしたような数値が表示され、結果、ON/OFFを繰り返すようになったため、入力に内蔵プルアップ抵抗を使うINPUT_PULLUPを指定しました。

 センサの精度の問題か、このセンサ、動作確認のときから、なぜか、10度ほど高いという誤差があったため、-10としましたが、これは除くとしてArduinoにおけるアナログ入力からの摂氏温度の算出式は、10mVを摂氏1度(Arduinoの最大出力電圧5V=500度)とし、アナログ値に500を乗じ、アナログで表現できる数1024で除すようです。

 delayを含むif文は、シリアルモニタで確認したところ、tempの最初1つ、2つの値が、unsigned intの取り得る数のような値になったこと、温度センサの入力値の変化が結構、激しく、これが閾値を挟む状況だと、無駄にON/OFF(HIGH/LOW)を繰り返すことになるので追加。

 ここで自身は、delay()関数に対する勘違いに気づいた...delay()は、その(位置・行)時点から遅延するんであってloop()ごとの遅延ではない...確かにプログラムの任意の場所に入れられるんだから、そりゃそうで当たり前だよね...正直、あまり意識しておらず、認識が曖昧だったのですが、気づくことができてよかった...。

Arduino+サーボモータでAC100V用家電を制御する方法

[2017/12/05]

 そういえば、100Vを家電をArduinoなどのマイコンボードから制御する、もっと単純な方法があることを思い出しました。

 

 既に情報も多数ありますが、物理スイッチをサーボモータやギヤモータで物理的にON/OFFする方法です。

Arduinoとサーボモータで物理スイッチをON/OFF

 家庭(やオフィス)にある電気製品における物理スイッチとは、壁面スイッチとか、延長コード付きスイッチ付き電源タップのスイッチなどを指します。

Arduinoとサーボモータで物理スイッチをON/OFF gif動画

 これらのスイッチングには、1.5kg/cmもあればよく、最も安価と思われる模型用のプラスチック製サーボモータでもいけます。
( => [追記:2017/12/27] スイッチによるっぽい...100均の1口電源タップはON/OFFできましたが、100均のではない、とある電源タップは1.5Kg/cmだと切り替えできなかった...。)

 延長コード付きや1個口スイッチ付き、2個口集中スイッチ付きの電源タップは、今や100均にもあります。

 尚、Arduinoボードなどマイコンを使った家電の操作は、リレーを使う方法を含め、電源のON/OFFであるため、コンセントをつなぐだけで使える単純な家電か、もしくは、(赤外線)リモコン制御可能な家電に限定されるでしょう。

 ただ、リモコン操作可能な家電なら、電源を入れた後にも、いろいろなセンサーを併用して既存の家電に新たな機能を追加することだってできるようになります。

 なぜなら、別途、Arduinoで回路を組み、既存のリモコンから各種ボタン押下時のデータを学習させ、送信モジュール回路を作れば、電源をONした後のリモコン操作はもちろん、各種センサーの併用で「〜な時、〜する」ことも、更に「外出先からPCやスマホを使って〜」といったことも自由自在だからです。

 楽しみも広がり、いろんなことができてしまうわけですが、それだけに、くどいようですが、やるなら自己責任で。

Arduinoに代えてESP8266にすれば....

[2018/08/28]

 今更ながら追記...

 このページでの話をArduinoではなく、ESP8266/ESP-WROOM-02/ESP32にするだけで、まさにIoT、スマートホーム・スマートハウスにまた一歩近づく、無線でリモコン家電の各種操作を可能とするスマートリモコンや家電をON/OFF可能とするスマートプラグ/スマートコンセントを自作できたりします。

[2018/10/01]

 自作スマートリモコンも自作スマートコンセントも自作スマートスピーカーから操作することもできます。

[2020/03/01]

 遅まきながら、ESP8266・ESP32/WebSocket/サーボモータで壁面照明スイッチ2つをON/OFFさせ、PC/スマホ/タブレットなどブラウザから、更に自作ラズパイスマートスピーカーで壁面照明スイッチを音声操作できるようにしてみました(もちろん、手でオンオフすることもできます)。

ホーム前へ次へ