initial servo — ESP32-C3 simulation

first try for a servo

An interactive ESP32-C3 circuit simulation you can run free in your browser on Velxio, by alvaro-martinez.

Components

Sketch code

// ESP32-C3 — Servo Motor Sweep
// Wiring: PWM → GPIO10  |  V+ → 3V3  |  GND → GND
// Uses ESP32Servo library
/*
#include <ESP32Servo.h>

#define ROT_PIN 2
#define LIN_PIN 3
Servo Rservo;
Servo Lservo;

#define BUTTON_PIN 10
#define LED_PIN 7

#define BASE_POSITION 0
#define BLINK_COUNT 3
#define BLINK_DELAY 200
// Button state tracking
volatile bool buttonPressed = false;

// LED control
bool ledBlinking = false;
unsigned long blinkStartTime = 0;
int blinkCount = 0;

// Motor positions to reach
std::vector<std::pair<float, float>> targetPositions;
size_t currentTargetIndex = 0;

void IRAM_ATTR handleButton() {
  buttonPressed = true;
}

void setup() {
  Serial.begin(115200);
  Rservo.attach(ROT_PIN, 500, 2400);
  Rservo.write(45);
  Lservo.attach(LIN_PIN, 500, 2400);
  Lservo.write(90);

  Serial.println("ESP32-C3 Servo Sweep");
  // Initialize  button
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), handleButton, FALLING);

  pinMode(LED_PIN, OUTPUT);
}

void reset() {
    Rservo.write(BASE_POSITION);
    Lservo.write(BASE_POSITION);
    targetPositions.clear();
    currentTargetIndex = 0;
    blinkCount = 0;
    ledBlinking = false;
    Serial.println("Button pressed - returning to base");
    buttonPressed = false;
}

void readOrder() {
    float x, y;
    x = Serial.parseFloat();
    y = Serial.parseFloat();

    targetPositions.push_back({ x, y });
}

void avanza() {
    auto [tx, ty] = targetPositions[currentTargetIndex];

    int pos_x = BASE_POSITION + static_cast<int>(tx * 90.0f);
    int pos_y = BASE_POSITION + static_cast<int>(ty * 90.0f);
    Serial.printf("New position: (%d, %d)\n", pos_x, pos_y);

    Rservo.write(pos_x);
    Lservo.write(pos_y);

//    if (abs(Rservo.read() - pos_x) < 5 && abs(Lservo.read() - pos_y) < 5) {
      currentTargetIndex++;
//    }
  if (currentTargetIndex == targetPositions.size())
    Serial.printf("stop at %f\n", millis());
}

void tiltLed() {
  if (!ledBlinking ) {
    ledBlinking = true;
    blinkStartTime = millis();
  }

  if (ledBlinking) {
    unsigned long now = millis();
    if (now - blinkStartTime >= BLINK_DELAY) {
      blinkCount++;
      digitalWrite(LED_PIN, !digitalRead(LED_PIN));

      if (blinkCount == BLINK_COUNT) {
        ledBlinking = false;
      }

      blinkStartTime = now;
    }
  }
}

void loop() {
  // Check button state
  if (buttonPressed)    // Move to base position and reset sequence
    reset();

  // Check for new commands via serial
  if (Serial.available() > 0) readOrder();
  
  // Check if all movements completed
  if (currentTargetIndex < targetPositions.size()) 
    avanza();

  // Blink LED on completion
  tiltLed();
}
*/
#include <ESP32Servo.h>
#include <vector>

#define ROT_PIN 2
#define LIN_PIN 3
Servo Rservo;
Servo Lservo;

#define BUTTON_PIN 10
#define LED_PIN 7

#define BASE_POSITION 90
volatile bool buttonPressed = false;

void IRAM_ATTR handleButton() {
  buttonPressed = true;
}

void setup() {
  Serial.begin(115