/* Mise en route séquencielle de 4 moteurs.
On utilise un double compteur.
L' Int EngineNbr sert à allumer les moteurs dans l'ordre 1,2,3,4.
L' Int LoopNbr sert à temporiser la mise enroute entre les moteurs.
Il faut 5 à 10 Loops de temporisation selon les moteurs.
La Pin 3 est utilisée comme arrêt externe, en Pull down. En PullUp c'est trop sensible.
Les vibrations des moteurs entraînent le déclenchement de l'EmerStop, donc les
isoler de la breadboard.
*/
int const Rouge=5; //Couleur des 4 moteurs.
int const Verte=9;
int const Jaune=10;
int const Bleue=11;
int const Start=2; //Bp vert
int const Stop=3; //Bp rouge
int const RunUp=6; //Bp bleu
int const TakeOff=7; //Bp jaune
int const Buzzer=4;
int Rmp;
int Rmp1=20; //ralenti
int Rmp2=150; //warm up
int RmpTO=220; //takeoff power
int EngineNbr=1;
int LoopNbr=0;
int RunUpNbr=0;
unsigned long myTime;
bool Emergency=false;
bool Eng4On=false;
bool Eng1=false;
bool Ralenti=false;
bool NoRunUp=false;
void setup() {
for(int pinNumber=9;pinNumber<12;pinNumber++)
{pinMode(pinNumber,OUTPUT);}
pinMode(6, INPUT_PULLUP);
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT);
pinMode(5, OUTPUT);
pinMode(7, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(Stop),EmerStop,RISING); //Emer Stop.
Serial.begin(9600);
}
void loop() {
One: //Retour d'arrêt Stop.
Emergency=false; //Initialisation des variables.
Eng4On=false;
EngineNbr=1;
LoopNbr=0;
RunUpNbr=0;
Ralenti=false;
NoRunUp=false;
for(int pinNumber=9;pinNumber<12;pinNumber++)
{digitalWrite(pinNumber, LOW);}
digitalWrite(Rouge, LOW);
Rmp=Rmp1;
while(digitalRead(Start)==HIGH) {} //mise en route Bp vert.
tone(Buzzer,40,700); //Buzzer
Two: //Retour de Loop normale.
if (Emergency==true) {goto One;} //Ceci est le point de retour de l'EmerStop.
myTime=millis();//myTime=millis(); //affichage du temps écoulé. Sert au débug.
delay(5);
if (EngineNbr==1 && digitalRead(Start)==LOW && LoopNbr>5) //Allumage Engine 1.
{analogWrite(Rouge,Rmp);
EngineNbr=++EngineNbr;
Eng1=true;
LoopNbr=0;}
if (EngineNbr==2 && digitalRead(Start)==LOW && LoopNbr>6) //Engine 2.
{analogWrite(Verte, Rmp);
EngineNbr=++EngineNbr;
LoopNbr=0;}
if (EngineNbr==3 && digitalRead(Start)==LOW && LoopNbr>6)
{analogWrite(Jaune, Rmp);
EngineNbr=++EngineNbr;
LoopNbr=0;}
if (EngineNbr==4 && digitalRead(Start)==LOW && LoopNbr>10)
{analogWrite(Bleue, Rmp);
EngineNbr=++EngineNbr;
Eng4On=true;
LoopNbr=0;}
if (Eng1==true) {LoopNbr=++LoopNbr;} //Temporisation de mise en route entre moteurs.
//digitalRead(Rouge)==HIGH plante le programme. Moteur Rouge refuse de démarrer.
if (EngineNbr>=5 && digitalRead(RunUp)==LOW && LoopNbr>=10 && NoRunUp==false){
EngineNbr=++EngineNbr;
Rmp=Rmp2;
analogWrite(Jaune,Rmp2); //mise en chauffe de deux moteurs à la fois.
delay(500);
analogWrite(Rouge,Rmp2);
delay(500);
analogWrite(Rouge,Rmp1);
analogWrite(Jaune,Rmp1);
delay(1000);
analogWrite(Verte,Rmp2);
delay(1000);
analogWrite(Bleue,Rmp2);
delay(1000);
analogWrite(Verte,Rmp1);
analogWrite(Bleue,Rmp1);
RunUpNbr=++RunUpNbr;
LoopNbr=0;} //il faut qq mise en chauffe mini pour pouvoir décoller.
Serial.print("Engine Nbr:");
Serial.print(EngineNbr);
Serial.print(" Loop Nbr:");
Serial.print(LoopNbr);
Serial.print(" Time:");
Serial.print(myTime/=1000); //affichage en secondes.
Serial.print(" Rmp:");
Serial.print(Rmp);
Serial.print(" RunUp:");
Serial.println(RunUpNbr);
delay(1000);
if(Ralenti==true && digitalRead(TakeOff)==LOW)
{
Rmp=Rmp-20; //Réduction Rmp par pas de 20.
analogWrite(Rouge,Rmp);
analogWrite(Verte,Rmp);
analogWrite(Jaune,Rmp);
analogWrite(Bleue,Rmp);
if(Rmp<=120){Ralenti=false;} //Condition pour repasser à Take Off power, à Rmp=120.
LoopNbr=0;}
//Avec 3 RunUp on peut afficher la puissance de décollage.
if (RunUpNbr>=3 && digitalRead(TakeOff)==LOW && Eng4On==true && LoopNbr>=6 && Ralenti==false)
{Rmp=RmpTO;
analogWrite(Rouge,Rmp);
analogWrite(Jaune,Rmp);
analogWrite(Verte,Rmp);
analogWrite(Bleue,Rmp);
Ralenti=true; //condition pour passer au ralenti.
NoRunUp=true; //inhibe le bouton RunUp après décollage.
delay(500);}
LoopNbr=++LoopNbr;
goto Two;
}
void EmerStop() { //Emergency Stop bouton Rouge. AttachToInterrupt.
tone(Buzzer,100,1000);
Emergency=true;
}