Aufgrund fehlender Möglichkeiten hier vollkommen ungetestet und nur eine Idee.
Ich kann den nicht kompilieren und habe das nur trocken getackert...
Unkommentiert und ohne irgendeinen Anspruch.
[EDIT] Es gibt in Zeile166 eine Änderung, da ich da aus einer anderen Version was übersehen habe - Danke @ec2021 für den Hinweis[/]
//Einbinden der Bibliotheken
#include <Arduino.h> //Für alle Arduino-sketches erforderlich
#include <TMCStepper.h> //Bibliothek für alle TMC-Stepper (Auch 2209)
// Pin-Belegung für den ersten Stepper-driver
#define DIR_PIN_VPV A1 // Richtungssignal
#define STEP_PIN_VPV A0 // Schrittsignal
#define EN_PIN_VPV 38 // Aktivierte Motorausgänge (GND = An, VIO = Aus)
// Pin-Belegung für den zweiten Stepper-driver
#define DIR_PIN_HPV A3 // Richtungssignal
#define STEP_PIN_HPV A2 // Schrittsignal
#define EN_PIN_HPV 40 // Aktivierte Motorausgänge (GND = An, VIO = Aus)
//Dauer, in der das Experiment abfahren soll
long eineMin = 60000;
long dreiMin = eineMin*3; //3 Minuten
long fuenfMin = eineMin*5; //5 Minuten
long zehnMin = eineMin*10; //10 Minuten
//Initialisieren der Ausgangspositionen
float sommerVPVAusgang = -60.00; //VPV = Vertikale PV
float sommerHPVAusgang = -130.85; //HPV = Horizontale PV
float sommerVSAAusgang = 0.00; //VSA = Vertikaler Schwenkarm (Sonne)
float sommerHSAAusgang = -130.85; //HSA = Horizontaler Schwenkarm (Sonne)
float winterVPVAusgang = -60.00; //Beginn um 08:30 Uhr
float winterHPVAusgang = -52.81;
float winterVSAAusgang = 0.00;
float winterHSAAusgang = -52.81;
//Initialisieren der abzufahrenden Gradzahlen
float gzSommerVerti [] = {1.54, 1.73, 1.87, 1.97, 2.04, 2.10, 2.15, 2.19, 2.23, 2.27, 2.29, 2.31, 2.33,
2.34, 2.34, 2.34, 2.34, 2.32, 2.30, 2.26, 2.22, 2.17, 2.11, 2.02, 1.92, 1.79,
1.66, 1.49, 1.29, 1.06, 0.81, 0.54, 0.24, -0.05, -0.36, -0.64, -0.91, -1.15,
-1.37, -1.55, -1.71, -1.85, -1.96, -2.05, -2.13, -2.19, -2.24, -2.28, -2.31,
-2.32, -2.34, -2.35, -2.34, -2.34, -2.32, -2.30, -2.29, -2.25, -2.22, -2.17,
-2.14, -2.07, -2.02, -1.93, -1.83, -1.67, -1.51};
float gzSommerHori [] = {2.93, 2.89, 2.84, 2.80, 2.78, 2.75, 2.73, 2.73, 2.72, 2.72, 2.74, 2.77, 2.80,
2.84, 2.91, 2.98, 3.08, 3.18, 3.32, 3.47, 3.64, 3.86, 4.09, 4.36, 4.67, 5.02,
5.38, 5.77, 6.17, 6.56, 6.90, 7.16, 7.33, 7.36, 7.28, 7.07, 6.78, 6.41, 6.03,
5.62, 5.24, 4.88, 4.56, 4.25, 4.00, 3.78, 3.57, 3.41, 3.26, 3.14, 3.04, 2.95,
2.89, 2.83, 2.78, 2.76, 2.73, 2.72, 2.72, 2.73, 2.74, 2.76, 2.78, 2.82, 2.86,
2.90, 2.94};
float gzWinterVerti [] = {1.55, 1.59, 1.60, 1.54, 1.46, 1.36, 1.27, 1.15, 1.04, 0.91, 0.78, 0.65, 0.51,
0.37, 0.23, 0.08, -0.06, -0.21, -0.35, -0.49, -0.63, -0.77, -0.90, -1.01,
-1.14, -1.25, -1.36, -1.44, -1.53, -1.59, -1.60, -1.55};
float gzWinterHori [] = {2.91, 2.96, 3.01, 3.06, 3.12, 3.18, 3.23, 3.29, 3.34, 3.39, 3.44, 3.47, 3.52,
3.53, 3.56, 3.56, 3.57, 3.55, 3.54, 3.52, 3.48, 3.44, 3.40, 3.35, 3.29, 3.24,
3.19, 3.12, 3.08, 3.01, 2.97, 2.91};
int anzWerteSommer = sizeof(gzSommerVerti)/sizeof(float); //Anzahl der Gradzahlen im Sommer
int anzWerteWinter = sizeof(gzWinterVerti)/sizeof(float); //Anzahl der Gradzahlen im Sommer
//Initialisieren der Uebersetzungen
float uebersetzungVPV = 3.17;
float uebersetzungHPV = 13.83;
float uebersetzungVSA = 1.00;
float uebersetzungHSA = 1.00;
void setup() {
//Driver-Pins als Outputs deklarieren
pinMode(DIR_PIN_VPV, OUTPUT);
pinMode(STEP_PIN_VPV, OUTPUT);
pinMode(EN_PIN_VPV, OUTPUT);
pinMode(DIR_PIN_HPV, OUTPUT);
pinMode(STEP_PIN_HPV, OUTPUT);
pinMode(EN_PIN_HPV, OUTPUT);
//Enable-Pins auf LOW setzen
digitalWrite(EN_PIN_VPV, LOW);
digitalWrite(EN_PIN_HPV, LOW);
//Seriellen Monitor starten
Serial.begin(9600);
Serial.println(F("Start... "));
}
void loop() {
// put your main code here, to run repeatedly:
if(Serial.available()){
int eingabe = Serial.read();
if(eingabe == 's'){
Ausgangspunkt(sommerVPVAusgang, sommerHPVAusgang, uebersetzungVPV, uebersetzungHPV);
}
if(eingabe == 'w'){
Ausgangspunkt(winterVPVAusgang, winterHPVAusgang, uebersetzungVPV, uebersetzungHPV);
}
if(eingabe == 'S'){
stepsPV(gzSommerVerti, gzSommerHori, uebersetzungVPV, uebersetzungHPV, anzWerteSommer, dreiMin);
}
if(eingabe == 'W'){
stepsPV(gzWinterVerti, gzWinterHori, uebersetzungVPV, uebersetzungHPV, anzWerteWinter, dreiMin);
}
if(eingabe == 't'){
vorschrittVPV(1000, 1); //Test für Funktion
}
}
vorschrittHPV();
}
/*In diesem Abschnitt werden Funktionen,
die mehrfach ausgeführt werden müssen,
der Einfachheit halber hinterlegt*/
void rueckschrittHPV(long steps, long takt){
static unsigned long millisVorher;
long stepsZaehler = 0;
if(steps*(-1) > stepsZaehler){
if(millis() - millisVorher >= takt){
millisVorher = millis();
digitalWrite(DIR_PIN_HPV, HIGH); //UZS
digitalWrite(STEP_PIN_HPV, HIGH);
digitalWrite(STEP_PIN_HPV, LOW);
stepsZaehler++;
}
}
}
bool vorschrittHPV()
{
return vorschrittHPV(0,0);
}
bool vorschrittHPV(long steps, long takt)
{
static bool myStatus = false;
static long mySteps = 0;
static long myTakt = 0;
static unsigned long lastmillis = 0;
if (myStatus == false)
{
mySteps = steps;
myTakt = takt;
myStatus = true;
lastmillis = 0;
Serial.print(F("Daten übernommen: ")); Serial.print(mySteps); Serial.print(" "); Serial.println(myTakt);
}
if (mySteps > 0)
{
if (millis() - lastmillis > myTakt)
{
digitalWrite(DIR_PIN_HPV, LOW); //Gegen den Uhrzeigersinn (UZS)
digitalWrite(STEP_PIN_HPV, HIGH);
digitalWrite(STEP_PIN_HPV, LOW);
digitalWrite(DIR_PIN_HPV, HIGH);
mySteps--;
lastmillis = millis();
}
}
if (mySteps <= 0) myStatus = false;
return myStatus;
}
void rueckschrittVPV(long steps, long takt){
static unsigned long millisVorher;
long stepsZaehler = 0;
if(steps*(-1) > stepsZaehler){
if(millis() - millisVorher >= takt){
millisVorher = millis();
digitalWrite(DIR_PIN_VPV, HIGH); //UZS
digitalWrite(STEP_PIN_VPV, HIGH);
digitalWrite(STEP_PIN_VPV, LOW);
stepsZaehler++;
}
}
}
void vorschrittVPV(long steps, long takt){
static unsigned long millisVorher;
long stepsZaehler = 0;
if(steps > stepsZaehler){
if(millis() - millisVorher >= takt){
millisVorher = millis();
digitalWrite(DIR_PIN_VPV, LOW); //Gegen den Uhrzeigersinn (UZS)
digitalWrite(STEP_PIN_VPV, HIGH);
digitalWrite(STEP_PIN_VPV, LOW);
digitalWrite(DIR_PIN_VPV, HIGH);
stepsZaehler++;
}
}
}
//Testfunktion zum rumprobieren
/*void vorschrittVPV(long steps, long takt){
static unsigned long timer;
long stepsZaehler = 0;
for(int i = 0; i < steps; i++){
if(millis() > timer + takt){
digitalWrite(DIR_PIN_VPV, LOW);
digitalWrite(STEP_PIN_VPV, HIGH);
digitalWrite(STEP_PIN_VPV, LOW);
digitalWrite(DIR_PIN_VPV, HIGH);
//stepsZaehler++;
timer = millis();
}
}
}*/
//Allgemeinfültige Funktion zum Positionieren der Drehachse
void stepsPV(float axisVPV[], float axisHPV[], float ueberVPV, float ueberHPV, int anzWerte, long dauer){
long viertelstundenTakt = (dauer/anzWerte-1);
for(int i=0; i<anzWerte; i++){
long stepsVPV = (axisVPV[i]/(2.8125*0.01))*ueberVPV;
long stepsHPV = (axisHPV[i]/(2.8125*0.01))*ueberHPV;
//Abfrage, ob Gradzahl positiv oder negativ ist und anschließend entsprechender Schritt...
//...für VPV...
if(axisVPV[i] < 0){
rueckschrittVPV(stepsVPV, viertelstundenTakt/stepsVPV);
}
else if(axisVPV[i] >= 0){
vorschrittVPV(stepsVPV, viertelstundenTakt/stepsVPV);
}
//...für HPV...
if(axisHPV[i] < 0){
rueckschrittHPV(stepsHPV, viertelstundenTakt/stepsHPV);
}
else if(axisHPV[i] >= 0){
vorschrittHPV(stepsHPV, viertelstundenTakt/stepsHPV);
}
}
}
//Positionieren zu den Ausgangspunkten
void Ausgangspunkt(float VPV, float HPV, float uebersVPV, float uebersHPV){
long stepsVPV = (VPV/(2.8125*0.01))*uebersVPV;
long stepsHPV = (HPV/(2.8125*0.01))*uebersHPV;
if(VPV < 0 && HPV < 0){
rueckschrittHPV(stepsHPV, 1);
rueckschrittVPV(stepsVPV, 1);
}
else if (VPV >= 0 && HPV < 0){
rueckschrittHPV(stepsHPV, 1);
vorschrittVPV(stepsVPV, 1);
}
else if (VPV < 0 && HPV >= 0){
vorschrittHPV(stepsHPV, 1);
rueckschrittVPV(stepsVPV, 1);
}
else if (VPV >= 0 && HPV >= 0){
vorschrittHPV(stepsHPV, 1);
vorschrittVPV(stepsVPV, 1);
}
}
Für die Rückgabe in Zeile 126 gibt es derzeit keinen Sinn, aber mit einer solchen Rückgabe kannst Du prüfen, ob Dein Step bereits abgelaufen ist.