私の入門記録であって、入門者向け解説サイトではありません。

サーボモーター

  • 投稿日:
  • Category:

今後、ポイントをスローアクションで動かしたいと考えているので、ポイントマシンとしてサーボモーターの使用も検証しておかねばならない。下記 2サイトを参考にスケッチを作成した。2つ目のリンクサイトは、ServoEasingライブラリの使用法が役にたった。このライブラリを使用すると、サーボの回転角のみならず、動かし方(回転速度の設定、最初と最後はゆっくり等)の制御が可能になるのである。

[ スケッチ:Esp32_AsyncWebServer_Relay ]

#include <WiFi.h>
#include "ESPAsyncWebServer.h"
#include "SPIFFS.h"
#include <ArduinoJson.h>
#include <ESP32Servo.h> // for Servo
#include <ServoEasing.hpp>
const char ssid[] = "********";
const char pass[] = "********";
const IPAddress ip(192,168,3,17);
const IPAddress gateway(192,168,1,1);  // デフォルトゲートウェイ
const IPAddress subnet(255,255,255,0);
AsyncWebServer server(80);            // ポート設定
// Jsonオブジェクトの初期化
StaticJsonDocument<512> doc;
#define LED_PIN 33
#define REL_PIN 32
uint8_t led_status;  //LEDの状態制御用変数
void setup()
{
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT); // GPIO25を出力設定に
  pinMode(REL_PIN, OUTPUT); // GPIO25を出力設定に
  // SPIFFSのセットアップ
  if(!SPIFFS.begin(true)){
    Serial.println("An Error has occurred while mounting SPIFFS");
    return;
  }
  WiFi.config(ip, gateway, subnet);
  WiFi.begin (ssid, pass);
  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 1000 );
    Serial.print ( "." );
  }
  // 各種情報を表示
  Serial.print("SSID: ");
  Serial.println(ssid);
  Serial.print("AP IP address: ");
  Serial.println(ip);
  // GETリクエストに対するハンドラーを登録
  // rootにアクセスされた時のレスポンス
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/index.html");
  });
  // style.cssにアクセスされた時のレスポンス
  server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/style.css", "text/css");
  });
  // LED の制御変数の変更リクエスト
  server.on(
    "/post_test",
    HTTP_POST,
    [](AsyncWebServerRequest * request){},
    NULL,
    [](AsyncWebServerRequest * request, uint8_t *data, size_t len, size_t index, size_t total) {
      String resjson = "";
      for (size_t i = 0; i < len; i++) {
        //Serial.write(data[i]);
        resjson.concat(char(data[i]));
      }
      Serial.println(resjson);
      DeserializationError error = deserializeJson(doc, resjson);
      if(error){
        Serial.println("deserializeJson() faild");
        request->send(400);
      }
      else{
        led_status = doc["LED_STATUS"];       //zz Tilt Motor Default SPEED
        request->send(200);
      }
  });
  led_status = 0;
  // サーバースタート
  server.begin();
  Serial.println("Server start!");
  // for Servo
  // Allow allocation of all timers
  myservo.setPeriodHertz(50);    // standard 50 hz servo
  myservo.attach(servoPin, 1000, 2000); // attaches the servo on pin 18 to the servo object
  synchronizeAllServosStartAndWaitForAllServosToStop();
}
void loop() {
//if (led_status != led_status_tmp) {
  // LED状態変更
  if(led_status == 0){
    digitalWrite(LED_PIN, LOW);
    digitalWrite(REL_PIN, LOW);
    myservo.easeToD(0, 2000);
  }
  else{
    digitalWrite(LED_PIN, HIGH);
    digitalWrite(REL_PIN, HIGH);
    myservo.easeToD(180, 2000);
  }
}

回路の方だが、前回のリレー部分はそのままに、今回のサーボモーター関連を加えてある。リレーの出力側には確認の為にLED表示を付けてみた。Web画面が ON/OFF のままだが、ポイント制御においては R/L に置き換えて見て欲しい。なお、リレーやサーボモーターを動かす為の電流は大きいので、ESP32への負荷を考え、本番は別電源で動かす予定である。