概要
ESP8266 (以下 WROOM02) でサーボを制御する
はじめに
今回使ったサーボは、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
そのものズバリの「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 の角度を送信します。
サーボがジリジリいってますが、いい感じに制御できるようです。
まとめ
- WROOM02 でサーボを制御しました。
- Ticker のおかげで、随分と簡単に、安定した PWM が生成できます。
- 逆に loop( ) で PWM を生成した場合だと、他の処理に影響されて PWM (サーボの角度) が安定しないです。Ticker バンザイ !!
- 2個以上つなげる場合は、PWM をシリアル化するのかな???
シリアル化 して 20 msec を死守するためには、1ピンで 20 / 2.4 = 8.xx 最大 8 個まで??? - ちゃんと 5 V で駆動させたいですが、トランジスタ (ソースドライバ) を使えばいいかな???