I2C接続AQMシリーズのキャラクタ表示LCDをMicro:bitで使う (7) リレー

センサ・データを生かす出力制御

 圧力センサ光センサでは、ある値であるスレッショルドを超えるとLEDを点灯させるスケッチを書きました。一歩進めて、リレーのON/OFFに挑戦します。用途に合った規格のリレーを使えば、AC100Vにつながった電気器具のON/OFFができます。

 リレーは、マイコンから直接制御できません。理由は二つあります。

  • 扱う電流が大きい
  • 逆起電力によるデバイスの破壊

 小さな電力であれば、MOS FET(もすふぇっと)でリレーを制御できます。とくに速度が重要でない場合は、ドライブ回路も簡単です。Micro:bitのI/Oで直接MOS FETを制御できます。ただし、ONになる電圧が2Vで制御できるMOS FETが必要です。多くのMOS FETはゲートに約5VをかけないとONになりません。3.3Vで動作するMicro:bitでは駆動できません。

 ゲートの駆動電圧は、メーカによってVgs、Vthとか呼び名が異なります。2Vの製品を探します。カタログから探したので、実際にMicro:bitで使えるかは不明です。

  • 2SK2232 60V/25A Vth=2V
  • 2SK2925 60V/10A VGS (off)=2.5V
  • 2SK2796 60V/5A VGS (off)=2.0V 
  • 2SK4033 60V/5A Vth=2.5V 
  • 2SK3140 60V/60A VGS (off)=2.5V 

リレーの外観

 MOS FETでリレーを駆動できます。MOS FETはONもしくはOFFで利用するスイッチング・デバイスです。

 リレーは、機械式(有接点)半導体(無接点、ソリッド・ステート・リレー)の2種類があります。

  • 機械式では、制御するものと物理的に絶縁できる。2次側では、交流および直流を制御できる
  • 半導体では2次側は交流を制御できる(直流対応もあるが少ない)

 電力用途は形状が大きいですが、電子工作に使うのは、だんだん小型化が進んでいます。

 構造は、こちらの記事を参照ください。

リレーをMOS FETでドライブする回路

 機械式リレーは動作が速くないので、下記のMOS FETドライブ回路で駆動できます。リレーは電磁石に電流が流れるので、ON/OFF時に高い起電力が発生します。ほかの回路にノイズとして飛び込んだり、デバイスの耐電圧を超えることがあるので、ダイオードで対処します。

 リレーには4種類のパラメータがあります。

 DC12Vや5Vという表記は、リレーのコイルにかける電圧です。小型のリレーでは、電流は30mAや100mAぐらいです。

 1A 125V/ACという表記は、2次側(負荷)のON/OFFできる交流の電力です。約100Wが制御できます。

 2A 30V/DCという表記は、2次側のON/OFFできる直流の電力です。直流ではON/OFF時に接点にアーク(火花)が飛びやすいので、交流より扱える電力は低くなります。

 1Cというのは2次側の接点が1回路という意味です。2回路用もあります。

 また、接点はONしないときにつながっているノーマリ・オンのa接点(メーク接点)と電気的にONしたときにつながるノーマリ・オフのb接点(ブレイク接点)があります。

Micro:bitでLEDを駆動

 2次側にはパワーLED(1W)をつなぎます。電流は約300~350mA流れます。LED内部では、複数のLEDが直列につながれているモジュールもあるので、電圧は製品によって異なります。1Wや3Wは、1個入りLEDなので、順方向電圧Vfは約3Vです。

 最初に確認事項があります。リレーにつながったLEDは、電源が入っていないと光りません。Micro:bitと駆動回路に電源が入ったらどうでしょうか。プログラムが動かないうちにLEDが点灯するのは不都合です。

STEP1 からのプログラムを書き込む

void setup() {
}
void loop() {
}

 中途半端な電圧が出ているピンもあります。初期化(HIGHもしくはLOW)にしてから利用するのが望ましいです。

  • L 200mV(50Hzのハムが載っている)
  • h 1.675V
  • H 3.18V

P0 P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 P11 P12 P13 P14 P15 P16 P19 P20
h h h L L H L L L L L H L L L L L H H

 Lの出ているピンの様子。

