Servo bewegen met behulp van een Micro Switch

Ik had nog een vraag over het programma wat ik geschreven heb, het programma heeft gewerkt maar om een of andere reden werkt hij niet meer.

de Setup:

pic basic code:

#include <Servo.h>
 
Servo mijnServo; 									// Servo wordt mijnServo genoemd
int buttonPin1 = 7;									// MicroSwitch 1 op pin 7
int buttonPin2 = 4;									// MicroSwitch 2 op pin 4
int buttonPin3 = 2;									// MicroSwitch 3 op pin 2
int buttonPin4 = 12;									// MicroSwitch 4 op pin 12 

//L293D
		//Motor A, Transport
const int motorPin1  = 5;  							// Pin 14 van L293
const int motorPin2  = 6;  							// Pin 10 van L293

		//Motor B, Drukken van de dop op flesje
const int motorPin3  = 10; 							// Pin  7 van L293
const int motorPin4  = 9;  							// Pin  2 van L293

void setup(){
 		// Servo wordt verbonden met pin 8
    mijnServo.attach(8);				
  		
  		// Pin van de Micro Switch 1 tm 4 zijn INPUTS
  	pinMode(buttonPin1, INPUT_PULLUP);
  	pinMode(buttonPin2, INPUT_PULLUP);
  	pinMode(buttonPin3, INPUT_PULLUP);
	pinMode(buttonPin4, INPUT_PULLUP);
  		
  		// Beginpunt van Servo is 0 graden
  	mijnServo.write(0);	
  
        // Pin van de Motorschakelingen zijn OUTPUTS
    pinMode(motorPin1, OUTPUT);
    pinMode(motorPin2, OUTPUT);
    pinMode(motorPin3, OUTPUT);
    pinMode(motorPin4, OUTPUT);
  
}

Wat ik eerst had (heeft gewerkt maar nu niet meer)

pic basic code:

void loop(){

  		// Motor A gaat draaien tot MicroSwitch 2 (1 -> 2)
  while (digitalRead(buttonPin1) == LOW);   
  while (digitalRead(buttonPin2) == HIGH);
  while (digitalRead(buttonPin3) == HIGH);
  while (digitalRead(buttonPin4) == HIGH);
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
  
  		// Motor A komt bij MicroSwitch 2 en stopt met draaien, servo komt in beweging
  while (digitalRead(buttonPin1) == HIGH);
  while (digitalRead(buttonPin2) == LOW);
  while (digitalRead(buttonPin3) == HIGH);
  while (digitalRead(buttonPin4) == HIGH);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
 	mijnServo.write(35);
	delay(1500);									// 1.5 Seconde wachten tot hij weer naar 0 graden draait
	mijnServo.write(0);
  
      	// Motor A gaat draaien als Micro Switch 2 nog ingedrukt is maar Micro Switch 3 nog niet
  while (digitalRead(buttonPin1) == HIGH);
  while (digitalRead(buttonPin2) == LOW);
  while (digitalRead(buttonPin3) == HIGH);
  while (digitalRead(buttonPin4) == HIGH);
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
  
  		// Motor A stopt met draaien wanneer hij Micro Switch 3 bereikt
  while (digitalRead(buttonPin1) == HIGH);
  while (digitalRead(buttonPin2) == HIGH);
  while (digitalRead(buttonPin3) == LOW);
  while (digitalRead(buttonPin4) == HIGH);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);

  		// Motor B gaat draaien, en draait weer terug
  while (digitalRead(buttonPin1) == HIGH);
  while (digitalRead(buttonPin2) == HIGH);  
  while (digitalRead(buttonPin3) == LOW);
  while (digitalRead(buttonPin4) == HIGH);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin4, LOW);
  delay(500);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, HIGH);
  delay(500);
  
  		// Motor A gaat draaien tot hij Micro Switch 4 bereikt
  while (digitalRead(buttonPin1) == HIGH);
  while (digitalRead(buttonPin2) == HIGH);
  while (digitalRead(buttonPin3) == LOW);
  while (digitalRead(buttonPin4) == HIGH);
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
  
  		// Motor A stopt en draait terug tot beginpunt (Het eindpunt)
  while (digitalRead(buttonPin1) == HIGH);
  while (digitalRead(buttonPin2) == HIGH);
  while (digitalRead(buttonPin2) == HIGH);
  while (digitalRead(buttonPin4) == LOW);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
  delay(500);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
  
  		// Motor A draait terug en komt langs MicroSwitch 3 maar moet verder
  while (digitalRead(buttonPin1) == HIGH);
  while (digitalRead(buttonPin2) == HIGH);
  while (digitalRead(buttonPin3) == LOW);
  while (digitalRead(buttonPin4) == HIGH);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);

  		// Motor A draait terug en komt langs MicroSwitch 2 maar moet verder
  while (digitalRead(buttonPin1) == HIGH);
  while (digitalRead(buttonPin2) == LOW);
  while (digitalRead(buttonPin3) == HIGH);
  while (digitalRead(buttonPin4) == HIGH);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
  
  		// Motor A komt bij Micro Switch 1 (Het beginpunt)
  while (digitalRead(buttonPin1) == LOW);
  while (digitalRead(buttonPin2) == HIGH);
  while (digitalRead(buttonPin3) == HIGH);
  while (digitalRead(buttonPin4) == HIGH);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
}

