Probleme mit Programmstart über Taster

Hallo zusammen,

ich bastle mir gerade einen Drehteller für Timelapseaufnahmen, welcher von einem Schrittmotor angetrieben wird. Der Teller soll sich immer um einen bestimmten Winkel drehen (16 Schritte), dann wird eine Aufnahme gemacht (mit Fokus und Auslöser), der Teller wieder weitergedreht usw.. Nach 25 Bewegungen ist das ganze fertig und stoppt. Soweit funktioniert momentan auch alles. Jetzt habe ich nur das Problem, dass ich das ganze über einen Tastendruck starten möchte (Taster an Arduino-Pin 2), allerdings startet das ganze Programm schon, wenn ich die Schaltung mit Strom versorge. Ich habe den Pullup an Pin 2 aktiviert, wenn Pin 2 auf Gnd gezogen wird, sollte dieser eigentlich den state-Zustand togglen. Aber irgendwie funktioniert das nicht. Was mache ich da falsch? Danke schon mal für eure Hilfe!

Gruß,

Martin

//Foto-Drehteller


#define step_pin 4    // Step Pin DRV8825
#define trigger_pin A0 //Pin für Auslöser
#define focus_pin A1   //Pin für Autofocus
#define dir_pin 3     // Direction Pin DRV8825
#define enable_pin 5  // Enable Pin DRV8825
#define sleep_pin 11   // Pin 11 Verbunden mit SLEEP pin
#define start_switch 2 // Pin 2 verbunden mit Start/Stop-Schalter
const int trigger_time = 100; //Zeit, die der Auslöser gedrückt wird
int delay_time = 3000; // Gesamtzeit für eine Aufnahme
int focus_time = 1500; //Zeit zum fokusieren
volatile boolean state = false;  
int steps;        //Stepperschritte
int scancount;    //Zähler für Scanschritte


void setup() {
   Serial.begin(9600);
   pinMode(dir_pin, OUTPUT);
   pinMode(step_pin, OUTPUT);
   pinMode(enable_pin, OUTPUT);
   pinMode(trigger_pin, OUTPUT);
   pinMode(focus_pin, OUTPUT);
   pinMode(sleep_pin, OUTPUT);
   pinMode(start_switch, INPUT_PULLUP);
   digitalWrite(trigger_pin, LOW);
   digitalWrite(focus_pin, LOW);
   digitalWrite(enable_pin, HIGH);
   digitalWrite(sleep_pin, HIGH);  
   delay(5);  
  
  scancount = 0;
  steps = 0;
  
}

void loop() {

//state = false;


 if (digitalRead(start_switch)== LOW); {
 delay(20);
state = !state;

}



while ((scancount<25) && (state = true) && steps < 16) {
    digitalWrite(enable_pin, LOW);
      digitalWrite(dir_pin, LOW); 
      digitalWrite(step_pin, HIGH);
      delay(10);
      digitalWrite(step_pin, LOW);
      delay(10);
      steps++;   // Stepperschritte hochzählen
     
  }
           
 if (scancount<25)  {        
          delay(delay_time/2);
          digitalWrite(focus_pin, HIGH);
          delay(focus_time);
          digitalWrite(trigger_pin, HIGH);
          delay(trigger_time);
          digitalWrite(trigger_pin, LOW); 
          digitalWrite(focus_pin, LOW);
          delay((delay_time/2) - trigger_time);
          scancount++; //Scandurchgang hochzählen
          steps = 0; //Stepperschritte zurücksetzen
         Serial.print(scancount);
 }

  else {
  digitalWrite(focus_pin, LOW);
  digitalWrite(trigger_pin, LOW);
}
}

