Aller au contenu


Photo
- - - - -

Pause générale d'un programme

Arduino

  • Veuillez vous connecter pour répondre
4 réponses à ce sujet

#1 Kaquaoify

Kaquaoify

    Membre occasionnel

  • Membres
  • Pip
  • 99 messages
  • Gender:Male
  • Location:Derrière mon pare-feu
  • Interests:Informatique, programmation, développement, spaghettis

Posté 04 mai 2015 - 10:13

Bonjour !

 

 

Après le montage de mon joli robot, j'ai un trajet à lui faire faire. Cela dit, sur son chemin il peut y avoir des obstacles imprévus, ce qui fait que je l'ai équipé de magnifique capteurs.

 

Mon problème maintenant c'est comment faire pour que quand un capteur sois activé:

 

- Le robot s'arrête directement

- La programmation du temps de trajet se mette en pause pour pas tout dérégler.

 

Actuellement dans mon programme, le moteur s'arrête et c'est juste, mais le programme du trajet continue entre 2 et je ne veux pas.

 

Donc comment faire une "pause globale" du programme ?

 

Merci d'avance !

  //Déclaration des variables
    int AvD = 0; //Capteur avant-droite
    int AvG = 0; //Capteur avant-gauche
    int ArD = 0; //Capteur arrière-droite
    int ArG = 0; //Capteur arrière-gauche
    

void setup() 
{
  //Adressage des moteurs
  //Moteur 1
    pinMode(12, OUTPUT); //Indique la direction du moteur
    pinMode(9, OUTPUT); //Active ou désactive le frein du moteur

  //Moteur 2
    pinMode(13, OUTPUT); //Indique la direction du moteur
    pinMode(8, OUTPUT); //Active ou désactive le frein du moteur

  //Adresse des capteurs
    pinMode(28, INPUT); //Capteur Avant-droite
    pinMode(26, INPUT); //Capteur avant-gauche
    pinMode(22, INPUT); //Capteur arrière-droite
    pinMode(24, INPUT); //Capteur arrière-gauche

  //Adressage du système de départ
    pinMode(30, INPUT); //Système de départ
    
  
}

void loop() 
{
  avant();
  delay(1000);
  arriere();
  delay(1000);
}

void avant()
{
  AvG = digitalRead(26);
  
  if (AvG == HIGH)
  {
      digitalWrite(12, HIGH);
      digitalWrite(9, LOW);
      analogWrite(3, 255);
      digitalWrite(13, HIGH);
      digitalWrite(8, LOW);
      analogWrite(11, 255);
      
  }
  else
  {
      digitalWrite(9, HIGH);
      digitalWrite(8, HIGH);
  }


}

void arriere()
{
  AvG = digitalRead(26);
  
  if (AvG == HIGH)
  {
      digitalWrite(12, LOW);
      digitalWrite(9, LOW);
      analogWrite(3, 255);
      digitalWrite(13, LOW);
      digitalWrite(8, LOW);
      analogWrite(11, 255);
      
  }
  else
  {
      digitalWrite(9, HIGH);
      digitalWrite(8, HIGH);
  }


}

La théorie, c'est quand ça marche pas, mais on sait pourquoi.

La pratique, c'est quand ça marche, mais on sait pourquoi.

Quand la pratique rejoint la théorie, ça marche pas et on sait pas pourquoi


#2 darkzz

darkzz

    Membre occasionnel

  • Membres
  • Pip
  • 83 messages

Posté 04 mai 2015 - 12:09

Hey !

 

La première idée qui me vient à l'esprit est d'utiliser un drapeau (flag) initialisé à zéro. En programmation un flag est juste une variable, un "int" par exemple qui prend souvent deux valeurs : 1 pour activé et 0 pour désactivé.

Quand ton capteur détectera quelquechose, il mettra la valeur "1" dans le flag. Après il suffit juste de dire ta fonction qui calcule le temps de trajet n'est appelée que si le flag vaut 0.

 

En gros :

 

if (Flag == 0 ) // Le capteur n'a rien détecté

{

     Calcultempstrajet();

}

else if (Flag == 1) // Le capteur a détecté quelquechose

{

    PauseTempsTrajets();

}

 

La fonction PauseTempsTrajets peut par exemple stopper le compteur du temps de trajet.

 

Je sais que ce n'est peut être pa la solution la plus propre (en termes de ressources, etc.) mais en tout cas c'est la plus simple à comprendre et implémenter.

 

N'hésite pas si tu a des questions.

 

Par contre dans le code que tu a fournis, il n'y a pas la fonction qui calcul le temps de trajet, du coup on ne sait pas trop quand elle est appelée.

 

Darkzz



#3 Kaquaoify

Kaquaoify

    Membre occasionnel

  • Membres
  • Pip
  • 99 messages
  • Gender:Male
  • Location:Derrière mon pare-feu
  • Interests:Informatique, programmation, développement, spaghettis

Posté 04 mai 2015 - 01:48

MErci de ta réponse.

 

La fonction du temps de trajet c'est "loop"

 

