Arduinoでステッピングモータの制御(ユニポーラ編)

 

こんなこと、やります。

  • Arduinoでユニポーラ型のステッピングモータを動かす
  • 可変抵抗でステッピングモータの角度を制御する

Arduinoでステッピングモータの制御(ユニポーラ編)
Arduinoでステッピングモータの制御(ユニポーラ編)

つかうもの

この記事でつかうものをご紹介いたします。

ステッピングモータ

ステッピングモータはユニポーラ型の28BYJ-48、モータドライバはULN2003を使用しました。

Amazonで買うと、ステッピングモータとモータドライバ3個セットになっていてお買い得です。

可変抵抗

可変抵抗は100kΩのBカーブを使いました。Bカーブ、10kΩ以上であれば、他のものでも構いません。

Arduino

Arduino Uno Rev3を使用しました。

▼ もちろん、ほかのArduinoをお使いになってもらっても構いません。

もしまだArduinoをお持ちでないようでしたら、オススメArduinoどれを選べばいい?Arduinoで電子工作をはじめる方へをご参考になさってみてください。

開発環境

項目バージョン
パソコンmacOS Big Sur 11.0.1
統合開発環境VS Code x Platform IO

もちろん、WindowsやLinuxでもお使いいただけます。また開発環境も、Arduino IDEでかまいません。

ステッピングモータについて

ここではステッピングモータについて説明します。

ユニポーラ

ユニポーラとは、1つの巻線に対し、一定方向の電流しか流さないステッピングモータです。

トルクはそれほど高くできませんが。安価で購入しやすいのが魅力です。この記事でも、ユニポーラ型のステッピングモータを使用しています。

バイポーラ

バイポーラとは、1つの巻線に対し、双方向へ電流を流すステッピングモータです。トルクの高さが特徴です。ただし、回転速度を上げていくとユニポーラの方がバイポーラよりもトルクを高く維持できます。

一方で、バイポーラ型のステッピングモータは高価で、3DプリンタやCNC機械などに使われます。

▼ バイポーラ型のステッピングモータも動かしてみたので、ラズパイでステッピングモータの制御をご参考になさってみてください。

▼ また、CNCシールドを使って3DプリンタのようにGコードでステッピングモータを動かすこともできます。詳しくはこちらをご覧ください。

28BYJ-48の仕様

28BYJ-48は2相ユニポーラ型のステッピングモータになります。ステッピングモータのシャーシ内にギヤが内蔵されていて、そのギヤ比は1/64となります。トルクはかなり強めですが、動きはゆっくりです。無負荷のときの最高回転数は4秒で1回転となります。

項目内容
ギア比1/64
相数2相ユニポーラ
ステップ角5.625°
出力軸1回転のステップ数2048(2相励磁)
定格電圧5V
直流抵抗約22Ω(センタータップ - 各端子、テスターで実測)

28BYJ-48とULN2003のデータシート

28BYJ-48ULN2003の詳細はこちらのデータシートをご覧ください。

準備

Arduinoやステッピングモータを準備します。

Arduinoとステッピングモータの配線

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

モータドライバの配線
モータドライバの配線

可変抵抗の配線

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

Arduino、ステッピングモータ、可変抵抗の配線のようす
Arduino、ステッピングモータ、可変抵抗の配線のようす

可変抵抗の使い方は、Arduinoと可変抵抗でLEDの明るさ制御もご参考になさってみてください。

Stepperライブラリのインストール

次に、Arduinoでカンタンにステッピングモータを制御できる、Stepperライブラリをインストールします。Arduino IDEのライブラリマネージャーから「Stepper」で検索してインストールしてください。

Stepperライブラリのインストール
Stepperライブラリのインストール

可変抵抗でステッピングモータの角度を制御

映像のように可変抵抗の位置に合わせて、ステッピングモータの角度を制御します。

可変抵抗でステッピングモータの角度を制御
可変抵抗でステッピングモータの角度を制御

動画の続きはこちらのYouTubeで見れます。

プログラム

こちらのがArduinoスケッチのソースコードです。ピン番号の指定を間違えないように注意しましょう。

#include <Arduino.h>
#include <Stepper.h>

const int stepsPerRevolution = 2048;  // 1回転のステップ数
const int POT = 0;
const int A = 8;
const int Abar = 10;
const int B = 9;
const int Bbar = 11;

Stepper myStepper(stepsPerRevolution, A, Abar, B, Bbar);

int stepCount = 0;

void stop() {
  digitalWrite(A, LOW);
  digitalWrite(Abar, LOW);
  digitalWrite(B, LOW);
  digitalWrite(Bbar, LOW);
}

void setup() {
    Serial.begin(9600);
    myStepper.setSpeed(15); // RPM (revolutions per minute)
}
int lastPotAngle = 0;
int motorAngle = 0;

void loop()
{
  float v = float(analogRead(POT)) / 1023.0;
  int potAngle = int(360.0 * v);
  int diffPotAngle = potAngle - lastPotAngle;
  lastPotAngle = potAngle;


  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);
    myStepper.step(diffStep); // ステップ数
    stepCount += diffStep;
    motorAngle = potAngle;
  }

//  stop();
  delay(10);
}

プログラムの解説

ステッピングモータ28BYJ-48は、2048で出力軸が1回転します。Stepperインスタンスを生成する際にその値を指定します。

ステッピングモータの最高回転数は4秒で1回転でしたので、1分間だと最大15回転ほどになります。myStepper.setSpeed(15);でRPMを15に指定しました。

myStepper.step(diffStep);では、ステッピングモータを1ステップづつ動かすことができます。負の値を入れれば逆回転になります。

可変抵抗値の回転範囲で、ステッピングモータが1回転するようにしました。可変抵抗から導き出された角度と、ステッピングモーターの角度が同じになるまでステップさせます。ステッピングモータでは、絶対的な回転角度を知ることができないため、可変抵抗の変化量(微分値)を元に動かすステップ数を決めています。

課題

今回の方法では、ステッピングモータ絶対的な角度や、初期の角度を知ることができません。

また、ステッピングモータは脱調によって角度計算が狂っていきます。脱調を防止するには、常にステッピングモータに電流を流し続けなければならないようです。

プログラム中では、消費電力節約のため、stop関数をつかってステッピングモータの電流をいちいちストップしています。その結果、脱調が頻繁に発生してしまい、角度がどんどんズレてしまいました。

正確な角度を出したい場合は、ロータリーエンコーダを使って角度のフィードバックを行う必要があるでしょう。

記事に関するご質問などがあれば、
Twitter または お問い合わせ までご連絡ください。
人気のArduino互換機
Arduinoで人気の周辺パーツ
Arduinoのオススメ参考書

▼ Arduino初心者向きの内容となっています。ほかのArduino書籍と比べて図や説明がとてもていねいで、読みやすかったです。Arduinoで一通りのセンサーが扱えるようになります。

▼ 外国人が書いた本を翻訳したものです。この手の書籍は、目からうろこな発見をすることが多いです。

▼ Arduinoの入門書を既に読んでいる方で、次のステップを目指したい人向きの本です。C言語のプログラミングの内容が中心です。ESP32だけでなく、ふつうのArduinoにも役立つ内容でした。

関連記事