気の向くままに辿るIT/ICT
webzoit.netウェブサイトホームページ
IoT・電子工作

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

ウェブ造ホーム前へ次へ
サイト内検索
カスタム検索
Arduinoって?

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

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

2017/09/20

 家庭の配電盤にもリレーが入っていてこれで制御しているはずだが、リレー(モジュール)を使うと小さな電圧・電流で大きな電圧・電流の、また、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円で1000円前後といったところかと。

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

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

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

 AC100V用のコンセント付き延長ケーブルは、(普段は、コンセント側で自動認識されるため、意識する必要はないが、)プラスとマイナスの2本の線からなっており、リレーモジュールを噛ませるために、何れかの線を切断、それぞれをリレーモジュールのCOMと、NCかNOにつなぐ。

 最近のものは、ダブルコード状になっているので配線の長さ方向のどの場所であってもコードに沿って接着しているその部分をカッターなどでなぞるか、一部刃を入れて手で引っ張れば簡単に分断できる(尤もそういう構造でないとしたら、たぶん被覆で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である模様。

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()ごとの遅延ではない...確かにプログラムの任意の場所に入れられるんだから、そりゃそうで当たり前だよね...正直、あまり意識しておらず、認識が曖昧だったのだが、気づくことができてよかった...。

EasyWordMall UNO R3開発ボード USBケーブル付属 Arduinoと互換

EasyWordMall Pro Mini モジュール Atmega328 5V 16M Arduino用

Rasbee オリジナル FT232RL モジュール 5V 3.3V FTDI USB TTL 変換アダプタレッド 1個 [並行輸入品]

KKHMF Mini USB Nano V3.0 ATmega328P CH340G 5V 16M マイクロコントローラーボード モジュールArduinoと互換

Rasbee 400穴 ブレッドボード 8.5*5.5cm 1個

HiLetgo 400穴 ブレッドボード 8.5*5.5cm 5個セット

HiLetgo 400穴 ブレッドボード 8.5*5.5cm 10個セット

Rasbee SY-170 ミニブレッドボード カラフルブレッドボード 5個

HiLetgo ジャンパーワイヤー(オス-オス) 20cmx40本 5セット

Rasbee ジャンパーワイヤー(オス-オス) 各種長さx65本

SODIAL(R)25×1N4004 400V 1A アキシャルリードシリコン整流ダイオード

HiLetgo 5V 2チャンネル リレー モジュール リレー拡張ボード オプトカプラー保護 [並行輸入品]

HiLetgo 5V 1チャンネルソリッドステートリレーモジュール低レベルトリガAC 240V 2A PLC

HiLetgo 37センサーモジュールアソートキット/Arduino開発スターターキット