Arduinoでステッピングモータの制御|ユニポーラ型「28BYJ-48」と「ULN2003」ドライバ

はじめに
こんなこと、やります。
- Arduinoでユニポーラ型のステッピングモータを動かす
- 可変抵抗でステッピングモータの角度を制御する
ステッピングモータについて
ここではステッピングモータについて説明します。
ユニポーラ
今回使用したステッピングモータはユニポーラ型になります。ユニポーラとは、1つの巻線に対し、一定方向の電流しか流さないステッピングモータです。トルクはそれほど高くできませんが。安価で購入しやすいのが魅力です。この記事でも、ユニポーラ型のステッピングモータを使用してます。
バイポーラ
一方で、バイポーラ型のステッピングモータもあります。こちらは1つの巻線に対し、双方向へ電流を流すステッピングモータです。トルクの高さが特徴です。ただし、回転速度を上げていくとユニポーラの方がバイポーラよりもトルクを高く維持できます。バイポーラ型のステッピングモータはユニポーラよりも割高で、3DプリンタやCNC機械などに使われます。
28BYJ-48の仕様
28BYJ-48は2相ユニポーラ型のステッピングモータになります。ステッピングモータのシャーシ内にギヤが内蔵されていて、そのギヤ比は1/64となります。トルクはかなり強めですが、動きはゆっくりです。無負荷のときの最高回転数は4秒で1回転となります。
項目 | 内容 |
---|---|
ギア比 | 1/64 |
相数 | 2相ユニポーラ |
ステップ角 | 5.625° |
出力軸1回転のステップ数 | 2048(2相励磁) |
定格電圧 | 5V |
直流抵抗 | 約22Ω(センタータップ - 各端子、テスターで実測) |
28BYJ-48とULN2003のデータシート
28BYJ-48
とULN2003
の詳細はこちらのデータシートをご覧ください。
- https://www.digikey.jp/ja/datasheets/mikroelektronika/mikroelektronika-step-motor-5v-28byj48-datasheet
- https://www.tij.co.jp/product/jp/ULN2003A
可変抵抗でステッピングモータを動かす準備

Arduinoやステッピングモータを準備します。
Arduinoとステッピングモータの配線
図のように、モータドライバULN2003
のIN1〜IN4を、Arduinoのデジタルピン8、9、10、11番へつなぎます。Arduinoとは別の5V電源を用意し、モータドライバの±端子へつなぎます。

可変抵抗の配線
可変抵抗の両端1番、3番端子を、ArduinoのGNDと5Vへつなぎます。そして、真ん中の2番端子を、アナログピン0番へつなぎます。

Stepperライブラリのインストール
次に、Arduinoで簡単にステッピングモータを制御できる、Stepper
ライブラリをインストールします。Arduino
IDEのライブラリマネージャーから「Stepper」で検索してインストールしてください。
可変抵抗でステッピングモータの角度を制御
映像のように可変抵抗の位置に合わせて、ステッピングモータの角度を制御します。
動画の続きはこちらのYouTubeで見れます。 https://www.youtube.com/watch?v=lPF7XyqDMug&ab_channel=ToshihikoArai
プログラム
こちらのがArduinoスケッチのソースコードです。ピン番号の指定を間違えないように注意しましょう。
#include <Arduino.h>
#include <Stepper.h>
#define POT_PIN A0
#define IN1_PIN 8
#define IN2_PIN 9
#define IN3_PIN 10
#define IN4_PIN 11
#define stepsPerRevolution 2048 // 1回転のステップ数
(stepsPerRevolution, IN1_PIN, IN3_PIN, IN2_PIN, IN4_PIN);
Stepper motor
int stepCount = 0;
int lastPotAngle = 0;
int motorAngle = 0;
int medianFilter(int s[], size_t len) {
for (size_t i=0; i<len; ++i) {
for (size_t j=i+1; j<len; ++j) {
if (s[i] > s[j]) {
int tmp = s[i];
[i] = s[j];
s[j] = tmp;
s}
}
}
int m = len / 2;
return s[m];
}
void stop() {
(IN1_PIN, LOW);
digitalWrite(IN2_PIN, LOW);
digitalWrite(IN3_PIN, LOW);
digitalWrite(IN4_PIN, LOW);
digitalWrite}
void setup() {
.begin(115200);
Serial.setSpeed(15); // RPM (revolutions per minute)
motor}
void loop() {
float v = float(analogRead(POT_PIN)) / 1023.0;
int potAngle = int(360.0 * v);
int diffPotAngle = potAngle - lastPotAngle;
.println(diffPotAngle);
Serialif(abs(diffPotAngle) <= 7) { // POTのセンサノイズとして無視する
(10);
delayreturn;
}
= potAngle;
lastPotAngle
while (motorAngle != potAngle) {
int diffStep = -1.0 * float(diffPotAngle) * float(stepsPerRevolution) /
360.0; // Pot -> CW, MOTOR -> CCW
// Serial.print(diffPotAngle);
// Serial.print(" / ");
// Serial.println(diffStep);
.step(diffStep); // ステップ数
motor+= diffStep;
stepCount = potAngle;
motorAngle }
// stop();
(10);
delay}
Stepperの初期化ですが、1,2,3,4の並び順だと脱調してしまってうまく回転できず、1,3,2,4の順番で上手くできました。
(stepsPerRevolution, IN1_PIN, IN3_PIN, IN2_PIN, IN4_PIN); Stepper motor
プログラムの解説
ステッピングモータ28BYJ-48
は、2048で出力軸が1回転します。
Stepper
インスタンスを生成する際にその値を指定します。ステッピングモータの最高回転数は4秒で1回転でしたので、1分間だと最大15回転ほどになります。myStepper.setSpeed(15);
でRPMを15に指定しました。
myStepper.step(diffStep);
では、ステッピングモータを1ステップづつ動かすことができます。負の値を入れれば逆回転になります。
可変抵抗値の回転範囲で、ステッピングモータが1回転するようにしました。可変抵抗から導き出された角度と、ステッピングモーターの角度が同じになるまでステップさせます。ステッピングモータでは、絶対的な回転角度を知ることができないため、可変抵抗の変化量(微分値)を元に動かすステップ数を決めてます。
今後の課題
今回の方法では、ステッピングモータ絶対的な角度や、初期の角度を知ることができません。
また、ステッピングモータは脱調によって角度計算が狂っていきます。脱調を防止するには、常にステッピングモータに電流を流し続けなければならないようです。
プログラム中では、消費電力節約のため、stop
関数をつかってステッピングモータの電流をいちいちストップしてます。その結果、脱調が頻繁に発生してしまい、角度がどんどんズレてしまいました。
正確な角度を出したい場合は、ロータリーエンコーダを使って角度のフィードバックを行う必要があるでしょう。
関連記事
- 【XYペンプロッター制作③】CNCシールドの設定「マイクロステップ分解能」
- 【XYペンプロッター制作①】CNCシールドでステッピングモータを動かすまで
- Arduinoで可変電圧器【Seeeduino Xiao】
- 【Raspberry Pi】ステップ応答による抵抗値の測定
- Raspberry Piでステッピングモータの制御