プログラミング素人のArduino

技術屋の末端。プログラミングは専門外。 電気回路も専門外です。 コードに間違いなど見つけられたら、気軽にコメントください。 VC#始めました。

トランジスタでポンプを制御する(リレー回路)

トランジスタを使って、ポンプの動作を制御しようと思います。

前回紹介したポンプは、ArduinoのDigital or Analog出力では動作させることができませんでした。

これは、Aruduinoの出力電流が足りないためで、これを解決するためにリレー回路を作ります。

リレー回路とは、トランジスタを使うことで、Arduinoからの信号を使って外部電源の制御をするものです。

外部電源として、9V電池を使います。

トランジスタとしては↓を使います。

http://akizukidenshi.com/catalog/g/gI-06001/

回路はこうなります。

電池は9V、モーターをポンプに読み替えてください。

回路は簡単に言うと、電池のマイナスから見て(あえてマイナスから見ます)、エミッタ、コレクタ、ポンプ、ダイオード、プラスと繋がっています。

これに、ベースに信号が入ります。

ここでは、動作テスト用の信号として、タクトスイッチを使っています。

Pin7の状態のHigh or Lowを読んで、pin5を変化させ、トランジスタを制御します。

ここで使っているトランジスタはPNP型です。

タクトスイッチ(Pn7)の信号を検知したら、Pin5を出力し、これをトランジスタのベースに入力します。

ベース出力によって、エミッタからコレクタへの電流をON/OFFします。

トランジスタの基本的な使い方は、この辺で。PNPとNPNの違いなども。

http://www.picfun.com/parttrs.html

PNPトランジスタでは、ベース入力がOFF(Low)のとき外部電源ON、Base入力がON(High)のとき外部電源OFFとなります。

直感的にはトランジスタが可変抵抗のようになって、その抵抗をArduinoでコントロールすることで、ポンプ(モーター)の動作を制御します。

http://akizukidenshi.com/catalog/g/gI-06001/

先ほど、あえてマイナスから回路を見ましたが、トランジスタの回路記号での三角矢印はマイナスの電荷をもった自由電子の流れと見ることができます。

回路が出来上がったところで、ポンプに電圧計をつけてトランジスタの動作を確認してみます。

スイッチが押されていないとき、1.3Vぐらい、スイッチが押されると、7.3Vぐらいとなりました。

どうやら上手く行ったようです。

Base入力が255のときOFFのはずですが、1.3Vがどこかから流れ込んでいるようです。ポンプはこの電圧では動作しないのでとりあえず問題なし、とします。

1のとき、9V電池の電圧がでています。

ところが、電池単体の出力を確認すると5.7Vでした。

やはり、ONのときもOFFのときも1.3~1.6Vぐらいがどこかから流れ込んでいるようです。

ポンプのとなりにダイオードを入れました。

これは、電流の逆流を防ぐためのもので、回路やその他の部品を保護するものです。

今回の場合は無くてもよいかもしれませんが、一応入れました。

ダイオードはLEDもその一種ですが、一方向にしか電流を流しません。これで、何らかの影響で、逆流電圧が発生しても回路を保護できます。LEDが方向性をもっているのもこれと同じです。

このような整流用ダイオードではカソードバンドといわれる印がついています。

下図では黒く塗られている方で、こちらを電池のマイナスの側につなぎます。

http://akizukidenshi.com/catalog/g/gI-00941/

これで、外部電源をコントロールするリレー回路ができました。

=====================================

int pin7 = 7; //デジタルデータ出力pinとして7番を使いpin7という変数を定義する  (intは整数の宣言)

int state = 0; //pinから取得したデータ格納

int pwm = 5; //pin5をanalog出力

void setup() {

Serial.begin(9600); //シリアルモニタを使う(カッコ内は通信速度)

pinMode(pin7, INPUT); //pin7を入力として使う(電圧を読む)

pinMode(pwm, OUTPUT); //電圧を印可する宣言

}

void loop() {

// put your main code here, to run repeatedly:

state = digitalRead(pin7); //データとしてpin7のdigital値を読み込む

Serial.println(state); //シリアルモニタにデータを出力

if (state == 0) {

analogWrite(pwm, 255); //外部電源OFF

}

else {

analogWrite(pwm, 1); //外部電源ON

}

delay(500);//更新間隔の設定

}

=====================================