Läuft schon recht gut. Ich muss die Messplatine noch am Motorturm befestigen, und die Abschattungen der 4 Lichtsensoren für volles Sonnenlicht noch machen. Dann sollte das so weit gehen. Kann aber noch sein, dass ich an jedem der beiden Motoren einen Hallgeber zum zentrieren brauche. Denn man muss ja bei den Schrittmotoren mit Schrittfehlern rechnen. Vielleicht immer m Morgen einmal zentrieren. Mal schauen.
Servus
Franz
PS: Ein Video folgt, wenn ich die Messplatine draufgebaut habe, die liegt im Moment noch daneben.
Hier mal das Bild. Das Ding funktioniert schon Es fährt schön dem Licht nach. Ich muss nur noch 4 Lichtsensoren von den acht abdunkeln, und sicher noch ein paar Feinheiten Einstellen. Dann läuft die Kiste. Der Knubbel mit der langen Schraube ist übrigens ein Gegengewicht, dass die Platine nicht mit Vollgas nach unten rauscht, wenn die Motoren stromlos sind. Unter dem Tesaband ist ne halbe Rolle Lötzinn um die Schraube gewickelt. Der Motor hällt die Platine locker oben, solange der Treiber den Motor mit Spannung versorgt. Aber wenn die Spannung ausgeschalten wird, geht die Platine wie ne Axt runter, wenn das Gegengewicht fehlt
.

