できること

第37回 ステッピングモータの基本(前編)〜Arduinoでパーツやセンサを使ってみよう

※この記事は2016年1月19日に公開した記事を再編集し、2022年2月7日に再度公開しました。

DSC_0145-001

 

目次

  1. 今回の電子工作レシピ
  2. ステッピングモータとは?
  3. ステッピングモータドライバキットL6470
  4. ステッピングモータを動かしてみる
  5. まとめ

 

今回は、またArduinoでパーツやセンサを使ってみようシリーズです。今回取り上げるのはロボットアームや走行型ロボットのタイヤの回転制御部分などでよく利用されているステッピングモータを使ってみます。ステッピングモータを使うことでどんな世界が広がるでしょうか。ステッピングモータの性質を学んで動かしながら、ロボットアームや走行の制御以外にどんなものを作るのに向いているのか探ってみたいと思います。

今回の電子工作レシピ

時間目安:90分
必要なパーツ

 

ステッピングモータとは?

写真1 ステッピングモータ

写真1 ステッピングモータ

ステッピングモータは、これまで取り上げたサーボモータや通常のモータとは違い、電力信号をモータに送ることで、回転を綿密に制御できるモータです。簡単にそれぞれのモータの特徴を分けると、

  • モータ:電力をかけるとひたすら回る
  • サーボモータ:信号に応じて0度からN度の範囲で回転する
  • ステッピングモータ:信号に応じてモータを制限なく制御できる

という感じです。このステッピングモータ、どのように操作するのでしょうか、wikipediaを見てみると、

ステッピングモータ – 引用wikipedia

ステッピングモータ(Stepper motor)は、パルス電力に同期して動作する同期電動機である。したがってパルスモータ(Pulse motor)とも言われる。簡単な回路構成で、正確な位置決め制御を実現できるので、装置の位置決めを行なう場合などによく使われる。

 

ステッピングモータは略して”ステッパ”と呼ばれることも多いです。

また、この「パルス」という電力信号が今回ステッピングモータを動かすための鍵となります。

 

ステッピングモータを動かすためのパルスとは?

パルスというキーワードは、電子回路に限らず何かしら聞いたことのある人が多いかと思います。このパルスは、電子回路の分野では、一定の間隔を持った矩形波(くけいは)≒電力オンオフや強弱による波のことを示します。

図1 パルス信号

図1 パルス信号の例

この電力を一定の幅でON/OFFすることでさまざまな部品を動かす制御方式をPWM(Pulse Width Modulation)と言い、電子回路ではモータなどを使う場合によく出てくるキーワードになります。このPWM信号、Arduinoでよく使う、analogWriteの関数が、PWM信号を出力しているのです。

 

PWMによるanalogWrite関数の仕組み

図2 PWM信号

図2 PWM信号

analogWrite()は、これまでの連載でやっているようにLEDなどの明るさを制御するために使っていますね。Arduino UNOの各ピンの出力電圧値の最大は5Vですが、analogWrite(ピン番号,出力値)で指定された出力値(0〜255)は、実際には5Vを256分割した電圧が出力されているのではなく、Arduinoのパルス周期の中で、5Vの出力している時間と、0Vでオフになっている時間の平均をとることで、擬似的にアナログ電圧の出力を実現しています。このようにPWMは知らず知らずのうちにArduinoで利用しています。

※上記を踏まえてanalogWrite(PIN,128)を例にした場合、2.5VがPINから出力されているのではなく、1周期の中で半分の時間が0V、残り半分が5V出力して平均をとると2.5Vになるようになっています。

 

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

ステッピングモータの制御では、このPWMを使うことで実現できますが、Arduinoからそのままステッピングモータに信号を送ってモータを制御することは難しいです。今回はステッピングモータを手軽に制御できる L6470というモータドライバキットを利用します。

写真2 L6470モータドライバキット

写真2 L6470モータドライバキット

 

写真3 部品一式

写真3 部品一式

このドライバキット一式は、部品のいくつかを基板にハンダ付けする必要があります。付属のマニュアルに従えば難しくはないはずです。

