トランジスタでモーター制御

PWMを使って、トランジスタでDCモーターを制御する方法を学びます。


LAST REVISION: 2022/10/05 22:00


この記事は、2022/01/18にKarl Söderby氏により改定されました。

モーターとトランジスタは非常に一般的な電子部品です。この記事は、実際に動作するコード例と回路、回路図を使い、基本的な事柄を提供することを目的としています。

デジタルピンの2番に接続されている押しボタンが押されると、Arduinoがパルス幅変調(PWM: Pulse-Width Modulation)を使いトランジスタを制御し、モーターのスピードを上げ、その後、下がります。

トランジスタ

Arduinoではデジタルピンに5V、40mAまでしか供給できません。ほとんどのモーターは、動作するにはそれ以上の電流や電圧を必要とします。トランジスタはデジタルスイッチのように振舞うことができ、Arduinoでより高電圧・高電流を必要とする負荷を制御することができます。この例では、モーターの回路を接地します。この例では、TIP120を使い、60V、5Aまで制御することができます。

トランジスタをPWM制御するのは、LEDにパルスを送るのに似ています。PWMの値が大きくなると、モーターは早く回ります。PWMの値が小さくなると、モーターはゆっくり回ります。

トランジスタには3本のピンがあります。この例で使われているようなバイポーラトランジスタでは、ピンはベース、コレクタ、エミッタと呼ばれています。ベースピンに少しの電流を流すと、コレクタピンとエミッタピンの間に電流が流れます。バイポーラトランジスタには、NPNとPNPという2つの異なる種類があります。TIP120はNPN型のトランジスタで、コレクタをモーターに接続し、エミッタをGNDに接続します。

モーター

モーターは電磁誘導と呼ばれるに現象よって動作します。電線に電荷を流すと、磁界が発生します。コイルにした電線では、電流を増やすと、より強い磁界が発生します。DCモーターでは、コイルがモーターのシャフトの周りに配置されています。発生した磁界がモーター内の磁石に引っ張られたり、押し返されたりします。

モーターを止めても、シャフトは回り続けるので、わずかな電流が潜在的に発生します。モーターと並列に配置されたダイオードが、発生した電流が回路を損傷するのを防ぎます。

モーターは、起動時や、負荷がかかっているときに最大の電流が流れます。停動電流は、負荷によりモーターが停止したときに流れる電流です。モーターが起動後動作しているときは、電流はかなり少なくなります。

定格電圧は、最大効率で動作するときの、モーターのピーク動作電圧です。モーターの定格電圧よりも高くても低くても、時間とともに、モーターの寿命を縮めます。定格電圧よりも低い電圧では、モーターはゆっくり回ります。一般に、モーターが回るには定格電圧の半分の電圧が必要です。起動時にそれ以下の電圧しか与えないと、モーターは回らないでしょう。

必要なハードウェア

  • Arduinoボード
  • モーメンタリスイッチかボタン
  • 10kΩの抵抗
  • ブレッドボード
  • フックアップワイヤー
  • 9VのDCモーター
  • TIP120トランジスタ
  • 1N4001ダイオード
  • 9Vの電池

回路

トランジスタでモーターを制御する回路

トランジスタでモーターを制御する回路

まず、(Arduinoの)電源とアースに電線をつなぎます。図では、赤(電源)と黒(アース)で、ブレッドボードの横の2つの縦の列に接続します。これで5Vとアースにアクセスできるようになります。

押しボタンをプレッドボード上に配置します。このとき、ブレッドボードの中央をまたぐようにします。デジタルピン2番と押しボタンの一つの足を電線で接続します。ボタンの同じ足を10kΩのプルダウン抵抗を通じて、アースに接続します。Arduinoに接続していない足は、5V電源に接続します。

