Arduino初心者編:サーボモータとステッピングモータの動作原理と制御方法

Arduino初心者編:サーボモータとステッピングモータの動作原理と制御方法

アプリケーションによっては、モータ回転軸の位置を正確に調整する必要がある物もあります。そこで登場するのがサーボモータとステッピングモータです。工作機械や産業用ロボットによく使用されています。これらのモータを簡単に制御できるICやライブラリの使い方を説明します。

サーボモータ

自動車模型のステアリングや模型飛行機の翼部分位置の事を想像してみて下さい。飛行機の翼はサーボモータの代表的な用途です。サーボモータは、モータ軸を特定の角度に正確に制御できる特徴持っています。

サーボモーターとは、制御部と駆動部の組み合わせの物で内部には、ギアを介して出力軸を駆動する直流モータがあります。電子制御ユニットは、角度センサーの出力値と外部から指定された設定値を比較し、自分の望む位置になるようにモータ部分を制御します。このフィードバック技術の利点は、通常のDCモータをその位置から回転させるような外乱(例えば、飛行中の風の力)が起きてしまっても、モータ軸の位置が確実に所望の位置に接近して維持される事です。

図1.模型製作で人気の高いサーボモータ SG90 の構造

角度センサには簡易ポテンショメータを使用するのが一般的なため,多くのサーボモーターは有効範囲が360度以下に制限されており,完全な回転が出来ません。今回紹介するサンプル回路では、180度の範囲で回転できるモデルSG90を使用しています。

SG90 は回転角度が指定された特殊なパルス幅変調信号(サーボに代表される)を入力信号とします。これは1~2ミリ秒の長さのパルスで構成されており、20ミリ秒ごとに(つまり1秒間に50回、つまり50ヘルツの固定周波数で)繰り返されます。パルスの長さによって近づく角度が決まり、1ミリ秒のパルスは0度を表し、2ミリ秒は180度を表します。任意の値も可能です。

図2.SG90 は,パルス幅変調の一形態によって制御されます。

次の回路では,アナログポインタのようなサーボモータを使って,フォトセンサのアナログを読み出して輝度値を出力したいと思います。

図3.明るさを測定するためには,サーボがポインターの役割を果たす必要があります。

すでにハードウェアで使われているArduinoのパルス幅変調は、パルス列が非常に短いため、そのまま制御に使う事は出来ません。代わりに、Arduino IDEに最初から入っているServo.hライブラリというものを使用します。

#include <Servo.h>

#define SERVOPIN 9
#define SENSORPIN 0

Servo myservo;
int value;
double angle;

void setup() 
{
  Serial.begin(9600);
  myservo.attach(SERVOPIN);
}

void loop() 
{
  value = analogRead(SENSORPIN);
  angle = map(value, 0, 1023, 0, 180);     //(1)
  Serial.println(angle);
  myservo.write(angle);    //(2)
  delay(15);                           
}
  1. map()関数は、ある範囲の数値を別の範囲の数値に変換するために使用します(そして、それを戻り値として返します)。この場合、センサの値を0〜1023の範囲から0〜180の範囲に変換すれば良いだけです。
  2. ここではライブラリー関数 write()を使って、最終的にサーボに信号を出力しています。0から180までの値が使えて、希望する角度を直接指定するだけです。

プログラムをアップロードすると、フォトレジスタの明るさの変化に対してサーボがどのように反応するかを観察してみてください。

ステッピングモータ

サーボモータは、動きを生成するためにDCモータを使用しています。固定された永久磁石のフィールドに配置された回転可能なコイルを取り付けた構成です。電圧が印加されると、コイルは磁場によって整列させられます。コイルの極性はスライド接点によって変化し,半開店すると逆方向に整列するような作りです。この作業を常に繰り返す事で回転につながっていきます。詳細はDCモータの記事を参照してください。

DCモータの欠点は回転角度を正確に制御出来ない事です。一方のサーボモーターは完全な回転を行う事が出来ません。ただし、一部のアプリケーションを使えば完全な回転を行う事が出来るでしょう。

両者:数回の回転でも正確な位置決めが可能です。その例としてはプリンタやプロッタ等その他多くの機器の駆動機構を挙げる事が出来ますね。

今回のような場合には、ステッピングモータが使用されます。DCモータとは異なり、コイルが静止した状態で永久磁石が回転可能です。スリップリングで制御された極性反転は行われません。電流の流れを変える事で磁界が変化するまで、モータは一定の位置に留まったままです。複数のコイルが使用されているため、より正確な位置決めが可能となり、よりスムーズな回転が可能となるでしょう。

