第十八項 モーター制御・PWM/ステッピングモーター

電子工作創作表現(2019/11/1)

スライドPDF

モーターの続き

  • 前回は、シンプルに回転するだけの「DCモーター」
     
  • 今回はもう少し複雑・繊細な動きをするモーター
前回はモーターの基本原理と、最もベーシックな部品であるDCモーターを紹介しました。
今回はもう少し複雑な動きをできるようなモーターを紹介していきます。

動き物を作る

  • 必要な部品は工業系部品か、ロボコン関連用品が充実
     
  • 「ツクモロボット王国」
     
  • 千石電商
ちなみに、作品やパフォーマンスで動きものを作ろうとすると色々と作り物が必要になってきますが、こういったメカ物を取り扱っているのはかなり限られています。秋葉原ではツクモロボット王国辺りに行くと、初心者向けのキットからギヤやシャフトのようなパーツまで揃っているので、まずはキットを改造するというところから初めて見るのも良いかもしれません。すぐそばの千石電商本店にもメカパーツがいくらか揃っている印象でした。

PWMサーボモーター

  • 指定の角度を向けるためのモーター
     
  • 厳密には違うが、単純に「サーボモーター」と言うとこのPWMサーボを指す
     
  • ロボット等に使用されることが多い
今日まず紹介するのがPWMサーボモーターです。単にサーボモーターとかサーボと言う事もありますが、ACサーボなどもう少し大きいサーボモーターもあるので、ここではPWMサーボと呼びます。ラジコンに使われる事も多いので、RCサーボと呼んだりもします。
DCモーターは正転・逆転の方向と速度を制御できますが「ここまで進んだら止める」とか「ここに戻る」のような処理をしようとするとセンサーなどで位置を取らなくてはいけません。ですがこのPWMサーボはセンサーを内蔵しているので、PWMで指示を送ると指定の角度まで進んだ後そこで自動的に停止してくれます。

サーボモーターの特徴

servo

  • ドアの開け閉め、スイッチなど指や関節のような動作が得意
     
  • 駆動範囲は270度~多くても2回転
     
  • 3本線で、PWMを送って角度を指示する
ロボットに使われたりスイッチを押す、蓋を開け閉めするなど指や関節に近い動作を得意とします。そのかわりDCモーターのように無限回転はできず、大体270度~多くて2回転くらいのところを往復するような構造になっています。
ドライバは不要、というよりは内蔵されていると言った方が正確で、電源とPWM信号を送れば制御することができます。

Arduinoから制御する

circuit

  • Arduinoのサーボ制御ライブラリServo.h
ArduinoではPWMサーボをコントロールするためのライブラリがあらかじめ用意されているので、それを使えば簡単に制御することができます。
回路としてはVCCをVinまたは5V、GNDをGND、コントロール用のピンをArduinoの出力ピンに接続します。
最大12個までつなげられ、0~13番・アナログの0~5番ピンでも使うことができます。

#include 

Servo servo1;

void setup() {
  servo1.attach(9);  // 9番ピンにサーボ出力を設定
}

void loop() {
  delay(1000);
  servo1.write(0);
  delay(1000);
  servo1.write(random(180)); //0~180度の間でランダムに角度を指定する
}

パルス幅と角度の指定

  • パルス幅と角度の関係は、メーカーによって異なることがある
     
  • attachで有効な角度の範囲をパルス幅に指定することができる
     
  • デフォルトは544~2400マイクロ秒
write関数では角度を指定できると書きましたが、これはメーカーの仕様によって異なる場合があります。
PWMサーボは「パルス幅」の時間が角度に対応するようになっており、Servoライブラリのデフォルトである544~2400マイクロ秒と違う場合は指示した角度と実際の角度が違って来ることになります。これはattach関数に追加で指示することができるので、データシートと照らし合わせながら設定すると良いでしょう。
  servo1.attach(9, 800, 2300); //メーカーの仕様に合わせてパルス幅を調整する

パルス幅を直接指定

  • writeMicroseconds()で直接指定することも可能
     
  • writeよりも細かく指示できる
