はじめての電子工作超入門

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

DSC_0145-001

今回は、また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);
}

 

まとめ

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

 

高専ロボコン2015 出場ロボット解剖計画
赤川シホロ

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