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);
}
}