2007年10月02日

Arduino

Flashから交流電源をコントロール

前回のリレースイッチでは、電源のON/OFFしかできませんでした。
今回扱はAC電源をコントロールして、電球の明るさをコントロールします。

ac_cont01.jpg

ソースをダウンロード

必要なもの
ac_cont_trai.jpg
トライアック
ac_cont_phototrai.jpg
フォトトラアック(非クロスゼロ)
ac_cont_phototcap.jpg
フォトカプラ
ac_cont_con.jpg
フィルムコンデンサ
ac_cont_trance.jpg
トランス
そのほか、抵抗、電球、配線、基盤など

1 | トライアックで電源の切替する

交流電力をコントロールするには、交流のサイン波をカットすることで調整します。
ac_cont_zu3.gif

リレースイッチでは、切替に時間がかかるので、
交流のトランジスターにあたるトライアックを使用します。

トライアックへの切り替えトリガーパルスを送るために、
AC100Vの電源をarduinoに直結させるのは、
危険なためフォトトライアック使って絶縁させます。
arduinoから、フォトトライアックに1msのトリガーパルスを送ることで、
トライアックに間接的にトリガーパルスを送ります。

回路右側のコンデンサーと抵抗は、高周波ノイズを取るための回路です。

ac_cont_zu2.gif

ac_cont02.jpg

2 | 交流の周期を読み込む

交流のサイン波を切り取るために、交流の周期を知る必要があります。

交流の周期を読み込むのに、トランスで6Vに降圧後、
フォトカプラでパルスに変換します。
フォトカプラは、交流が0Vになる地点で、パルスを送ってきます。
AC50Hzの場合、1秒間に100回パルスを送ってきます。

ac_cont_zu4.gif

ac_cont_zu1.gif

ac_cont03.jpg

ソフト上の処理
arduinoでパルスの割り込みには、attachInterruptを使います。
attachInterruptは最初に、setupの中で、パルス割り込み宣言します。

attachInterrupt(0, zeroPulse, RISING);

attachInterruptの
引数1つ目は、使うポート名(Digital2→0に対応)
引数2つ目は、割り込み関数名
引数3つ目は、パルスが立ち上がりか、立ち下がりかを選択

割り込み関数の中では、delay関数を使えないので、フラグの変化をさせています。

void zeroPulse()
{
  zeroFlg = 1;
}

3 | arduinoでパルスコントロール

arduinoからパルスを出すには、
フォトカプラからのパルスで割り込み後、zeroFlgが1になります。
delayMicrosecondsで、時間待ちをして、
1msのパルスをフォトトライアックに送信します。

delayMicroseconds(delayTime);
digitalWrite(triggerPin, HIGH);
delay(1);
digitalWrite(triggerPin, LOW);

フォトトライアックへのパルス出力待ち時間計算
arduinoは1ms以下のパルスを出すと、不安定になるので、パルスは1msとしました。
10ms-1ms=9msを、255で割ります。
9000μs ÷ 255 ≒ 35
フォトカプラからのパルスは、交流0Vになる前に57μsずれがあるので、
遅延時間は以下のようになります。

delayTime = 57 + (255 - sum) * 39;

それと、
出力電源が不安定なため、電力が0に近く小さい時と、
電力が大きく100%に近い時は、
上記の式を使わず、0V、100V出力にしています。

今回のarduinoでの交流のコントロールは、delay関数の不安定なことや、割り込み処理ができないために不安定なので、使う用途によって応答処理をするなど、ソースを改良する必要があります。