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

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

この記事では、Arduinoでステッピングモータを動かす方法を解説していく。具体的には、可変抵抗を使ってステッピングモータの角度を制御してみた。

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

開発環境

項目バージョン
ArduinoデバイスArduino Uno Rev3
ステッピングモータ28BYJ-48
モータドライバULN2003
統合開発環境VS Code x Platform IO
パソコンmacOS Big Sur 11.0.1

ステッピングモータはこちらの製品を使った。3個セットでモータドライバも付いていて1000円以下という安さ。

Ren He 5V ステッピングモータ+ 28BYJ-48 ULN2003ドライバーボード セット Arduino用 3個セット
Ren He 5V ステッピングモータ+ 28BYJ-48 ULN2003ドライバーボード セット Arduino用 3個セット

A、B、C、D 4相LED、ステッピングモータ作業のステータスを示します。 モーター ピンを経た電源のために外部の電圧を選ぶことができる、ステップモーターの下で疾走しなさい。 ドライブモジュール基板サイズ:3.2cm*3.5cm。直径:28mm。 電圧:5V。 ステップ角度:5.625×1/64。

Amazon

ステッピングモータ28BYJ-48の使用

ギヤ内蔵のステッピングモーターで、ギヤ比1/64で減速されるため動きはゆっくりである。無負荷の最高回転数は4秒で1回転となる。 そのかわり、トルクはかなり強めである。

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

データシートはこちら

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

モータドライバのIN1からIN4までを、Arduinoのデジタルピン8、9、10、11番へ繋ぐ。また、Arduinoとは別の5V電源を用意しモータドライバの±端子へ繋ぐ。

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

可変抵抗は100kΩのBカーブを使用した。可変抵抗の両端(1番、3番)をArduinoのGNDと5Vへ繋ぎ、真ん中の端子をアナログピン0番へ繋いだ。

可変抵抗の詳しい使い方はこちらの記事を参考に。

全体の配線図
全体の配線図

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

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

Arduinodでステッピングモータを制御するには、Stepperライブラリを使うと非常に簡単にできる。Platform IOを使ってVS CodeでArduino開発しているため、画像のようにStepperライブラリを検索してプロジェクトへインストールした。

プログラム

動画のように可変抵抗の位置に合わせて、ステッピングモータの角度を制御するプログラムがこちら。

#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);
}

プログラムの解説

今回使用したステッピングモータは2048で出力軸が1回転である。よってStepperインスタンスを生成する際にその値を指定している。

また、ステッピングモータの最高回転数は4秒で1回転であるため、1分間に最大15回転できることになる。よって、myStepper.setSpeed(15);でRPM15を指定している。

そして、myStepper.step(diffStep);のようにしてステッピングモータを1ステップづつ動かすことができる。負の値を入れれば逆回転させられる。

可変抵抗値の上限範囲で、ステッピングモータの角度がちょうど0度〜360度回転するように設定している。よって、whileループで可変抵抗から導き出された角度とステッピングモーターの角度が一致するまでステップさせている。ただし、ステッピングモータの絶対的な回転角度を知ることができないため、可変抵抗の変化量(微分値)を元に動かすステップ数を決めている。

動画のように、可変抵抗によるステッピングモータの角度制御ができることがわかった。しかし、先ほど述べた通りこの方法ではステッピングモータ絶対的な角度や初期の角度を知ることはできない。

また、ステッピングモータは脱調により角度がズレる恐れがある。とくに、プログラム中のstop関数はステッピングモータの停止時に無駄な電流を流さないようにするための方法であったが、stop関数を実行すると脱調が頻繁に発生してしまい角度がどんどんズレてしまった。脱調を防ぐには、常にステッピングモータに電流を流していなければならない。

よって、本プログラムはあくまで実験ということで、正確な角度が必要な環境ではロータリーエンコーダを使って角度のフィードバックを行ったほうが良いかもしれない。

今回使用した関連製品はこちら

Ren He 5V ステッピングモータ+ 28BYJ-48 ULN2003ドライバーボード セット Arduino用 3個セット
Ren He 5V ステッピングモータ+ 28BYJ-48 ULN2003ドライバーボード セット Arduino用 3個セット

