Arduino
IoT
ESP8266
ArduinoIDE
ESP-WROOM-02

ESP8266 (ESP-WROOM-02) でサーボを制御する

More than 1 year has passed since last update.

概要

ESP8266 (以下 WROOM02) でサーボを制御する
スクリーンショット 2016-01-10 17.07.32.png

はじめに

今回使ったサーボは、SG90 というやつ。秋月で 400円。
http://akizukidenshi.com/catalog/g/gM-08761/

キー
PWMサイクル 20 ミリsec
制御パルス 0.5~2.4 ミリsec
制御角 ±約 90 °(180 °)
配線 茶:GND 赤:電源[+] 橙:制御信号
[JRタイプ]
トルク 1.8 kgf・cm
動作速度 0.1秒 / 60度
動作電圧 4.8V(~5V)
温度範囲 0 ℃ ~ 55 ℃
外形寸法 22.2 x 11.8 x 31 mm
重量 9 g

4.8 V 駆動ですが、WROOM02 用の 3.3 V で、取り敢えず、動作しました。
(電源 5 V 、制御信号 3.3 V では、動作しません。)

データシートはこちら
http://akizukidenshi.com/download/ds/towerpro/SG90_a.pdf

スクリーンショット 2016-01-10 17.07.15.png

そのものズバリの「Servo」ライブラリがありますが、挙動を理解したいので、今回は自前で作成してみます。

データシートによると、20 msec 周期 (50 Hz) で制御パルス(PWM)を送ればよいらしい。
ここは、まさに Ticker の出番ですよ。
「ESP8266 (ESP-WROOM-02) の便利ライブラリまとめ (Ticker編)」

スケッチ

// SG90
// http://akizukidenshi.com/download/ds/towerpro/SG90_a.pdf
// 
// Position "0" (  1.45 ms pulse) is middle,
//         "90" ( - 2.4 ms pulse) is all the way to the right,
//        "-90" ( - 0.5 ms pulse) is all the way left.

#include <Ticker.h>

const int deg000 =  500; // micro sec.
const int deg180 = 2400; // micro sec.

int microSec = deg000;

#define PWM_OUT 4

Ticker serv1;

void setup() {
  Serial.begin(115200);
  Serial.println();

  pinMode(PWM_OUT, OUTPUT);

  // 20 msec
  serv1.attach_ms(20, pwm);
}

void pwm() {
  digitalWrite(PWM_OUT, HIGH);
  delayMicroseconds(microSec);
  digitalWrite(PWM_OUT, LOW);
}

void loop() {
  if (0 < Serial.available()) {
    delay(10);
    int deg = serialReadAsInt();
    if (0 <= deg && deg <= 180) {
      microSec = deg000 + deg / 180.0 * (deg180 - deg000);
    }

    Serial.print(deg);
    Serial.print(" : ");
    Serial.println(microSec);
  }
}

int serialReadAsInt() {
  char c[9] = "0";
  for (int i = 0; i < 8; i++) {
    c[i] = Serial.read();
    if (c[i] == '\0') {
      break;
    }
  }
  return atoi( c );
}

動作確認

ツール - シリアルモニタ を開いて、0 - 180 の角度を送信します。
サーボがジリジリいってますが、いい感じに制御できるようです。

スクリーンショット_2016-01-10_17_16_51.png

まとめ

  • WROOM02 でサーボを制御しました。
  • Ticker のおかげで、随分と簡単に、安定した PWM が生成できます。
  • 逆に loop( ) で PWM を生成した場合だと、他の処理に影響されて PWM (サーボの角度) が安定しないです。Ticker バンザイ !!
  • 2個以上つなげる場合は、PWM をシリアル化するのかな???
    シリアル化 して 20 msec を死守するためには、1ピンで 20 / 2.4 = 8.xx 最大 8 個まで???
  • ちゃんと 5 V で駆動させたいですが、トランジスタ (ソースドライバ) を使えばいいかな???

参考資料