ISR-based Servo Controller Library for ESP32 (ESP32_ISR_Servo)

Just created on GitHub a new ISR-based library enabling you to use 1 Hardware Timer on an ESP32-based board to control 16-or-more independent servo motors.
You can specify which ESP32 hardware timer to use to avoid conflict with other libraries. Default is using timer 3.

It’s quite simple to use.

Here is the sample code

#ifndef ESP32
#error This code is designed to run on ESP32 platform, not Arduino nor ESP8266! Please check your Tools->Board setting.
#endif

#define TIMER_INTERRUPT_DEBUG       1
#define ISR_SERVO_DEBUG             1

// Select different ESP32 timer number (0-3) to avoid conflict
#define USE_ESP32_TIMER_NO          3

#include "ESP32_ISR_Servo.h"

#define PIN_D25           25        // Pin D25 mapped to pin GPIO25/ADC18/DAC1 of ESP32
#define PIN_D26           26        // Pin D26 mapped to pin GPIO26/ADC19/DAC2 of ESP32

// Published values for SG90 servos; adjust if needed
#define MIN_MICROS      800  //544
#define MAX_MICROS      2450

int servoIndex1  = -1;
int servoIndex2  = -1;

void setup() 
{
  Serial.begin(115200);
  Serial.println("\nStarting");
  
  //Select ESP32 timer USE_ESP32_TIMER_NO
  ESP32_ISR_Servos.useTimer(USE_ESP32_TIMER_NO);
  
  servoIndex1 = ESP32_ISR_Servos.setupServo(PIN_D25, MIN_MICROS, MAX_MICROS);
  servoIndex2 = ESP32_ISR_Servos.setupServo(PIN_D26, MIN_MICROS, MAX_MICROS);
  
  if (servoIndex1 != -1)
    Serial.println("Setup Servo1 OK");
  else
    Serial.println("Setup Servo1 failed");

  if (servoIndex2 != -1)
    Serial.println("Setup Servo2 OK");
  else
    Serial.println("Setup Servo2 failed");    
}

void loop() 
{
  int position;
  
  if ( ( servoIndex1 != -1) && ( servoIndex2 != -1) )
  {
    for (position = 0; position <= 180; position++) 
    { 
      // goes from 0 degrees to 180 degrees
      // in steps of 1 degree

      if (position %30 == 0)
      {
        Serial.println("Servo1 pos = " + String(position) + ", Servo2 pos = " + String(180 - position) );
      }
          
      ESP32_ISR_Servos.setPosition(servoIndex1, position);
      ESP32_ISR_Servos.setPosition(servoIndex2, 180 - position);
      // waits 30ms for the servo to reach the position
      delay(30);
    }
    delay(5000);
    
    for (position = 180; position >= 0; position--) 
    { 
      // goes from 180 degrees to 0 degrees
      if (position %30 == 0)
      {
        Serial.println("Servo1 pos = " + String(position) + ", Servo2 pos = " + String(180 - position) );
      }

      ESP32_ISR_Servos.setPosition(servoIndex1, position);
      ESP32_ISR_Servos.setPosition(servoIndex2, 180 - position);
      // waits 30ms for the servo to reach the position
      delay(30);                                  
    }
    delay(5000);

  }
}

2 Likes

Updated: Dec 17th 2019

ESP32_ISR_Servo libraries v1.0.1 just got included into Arduino Library Manager.
Now you can install this library directly from Arduino Library Manager.

Updated: Dec 20th 2019

New ESP32_ISR_Servo libraries v1.0.2 with new example using Blynk widgets to control servos.

Updated Dec 29th 2019

Included in Platform.io

Hi Khoih. Sorry out of topic, recently i see your reporsitory about STM32 ISR Servo and i had a question. the question is, it posible to control more than 16 servos with your library ? and how ? Im a newbie in microcontroller soo sorry if the question is weird.

Thank you