A、B、C、D 4相LED、ステッピングモータ作業のステータスを示します。 モーター ピンを経た電源のために外部の電圧を選ぶことができる、ステップモーターの下で疾走しなさい。 ドライブモジュール基板サイズ:3.2cm*3.5cm。直径:28mm。 電圧:5V。 ステップ角度:5.625×1/64。

Amazon
Arduino Uno Rev3 ATmega328 マイコンボード A000066
Arduino Uno Rev3 ATmega328 マイコンボード A000066

Uno Rev.3、8 bit、AVR、ATmega328、USB-シリアルコンバータとしてプログラムされたATmega 16U2搭載

AmazonRakuten

こんな商品も人気です!

1.54インチ 電子ペーパーモジュール 200x200ラズベリーパイ エンベデッドコントローラ付き E-Inkディスプレイ画面
1.54インチ 電子ペーパーモジュール 200x200ラズベリーパイ エンベデッドコントローラ付き E-Inkディスプレイ画面

バックライトがなく、電源を切っても最後のコンテンツが長時間表示される。 超低消費電力、基本的に電力はリフレッシュにのみ必要です。 SPIインターフェイス、Raspberry Pi / Arduino / Nucleoなどのコントローラーボードとの接続用。

AmazonRakuten
M5Stack 開発ボード M5Stack Core2 開発キットデュアルコア32ビット240Mhz LX6プロセッサーUIFlow, MicroPython, A r d u i n o用
M5Stack 開発ボード M5Stack Core2 開発キットデュアルコア32ビット240Mhz LX6プロセッサーUIFlow, MicroPython, A r d u i n o用

Amazon
ELEGOO Arduino用 Nanoボード V3.0 CH340/ATmega328P、Nano V3.0互換
ELEGOO Arduino用 Nanoボード V3.0 CH340/ATmega328P、Nano V3.0互換

NanoはArduinoと互換性があり、ATmega328PやCH340と同じの公式バージョンで使用しています。 これは、最小で、完全で、ブレッドボードに優しいボードです。より多くのアナログ入力ピンとオンボード+ 5V AREFジャンパを備えた(電気的に)すべてが備わっています。

Amazon
ELEGOO Arduino用の 2.8 Inches TFT ターチスクリーン カードソケット付
ELEGOO Arduino用の 2.8 Inches TFT ターチスクリーン カードソケット付

無料チュートリアル(CDに収録)、より良い価格、より良いサービス。 (技術データ付き) 2.8インチ多彩なディスプレイ液晶画面 タッチペンも付き

AmazonRakuten

Arduinoの参考書

ESP32&Arduino 電子工作 プログラミング入門
ESP32&Arduino 電子工作 プログラミング入門

電子工作ファンに人気のマイコンArduino、そしてWiFiとBluetooth内蔵でネットワーク接続しやすいESP32。それらのマイコンでプログラムを組む際に使うのが「Arduino言語」です。「電子工作は好きだけどプログラミングはよくわからない」あるいは「プログラミングの経験がある。それを活かして電子工作を楽しみたい」--そんなみなさまのための電子工作プログラミング入門が本書です。

KindleAmazonRakuten
電子部品ごとの制御を学べる! Arduino 電子工作実践講座 改訂第2版
電子部品ごとの制御を学べる! Arduino 電子工作実践講座 改訂第2版

電子パーツを自由自在に組み合わせて電子工作ができるように、Arduinoによる電子部品ごとの制御方法を詳しく解説。初心者や電子工作に躓いた人でも安心して取り組めるよう、豊富な図・写真で徹底解説。2018年発刊の「Arduino 電子工作 実践講座」の改訂版です。

KindleAmazonRakuten
Arduinoをはじめよう 第3版 (Make:PROJECTS)
Arduinoをはじめよう 第3版 (Make:PROJECTS)

本書では、開発者自らが、Arduinoの哲学、ハードウェア、ソフトウェアの基礎を解説、誰にでもできる簡単なチュートリアルを行います。

AmazonRakuten

Amazonでお得に購入するなら、Amazonギフト券がオススメ!

\Amazonギフトがお得/

コンビニ・ATM・ネットバンキングで¥5,000以上チャージすると、プライム会員は最大2.5%ポイント、通常会員は最大2%ポイントがもらえます!
Amazonギフト券

\この記事をシェアする/