- Sonnen_Nachleitung_Nema17_3.jpg (453.32 KiB) 2933 mal betrachtet
Hier noch das aktuelle Programm. Es macht was es soll, ich hoffe am Wochenende ist volle Sonne zum Testen. Aber ich bin mir sicher, dass es gut funktionieren wird. Ich habe jetzt bei voller LED Beleuchtung am Arbeitsplatz Werte so um die 2600 von 8190. Da ist also viel Luft nach oben, und auch nach unten.
Da sind vier Stellen mit Serial.print(); auskommentiert. Die kann man rausschmeißen. Ich habe sie zum Testen noch lassen. Bin ja mit den Tests noch nicht durch.
Code: Alles auswählen
#include <LiquidCrystal_I2C.h>
// Display Adresse 0x3F 0der 0x27
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include <Adafruit_ADS1X15.h> // bindet Wire.h für I2C mit ein
Adafruit_ADS1115 ads;
Adafruit_ADS1115 ads2;
#define ADS_I2C_ADDR 0x48
#define ADS_I2C_ADDR2 0x49
//------------------------------------------------------
#include <MobaTools.h>
int Rampe = 0;
const int STEPS_REVOLUTION = 6400; //Schritte pro Umdrehung Treibereinstellung
//Stepper einrichten ( 6400 Schritte / Umdrehung - 1/4 Microstep )
MoToStepper myStepper1( STEPS_REVOLUTION, STEPDIR ); // 6400 Steps/ Umdrehung
MoToStepper myStepper2( STEPS_REVOLUTION, STEPDIR ); // 6400 Steps/ Umdrehung
const byte dirPin1 = 6;
const byte stepPin1 = 7;
const byte enaPin1 = 5;
const byte dirPin2 = 9;
const byte stepPin2 = 10;
const byte enaPin2 = 8;
int vspeed = 0; //Steppergeschwindigkeit in U/min*10
//-----------------------------------------------------
byte ablauf = 3; //3 = Tagbetrieb /4 = Nachtbetrieb
const float multiplier = 0.125F; // ADS1115-Multiplikator bei einf. Verstärkung
const byte panel = A0;
int panelwert = 0;
float panelspannung = 0;
float ads_mv0 = 0; // Sensor rechts
float ads_mv1 = 0; // Sensor links
float ads_mv2 = 0; // Sensor hinten
float ads_mv3 = 0; // Sensor vorne
int adc0 = 0;
int adc1 = 0;
int adc2 = 0;
int adc3 = 0;
float ads_mv4 = 0; // Sensor rechts
float ads_mv5 = 0; // Sensor links
float ads_mv6 = 0; // Sensor hinten
float ads_mv7 = 0; // Sensor vorne
int adc4 = 0;
int adc5 = 0;
int adc6 = 0;
int adc7 = 0;
float Messung1 = 0;
float Messung2 = 0;
float Messung3 = 0;
float Messung4 = 0;
const int startposvertikal = 25;
const int startposhorizontal = 60;
byte kontrolle1 = 0;
byte kontrolle2 = 0;
byte kontrolle3 = 0;
byte kontrolle4 = 0;
int posvertikal = startposvertikal;
int poshorizontal = startposhorizontal;
const byte Servo1 = 5;
const byte Servo2 = 6;
unsigned long sekundenablauf1 = 0; // Messabstand 1 Sekunde
const unsigned long pausezeit1 = 5000;
unsigned long aktuellzeit = 0;
void setup() {
//----------------------------------------------------
lcd.begin();
lcd.backlight();
lcd.clear();
//----------------------------------------------------
Serial.begin(9600);
//----------------------------------------------------
ads.begin(ADS_I2C_ADDR, &Wire);
ads2.begin(ADS_I2C_ADDR2, &Wire);
// Werte 1-fach verstärken (ESP32 liefert max. 3,3V)
ads.setGain(GAIN_ONE);
ads2.setGain(GAIN_ONE);
//----------------------------------------------------
lcd.setCursor (0, 0); // Zeile 1
//----------------------------------------------------
pinMode(panel, INPUT); // Spannung vom Panel
//----------------------------------------------------
sekundenablauf1 = millis();
//-----Stepper---------------------------------------
myStepper1.attach( stepPin1, dirPin1 );
myStepper1.attachEnable( enaPin1, 10, LOW ); // Enable Pin aktivieren ( LOW=aktiv )
myStepper1.setSpeed( 10 );
myStepper1.setRampLen( Rampe ); // Rampenlänge 100 Steps bei 20U/min
myStepper2.attach( stepPin2, dirPin2 );
myStepper2.attachEnable( enaPin2, 10, LOW ); // Enable Pin aktivieren ( LOW=aktiv )
myStepper2.setSpeed( 10 );
myStepper2.setRampLen( Rampe ); // Rampenlänge 100 Steps bei 20U/min
//---------------------------------------------------
}
void loop() {
aktuellzeit = millis();
//Jede Sekunde Spannung am Panel messen
if (aktuellzeit - sekundenablauf1 >= pausezeit1) // Eine Sekunde abgelaufen?
{
panelwert = analogRead(panel);
panelspannung = panelwert * 20.3 / 1024.0;
lcd.setCursor (14, 0); // Zeile 1
lcd.print (panelspannung);
if (ablauf == 3)
{
lcd.setCursor (0, 0); // Zeile 1
lcd.print (F("Panelspannung "));
}
if (ablauf == 4)
{
lcd.setCursor (0, 0); // Zeile 1
lcd.print (F("Nachtbetrieb "));
}
sekundenablauf1 = millis();
}
// -----Kanal 0 Messung------------------------------
adc0 = ads.readADC_SingleEnded(0);
ads_mv0 = ads.computeVolts(adc0) * 1000;
// -----Kanal 1 Messung------------------------------
adc1 = ads.readADC_SingleEnded(1);
ads_mv1 = ads.computeVolts(adc1) * 1000;
Messung1 = ads_mv0 + ads_mv1;
lcd.setCursor (6, 3); // Zeile 4
lcd.print (" ");
lcd.setCursor (6, 3); // Zeile 4
lcd.print (Messung1);
// -----Kanal 2 Messung------------------------------
adc2 = ads.readADC_SingleEnded(2);
ads_mv2 = ads.computeVolts(adc2) * 1000;
// -----Kanal 3 Messung------------------------------
adc3 = ads.readADC_SingleEnded(3);
ads_mv3 = ads.computeVolts(adc3) * 1000;
Messung2 = ads_mv2 + ads_mv3;
lcd.setCursor (6, 1); // Zeile 2
lcd.print (" ");
lcd.setCursor (6, 1); // Zeile 2
lcd.print (Messung2);
// -----Kanal 4 Messung------------------------------
adc4 = ads2.readADC_SingleEnded(0);
ads_mv4 = ads.computeVolts(adc4) * 1000;
// -----Kanal 5 Messung------------------------------
adc5 = ads2.readADC_SingleEnded(1);
ads_mv5 = ads.computeVolts(adc5) * 1000;
Messung3 = ads_mv4 + ads_mv5;
lcd.setCursor (0, 2); // Zeile 3
lcd.print (Messung3);
// -----Kanal 6 Messung------------------------------
adc6 = ads2.readADC_SingleEnded(2);
ads_mv6 = ads.computeVolts(adc6) * 1000;
// -----Kanal 7 Messung------------------------------
adc7 = ads2.readADC_SingleEnded(3);
ads_mv7 = ads.computeVolts(adc7) * 1000;
Messung4 = ads_mv6 + ads_mv7;
lcd.setCursor (12, 2); // Zeile 3
lcd.print (Messung4);
//------------Lichtquelle suchen---------------------
if (ablauf == 3)
{
//--------Horizontal Kontrolle plus--------------
if (kontrolle1 == 0)
{
if ((Messung2) < Messung1) // Links dunkler als rechts
{
if (poshorizontal > 0)
{
if (myStepper1.moving() == 0)
{
poshorizontal = poshorizontal - 1; // Fahre nach rechts
myStepper1.doSteps( -50 ); // Stepper dreht rückwärts
lcd.setCursor (0, 3);
lcd.print (" ");
lcd.setCursor (0, 3);
lcd.print (poshorizontal);
}
}
}
else
{
kontrolle1 = 1;
/*
Serial.println(F("Messung2 < Messung1"));
Serial.print(Messung2);
Serial.print(" - ");
Serial.println(Messung1);
*/
}
}
//--------Horizontal Kontrolle minus-------------
if (kontrolle2 == 0)
{
if ((Messung2) > Messung1) // Links heller als rechts
{
if (poshorizontal < 120)
{
if (myStepper1.moving() == 0)
{
poshorizontal = poshorizontal + 1; // Fahre nacht Links
myStepper1.doSteps( 50 ); // Stepper dreht Vorwärts
lcd.setCursor (0, 3);
lcd.print (" ");
lcd.setCursor (0, 3);
lcd.print (poshorizontal);
}
}
}
else
{
kontrolle2 = 1;
/*
Serial.println(F("Messung2 > Messung1"));
Serial.print(Messung2);
Serial.print(" - ");
Serial.println(Messung1);
*/
}
}
//-------Vertikale Kontrolle plus----------------
if (kontrolle3 == 0)
{
if ((Messung4) < Messung3) // Hinten dunkler als vorne
{
if (posvertikal > 0)
{
if (myStepper2.moving() == 0)
{
posvertikal = posvertikal - 1; // Fahre runter
myStepper2.doSteps( 50 ); // Stepper dreht rückwärts
lcd.setCursor (17, 3);
lcd.print (" ");
lcd.setCursor (17, 3);
lcd.print (posvertikal);
}
}
}
else
{
kontrolle3 = 1;
/*
Serial.println(F("Messung4 < Messung3"));
Serial.print(Messung4);
Serial.print(" - ");
Serial.println(Messung3);
*/
}
}
//--------Vertikal Kontrolle minus---------------
if (kontrolle4 == 0)
{
if ((Messung4) > Messung3) // Hinten heller als vorne
{
if (posvertikal < 50)
{
if (myStepper2.moving() == 0)
{
posvertikal = posvertikal + 1; // Fahre hoch
myStepper2.doSteps( -50 ); // Stepper dreht Vorwärts
lcd.setCursor (17, 3);
lcd.print (" ");
lcd.setCursor (17, 3);
lcd.print (posvertikal);
}
}
}
else
{
kontrolle4 = 1;
/*
Serial.println(F("Messung4 > Messung3"));
Serial.print(Messung4);
Serial.print(" - ");
Serial.println(Messung3);
*/
}
}
//-------Vertikale Kontrolle Ende-----------------
//------------Lichtquelle suchen Ende-------------
}
//------------Kontrolle wieder aktivieren-------------
//--------------------auf / ab------------------------
if (ablauf == 3)
{
if (kontrolle1 == 1)
{
if ((Messung2 + 200) <= Messung1) // Links dunkler als rechts
{
kontrolle1 = 0;
}
}
if (kontrolle2 == 1)
{
if ((Messung2) >= (Messung1 + 200)) // Links heller als rechts
{
kontrolle2 = 0;
}
}
//-----------------rechts / links-------------------
if (kontrolle3 == 1)
{
if ((Messung4 + 200) <= Messung3) // Hinten dunkler als vorne
{
kontrolle3 = 0;
}
}
if (kontrolle4 == 1)
{
if ((Messung4) >= (Messung3 + 200)) // Hinten heller als vorne
{
kontrolle4 = 0;
}
}
}
//-----------------------------------------------------
//--------------Kontrolle ob schon zu Dunkel-----------
if ((Messung1 < 1000) || (Messung2 < 1000) || (Messung3 < 1000) || (Messung4 < 1000))
{
ablauf = 4;
}
else
{
if ((Messung1 > 1400) && (Messung2 > 1400) && (Messung3 > 1400) && (Messung4 > 1400))
{
ablauf = 3;
}
}
//-----------------------------------------------------
//---------In die Nachtposition fahren-----------------
if (ablauf == 4)
{
//ServoVertikal.write(startposvertikal);
//ServoHorizontal.write(startposhorizontal);
}
//-----------------------------------------------------
}
.