Arduinoの9番ピンをTIP120のベースピンに接続します。放熱版を向こう側にしてトランジスタを見ている場合、ベースピンはトランジスタの左側です。これがオン・オフを制御するピンです。トランジスタのコレクタは、モーターの一方のリード線に接続し、エミッタはアースに接続します。

モーターのもう一方の端子は9Vの電池のプラス側に接続します。電池のマイナスをArduinoのアースに接続します。

回路図

トランジスタでモーターを制御する回路図

トランジスタでモーターを制御する回路図

コード例

以下は、トランジスタでDCモーターを制御するプログラム全体です。この後、詳細な説明を行います。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/*
 Motor Control with a Transistor

 This example shows you how to control a motor's using a transistor.
 When a pushbutton on pin 2 is pressed, the Arduino will control a transistor
 via PWM, which will slowly ramp up the motor's speed, then slow it down.

 The circuit :
 * momentary switch with one end connected to 5V, the other end connected
   to GND through a 10-kilohm resistor, and digital pin 2.
 * TIP120 tranistor, with the Base connected to digital pin 9, the Emitter to ground,
   and the Collector to one lead from a 9V DC motor
 * a 9V battery, with the ground connected to the Arduino's ground, and the power
   connected to the motor
 * 1N4001 diode across the motor's leads, with the striped side connected to the 9V

 The Arduino can only provide 40mA at 5V on its pins. Most motors require
 more current and/or voltage to overcome inertia and run. A transistor
 can act as a digital switch, enabling the Arduino to control loads with
 higher electrical requirements.

 Created on 03 January 2013
 by Scott Fitzgerald

 http://www.arduino.cc/en/Tutorial/TransistorMotorControl

 This example code is in the public domain.
 */

// give a name to digital pin 2, which has a pushbutton attached
int pushButton = 2;

// the transistor which controls the motor will be attached to digital pin 9
int motorControl = 9;

// the setup routine runs once when you press reset:
void setup() {
  // make the pushbutton's pin an input:
  pinMode(pushButton, INPUT);

  // make the transistor's pin an output:
  pinMode(motorControl, OUTPUT);  
}

// the loop routine runs over and over again forever:
void loop() {

  // read the state of the button and check if it is pressed
  if(digitalRead(pushButton) == HIGH){
    // ramp up the motor speed
    for(int x = 0; x <= 255; x++){
      analogWrite(motorControl, x);
      delay(50);
    }

    // ramp down the motor speed
    for(int x = 255; x >= 0; x--){
      analogWrite(motorControl, x);
      delay(50);
    }    
  }

  delay(1);        // delay in between reads for stability
}

コードのウォークスルー

i
このセクションでは、プログラムの詳細なウォークするを行います。

最初に、押しボタンの状態とモーター制御を行うためのピン用の変数を作成します。

1
2
int pushButton = 2;
int motorControl = 9;

setup()では、これらのピンを、それぞれ、入力と出力として宣言します。

1
2
3
4
void setup() {
  pinMode(pushButton, INPUT);
  pinMode(motorControl, OUTPUT);  
}

これで、setupは終わり、loop()に移ります。

1
void loop() {

押しボタンの状態を読み、HIGHかどうかを調べます。以下のように、if()文の中で直接評価することができます。

1
if(digitalRead(pushButton) == HIGH){

ボタンが押されれば、motorControlのPWMの値を増加させ、モーターの速度を上げます。最高速に達すると、速度を落としていきます。

1
2
3
4
5
6
7
8
9
for(int x = 0; x <= 255; x+=5){
      analogWrite(motorControl, x);
      delay(50);
    }

    for(int x = 255; x >= 0; x-=5){
      analogWrite(motorControl, x);
      delay(50);
    }

if()文を閉じ、loop()を閉じる前に、少しだけdelay()を入れます。

1
2
3
}
  delay(1);
}

オリジナルのページ

https://docs.arduino.cc/learn/electronics/transistor-motor-control

最終更新日

March 2, 2023

inserted by FC2 system