また、attachで指示せず直接パルス幅を記述することもできます。その場合はwriteMicrosecondsという関数を使います。
例えばGWSのサーボ角度範囲は0~180度で800~2300usとなっています。(https://gwsus.com/gws_com_tw_www/english/product/servo/servo.htm) この場合write関数で指示できるのは180段階ですが、writeMicroseconds関数を使えば1500段階になります。サーボの性能にも依存しますがソフトウェア上はより高い解像度で角度を指示することが可能になります。
#include 

Servo servo1;

void setup() {
  servo1.attach(9);  // 9番ピンにサーボ出力を設定
}

void loop() {
  delay(1000);
  servo1.writeMicroseconds(800);
  delay(1000);
  servo1.writeMicroseconds(random(800, 2300)); //0~180度の間でランダムに角度を指定する
}

attachとdetach

  • attachを呼んだ瞬間モーターにトルクが発生する
     
  • dettachを呼ぶと脱力する(静音&省電力)
PWMサーボはattachを呼んだ瞬間から動作をはじめます。動く時にはギヤの音が鳴り、目的の位置に着いてからも「ジジジ…」と調整する音がなり続けます。これはトルクが常にかかり続けているためで、手で回そうとしても回らないか、すぐ戻ろうとします。物を持ち上げ続けるなど力が必要な場合はこのままで問題ありませんが、バッテリー駆動で電気を節約したい、止まっている間は音が鳴らないようにしたいなどの場合はdettachを呼ぶことで脱力させることができます。
#include 

Servo servo1;

void setup() {
  servo1.attach(9);  // 9番ピンにサーボ出力を設定
  Serial.begin(9600);
}

void loop() {
  while (Serial.available())
  {
    byte bt = Serial.read();
    if (bt == 'a') 
    {
      servo1.attach(9);
      servo1.writeMicroseconds(random(800, 2300)); //aを受け取ったらランダムの場所に動く
    }
    if (bt == 'd') servo1.detach(); //サーボのトルクを解除する
  }
}

ステッピングモーター

step

  • さらに高性能なモーター
     
  • 動きも制御もより複雑になる
最後により高性能なモーターであるステッピングモーターを紹介します。コントロール方法が複雑になりますが、その分できることも各段に多くなります。PWMと同じように任意の角度で止める事ができる一方で駆動範囲に制限はなく、DCモーターのようにどこまでも回し続けることができます。
更に適切に制御してあげることでとても静かに駆動させることもできます。

ステップを送る

  • DC/PWMモーターでは「速度」を指示していた
     
  • ステッピングモーターは1ステップごとにコイルの方向を制御する
従来のモーターとは制御構造が根本的に異なるため、このような動作ができるようになっています。DCモーターやPWMサーボは、指示した方向に基本的に動き続けるという動作をしますが、ステッピングモーターはマイコンArduinoから「1ステップ先に」動くという動作を指示します。時計の秒針をイメージすると分かりやすいと思います。そのため基本的には1ステップずつカクカクした動きで進んでいくのですが、この送り動作を高速に繰り返すことで滑らかな動きを実現することができます。

ステップ数と角度

  • 主な小型のステッピングモーターは200ステップで1週(1ステップ辺り1.8度)
     
  • より細かい動作はギヤで減速したり「マイクロステップ(後述)」という制御方法を使う
このステップという単位は、よく手に入る物だと1週200ステップ、1ステップ辺り1.8度の物が多いです。

ステッピングモーターの欠点

  • 速度やトルクが上がってくると「脱調」が起きる
     
  • 電源リセットや「脱調」で現在位置が分からなくなる
一見万能に思えるステッピングモーターですが、欠点もあります。最も大きな弱点が「脱調」という現象で、トルクが足りなかったりステップ速度が早すぎたりした時、軸が周り切らずステップを指示した数と実際の角度がズレてくる現象の事を言います。プログラムから指示したステップ数を数えておけば現在の角度は分かりますが、脱調が一度起きるとモーターが今どの位置を向いているのか分からなくなってしまいます。また電源を入れた時の位置が原点になるので、装置によっては初期位置を割り出すような仕組みを作ってあげる必要があります。

入手先

  • 42mm角の小型なら秋月やストロベリーリナックスで入手可能
     
  • もう少し大型の物が手に入る「シナノケンシ」
     
  • 有名&高品質な「オリエンタルモーター」
ステッピングモーターはDCモーターやPWMサーボがホビー~家庭用電子機器向けなのに比べて、
どちらかというと産業機器に使われる事が多いです。通常用途なら秋月やストロベリーリナックスのような電子部品屋でも購入することができますが、更に大型の物はシナノケンシやオリエンタルモーターのようなメーカーから購入することも可能です。

買う時の注意

  • 「バイポーラ」がおススメ。紹介するドライバもバイポーラ
     
  • 角タイプの方が取り付けやすい。NEMAという規格で定義されている
そしてステッピングモーターと一口に言っても色々な種類があります。もし購入を検討しているのであれば、6本線のユニポーラでは無く4本線のバイポーラをおススメします。ユニポーラは駆動回路が簡単の変わりにトルクが少ないというタイプなので、ドライバを買って使う分にはバイポーラタイプの物を使うのが配線も少なく、トルクも比較的強いので良いでしょう。
また円筒形のタイプが安いのでついそっちを買ってしまいがちですが、個人的には取付しやすい直方体タイプのものをおススメします。NEMAという規格に準拠したものが多いので、頻繁に使うようになった時には選択肢の幅が広がって便利です。

ステッピングモータードライバ

motorShield

  • ドライバが多い!(1000円~10万円台まで)

  • おススメは「L6470」モータードライバ

ステッピングモータードライバもいくつかあるので紹介します。ステッピングモーターについては、その制御の複雑さから、よりたくさんの種類のドライバが流通しています。先述のオリエンタルモーターでは自社のモーター用ドライバも生産しており、こちらはPCから直接制御もできて非常に高機能ですが2万~10万台までとかなり値が張ります。
Arduino用のシールドとライブラリ(Stepper.h)などもありますが、作品制作に用いるのであれば「L6470」を載せたドライバモジュールを強くお勧めします。

L6470ドライバモジュール

l6470

  • L6470というICを載せたモジュール(秋月やストロベリーリナックスなど)

  • 価格のわりに繊細なコントロールができる

L6470はSPI通信という通信方式で制御できるタイプのモータードライバなので、Arduinoから指示を送って動かす事ができます。1ステップ分のパルスを送ればその通りにステップ駆動をしてくれますし、「xxステップ動かして」という指示の仕方もできます。
また、作品やパフォーマンスに向いている機能として、加減速を指示した滑らかな動作や、アナログ出力を使って1ステップより細かく滑らかに動かす「マイクロステップ」の機能もついているため、繊細なコントロールが可能となります。これはArduinoのStepperライブラリなどでは難しい機能です。次週では、このステッピングモータードライバの使い方について実物を交えて解説していきます。