#include <Arduino.h>

const byte COIL_PINS[] = {11, 10, 9, 8}; // IN1, IN2, IN3, IN4 на платі ULN2003
const int STEPS_PER_REV = 2048; // Приблизно: 32 кроки двигуна × редуктор ≈64
const byte STEP_MS = 3; // Менше 2 мс — двигун може пропускати кроки
const byte PATTERN[4][4] = {
  {1, 1, 0, 0},
  {0, 1, 1, 0},
  {0, 0, 1, 1},
  {1, 0, 0, 1},
}; // Дві сусідні обмотки разом — сильніший крок

int phase = 0;

void energize(int p) {
  for (byte i = 0; i < 4; i++) {
    digitalWrite(COIL_PINS[i], PATTERN[p][i]);
  }
}

void stepOnce(int direction) {
  phase = (phase + direction + 4) % 4; // Наступна або попередня фаза
  energize(phase);
  delay(STEP_MS);
}

void release() {
  for (byte i = 0; i < 4; i++) {
    digitalWrite(COIL_PINS[i], LOW); // Обмотки без струму не гріються
  }
}

void rotateDegrees(long degrees) {
  long steps = degrees * STEPS_PER_REV / 360;
  int direction = steps > 0 ? 1 : -1;

  for (long i = 0; i < abs(steps); i++) {
    stepOnce(direction);
  }

  release();
}

void setup() {
  for (byte i = 0; i < 4; i++) {
    pinMode(COIL_PINS[i], OUTPUT);
  }

  Serial.begin(115200);
}

void loop() {
  Serial.println("+90");
  rotateDegrees(90);
  delay(1000);
  Serial.println("+90");
  rotateDegrees(90);
  delay(1000);
  Serial.println("-180");
  rotateDegrees(-180); // Мінус — у зворотний бік
  delay(2000);
}
