Arduino
IoT
ESP8266
ArduinoIDE
ESP-WROOM-02

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

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


参考資料