Arduinoとステッピングモーター設定

ユニポーラ回路・バイポーラ回路を使った様々なステッピングモーターをArduinoで制御する方法を学びます。


AUTHOR: Arduino、LAST REVISION: 2022/10/05 22:00


ステッピングモーターは、その独自設計により、フィードバック機構無しで高精度に制御することができます。ステッピングモーターのシャフトにはいくつかの磁石が取り付けられ、いくつかのコイルにより制御されます。コイルは特定の順序でプラスまたはマイナスに帯電し、小さいステップで正確に正転・逆転させます。

ユニポーラ型とバイポーラ型という2種類のステッピングモーターがあり、どちらの種類かを知ることが重要です。各種類のモーターごとに、回路が異なります。コード例は、両方の種類のモーターを制御できます。モーターの接続方法は、ユニポーラ型バイポーラ型の回路図を参照してください。

ユニポーラ型のステッピングモーターもバイポーラ型のステッピングモーターも、8番と9番、10番、11番のデジタルピンで制御されます。Arduinoボードは、ユニポーラ型のステッピングモーターを使うときはU2004ダーリントンアレイに、バイポーラ型のステッピングモーターを使うときはSN754410NE Hブリッジに接続します。

必要なハードウェア

  • Arduinoボード
  • ステッピングモーター
  • U2004ダーリントンアレイ(ユニポーラ型のステッピングモーターを使うとき)
  • SN754410NE Hブリッジ(バイポーラ型のステッピングモーターを使うとき)
  • 使用するステッピングモーターに適した電源
  • フックアップワイヤー
  • ブレッドボード

回路

以下に、ユニポーラ型とバイポーラ型のステッピングモーター用の回路を示します。どちらの場合でも、Arduinoボードから直接給電するには消費電力が大きいので、ステッピングモーターには外部から電源を供給するのが最善です。

i
注意: 以下の回路は双方4線接続の設定です。2線接続の設定では、例示するコードは動作しません。

ユニポーラ回路と回路図

ユニポーラモーターノブ回路。図はFritzingで記述。

ユニポーラモーターノブ回路。図はFritzingで記述。

ユニポーラモーターノブ回路図。図はFritzingで記述。

ユニポーラモーターノブ回路図。図はFritzingで記述。

バイポーラ回路と回路図

バイポーラモーターノブ回路。図はFritzingで記述。

バイポーラモーターノブ回路。図はFritzingで記述。

バイポーラモーターノブ回路図。図はFritzingで記述。

バイポーラモーターノブ回路図。図はFritzingで記述。

MotorKnob

ステッピングモーターは、アナログ入力の0番に接続された可変抵抗(や他のセンサー)の回転角に従います。

 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
#include <Stepper.h>

// change this to the number of steps on your motor
#define STEPS 100

// create an instance of the stepper class, specifying
// the number of steps of the motor and the pins it's
// attached to
Stepper stepper(STEPS, 8, 9, 10, 11);

// the previous reading from the analog input
int previous = 0;

void setup() {
  // set the speed of the motor to 30 RPMs
  stepper.setSpeed(30);
}

void loop() {
  // get the sensor value
  int val = analogRead(0);

  // move a number of steps equal to the change in the
  // sensor reading
  stepper.step(val - previous);

  // remember the previous value of the sensor
  previous = val;
}

StepperOneRevolution

モーターはある方向に1回転し、その後、逆に1回転します。

 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
#include <Stepper.h>

const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution
// for your motor

// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

void setup() {
  // set the speed at 60 rpm:
  myStepper.setSpeed(60);
  // initialize the serial port:
  Serial.begin(9600);
}

void loop() {
  // step one revolution  in one direction:
  Serial.println("clockwise");
  myStepper.step(stepsPerRevolution);
  delay(500);

  // step one revolution in the other direction:
  Serial.println("counterclockwise");
  myStepper.step(-stepsPerRevolution);
  delay(500);
}

StepperOneStepAtATime

モーターはゆっくり1ステップずつ動きます。これを使って、ステッピングモーターの4線が正しいピンに接続されているかを試すことができます。正しく接続されていれば、全てのステップが同じ方向に動きます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <Stepper.h>

const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution
// for your motor

// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

int stepCount = 0;         // number of steps the motor has taken

void setup() {
  // initialize the serial port:
  Serial.begin(9600);
}

void loop() {
  // step one step:
  myStepper.step(1);
  Serial.print("steps:");
  Serial.println(stepCount);
  stepCount++;
  delay(500);
}

StepperSpeedControl

モーターは時計方向に回転します。可変抵抗の値が高いと、モーターは早く回ります。setSpeed()がステップの間隔の遅延を設定するので、低速でのセンサーの値の変化に対しては、モーターの反応が鈍いことに気づくかもしれません。

 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
#include <Stepper.h>

const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution
// for your motor


// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

int stepCount = 0;  // number of steps the motor has taken

void setup() {
  // nothing to do inside the setup
}

void loop() {
  // read the sensor value:
  int sensorReading = analogRead(A0);
  // map it to a range from 0 to 100:
  int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
  // set the motor speed:
  if (motorSpeed > 0) {
    myStepper.setSpeed(motorSpeed);
    // step 1/100 of a revolution:
    myStepper.step(stepsPerRevolution / 100);
  }
}

オリジナルのページ

https://docs.arduino.cc/learn/electronics/stepper-motors

最終更新日

October 23, 2022

inserted by FC2 system