「ESP8266 Arduino スケッチ Tips」 ステッピングモーターとイールド

stepper_1200x627

ESP8266で Seeed Studio ギアドステッピングモーター(モータードライバー付)を回転させる簡単なテストをします。

接続

ステッピングモーターに5Vの電源が必要です。USB-TTL変換モジュールの5V出力ピンなどを使います。ESP8266の電源3.3Vを使うことはできませんので注意が必要です。

ESP8266 USB-TTL

モジュール

モータードライバー
5V出力ピン VCC
GND GND GND
IO12 IN1
IO13 IN2
IO14 IN3
IO16 IN4

スケッチ

Arduino IDEに付属の stepper ライブラリを使うことでステッピングモーター動かすことができます。

スケッチは、スケッチ例、stepper_oneRevolution (Arduino IDEのメニューからファイル>スケッチの例>Stepper>stepper_oneRevolution)を使います。

ステッピングモーターの仕様に合わせる

使用するステッピングモーターの1回転のステップ数は32ですので、stepsPerRevolutionを変更します。

また、モーターは、1/64に減速されたギアドステッピングモーターですので、実際に1回転させるのに必要な値 stepsPerGearedRevolution を追加して、32 x 64にしています。

イールド yield() で裏方に仕事をしてもらう

スケッチをモーターの仕様に合わせました。これで動くようになったはずです。ただ、これだけではWDT Reset(ウォッチドッグ タイマー リセット)が発生し、正常に動作しません。ESP8266がリセットを繰り返します。

ESP8266にはWiFiやインターネットとつなぐためのTCP/IP機能などが内臓されています。これらを正常に動かすのに必要なプログラムが、裏方として隠れて仕事をしています。

裏方が一定期間仕事をしていないことをESP8266マイコンが検知すると、プログラムの暴走と判断され、自動的にリセット(再起動)されます。このような監視の仕組みを、「ウオッチドッグ(番犬)タイマー」と呼びます。

ステッピングモーターを回転させる myStepper.step(stepsPerCycle)は、モーターを回すことだけに集中し、裏方が仕事をする時間を奪ってしまいます。1回転させる時間はコンピューターとしては比較的長い時間となります。このため、ウオッチドッグタイマーの機能が働き、再起動してしまうのです。

そこで、1度に1回転させずに、八分の一回転だけして、裏方に仕事をしてもらうというスケッチにしてみます。

裏方に仕事をしてもらうためには、イールド yield()を使います。yield以外にdelay()でも同じ効果がありますのでyield()かdelay()のいずれかを使います。

これで、「少し回す。裏方に仕事をしてもらう。」を8回繰り返して1回転させるスケッチとなりました。これで簡単なテストですが安定して動くようになりました。ステッピングモーターの回転速度が遅いときなどは、一度に動かすステップ数をより少なくする工夫が必要となるでしょう。

/*
 ESP8266 Stepper Motor Control Test
 Based on the stepper motor example stepper_OneStepAtAtime 
 Created 30 Nov. 2009 by Tom Igoe

 Modified for testing with ESP8266 by MONOxIT 8/20/2016
 ESP8266 to sterrper motor (Gear Stepper Motor with Driver by seeed studio) connection
 IO12 - IN1, IO13-IN2, IO14-IN3, IO16-IN4
 5V(USB)-VCC, GND-GND 
*/

#include <Stepper.h>
const int stepsPerRevolution = 32;
const int stepsPerGearedRevolution = 32 * 64; //gear reduction ration 1/64
const int stepsPerCycle = stepsPerGearedRevolution / 8; // 1/8 turn at one time to avoid WDT reset

// initialize the stepper library on pins 12, 13,14,16:
Stepper myStepper(stepsPerRevolution, 12, 14, 13, 16);

void setup() {
 // initialize the serial port:
 Serial.begin(115200);
 myStepper.setSpeed(800);
}

void loop() {
 Serial.println("Rotate CW");
 // To avoid watchdog reset and allow utility functions to run, number of steps at once should be limited.
 for(int i = 0; i &amp;lt; 8; i++){
   myStepper.step(stepsPerCycle);
   // Call yield() to run utility functions.
   yield();
 }
 delay(500);
 Serial.println("Rotate ACW");
 for(int i = 0; i &amp;lt; 8; i++){
   myStepper.step(-stepsPerCycle);
   yield();
 }
 delay(500);
}

まとめ

ESP8266でも裏方に定期的な仕事をしてもらうことを考慮することで、Arduinoの標準ライブラリなどを使い比較的容易にフィジカルコンピューティングやIoTの試作ができます。今回はyieldを使いましたが、yieldでは仕事をする時間をもらえない裏方もいます。IoTで使うMQTTのpubsubclientがそれに当たります。MQTTのやり取りが不安定な場合は、今回のyieldの要領でpubsubclientの裏方に仕事をさせるpubsubclient.loop()をより頻繁に入れることで安定する場合がありますので試してみましょう。