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 :

Deux programmes simultanés


Sujet :

Arduino

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 15
    Points : 6
    Points
    6
    Par défaut Deux programmes simultanés
    Bonjour,

    Je suis étudiant en Terminal SSI et j'aurai besoin d'aide pour terminer mon projet de Science de l'ingénieur.
    Mon programme doit mesurer le temps entre 2 impulsions sur un bouton et ensuite, en fonction du temps mesuré, doit faire bouger un servomoteur.

    Pour mesurer le temps j'ai un programme qui me donne celui-ci en milliseconde : (millisBoutonOff est le temps à calculer)

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    unsigned long millisBoutonON = millis();
    int millisBoutonOff = 0;
    float milliisBoutonOff;
     
    void setup() {
      pinMode(butonPin, INPUT_PULLUP);                                                       
      Serial.begin(9600);
      chronoStatus = true;
    }
     
    void loop() {
     
      boutonState = digitalRead(butonPin);
      delay(10);                                  
     
      if (boutonState == LOW && chronoStatus == false) 
      {
        millisBoutonON = millis();
        Serial.println("Chrono ON");
        chronoStatus = true;
      }
     
      if (boutonState == HIGH && chronoStatus == true) 
      {
        millisBoutonOff = (millis() - millisBoutonON);
        Serial.println("Chrono OFF = " + String(millisBoutonOff));
        chronoStatus = false;
      }
    }
     
    Et pour le mouvement du servomoteur, j'en ai un autre :
     
     
    #include <Servo.h>
    Servo monservo;
     
    int Nbpas = 1400;
    int temps;
     
    void setup() {
     
    //Chronometre
    pinMode(butonPin, INPUT_PULLUP);                                                       
    Serial.begin(9600);
    chronoStatus = true;
     
    //Servomoteur
    monservo.attach(3);
     
    }
     
    void loop() {
    if ((temps)<(667)){//<90
    Nbpas = Nbpas - 200;
    }
    if ((temps>750) && (temps<2000)){//80>temps>30
    Nbpas = Nbpas + 200;
    }
    }
    if (Nbpas<800){
    Nbpas=800;}
    if (Nbpas>2200){
    Nbpas=2200;}
     
    monservo.write(Nbpas);
    delay(1000);
    }
    Mais quand je les assemble
    Cela me donne un peu n'importe quoi, le servomoteur ne va que dans un seul sens et le temps s'affiche très lentement et fais comme si je cliquait doucement alors que j'ai besoin d'un clicketie assez rapide.
    Je ne sais pas comment faire
    Je pensais à mettre le chrono en void afin de l'appelé seulement lorsque c'est nécessaire mais je ne sais pas comment faire cela

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Ce qui serait intéressant c'est de voir le programme combiné, celui qui est exécuté et qui donne ce résultat...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2016
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    J'aimerai juste avoir une précision le bouton poussoir que tu utilises est-il momentané ou à verrouillage, ensuite y a t'il une capa en parallèle pour supprimer les effets de rebon de ton bouton ?

    J'ai très bien compris ton premier programme, mais le second certaine partie me sont un peu floue pourrait donner plus explication concernant le but recherché.

    Ensuite une chose assez étrange lors de l'appel de ta méthode "monservo.write(Nbpas)" elle ne prend en paramètre qu'une valeur comprise entre 0 et 180 qui correspond à la position angulaire à laqulle tu souhaite placé ton servo moteur.
    https://www.arduino.cc/en/Reference/ServoWrite


    Ne serait ce pas plus tôt cette fonction que tu souhaites utiliser ? (writeMicroseconds() qui prend en paramètre une valeur en microsecond)
    https://www.arduino.cc/en/Reference/...teMicroseconds

    Ou je présume que la raison pour laquelle tu n'utilises pas cette fonction est que ton sevo moteur et un servo moteur à rotation continue je me trompe ?

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    C'est un bouton momentané.

    Dans mon second programme, je veux que mon servomoteur bouge selon un temps donné.
    Il faut savoir que mon servomoteur va de 800 à 2200 "Nbpas" (ceci n'est pas un angle mais des valeurs propres au ce servomoteur).
    Le servo est préalablement placé à 1400.
    Si le temps est < à 667 milliseconde, le servo doit se placé 200 "Nbpas" en dessous de ce qu'il est actuellement (-200).
    Si le temps est entre 750 et 2000 milliseconde, le servo doit se placé 200 "Nbpas" au dessus de ce qu'il est actuellement (+200).

    monservo.write(Nbpas) prend les données de 800 à 2200 sur mon servomoteur.

    Quand j'ai fait mes recherches pour avoir un programme qui réussi à compter le temps écoulé entre 2 click de bouton poussoir, je n'avais trouver que le programme que je vous ai présenté.
    Je ne sais pas comment fonctionne "writeMicroseconds()"

    Cordialement
    Mathieugalère

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Consultant en technologies
    Inscrit en
    Juin 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en technologies

    Informations forums :
    Inscription : Juin 2019
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour a tous hasard est ce que ça correspond :

    Syntax
    servo.writeMicroseconds(uS)

    Parameters
    servo: a variable of type Servo

    uS: the value of the parameter in microseconds (int)

    ?

  6. #6
    Modérateur

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

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bonjour Mathieu

    Le calcul que tu indiques ne s'effectue qu'une seule fois par seconde en raison du delay(1000); présent en fin de loop();.
    Plus ce délai est réduit, plus le servo ira vite jusqu'à ne plus pouvoir suivre la commande. Et d'ailleurs il doit manquer une incrémentation de temps dans le 2ème programme.

    Hors le premier programme n'est pas compatible avec l'utilisation d'un délai d'une seconde. Quelques ms de temporisation OK, mais pas plus. Je suppose que quand tu as fusionné les deux tu n'as pas repris le délai.

    Il faut utiliser la technique du BlinkWithoutDelay!
    Et bien faire attention que millis() est déjà utilisé dans le premier programme.

    Sur Arduino il n'y a pas de parallélisme, et donc pas plusieurs programmes en simultanés, mais un seul programme qui effectue plusieurs choses. Il faut le considérer à chaque fois!
    Il faut concevoir un seul programme qui fait toutes les tâches. Appondre le code de plusieurs loop dans une seule c'est généralement voué à l'échec.

    Bonne suite

    Delias

  7. #7
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour Mathieugalère
    Citation Envoyé par Mathieugalère Voir le message
    Mais quand je les assemble
    Comma a cité @al1_24
    Citation Envoyé par al1_24 Voir le message
    Ce qui serait intéressant c'est de voir le programme combiné, celui qui est exécuté et qui donne ce résultat...
    Se serait plus facile de t'aider!

    J'ai testé la partie lecture du bouton, quoi que incomplète, il manque des déclarations!
    Maintenant, montres nous comment tu as assemblé tout ça.

    Un petit conseil, pour ta séquence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (Nbpas<800){
    Nbpas=800;}
    if (Nbpas>2200){
    Nbpas=2200;}
    Regardes du côté de la fonction constrain(), ça fais plus "pro"

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Voici le programme complet

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    // Chronometre 
    const int  butonPin = 8;
    int boutonState = 0;
    bool chronoStatus;
     
    unsigned long millisBoutonON = millis();
    int millisBoutonOff = 0;
    float milliisBoutonOff;
     
    // Servomoteur
    #include <Servo.h>
    Servo monservo;
     
    int Nbpas = 1400;
    int temps;
     
     
    void setup() {
    //Chronometre
    pinMode(butonPin, INPUT_PULLUP);                                                       
    Serial.begin(9600);
    chronoStatus = true;
     
    //Servomoteur
    monservo.attach(3);
     
    }
     
    void loop() {
      // put your main code here, to run repeatedly:
    {
      boutonState = digitalRead(butonPin);
      delay(10);                                  
     
      if (boutonState == LOW && chronoStatus == false) 
      {
        millisBoutonON = millis();
        Serial.println("Chrono ON");
        chronoStatus = true;
      }
     
      if (boutonState == HIGH && chronoStatus == true) 
      {
        temps = (millis() - millisBoutonON);
        Serial.println("Chrono OFF = " + String(temps));
        chronoStatus = false;
      }
    }
     
    {
    if ((temps)<(667)){//>90
    Nbpas = Nbpas - 200;
    }
    if ((temps>857) && (temps<6000)){//70>temps>10
    Nbpas = Nbpas + 200;
    }
    }
     
    if (Nbpas<800){
    Nbpas=800;}
    if (Nbpas>2200){
    Nbpas=2200;}
    {
    monservo.write(Nbpas);
    Serial.println(Nbpas);
     
    }
    }
    Le problème était bien le "delay(1000);"
    Maintenant, le servomoteur fait plusieurs fois + (ou -) 200 d'un seul coup alors que je voudrais qu'il y ai une seconde entre chaque + (ou -) 200.
    Je pense qu'il faudrait placer un "delay(1000);" quelque part mais je ne sais pas où.

    Cordialement
    Mathieu

  9. #9
    Modérateur

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

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bonjour Mathieu

    La réponse est déjà donnée, dans mon précédent message.

    Delias

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/10/2018, 18h38
  2. Réponses: 5
    Dernier message: 23/10/2013, 10h55
  3. Réponses: 1
    Dernier message: 23/10/2008, 17h58
  4. Réponses: 11
    Dernier message: 09/09/2005, 13h51
  5. [TP] Echanger des données entre deux programmes
    Par ILIAS Raphaël dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 22/03/2005, 09h31

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