ESP32 Servoを使ってみる


IPUアドベントカレンダーですがラスト空いてたので予備で取ってたネタを差し込みます。

先日の記事を書いたら、コメントをもらいました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">サーボのライブラリはこれも行けましたよ。Arduinoのライブラリマネージャでもインストール可能です。includeを買えるだけでほぼそのまま行けるらしいです。<a href="https://t.co/Ay1yd97bF7">https://t.co/Ay1yd97bF7</a></p>&mdash; Hiroshi Sano (@hrs_sano645) <a href="https://twitter.com/hrs_sano645/status/1077146461073100800?ref_src=twsrc%5Etfw">2018年12月24日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ということで調べてみました。

確かにライブラリマネージャにありますね。

> ![](https://i.gyazo.com/09ce4d282ff94f609978529973331918.png)

ということでインストールして使ってみます。

利用するサーボはGroveのサーボモータです。

```servo.ino
#include <ESP32Servo.h>

Servo servo1; // create four servo objects 
int servo1Pin = D2;

// Published values for SG90 servos; adjust if needed
int minUs = 500;
int maxUs = 2400;

int pos = 0;      // position in degrees

void setup() {
  servo1.setPeriodHertz(50);      // Standard 50hz servo
  servo1.attach(servo1Pin, minUs, maxUs);
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // sweep from 0 degrees to 180 degrees
    // in steps of 1 degree
    servo1.write(pos);
    delay(2);             // waits 20ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // sweep from 180 degrees to 0 degrees
    servo1.write(pos);
    delay(2);
  }
}
```

0~180度でサーボのシャフトを回すサンプルです。
のはずなんだけど明らかに180度まわっていない苦笑

## 複数動かす

```multiple-servo.ino
#include <ESP32Servo.h>

Servo servo1; // create four servo objects 
Servo servo2; // create four servo objects 

int servo1Pin = D0;
int servo2Pin = D2;

// Published values for SG90 servos; adjust if needed
int minUs = 500;
int maxUs = 2400;

int pos = 0;      // position in degrees

void setup() {
  servo1.setPeriodHertz(50);      // Standard 50hz servo
  servo2.setPeriodHertz(50);      // Standard 50hz servo
  servo1.attach(servo1Pin, minUs, maxUs);
  servo2.attach(servo2Pin, minUs, maxUs);
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // sweep from 0 degrees to 180 degrees
    // in steps of 1 degree
    servo1.write(pos);
    delay(2);             // waits 20ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // sweep from 180 degrees to 0 degrees
    servo1.write(pos);
    delay(2);
  }

  for (pos = 0; pos <= 180; pos += 1) { // sweep from 0 degrees to 180 degrees
    // in steps of 1 degree
    servo2.write(pos);
    delay(2);             // waits 20ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // sweep from 180 degrees to 0 degrees
    servo2.write(pos);
    delay(2);
  }
}
```

<img src="https://i.gyazo.com/9df1777918c0a16377026de815dd9226.gif" width="400">

## 複数を同時に動かす

```multiple-servo
#include <ESP32Servo.h>

Servo servo1; // create four servo objects 
Servo servo2; // create four servo objects 

int servo1Pin = D0;
int servo2Pin = D2;

// Published values for SG90 servos; adjust if needed
int minUs = 500;
int maxUs = 2400;

int pos = 0;      // position in degrees

void setup() {
  servo1.setPeriodHertz(50);      // Standard 50hz servo
  servo2.setPeriodHertz(50);      // Standard 50hz servo
  servo1.attach(servo1Pin, minUs, maxUs);
  servo2.attach(servo2Pin, minUs, maxUs);
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // sweep from 0 degrees to 180 degrees
    // in steps of 1 degree
    servo1.write(pos);
    servo2.write(pos);
    delay(2);             // waits 20ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // sweep from 180 degrees to 0 degrees
    servo1.write(pos);
    servo2.write(pos);
    delay(2);
  }
}

```

<img src="https://i.gyazo.com/cb33ba6790160f8dea807e756de5df8c.gif" width="400">

## 所感

Bluetooth連携のコードを試したときにこっちの実装のほうがESP32ナイズされてるからか安定して動きました。

ESP32でサーボやるときはこっちのライブラリのほうが良いかもしれなせいです。