On avance pendant 1000ticks et on recule pendant 1000ticks (c'est du basique, le trajet sera plus évolué après.)

 

Mais j'aimerai que si on se trouve pendant la fonction avant(), par exemple a 556ticks, et que le capteur détecte qqch, le delay se mette en pause à 556 et quand le capteur ne détecte plus rien, il reprenne à 556, je sais pas si tu vois ce que je veux dire...

 

parce que là, je lance le programme, la fonction loop appelle la fonction avant, du coup le robot va en avant pendant un delay de 1000, et si il détecte qqch, les moteurs s'arrêtent, mais pas la fonction loop. Et c'est elle que j'aimerai mettre en pause.


La théorie, c'est quand ça marche pas, mais on sait pourquoi.

La pratique, c'est quand ça marche, mais on sait pourquoi.

Quand la pratique rejoint la théorie, ça marche pas et on sait pas pourquoi


#4 darkzz

darkzz

    Membre occasionnel

  • Membres
  • Pip
  • 83 messages

Posté 05 mai 2015 - 11:41

La seule solution pour interrompre un "delay" est d'utiliser une interruption externe. 

Ton capteur est de quel type ? (Tout-ou-rien, analogique, numérique).

 

S'il est de type TOR (Tout-ou-Rien, comme un interrupteur), tu peux l'utiliser pour générer une interruption. Je t'invite à regarder cet article qui t'explique un peu les interruptions externes sur Arduino : http://michael.bouvy.net/blog/fr/2013/06/01/interruptions-arduino-atmega-delay-timer/

 

Sinon, il n'est pas possible d'interrompre un "delay" puisqu'en fait l'arduino effectue des opérations "NOP" (No Operation, ce qui veut dire qu'il ne fait rien) pendant un "delay".

 

Je vois aussi une solution à base de timer mais qui paraît beaucoup plus compliquée...

 

N'hésite pas si je n'ai pas été clair...

 

Darkzz



#5 Kaquaoify

Kaquaoify

    Membre occasionnel

  • Membres
  • Pip
  • 99 messages
  • Gender:Male
  • Location:Derrière mon pare-feu
  • Interests:Informatique, programmation, développement, spaghettis

Posté 05 mai 2015 - 10:56

Tu as été très clair, j'étais déjà tombé sur ce lien.

 

Mais entre deux j'ai trouvé un autre moyen d'arriver à mes fins :diablo:

  //Déclaration des variables
    int AvD; //Capteur avant-droite
    int AvG; //Capteur avant-gauche
    int ArD; //Capteur arrière-droite
    int ArG; //Capteur arrière-gauche
    int goupille; //Système de départ
    int f1_done; //Détéction de fin de la fonction 1
    int f2_done; //Détéction de fin de la fonction 2
void setup() 
{
  //Adressage des moteurs
  //Moteur 1
    pinMode(12, OUTPUT); //Indique la direction du moteur
    pinMode(9, OUTPUT); //Active ou désactive le frein du moteur

  //Moteur 2
    pinMode(13, OUTPUT); //Indique la direction du moteur
    pinMode(8, OUTPUT); //Active ou désactive le frein du moteur

  //Adresse des capteurs
    pinMode(28, INPUT); //Capteur Avant-droite
    pinMode(26, INPUT); //Capteur avant-gauche
    pinMode(22, INPUT); //Capteur arrière-droite
    pinMode(24, INPUT); //Capteur arrière-gauche

  //Adressage du système de départ
    pinMode(50, INPUT); //Système de départ
    
  //Initilaise les messages écran
    Serial.begin(9600);
    f1_done = 0;
    f2_done = 0;

}

void loop() 
{
  AvG = digitalRead(26);
  AvD = digitalRead(28);
  ArD = digitalRead(22);
  ArG = digitalRead(24);
  goupille = digitalRead(50);

  depart();
  droite();
  Serial.println("Pas de conditions résolues");
}

void depart()
{
    while(goupille == HIGH && f1_done != 1000 && AvG == HIGH && AvD == HIGH)
    {
          AvG = digitalRead(26);
          AvD = digitalRead(28);
          goupille = digitalRead(50);
          
          digitalWrite(12, HIGH);
          digitalWrite(9, LOW);
          analogWrite(3, 255);
          digitalWrite(13, HIGH);
          digitalWrite(8, LOW);
          analogWrite(11, 255); 
          delay(10);
          f1_done++;
          Serial.println(f1_done);

    }
          digitalWrite(9, HIGH);
          digitalWrite(8, HIGH);
}

void droite()
{
  while(f1_done == 1000 && ArD == HIGH && f2_done != 100)
  {
          digitalWrite(12, HIGH);
          digitalWrite(9, LOW);
          analogWrite(3, 255);
          digitalWrite(13, LOW);
          digitalWrite(8, LOW);
          analogWrite(11, 255); 
          delay(10);
          f2_done++;
          Serial.println(f2_done);
  }
          digitalWrite(9, HIGH);
          digitalWrite(8, HIGH);
}          

Le trajet sera tracé à tâtons mais c'est fiable et simple à mettre en marche :)

 

Merci de tes réponses et bonne soirée !


La théorie, c'est quand ça marche pas, mais on sait pourquoi.

La pratique, c'est quand ça marche, mais on sait pourquoi.

Quand la pratique rejoint la théorie, ça marche pas et on sait pas pourquoi






Aussi étiqueté avec au moins un de ces mots-clés : Arduino

0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users