STEP2 OUTPUT指定をし、HIGH出力にする

void setup() {

for (int i=0; i<21; i++){
pinMode(i, OUTPUT);
}
}
void loop() {
for (int i=0; i<21; i++){
digitalWrite(i, HIGH);
}
}

 いずれもHIGHです(H;3.18V)。

P0 P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 P11 P12 P13 P14 P15 P16 P19 P20
 H  H  H  H  H  H  H  H  H  H  H  H  H  H  H  H  H  H  H

●STEP2 OUTPUT指定をし、LOW出力にする

void setup() {
for (int i=0; i<21; i++){
pinMode(i, OUTPUT);
}

void loop() {
for (int i=0; i<21; i++){
digitalWrite(i, LOW);
}
}

 論理的にはすべてLOWですが、微妙に電圧の出ているピンがあります。

  • L;40mV
  • LL;19mV
  • 0;0V
P0 P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 P11 P12 P13 P14 P15 P16 P19 P20
0  0  0  0  0  LL 0  0  0  0  0 LL  0  0  0  0  0  L  L

テスト・スケッチ

 次の回路を使って1WのLEDを点滅します。定電流ダイオードCRDは350mAのNSI50350AST3Gです。MOS FETは60V/5Aの2SK4033です。Vth=2.5(max)なので、Micro:bitで駆動できるでしょう。リレーはDC12V、1接点タイプです。

#define RL 9
void setup() {
pinMode(RL, OUTPUT);
digitalWrite(RL, LOW);
}

void loop() {
digitalWrite(RL, HIGH);
delay(1000); // wait for a second
digitalWrite(RL, LOW);
delay(1000); // wait for a second
}

LCDの表示を追加

#include <Wire.h>
#define RL 9
unsigned char lcd_address = 0x3e;

int i2cwritecmd(byte cmd) {
Wire.beginTransmission(lcd_address);
Wire.write((byte)0x00);
Wire.write(cmd);
return Wire.endTransmission();
}

int i2cwritedata(byte data) {
Wire.beginTransmission(lcd_address);
Wire.write(0x40);
Wire.write(data);
return Wire.endTransmission();
}

void lcdcu_set(int x, int y) { // xは桁数、0から16が指定できる。yは行数で0が1行目、1が2行目
byte ca = (x + y * 0x40) | (0x80); i2cwritecmd(ca);
}

void i2cprint( String pdata) {
int n = pdata.length();
for (int i = 0; i < n; i = i + 1) {
i2cwritedata(pdata.charAt(i));
delay(1);
}
}

void init_lcd() { // LCDの初期化
delay(145);
i2cwritecmd(0x38);delay(1);
i2cwritecmd(0x39);delay(1);
i2cwritecmd(0x14);delay(1);
i2cwritecmd(0x73);delay(1);
i2cwritecmd(0x56);delay(1); // 3.3V
i2cwritecmd(0x6c);delay(300);
i2cwritecmd(0x38);delay(1);
i2cwritecmd(0x0c);delay(2);
i2cwritecmd(0x01);delay(2);
}

void setup() {
Wire.begin();
init_lcd();
i2cprint(String("Start"));
pinMode(RL, OUTPUT);
digitalWrite(RL, LOW);
}

void loop() {
digitalWrite(RL, HIGH);
lcdcu_set(0,1);
i2cprint("Relay ON ");
delay(1000); // wait for a second

lcdcu_set(0,1);
i2cprint("Relay OFF");
digitalWrite(RL, LOW);
delay(1000); // wait for a second
}

コラム ダイオードの効果

 コイル(インダクタ)は電気を一時的に溜めるので、つながった電源を急にON/OFFすると、磁束が変化して高い電圧が発生します。通常、高い電圧の発生は回路にとって不都合です。ダイオードを入れて、抑制します。ここで使ったダイオード1N4007は1000V耐圧1Aの整流用です。電流容量の少ないスイッチング用が使えるかどうかは不明です。

 実際のノイズを観測します。リレーのコイルの両端の波形ですが、特別に高い電圧は観測されませんでした。