IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Thread ou comment faire tourner une routine en même temps que le programme principal


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Architecte matériel
    Inscrit en
    Septembre 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte matériel

    Informations forums :
    Inscription : Septembre 2015
    Messages : 23
    Par défaut Thread ou comment faire tourner une routine en même temps que le programme principal
    Bonjour,

    Je débute + avec l'Arduino et je ne comprends pas comment utiliser l'appel à une routine sans bloquer mon programme principal.

    Pour être plus clair, mon arduino communique avec mon ordi via le port COM.
    Sur le port COM je récupère une phrase (NMEA pour ceux qui connaisse) que je décompose pour avoir mon info qui se nomme LED (1 pour allumé et 0 pour éteint), pour éteindre ou allumer une led.

    Quand je reçois l'info LED à 1, je dois faire clignoter une LED sur la broche 3 en permanence jusqu'à ce que je recois l'info LEd à 0 sur le port COM.
    Pour cela, j'ai fait un bout de code que voici partiellement dans Void Loop:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     if (Serial.available()) {                  // Si des donnees sont disponibles
        received = Serial.readString();
    ...........
     if(String(nomtrame) == String ("SOS")) {
        String etat;
        etat=(valtrame.substring(0,1));    
        Serial.println("L'etat demandé est : " + etat);    
                  if(String(etat) == "1") {
                 SOS(etat);
                  Serial.println("Le SOS est lancé " ); 
                  }
                  if(String(etat) == "0") {
                      analogWrite(ledredPin1,0);          // Enfin on change l'etat de la LED ROUGE
     
                                        }                               
            }
    Et ensuite j'ai crée une fonction qui fait clignoter la sortie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    void SOS(String etat){ 
     
          do {
     
          for (int i=0; i <= 2; i++){ 
                  analogWrite(ledredPin1,255);          // Enfin on change l'etat de la LED ROUGE            
                  delay(400);
                   analogWrite(ledredPin1,0);          // Enfin on change l'etat de la LED ROUGE             
                  delay(400);             
                  }
                  delay(600);
     
            for (int j=0; j <= 2; j++){ 
                  analogWrite(ledredPin1,255);          // Enfin on change l'etat de la LED ROUGE             
                  delay(1500);
                  analogWrite(ledredPin1,0);           // Enfin on change l'etat de la LED ROUGE              
                  delay(1500);
                  }
                   delay(1);
     
                  delay(2000); 
     
    }
                  while (etat=="1");
    }

    Est ce que vous pourriez m'orienter vers une solution ?

    Merci

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 282
    Par défaut
    Bonsoir

    Le microcontrôleur c'est mono-coeur et sans OS. Donc pas de thread géré par un OS...
    Il faut que tout soit géré par ton programme principal.

    Quelques pistes ici: Probleme de compilation pour un grand debutant - Arduino

    Bonne suite

    Delias

  3. #3
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 907
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 907
    Par défaut
    sur petits micro-contrôleurs on règle souvent cela par la programmation par machines à états finis (un exemple dans cette discussion)

    ça ne tourne pas "en même temps" (puisqu'il n'y a qu'un seul micro-processeur/coeur) mais vous pouvez vous débrouiller pour que cela tourne suffisamment rapidement pour donner l'impression à un humain de simultanéité

  4. #4
    Membre averti
    Homme Profil pro
    Architecte matériel
    Inscrit en
    Septembre 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte matériel

    Informations forums :
    Inscription : Septembre 2015
    Messages : 23
    Par défaut
    Merci pour ces retours, je vais mettre en place une autre stratégie.

    Bonne journée !!

  5. #5
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    Bonjour,
    Ton problème peut être résolu avec une interruption TIMER (interruption sur débordement) que tu actives dès que if(String(etat) == "1") { activer_interruption_timer();} et que tu désactives dès que if(String(etat) == "0") { desactiver_interruption_timer();}


    Dans l'interruption TIMER il te faut juste faire un toogle de la LED

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // fonction d'interruption
    if (x == 0) {
          // Toggle on
          digitalWrite(ledredPin1, HIGH);
          x = 1;
     
        } else {
          // Toggle off
          digitalWrite(ledredPin1, LOW);
          x = 0;
        }


    Le TIMER doit être configuré pour déborder toutes les secondes ou 500ms par exemple, ou tout autre valeur mais l'important est que ça ne clignote pas trop vite. Il y a plein de réglage possible pour le TIMER avec des prédiviseurs (prescaler)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment faire tourner une roue de manière fluide
    Par Toinou- dans le forum Android
    Réponses: 0
    Dernier message: 02/05/2014, 21h48
  2. Comment faire tourner une image GIF ?
    Par Claude_Azoulai dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 28/07/2009, 10h21
  3. Réponses: 3
    Dernier message: 28/08/2007, 06h31
  4. Réponses: 7
    Dernier message: 28/06/2007, 08h26
  5. comment faire tourner une video en boucle sous Firefox?
    Par samsso2006 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 11/04/2007, 12h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo