Pendant notre deuxième édition de Game Of Drone, l'épreuve de pilotage consistait à faire voler le drone autour de trois potos. Pour l'occasion nous avons créer un jeu de lumière.
Petite explication: Trois potos sont placés en triangle. Au sommet de chacun d'eux, se trouve une lampe. Lorsque le drone commence l'épreuve il doit faire un tour du poto qui à sa lampe qui clignote. Lorsqu'il à fait un tour complet, la lampe s'arrête de clignoter et reste allumée puis le poto suivant se met à clignoter… puis le troisième !
Notre problématique était donc de faire un code arduino pour controller ce système.
Notre système peut être dans 5 états différents: -Tous les potos éteint -Le premier poto qui clignote et le reste éteint -Le premier poto est allumé le deuxième clignotte et le troisième est éteint -Les deux premiers potos sont allumés, le troisième clignotte -Les trois potos sont allumés
Nous avons 5 boutons pour contrôler l'état du système.
La fréquence à laquelle clignote un poto est de 1Hz. Pour le code Arduino nous ne pourront pas utilisé la fonction delay() car il faut surveiller en même temps les boutons pour voir si l'utilisateur appuie dessus. Pour ce faire nous allons utiliser la technique de la machine à état. nous avons donc une variable state qui enregistre l'état dans lequel se trouve notre système. La fonction Loop tourne en boucle indéfiniment et lit constemment les 5 entrées auxquelles sont reliés les boutons. Ainsi, lorsque l'utilisateur appuie sur un bouton, on place dans la variable state l'état qui lui correspond.
Pour le clignotement on utilise la variable LED. A chaque occurence la fonction loop, on appel la fonction updateLED() qui mesure le temps écoulé et change l'état de LED entre 1 et 0 tous les 500ms.
La troisième fonction à juste le rôle de d'allumer les potos en fonction de l'état présent dans la variable state
int time; int state=0; int LED=0; void setup() { pinMode(7, INPUT); pinMode(6, INPUT); pinMode(5, INPUT); pinMode(4, INPUT); pinMode(3, INPUT); pinMode(12, OUTPUT); pinMode(11, OUTPUT); pinMode(10, OUTPUT); time=millis(); time_p=millis(); } // the loop function runs over and over again forever void loop() { if (digitalRead(7)==0) { state=0;} else if (digitalRead(6)==0) { state=1;} else if (digitalRead(5)==0) { state=2;} else if (digitalRead(4)==0) { state=3;} else if (digitalRead(3)==0) { state=4;} else state=state; updateLED(); blinkLED(); } void blinkLED(){ if (state==0) { digitalWrite(12, LOW); digitalWrite(11, LOW); digitalWrite(10, LOW); } if (state==1) { if (LED==1) { digitalWrite(12, HIGH); } else { digitalWrite(12, LOW); } digitalWrite(11, LOW); digitalWrite(10, LOW); } if (state==2) { digitalWrite(12, HIGH); digitalWrite(11, HIGH); } else { digitalWrite(11, LOW); } digitalWrite(10, LOW); if (state==3) { digitalWrite(12, HIGH); digitalWrite(11, HIGH); digitalWrite(10, HIGH); } else { digitalWrite(10, LOW); } if (state==4) { digitalWrite(12, LOW); digitalWrite(11, LOW); digitalWrite(10, LOW); } } void updateLED(){ if (time-millis()>500) { LED=1-LED; time=millis(); } }