Outils pour utilisateurs

Outils du site


ateliermobile

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
ateliermobile [2016/09/27 18:57]
melo
ateliermobile [2016/09/27 19:20]
melo
Ligne 64: Ligne 64:
  
 __Programme__ __Programme__
-\\ mode d'​emploi ​programme+\\ Mode d'​emploi ​ 
 +Le programme ​a été pensé de manière à ce qu'au passage de la carte, les actions à effectuer se stockent dans une liste. Une fois la carte passée et que 4 secondes se sont écoulées sans qu'un capteur n'ai reçu d'​informations,​ la liste d'​actions sera effectuée après l'​appui sur le bouton. Une fois la liste exécutée, un appui de 2s sur le bouton l'​effacera. Le robot sera alors prêt à lire et stocker les instructions dictées par une nouvelle carte à trous. 
 + 
 + 
 +\\ Améliorations possibles : 
 +  * Inclure des LEDs pour indiquer si on peux : passer une carte à trous, appuyer sur le bouton pour exécuter la liste, appuyer sur le bouton pour effacer la liste. 
 + 
 +\\ Code 
 + 
 +<​code>​ //entrées capteurs infrarouges/​bouton 
 +int capt = 2; 
 +int capt2 = 4; 
 +int capt3 = 5; 
 +int bouton = 8; 
 + 
 +//valeurs capteurs : 
 +int val; 
 +int val2; 
 +int val3; 
 +int PreviousVal;​ 
 +int PreviousVal2;​ 
 +int PreviousVal3;​ 
 + 
 +#define MAX_Liste 100 
 +int Liste[MAX_Liste];​ //création de la liste 
 +int frame = 0; //compteur d'​étapes  
 + 
 +#define STATE_PROG 0 
 +#define STATE_EXEC 1 
 +#define STATE_DONE 2 
 +int State = STATE_PROG;​ 
 + 
 +int temps_defini = 2000; //​définition du temps de maintient du bouton désiré en ms 
 +long debut_appui1;​ //variable de stockage du temps  
 + 
 +//sorties moteurs : 
 +int pinI1 = 9;  
 +int pinI2 = 10; 
 +int pinI3 = 12;  
 +int pinI4 = 13; 
 +int speedpin = 11;  
 +long test4sec; //deuxieme variable de stockage de temps 
 + 
 +void setup() { 
 +  pinMode (2, INPUT); 
 +  pinMode(4, INPUT); 
 +  pinMode(5, INPUT); 
 +  pinMode(8, INPUT_PULLUP);​ 
 +  Serial.begin(9600);​ 
 +  pinMode (pinI1, OUTPUT); 
 +  pinMode (pinI2, OUTPUT); 
 +  pinMode (speedpin, OUTPUT); 
 +  pinMode (pinI3, OUTPUT); 
 +  pinMode (pinI4, OUTPUT); 
 +
 + 
 +void loop() { 
 +  val = digitalRead(capt);​ //lecture des entrées de capteurs :  
 +  val2 = digitalRead(capt2); ​   
 +  val3 = digitalRead(capt3); ​   
 +  int etatBouton = digitalRead(bouton);​ //lecture de l'​état du bouton (0/1) 
 + 
 + 
 +//si mode programmation 
 +if (STATE_PROG == State){ 
 +  if (val != PreviousVal || val2 != PreviousVal2 || val3 != PreviousVal3) { 
 +    if ( val == 0 && val2 == 0 && val3 == 0) { 
 +      PreviousVal = val; 
 +      PreviousVal2 = val2; 
 +      PreviousVal3 = val3; 
 +      //​comparaison des valeurs des capteurs entre les anciennes valeurs et les nouvelles 
 +      test4sec = millis(); 
 +      Serial.println(test4sec);​ 
 +    } else { 
 +      if (PreviousVal == 0 && PreviousVal2 == 0 && PreviousVal3 == 0) { 
 +        if (frame < MAX_Liste) { 
 +          if (val == 1) { 
 +            Liste[frame] = 100; 
 +          } else if (val2 == 1) { 
 +            Liste[frame] = 10; 
 +          } else if (val3 == 1) { 
 +            Liste[frame] = 1; 
 +          } 
 +          PreviousVal = val; 
 +          PreviousVal2 = val2; 
 +          PreviousVal3 = val3; 
 +          frame++; //​incrémentation pour passer à la case suivante 
 +          //rangement dans la liste uniquement si changement d'​état.  
 +        } 
 +      } 
 +    } 
 +  } 
 +  if(frame >=1){ //si la liste est remplie d'au moins une valeur 
 +    if ( val == 0 && val2 == 0 && val3 == 0) { //que chaque valeur est égale à 0 
 +      if(millis()-test4sec>​4000){ //et que millis - test4sec est supérieur à 4 secondes 
 +         ​Serial.println("​OKAY"​);​ //on enregistre la liste  
 +         State = STATE_EXEC; //on passe en état exécution 
 +      } 
 +    } 
 +  } 
 +
 + 
 +if ( STATE_EXEC == State) {    
 +    analogWrite(speedpin,​ 250); //​initialiser la vitesse d'​exécution des moteurs 
 +    if (etatBouton == 0) {  
 +      for (int i = 0; i < frame; i = i + 1) { 
 +        Serial.print("​ligne bande perforee: "); 
 +        Serial.print(i);​ 
 +        Serial.println();​ 
 +        Serial.print("​valeur:​ "); 
 +        Serial.println(Liste[i]);​ //une fois que l'on atteind les 5 données, si le bouton est appuyé (0), alors on imprime sur le moniteur les valeurs récoltées 
 +        //quand on obtient 100, on avance dans un seul sens ; quand on obtient un 1, on tourne dans un seul sens; quand on obtient 10, on tourne dans le sens inverse 
 +        if(Liste[i] == 100 || Liste[i] == 1){ 
 +           ​digitalWrite(pinI1,​ LOW); 
 +           ​digitalWrite(pinI2,​ HIGH); 
 +         }  
 +         ​if(Liste[i] == 10){ 
 +          digitalWrite(pinI1,​ HIGH); 
 +          digitalWrite(pinI2,​ LOW); 
 +         }  
 +         //​quand on obtient 100, on avance dans un seul sens ; quand on obtient un 10, on tourne dans un seul sens; quand on obtient 1, on tourne dans le sens inverse 
 +         ​if(Liste[i] == 100 || Liste[i] == 10){ 
 +           ​digitalWrite(pinI3,​ LOW); 
 +           ​digitalWrite(pinI4,​ HIGH); 
 +         } 
 +         ​if(Liste[i] == 1){ 
 +           ​digitalWrite(pinI3,​ LOW); 
 +           ​digitalWrite(pinI4,​ HIGH); 
 +         } 
 +        delay(1000);​  
 +         ​debut_appui1 = millis(); //si le bouton est relâché, alors on stocke le chiffre que le compteur affiche à partir de ce moment dans la variable debut_appui1 
 +         } 
 +        State = STATE_DONE; //une fois la liste exécutée, on passe à statut suivant (STATE_DONE) 
 +      } 
 +    } 
 + 
 +  if ( STATE_DONE == State) //a-t-on bien terminé notre action ? si oui... 
 +  { 
 +       ​digitalWrite(pinI1,​ LOW); 
 +       ​digitalWrite(pinI2,​ LOW); //on remet les sorties moteur à 0 
 +       ​digitalWrite(pinI3,​ LOW); 
 +       ​digitalWrite(pinI4,​ LOW); 
 +     if (etatBouton == 1) //si bouton relâché 
 +    { 
 +      debut_appui1 = millis(); //alors on stocke le chiffre que le compteur affiche à partir de ce moment dans la variable debut_appui1 
 +      delay(1000);​ 
 +    } 
 +    else if ((millis() - debut_appui1) >= temps_defini) //est-ce que le temps choisi est écoulé ? compteur - debut_appui1 = ou > au temps défini, alors...  
 +    { 
 +      for(frame = 0; frame <  MAX_Liste; frame++){ 
 +        Liste[frame] = 0;  
 +      } 
 +      frame = 0; 
 +      State = STATE_PROG; ​       
 +      for (int frame = 0; frame < MAX_Liste; frame++) 
 +      { 
 +        Serial.print("​ligne bande perforee: "); 
 +        Serial.print(frame);​ 
 +        Serial.println();​ 
 +        Serial.print("​valeur:​ "); 
 +        Serial.println(Liste[frame]); ​   
 +      } //on remet tout à 0, et on vérifie en imprimant la liste dans le moniteur  
 +    } 
 +  } 
 +} </​code>​
  
 __Design__ __Design__
ateliermobile.txt · Dernière modification: 2016/09/27 19:20 par melo