#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); // Небольшая задержка для стабильности
}