De micro switches krijgen allemaal een puls maar werken niet met elkaar samen, ik kan 1 micro switch aansturen derest werkt dan niet meer.
Ik dacht eraan om het zo aan te passen maar dat heeft nog niks geholpen:

pic basic code:

void loop(){


      // Motor A gaat draaien tot MicroSwitch 2 (1 -> 2)
  while (digitalRead(buttonPin1) == LOW && digitalRead(buttonPin2) == HIGH && digitalRead(buttonPin3) == HIGH && digitalRead(buttonPin4) == HIGH); { 

    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
  }



         // Motor A komt bij MicroSwitch 2 en stopt met draaien, servo komt in beweging
  while (digitalRead(buttonPin1) == HIGH && digitalRead(buttonPin2) == LOW && digitalRead(buttonPin3) == HIGH && digitalRead(buttonPin4) == HIGH);  {
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
  mijnServo.write(35);
  delay(1500);                  // 1.5 Seconde wachten tot hij weer naar 0 graden draait
  mijnServo.write(0);
  }
        // Motor A gaat draaien als Micro Switch 2 nog ingedrukt is maar Micro Switch 3 nog niet
  while (digitalRead(buttonPin1) == HIGH && digitalRead(buttonPin2) == LOW && digitalRead(buttonPin3) == HIGH && digitalRead(buttonPin4) == HIGH);  {
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
  }
      // Motor A stopt met draaien wanneer hij Micro Switch 3 bereikt
  while (digitalRead(buttonPin1) == HIGH && digitalRead(buttonPin2) == HIGH && digitalRead(buttonPin3) == LOW && digitalRead(buttonPin4) == HIGH);  {
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
  }
      // Motor B gaat draaien, en draait weer terug
  while (digitalRead(buttonPin1) == HIGH && digitalRead(buttonPin2) == HIGH && digitalRead(buttonPin3) == LOW && digitalRead(buttonPin4) == HIGH);{
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, HIGH);
    digitalWrite(motorPin4, LOW);
  delay(500);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, HIGH);
  delay(500);
  }
      // Motor A gaat draaien tot hij Micro Switch 4 bereikt
  while (digitalRead(buttonPin1) == HIGH && digitalRead(buttonPin2) == HIGH && digitalRead(buttonPin3) == LOW && digitalRead(buttonPin4) == HIGH);{
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
  }
      // Motor A stopt en draait terug tot beginpunt (Het eindpunt)
  while (digitalRead(buttonPin1) == HIGH && digitalRead(buttonPin2) == HIGH && digitalRead(buttonPin3) == HIGH && digitalRead(buttonPin4) == LOW); {
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
  delay(500);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
  }
      // Motor A draait terug en komt langs MicroSwitch 3 maar moet verder
  while (digitalRead(buttonPin1) == HIGH && digitalRead(buttonPin2) == HIGH && digitalRead(buttonPin3) == LOW && digitalRead(buttonPin4) == HIGH);{
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
  }
      // Motor A draait terug en komt langs MicroSwitch 2 maar moet verder
  while (digitalRead(buttonPin1) == HIGH && digitalRead(buttonPin2) == LOW && digitalRead(buttonPin3) == HIGH && digitalRead(buttonPin4) == HIGH); {
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
  }  
      // Motor A komt bij Micro Switch 1 (Het beginpunt)
  while (digitalRead(buttonPin1) == LOW && digitalRead(buttonPin2) == HIGH && digitalRead(buttonPin3) == HIGH && digitalRead(buttonPin4) == HIGH); {
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
  }
}

Mijn vraag is dus, hoe kan ik ervoor zorgen dat alle 4 mijn micro switches worden gelezen. Zodat het proces niet door elkaar gaat lopen of alleen maar 1 handeling uitvoerd.
Bij voorbaat dank!

Arco

Special Member

While loops zijn 'blocking', dus daar kom je niet meer uit voordat de toestand verandert.
Ik zou eerst eens een flow diagram tekenen, er is zo weinig touw aan vast te knopen. Sommige toestanden komen 3, 4 keer voor en steeds met een andere actie?
Het moet eigenlijk een 'non-blocking' state machine worden.

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Dus als ik het goed begrijp dan moet ik het programma met iets anders dan 'while' aanroepen, ik heb het geprobeerd met if..else alleen dat mocht niet baten..