"manually" operate the motor without feedback from the sun position
Correct. The motor need only drive in carefully selected steps (constant 0.25 degrees per minute if the axis of rotation is polar) to accurately track the sun position, if the initial orientation is correct. Use the azimuth angle from the sun position library as your guide.
How do you plan to reset the panel position overnight?
Note: the sun does not follow daylight savings timekeeping conventions.
Edit: add simple Arduino program to create a table of solar positions for one day.
/*
This program calculates solar positions as a function of location, date, and time.
The equations are from Jean Meeus, Astronomical Algorithms, Willmann-Bell, Inc., Richmond, VA
(C) 2015, David Brooks, Institute for Earth Science Research and Education.
http://www.instesre.org/
*/
#define DEG_TO_RAD 0.01745329
#define PI 3.141592654
#define TWOPI 6.28318531
// local date and time zone
int month = 4, day = 27, year = 2020, zone = 8;
// local GPS coordinates
float Lon = -123.00, Lat = 43.00;
void setup() {
Serial.begin(9600);
Serial.print("Sun position table ");
Serial.print("at lat/lon location ");
Serial.print(Lat);
Lat = Lat*DEG_TO_RAD;
Serial.print("/");
Serial.println(Lon);
Lon = Lon*DEG_TO_RAD;
Serial.print("Date (y/m/d): ");
Serial.print(year);
Serial.print("/");
Serial.print(month);
Serial.print("/");
Serial.println(day);
Serial.println();
Serial.println("Local hour, minute, elevation, azimuth");
int hour, minute = 0, second = 0;
float T, JD_frac, L0, M, e, C, L_true, f, R, GrHrAngle, Obl;
float RA, Decl, HrAngle, elev, azimuth;
long JD_whole, JDx;
// Changes required in for… loop to get complete
// daylight coverage
// Time is UTC time!
// make a table by hours
for (hour = 12; hour <= 24; hour++) {
JD_whole = JulianDate(year, month, day); //4 digit year > 1582
JD_frac = (hour + minute / 60. + second / 3600.) / 24. - .5;
T = JD_whole - 2451545;
T = (T + JD_frac) / 36525.;
L0 = DEG_TO_RAD * fmod(280.46645 + 36000.76983 * T, 360);
M = DEG_TO_RAD * fmod(357.5291 + 35999.0503 * T, 360);
e = 0.016708617 - 0.000042037 * T;
C = DEG_TO_RAD * ((1.9146 - 0.004847 * T) * sin(M) + (0.019993 - 0.000101 * T) * sin(2 * M) + 0.00029 * sin(3 * M));
f = M + C;
Obl = DEG_TO_RAD * (23 + 26 / 60. + 21.448 / 3600. - 46.815 / 3600 * T);
JDx = JD_whole - 2451545;
GrHrAngle = 280.46061837 + (360 * JDx) % 360 + .98564736629 * JDx + 360.98564736629 * JD_frac;
GrHrAngle = fmod(GrHrAngle, 360.);
L_true = fmod(C + L0, TWOPI);
// R = 1.000001018 * (1 - e * e) / (1 + e * cos(f));
R = 0.000001018 * (1 - e * e) / (1 + e * cos(f));
R = R + (1 - e * e) / (1 + e * cos(f));
RA = atan2(sin(L_true) * cos(Obl), cos(L_true));
Decl = asin(sin(Obl) * sin(L_true));
HrAngle = DEG_TO_RAD * GrHrAngle + Lon - RA;
elev = asin(sin(Lat) * sin(Decl) + cos(Lat) * (cos(Decl) * cos(HrAngle)));
// Azimuth measured eastward from north.
azimuth = PI + atan2(sin(HrAngle), cos(HrAngle) * sin(Lat) - tan(Decl) * cos(Lat));
Serial.print(hour - zone); //local hour from UTC
Serial.print(",");
Serial.print(minute);
Serial.print(",");
Serial.print(elev / DEG_TO_RAD, 1);
Serial.print(",");
Serial.print(azimuth / DEG_TO_RAD, 1);
Serial.println();
}
}
void loop() {}
long JulianDate(int year, int month, int day) {
// not correct for year < 1583 (Gregorian calendar)
long JD_whole;
int A, B;
if (month <= 2) {
year--;
month += 12;
}
A = year / 100;
B = 2 - A + A / 4;
JD_whole = (long)(365.25 * (year + 4716)) + (int)(30.6001 * (month + 1)) + day + B - 1524;
return JD_whole;
}