ここで、データ記録から一度話が外れますが、リレーの駆動について説明します。リレー(継電器)とは、電気で操作するスイッチのことです。例えばArduinoで100V ACの家電を動かすことはできませんが(電圧・電力ともに足りないし、そもそも交流が出せない)、100V ACにつないである電線のスイッチを開閉することはできます。このスイッチがリレーです。これを動かせれば、たとえば三軸試験装置で、変位がある程度大きくなったら(つまり、変位計からの電圧が一定値を超えたら)、モーターのスイッチを切る、などすることが可能です。データロガーという観点でも、後の回で説明しますが、これを使って電源管理モジュール(間欠動作を管理するモジュール)をつくることができます。

 

 リレーにはメカニカルリレーとソリッドステートリレーがあります。前者はソレノイドを用いて、電磁石として機械的にスイッチを開閉するものです。動くたびにカチッと音がします。機械的に絶縁・接続するので、有無を言わせず機能します。ただし、機械的動作を伴うため、消費電力が大きいうえに、寿命があります(数万回・数十万回といった動作回数)。ソリッドステートリレーについては詳しくありませんが、フォトカプラを使って絶縁・接続するため、機械的動作を伴いません。ただ(この認識が正しいのかわかりませんが)、交流専用のものが多いように感じます(直流に対して使うと、一度リレーを開くと、閉じようとしても電流が流れっぱなしになる)。

 

 電子工作でリレーを買おうとすると、以下の製品(あるいは似たもの)がよく出てきます。2つ、4つ、6つと連なった多連型も多く売っています。

 

 

 これはこれで使えますが、5V専用で、3.3Vではパワーが足りないようです。後に3.3Vのシステムに移行することも考えると、以下のものがよいです。こちらは3.3V用ですが(推奨されているかはわかりませんが)5Vでも使えます。

 

GROVE - リレー GROVE - リレー
484円
楽天

 

消費電力はいずれも100mAほどです。電子工作的にはかなり大きな消費電力です。室内試験などで用いる場合はArduinoに家庭用電源から電力を得られるので問題ありませんが、電池駆動を考えると、あまり長い時間は駆動させたくないものです。リレーには、信号を送るとONとなるもの、信号を送るとOFFになるものがありますが、上記の製品は、信号を送るときのみON(接続される)となります。以下のように接続してみてください。

 

 

実際に届いたリレーと、上のFritzingの図で端子の並びが違うことがあるのでご注意ください。Vcc同士、GND同士をつなげばよいだけです。リレーの信号(SIG)ピンはArduinoの任意の端子につなぎ、スケッチ上で指定します。NCという端子もありますが、non-connectedなので使いません。この製品はGroveというシリーズで、下のようなコネクターが付いてきます。Arduinoに対して使うときは、片側は処理が必要です。ここでは単に切って剥きました(右図)。

 

 

 

そして以下のスケッチを試してみて下さい。5秒に一度、リレーがカチッといって開いたり閉じたりします。そして端子台の2極がつながったり絶縁されたりすることが、テスターを使えば(抵抗がゼロになるかどうか)でわかります。

 

#include <DS3232RTC.h>    //http://github.com/JChristensen/DS3232RTC
#include <Time.h>
#include <TimeLib.h>

const int RelayPin = 9; // リレーに信号を送るデジタルピン番号

void setup(void)
{
  pinMode(RelayPin, OUTPUT); // リレーに信号を送るデジタルピンを出力モードに設定
}

void loop(void)
{
  digitalWrite(RelayPin, HIGH);
  delay(10000);
  digitalWrite(RelayPin, LOW);
  delay(10000);
}

 

こんな感じ(左:リレーがOFFのとき、右:リレーがONのとき)。

 

 

 

ここでは応用として、第7回で説明したRTC(時計)を使えば、次のようにして、例えば毎時0分になったら10秒間だけリレーを開くということもできます(下のスケッチ、毎時リレーをながめているのが面倒だったので実際に試していないのですが、うまくいく、のではと思います)。ここで、RTCの時間設定は第7回のスケッチによりすでにされているものとします。何かの家電を1時間に10秒だけ電源を入れる、といったことに使えますね(家電はだいたい100V ACでしょうから、上記のソリッドステートリレーのほうがよいかもしれません)。

 

 

#include <DS3232RTC.h>    //http://github.com/JChristensen/DS3232RTC
#include <Time.h>
#include <TimeLib.h>

const int RelayPin = 9; // リレーに信号を送るデジタルピン番号
bool flg = false; // リレーがこの時間(hour)にすでに動作したかどうかのフラグ

void setup(void)
{
    pinMode(RelayPin, OUTPUT); // リレーに信号を送るデジタルピンを出力モードに設定
    
    /* ----- Setting time based on RTC ----- */
    setSyncProvider(RTC.get);   // ここでRTCの時刻をもとにArduinoの時刻を合わせる
    if(timeStatus() != timeSet) 
        Serial.println("Unable to sync with the RTC");
    else
        Serial.println("RTC has set the system time");
    delay(1000);
}

void loop(void)
{
    if((minute()==0)&&(!flg)) //分(minute)が0、かつまだこの分で動作していないなら
    {
      digitalWrite(RelayPin, HIGH);
      delay(10000);
      digitalWrite(RelayPin, LOW);
      flg=true; //おなじ分のうちにまた動作しないよう、フラグをtrueとしておく
    }

    if(minute()!=0) // 分(minute)が0でないときに、フラグを再びfalseとしておく
    {
      flg=false;        
    }
}

 

 なぜここでリレーの回を設けたかというと、Arduinoを使ったロガーそのもの(スレーブ)を、もう一台のArduino(マスター)でリレーを使って電源ON/OFFすれば、省電力化できるため、それを後の回で説明するためです。