- Sonnen_Nachführung_Solarpanel_V3_Schrittmotoren2.JPG (778.97 KiB) 2896 mal betrachtet
Man sieht jetzt im Video auch schön die Abdeckungen der Lichtsensoren. Also auf jeder Seite einer offen, und einer mit drei Lagen 100gr. Papier abgedeckt. Ich hoffe dass ich heute oder morgen mal richtig gutes Sonnenlicht bekomme, dass ich testen kann ob die Werteermittlung mit den jeweils beiden Lichtsensoren gut hinkommt. Bin mir aber recht sicher, dass das passt. Bei meinem Licht hier am Tisch habe ich auf den beiden Vertikalen Sesoren 3500 und auf den beiden Horizontalen 2900. Also wunderbar im Zielgebiet. Die Werte der beiden Horizontalen Sensoren können sich etwa um den Wert 100 unterscheiden, genauso bei den Vertikalen Sensoren. Ich habe zur Zeit die Einstellung so, dass eine Neueinstellung losgeht, wenn sich die Werte auf Horizontal oder auch Vertikal um mehr als 200 unterscheiden. Kann sein, dass ich das noch ein bischen runtersetze, so dass die Mühle schon eher nachjustiert.
Hier das Schaltbild in Vergrößerung!!
Und hier mal ein aktueller Video von der Mühle.