Загрузка данных


#include <Stepper.h>

// Пины фоторезисторов
const int pinNorth = A5;
const int pinWest  = A4;
const int pinEast  = A3;
const int pinSouth = A2;

// Параметры шагового двигателя
const int stepsPerRev = 520;
Stepper stepper(stepsPerRev, 8, 9, 10, 11);

// Текущая позиция в шагах (0 = север, движемся по часовой стрелке)
int currentStep = 0;

void setup() {
  Serial.begin(9600);
  stepper.setSpeed(60); // Скорость вращения (об/мин)
}

void loop() {
  // Считываем значения с фоторезисторов (0-1023)
  int north = analogRead(pinNorth);
  int west  = analogRead(pinWest);
  int east  = analogRead(pinEast);
  int south = analogRead(pinSouth);

  // Вычисляем вектор направления
  // Ось X: положительное = восток, отрицательное = запад
  float x = east - west;
  // Ось Y: положительное = север, отрицательное = юг
  float y = north - south;

  // Если сигнал нулевой (все одинаково), не двигаемся
  if (x == 0 && y == 0) {
    delay(50);
    return;
  }

  // Вычисляем угол в радианах
  // atan2(y, x) дает угол относительно оси X (восток)
  // Нам нужно относительно севера, поэтому смещаем на 90 градусов (PI/2)
  float angleRad = atan2(y, x);
  
  // Переводим в градусы (0 = восток, увеличивается против часовой)
  float angleDeg = angleRad * 180.0 / PI;
  
  // Преобразуем: 0 = север, по часовой стрелке
  // Восток = 90°, Юг = 180°, Запад = 270°
  float targetAngle = 90.0 - angleDeg;
  if (targetAngle < 0) targetAngle += 360.0;

  // Переводим угол в шаги (520 шагов на 360 градусов)
  int targetStep = round(targetAngle * stepsPerRev / 360.0);
  if (targetStep >= stepsPerRev) targetStep -= stepsPerRev;

  // Вычисляем разницу и направление движения
  int diff = targetStep - currentStep;
  
  // Выбираем кратчайший путь
  if (diff > stepsPerRev / 2) {
    diff -= stepsPerRev;
  } else if (diff < -stepsPerRev / 2) {
    diff += stepsPerRev;
  }

  // Двигаемся, если разница больше 1 шага (чтобы избежать дрожания)
  if (abs(diff) > 0) {
    stepper.step(diff);
    currentStep = targetStep;
    
    // Отладка в монитор порта
    Serial.print("N:");
    Serial.print(north);
    Serial.print(" S:");
    Serial.print(south);
    Serial.print(" E:");
    Serial.print(east);
    Serial.print(" W:");
    Serial.print(west);
    Serial.print(" | Angle:");
    Serial.print(targetAngle);
    Serial.print(" | Steps moved:");
    Serial.println(diff);
  }

  delay(50); // Небольшая задержка для стабильности
}