Algorithme du stockage
Comme vu précédemment, nous allons procéder au stockage statique simple d'une pièce. L'événement déclencheur sera la détection d'une pièce à l'entrée du convoyeur.
Modélisation
Voici le diagramme d'état que nous allons implémenter :
Programmation de l'automate
Pour la partie programmation, nous allons ajouter une variable qui sert à mémoriser l'état en cours :
// A placer avant notre fonction "setup".
int storage_status = 0;
void loop() {
do_storage();
}
/**
* fonction de stockage
*/
void do_storage() {
if(storage_status == 0) {
if(isThereIncomingBox()) {
storage_status = 1;
}
} else if(storage_status == 1) {
if(hasTouchedCantileverBack()) {
stopCantilever();
moveArmTowardRack();
delay(500);
storage_status = 2;
} else {
moveCantileverBackward();
}
} else if(storage_status == 2) {
if(hasTouchedSwitchHorizontal()) {
moveArmTowardRack();
delay(300);
stopM2Horizontal();
storage_status = 3;
} else {
moveArmTowardConveyor();
}
} else if(storage_status == 3) {
if(hasTouchedSwitchVertical()) {
moveArmDown();
delay(4500);
stopVertical();
storage_status = 4;
} else {
moveArmUp();
}
} else if(storage_status == 4) {
if(hasTouchedCantileverFront()) {
stopCantilever();
storage_status = 5;
} else {
moveCantileverForward();
}
} else if(storage_status == 5) {
if(boxHasReachedEndOfConveyor()) {
stopConveyor();
moveArmUp();
delay(4000);
stopVertical();
storage_status = 6;
} else {
moveConveyorForward();
}
} else if(storage_status == 6) {
if(hasTouchedCantileverBack()) {
stopCantilever();
moveArmTowardRack();
delay(4700); // pour arriver à la colonne n°3
stopM2Horizontal();
storage_status = 7;
} else {
moveCantileverBackward();
}
} else if(storage_status == 7) {
if(hasTouchedSwitchVertical()) {
moveArmDown();
delay(300); // pour arriver au niveau de la ligne supérieure.
stopVertical();
storage_status = 8;
} else {
moveArmUp();
}
} else if (storage_status == 8) {
if(hasTouchedCantileverFront()) {
stopCantilever();
moveArmDown();
delay(500);
stopVertical();
storage_status = 9;
} else {
moveCantileverForward();
}
} else if (storage_status == 9) {
if(hasTouchedCantileverBack()) {
stopVertical();
stopCantilever();
storage_status = 10;
} else {
moveCantileverBackward();
}
} else if (storage_status == 10) {
warehouse_status = 0;
}
}