ステッピングモーターには多数のバージョンが存在します。その中でもホビー分野でよく使われているモデル28BJYの機能を見ていきましょう。

図4.ULN2003Aドライバボードを,使用したステッピングモータ 28BYJ

ステッピングモーターは、主にステーターとローターの2つの部分で構成されています。ステッピングモータの外側にある固定子はコイル巻線で、中心にある回転子は主に永久磁石または強磁性体です。コイルに電流を流すと磁界が発生します。右手の指をコイルに電流が流れる方向に巻き付けると、親指の方向が磁界の向きを示します。

例えば、下の図において、電流をA+からA-の向きに流した場合、左側の固定子はS極となります。その結果、回転子は固定子に引っ張られて、時計回りに90度回転します。同様に、次は電流をB+からB-に流すと、回転子はさらに90度回転します。そして、次はA-からA+に流した後、さらにB-からB+に流すと、回転子は1回転できます。これを繰り返すことで、モータ回転を得ることができます。

図5.2相制御

また、両方のコイルを同時に制御する事も可能なので、電流は2倍になりトルクも大きくなるので、モータの出力は大きくなります。逆動作に応じて位相を逆にすると動作します。

4つのタップは交互にGNDに接続されており、それぞれを以前説明したリレー回路と同じ回路で制御する事が可能です。 トランジスタは「バルブ」の役割を果たし,制御信号に応じて電流の流れを遮断するか(何も接続されていないタップの場合のように)、またはスイッチスルーしてGND接続する事が出来ます。

今回のような回路はかなりの頻度で使用されるため、集積回路の形でも利用可能です。ULN2003Aは、この回路を1つのパッケージに7つ組み合わせて作られています。その動作は単純で、入力に電圧が印加されると対応する出力がGNDに切り替わります。このIC(集積回路)にはトランジスタの保護に必要なベース抵抗やフリーホイールダイオードがすでに含まれています。

今回の集積回路を用いたドライバモジュールは接続が4つあれば良いので、3つは未使用のままです。さらにボードには4つのLEDが搭載されており、特定のピンが現在アクティブであるかどうかのインジケータとして機能します。

図7.Arduino の任意の出力ピンで制御可能なドライバボード付き28BYJ ステッピングモータ

制御は出力ピンの周期的なスイッチングのみで構成されているので,単純に digitalWrite() コマンドで処理する事も出来ます。すでにプリインストールされているライブラリ Stepper.h を見てみましょう。

28BYJにはギアボックスが内蔵されています。シャフトモーターは内部的にいくつかの歯車によってガイドされており、速度は低下してしまいますが、トルク(モーターの「パワー」)は増加します。このいわゆる歯車の減速は、出力軸が完全に回転するまで2048ステップ(位相)を通過させなければならないことを意味します。この値はモータの種類によって異なります

#define STEPROTATION 2048

#include "Stepper.h"

Stepper Steppermotor(STEPROTATION , 8, 10, 9, 11);    //(1)

void setup() {    //(2)
}

void loop() {
  Steppermotor.setSpeed(5);
  Steppermotor.step(STEPROTATION );
  delay(500);

  Steppermotor.setSpeed(1);
  Steppermotor.step(-STEPROTATION /4);
  delay(500);
}
  1. StepperインスタンスとしてのSteppermotorオブジェクトを作成します。オブジェクトが作り出されると、5つの引数が渡されます。完全に回転するまでのステップ数と制御する4ピンです。最初の2つは片方のコイルに属し、残りの2つはもう片方のコイルに属しています。
  2. クラス Stepper は、オブジェクトの作成中に pinMode() を介したピンの設定など、すでに初期化を実行しています。ですから、この場合は setup() ルーチンでやるべきことはもう何もありません。

予想通り、このプログラムでは、最初に完全なターンを行い、次に反対方向にゆっくりとした四分の一ターンを行います。シャフトが手でわずかにロックされていても、完全な精度でポジションにアプローチします。これがステッピングモータの大きなメリットです。

しかし、サーボモーターと異なり絶対的な位置決定が出来ないという問題があります。上記のプログラムでは、シャフトを正確に1/4回転だけ動かす事が出来ます。スタート位置との相対的な関係でしか動かす事が出来ません( “上”や”12時”の位置からスタートする事は出来ません)。これを実現するためには、シャフトの位置を検出するためのセンサーを使用する必要があります。

シミュレーション

サーボモータとステッピングモータのTINKERCADによるシミュレーションです。使える部品が限られているため、ステッピングモータのシミュレーションは、L293Dを使用しています。

Arduino初心者編カテゴリの最新記事