ハンダ付けが完了したらArduinoとステッピングモータ、ドライバキットを接続していきます。モータの8V〜48V部分には今回12V 1.5AのACアダプターを接続しました。

 

図3 ステッピングモータ回路

図3 ステッピングモータ回路

 

ステッピングモータを動かしてみる

Arduinoとステッピングモータ、ドライバキットの接続が完了したらプログラムを用意します。PWM信号をArduinoでそのまま書くのは大変なので、ArduinoでL6470を手軽に制御できるプログラムが公開されていますので、今回はそれを利用してみます。

プログラムの赤色部分が、ステッピングモータを実際に動かす命令部分です。今回紹介しているサンプルプログラムでは、Arduinoのプログラムにタブで別のファイルにコマンド一式の関数が書かれていますので、別のファイルでプログラムを作成する場合は、このコマンド用ファイルも忘れずに加えてください。

ステッピングモータの動作プログラム

#include <SPI.h>
#include <MsTimer2.h>

// ピン定義。
#define PIN_SPI_MOSI 11
#define PIN_SPI_MISO 12
#define PIN_SPI_SCK 13
#define PIN_SPI_SS 10
#define PIN_BUSY 9

void setup()
{
  delay(1000);
  pinMode(PIN_SPI_MOSI, OUTPUT);
  pinMode(PIN_SPI_MISO, INPUT);
  pinMode(PIN_SPI_SCK, OUTPUT);
  pinMode(PIN_SPI_SS, OUTPUT);
  pinMode(PIN_BUSY, INPUT);
  SPI.begin();
  SPI.setDataMode(SPI_MODE3);
  SPI.setBitOrder(MSBFIRST);
  Serial.begin(9600);
  digitalWrite(PIN_SPI_SS, HIGH);
 
  L6470_resetdevice(); //L6470リセット
  L6470_setup();  //L6470を設定
  
  MsTimer2::set(50, fulash);//シリアルモニター用のタイマー割り込み
  MsTimer2::start();
  delay(4000);
}

void loop(){
<span style="color: #ff0000;">  L6470_move(1,500);//正転 
  L6470_busydelay(500);</span> //2秒待つ
}

void L6470_setup(){
L6470_setparam_acc(0x40); //[R, WS] 加速度default 0x08A (12bit) (14.55*val+14.55[step/s^2])
L6470_setparam_dec(0x40); //[R, WS] 減速度default 0x08A (12bit) (14.55*val+14.55[step/s^2])
L6470_setparam_maxspeed(0x40); //[R, WR]最大速度default 0x041 (10bit) (15.25*val+15.25[step/s])
L6470_setparam_minspeed(0x01); //[R, WS]最小速度default 0x000 (1+12bit) (0.238*val[step/s])
L6470_setparam_fsspd(0x3ff); //[R, WR]μステップからフルステップへの切替点速度default 0x027 (10bit) (15.25*val+7.63[step/s])
L6470_setparam_kvalhold(0x20); //[R, WR]停止時励磁電圧default 0x29 (8bit) (Vs[V]*val/256)
L6470_setparam_kvalrun(0x20); //[R, WR]定速回転時励磁電圧default 0x29 (8bit) (Vs[V]*val/256)
L6470_setparam_kvalacc(0x20); //[R, WR]加速時励磁電圧default 0x29 (8bit) (Vs[V]*val/256)
L6470_setparam_kvaldec(0x20); //[R, WR]減速時励磁電圧default 0x29 (8bit) (Vs[V]*val/256)

L6470_setparam_stepmood(0x03); //ステップモードdefault 0x07 (1+3+1+3bit)
}

void fulash(){
  Serial.print("0x");
  Serial.print( L6470_getparam_abspos(),HEX);
  Serial.print("  ");
  Serial.print("0x");
  Serial.println( L6470_getparam_speed(),HEX);
}

 

まとめ

今回ステッピングモータを動かすことができました。次回はこのステッピングモータを使って、デバイスを作成してみたいと思います。

 

この連載の記事

アバター画像

電子工作や新しいデバイスをこよなく愛するエンジニア。日常生活のちょっとしたことを電子工作で作って試して、おもしろく過ごしたいと日々考えています。

Tello+Scratch+SQ11でプチ動画を撮る!