Das Semikolon in der if-Abfrage muss weg.
if (digitalRead(start_switch)== LOW) {

Hallo @HotSystems,

ich hab mal das Semikolon entfernt, allerdings ohne Erfolg. Das Programm startet noch immer, sobald der Arduino Strom hat.

Zeige den aktuellen Sketch.

Anbei der Sketch,

//Foto-Drehteller


#define step_pin 4    // Step Pin DRV8825
#define trigger_pin A0 //Pin für Auslöser
#define focus_pin A1   //Pin für Autofocus
#define dir_pin 3     // Direction Pin DRV8825
#define enable_pin 5  // Enable Pin DRV8825
#define sleep_pin 11   // Pin 11 Verbunden mit SLEEP pin
#define start_switch 2 // Pin 2 verbunden mit Start/Stop-Schalter
const int trigger_time = 100; //Zeit, die der Auslöser gedrückt wird
int delay_time = 3000; // Gesamtzeit für eine Aufnahme
int focus_time = 1500; //Zeit zum fokusieren
volatile boolean state = false;  
int steps;        //Stepperschritte
int scancount;    //Zähler für Scanschritte


void setup() {
   Serial.begin(9600);
   pinMode(dir_pin, OUTPUT);
   pinMode(step_pin, OUTPUT);
   pinMode(enable_pin, OUTPUT);
   pinMode(trigger_pin, OUTPUT);
   pinMode(focus_pin, OUTPUT);
   pinMode(sleep_pin, OUTPUT);
   pinMode(start_switch, INPUT_PULLUP);
   digitalWrite(trigger_pin, LOW);
   digitalWrite(focus_pin, LOW);
   digitalWrite(enable_pin, HIGH);
   digitalWrite(sleep_pin, HIGH);  
   delay(5);  
  
  scancount = 0;
  steps = 0;
  
}

void loop() {

//state = false;


 if (digitalRead(start_switch)== LOW) {
 delay(20);
state = !state;

}



while ((scancount<25) && (state = true) && steps < 16) {
    digitalWrite(enable_pin, LOW);
      digitalWrite(dir_pin, LOW); 
      digitalWrite(step_pin, HIGH);
      delay(10);
      digitalWrite(step_pin, LOW);
      delay(10);
      steps++;   // Stepperschritte hochzählen
     
  }
           
 if (scancount<25)  {        
          delay(delay_time/2);
          digitalWrite(focus_pin, HIGH);
          delay(focus_time);
          digitalWrite(trigger_pin, HIGH);
          delay(trigger_time);
          digitalWrite(trigger_pin, LOW); 
          digitalWrite(focus_pin, LOW);
          delay((delay_time/2) - trigger_time);
          scancount++; //Scandurchgang hochzählen
          steps = 0; //Stepperschritte zurücksetzen
         Serial.print(scancount);
 }

  else {
  digitalWrite(focus_pin, LOW);
  digitalWrite(trigger_pin, LOW);
}
}

Allein das state = true bricht Dir das Genick. Das ist eine Zuweisung. Wenn Du vergleichen willst, brauchst Du zwei ==

Und dann bau daraus ne StateMachine.

Hallo,
ich hab das noch nicht ganz verstanden. Mit dem Starttaster soll der Vorgang starten, und sollen dann automatisch alle 25 Bewegungen durchlaufen. Oder soll es so sein das nach jeder Bewegung der Starttaster erneut gedrückt werden muss.?

Heinz

Er macht 25 Bilder.
Für jedes Bild dreht der Teller 16 Steps.
Den Vorgang will er mit einem Taster starten.
Dann alles einmal im Umlauf - und Schluß, bis sich wieder ein Tastendruck meldet....

Ja genau, so wär der Plan :wink:

Du hast meins oben gelesen und den ersten Teil probiert?

Ja, habs auf

while ((scancount<25) && (state == true) && steps < 16) {

geändert, ändert aber leider auch nichts

Las mir mal nen Moment - ich zieh mal den Code und bau was.

Hallo,
dann kann ich mich ja entspannt auf die Couch begeben. :wink: Ich wollte da gerade auch mal dran , mir war der Ablauf aber noch nicht ganz klar.
Gruß Heinz

Hallo,
ändere mal den Abschnitt, ist zwar murx geht aber

while (digitalRead(start_switch)== HIGH) { // hier einen doofe schleife 
 delay(20);
}
Serial.println("es geht los");

while (scancount<25  && steps < 16) {  // das state raus sonnst alles wie gehabt

naja...
war wohl nichts :wink:

So ich hab mal was umgebaut - derzeit compiliert es, aber noch mit delays und nicht schick...

//Foto-Drehteller
const byte triggerPin = A0;            // Pin für Auslöser
const byte focusPin = A1;              // Pin für Autofocus
const byte dirPin = 3;                 // Direction Pin DRV8825
const byte stepPin = 4;                // Step Pin DRV8825
const byte enablePin = 5;              // Enable Pin DRV8825
const byte sleepPin = 11;              // Pin 11 Verbunden mit SLEEP pin
const byte startSwitch = 2;            // Pin 2 verbunden mit Start/Stop-Schalter
const unsigned long triggerTime = 100; // Zeit, die der Auslöser gedrückt wird
const unsigned long receiveTime = 3000;// Gesamtzeit für eine Aufnahme
const unsigned long focusTime = 1500;  // Zeit zum fokusieren
boolean myStart = false;
unsigned int steps;        //Stepperschritte
const unsigned int maxCount = 25;
unsigned int scancount;    //Zähler für Scanschritte


void setup()
{
  Serial.begin(9600);
  pinMode(dirPin, OUTPUT);
  pinMode(stepPin, OUTPUT);
  pinMode(enablePin, OUTPUT);
  pinMode(triggerPin, OUTPUT);
  pinMode(focusPin, OUTPUT);
  pinMode(sleepPin, OUTPUT);
  pinMode(startSwitch, INPUT_PULLUP);
  digitalWrite(triggerPin, LOW);
  digitalWrite(focusPin, LOW);
  digitalWrite(enablePin, HIGH);
  digitalWrite(sleepPin, HIGH);
  delay(5);
  scancount = 0;
  steps = 0;
}

void loop()
{
  if (digitalRead(startSwitch) == LOW)
  {
    delay(20);
    myStart = true;
  }
  if (scancount >= maxCount)
  {
    scancount = 0;
    steps = 0;
    myStart = false;
  }
  if (myStart == true)
  {
    if (steps < 16)
    {
      digitalWrite(enablePin, LOW);
      digitalWrite(dirPin, LOW);
      digitalWrite(stepPin, HIGH);
      delay(10);
      digitalWrite(stepPin, LOW);
      delay(10);
      steps++;   // Stepperschritte hochzählen
    }
    delay(receiveTime / 2);
    digitalWrite(focusPin, HIGH);
    delay(focusTime);
    digitalWrite(triggerPin, HIGH);
    delay(triggerTime);
    digitalWrite(triggerPin, LOW);
    digitalWrite(focusPin, LOW);
    delay((receiveTime / 2) - triggerTime);
    scancount++; //Scandurchgang hochzählen
    steps = 0; //Stepperschritte zurücksetzen
    Serial.print(scancount);
  }
  else
  {
    digitalWrite(focusPin, LOW);
    digitalWrite(triggerPin, LOW);
  }
}

Einfach nur mal laufen lassen.
Mal sehen, was passiert.

Ich probiers morgen mal aus, danke schon mal.

Dann mal die Zeile ändern:

in: while (steps < 16)
Ich war mit dem if schon weiter.....

Funktioniert! Super, vielen Dank!

So und jetzt machen wir daraus ne Statemachine und das ganze delay() da raus?