2012年2月6日月曜日

ACリレーと調光と

秋月のソリッドステートリレーキットとネットに転がっている図面を収集して作った回路がこれ。
AC電源とTLP626をつなげるところの抵抗値はあやしいw
FritzingにZNRの画像がないので、ZNRはそれっぽく書いておきました。これに放熱板とかつけます。
ヒューズも付けてないですが、僕の利用法としては50Wの白熱電球の調光なので、まぁいっかって感じ^^;;;

調光の原理としては、上半分のTLP626の回路でAC電源のゼロクロスを検知し、下半分のTLP560の回路でACリレーを構成して、ゼロクロスを検知したらリレーオフにし、任意の時間後にリレーオンにすることで調光を実現します。

これをArduinoで制御しようとすると、結構苦労します。attatchInterrupt()した関数内でdelay()する方法では動きません(´・ω・`)
タイマーで短いインターバルで関数を連続的に呼び出し、関数内で呼び出し回数をカウントして、インターバル×カウント数でリレーオンにするタイミングをはかります。
それだけだったらそんなには難しくはないのですが、他の制御と同居させようとすると、他の制御がタイマーいじってたりするので、そっちに合わせないといけない><たかだか電球1個の調光だけのためにArduino使うのはもったい無いですから。

7 件のコメント:

  1. このコメントは投稿者によって削除されました。

    返信削除
  2. はじめまして、突然すみません。arduinoでの電球の調光を制御したくいろいろと試してこのブログにたどり着きました、、。
    この回路と次のページのコードを使わせて頂き、試してみたのですがうまく行きませんでした。arduinoに関しては本当に基礎知識しかないのですが、よろしければアドバイスをいただきたいです。

    返信削除
  3. つくったの、だいぶ前で、もうArduinoもいじってないので
    コメントしづらいのですが。。。
    TLP、なにそれって感じです><

    うーん、うちではずっと使用し続けています。
    基本、ゼロクロス検知とリレーオンオフがそれぞれ単独で動作確認できれば
    あとはタイミング調整だけだと思うんですけどね。
    ごめんなさい。

    返信削除
    返信
    1. コメント返信ありがとうございます。本当に困っておりまして、、、お手数ですがもう少しご質問をさせて頂いてもよろしいでしょうか、、。
      載せていらっしゃる画像の回路に

      #include "Tlc5940.h"
      #include "MsTimer2.h"


      volatile int zc_counter=0;
      volatile boolean zero_cross=false;
      int AC_pin = 5;
      volatile int ACdim = 500; // 0-600(?)


      void zero_cross_detect()
      {
      zero_cross = true;
      digitalWrite(AC_pin, LOW);
      }


      void ACdim_check()
      {
      if(zero_cross == true) {
      if(zc_counter>=ACdim) {
      digitalWrite(AC_pin, HIGH);
      zc_counter = 0;
      zero_cross = false;
      } else {
      zc_counter++;
      }
      }
      }


      void setup()
      {
      attachInterrupt(0, zero_cross_detect, RISING);
      pinMode(AC_pin, OUTPUT);

      MsTimer2::set(1, ACdim_check);
      MsTimer2::start();

      Tlc.init();
      Tlc.clear();

      Serial.begin(115200);
      }


      void loop()
      {
      if(Serial.available()>0){
      int inByte=Serial.read();
      if(inByte=='1'){
      ACdim+=50;
      if(ACdim>600) ACdim=0;
      Serial.println(ACdim, DEC);
      }else if(inByte=='2'){
      Tlc.set(0, 2000);
      Tlc.set(1, 2000);
      Tlc.update();
      }else if(inByte=='0'){
      ACdim=600;
      Tlc.set(0, 0);
      Tlc.set(1, 0);
      Tlc.update();
      Serial.println("reset");
      }
      }
      }

      のコードを使用して、稼働させているということでまちがいないでしょうか。また回路図のデジタルピンは2と12で間違いないでしょうか。
       お手数おかけしてすみません、、宜しくお願いいたします、、!

      削除
    2. コメント、見過ごしていました。ごめんなさい。
      ピン配置ですか、多分アレンジしてあるかもです。。。
      ソースは、、、外付けHDDに入っているのでちょっとすぐには確認できません。
      いや、本当にすみません。

      削除
    3. ご返答ありがとうございました!
      もう少しいじってみて頑張ってみようかと思います。
      タイミングだけとおっしゃっているのは0~600の数値を
      変化させていくということなのでしょうか。

      たびたび申し訳ありません、、、。

      削除
  4. 返答遅れまして申し訳ございません。

    ACdimの値を変化させる、でよいです。

    ACの0クロスを検知して、どの値になったらリレーオフにするかの
    タイマーカウンター(ただし単位はArduino依存)としています。

    返信削除