LoginSignup
16

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-01-10

概要

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 で駆動させたいですが、トランジスタ (ソースドライバ) を使えばいいかな???

参考資料

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16