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 :

TIPE PREPA code arduino acceleromètre+ servo


Sujet :

Arduino

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut TIPE PREPA code arduino acceleromètre+ servo
    Bonjour,

    Je suis étudiant en classe prépa (maths spé pour les intimes) et dans le cadre d'un projet pour les concours je dois réaliser un code qui récupère des données d'accélération selon l'axe y du capteur, les transforme en positions angulaire puis commande le servo moteur..
    Cependant mon programme censé être une boucle ne tourne qu'une fois et je ne comprends pas.. si vous pouviez m'éclairer !

    voila mon code : mon problème : je n'arrive pas à faire tourner mon code en boucle

    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
    #include <Servo.h>
     
      Servo s;  // create servo object to control a servo
      unsigned int A; // affichage de la position du moteur
      unsigned int P; 
      unsigned int pos; //Variable moteur
      int y;      // y axis variable
      unsigned int  Yo; // y de réfenrence, voiture immobile pour effectuer ce qui 
      équivault à une tare 
      unsigned int Y;
     
    void setup()  { 
      Serial.begin(57600);  // opens serial port, sets data rate to 57600 bps
      s.attach(9);  // attaches the servo on pin 9 to the servo object
      Yo=analogRead(2);
      Serial.print("Yo = ");
      Serial.println(Yo);
    }
     
    void loop() {
      {
      y  = analogRead(2);    // read the first analog input pin
      Serial.print("y= ");  // print y adc value
      Serial.println(y);
      {
      Y=y-Yo; // position angulaire "après tare" 
      P=Y+5 // determination de la position angulaire souhaitée (equation temporaire)
      {
      for( pos=A ; pos=P ; pos +=1 ) 
        s.write(pos);              // tell servo to go to position in variable 'pos'
          delay(10); // waits Xms for the servo to reach the position
          A=s.read();
        Serial.print(" a= ");
         Serial.println(A); // affichage de la position de A en fin de déplacement
      }}}
      delay(100); 
      }

  2. #2
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 143
    Points
    11 143
    Par défaut
    bonjour,

    Citation Envoyé par Antloip
    Cependant mon programme censé être une boucle ne tourne qu'une fois et je ne comprends pas.. si vous pouviez m'éclairer !
    effectivement, tu as la boucle loop dans ton programme. Mais est-ce la seule ?

    Je te laisse chercher un peu




    Ensuite, concernant la forme de ton code, il y a des accolades en trop ou mal placées et l'indentation qui est absente. Mais ces deux derniers points ne sont pas à l'origine du bogue.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Auteur Voir le message
    bonjour,


    Mais est-ce la seule ?
    je ne vois pas bien ce que vous sous entendez par là.. le set up n'est pas une boucle, mon loop oui.. est ce que l'ajout du module "delay" crée une boucle au sein de mon code ? je dirai que non.. je ne trouve pas :/

    En ce qui concerne l'indentation et les parenthèses sur quoi cela a t'il un impact ? Lisibilité,j'imagine ? y en a t'il d'autres ?

    Merci de vos réponses

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 681
    Points
    13 681
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void loop() {
      {
    //
      {
    //
      {
      for( pos=A ; pos=P ; pos +=1 ) 
    //
      }}}
    //
      }
    Pas banal toutes ces accolades

    En ce qui concerne l'indentation et les parenthèses sur quoi cela a t'il un impact ? Lisibilité,j'imagine ? y en a t'il d'autres ?
    Les parenthèses et les accolades ne sont pas souvent anodines ; oublie les et ton code ne compilera pas ou alors il compilera mais ne fera pas ce que tu penses.

    L'indentation, c'est purement pour la lisibilité ; n'indente pas et le fonctionnement de ton programme sera inchangé.

    Néanmoins, une mauvaise indentation peut cacher des bugs car on n'arrive pas bien à lire le flow du programme. Si tu veux voir ta fonction loop() correctement indentée, ouvre ce spoiler. Est-ce que c'est bien ce que tu voulais faire ?
    (notamment le for() ?)

    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
    void loop() {
    	{
    		y = analogRead(2);    // read the first analog input pin
    		Serial.print("y= ");  // print y adc value
    		Serial.println(y);
    		{
    			Y = y - Yo; // position angulaire "après tare"
    			P = Y + 5 // determination de la position angulaire souhaitée (equation temporaire)
    			{
    				for (pos = A; pos = P; pos += 1)
    					s.write(pos);              // tell servo to go to position in variable 'pos'
    				delay(10); // waits Xms for the servo to reach the position
    				A = s.read();
    				Serial.print(" a= ");
    				Serial.println(A); // affichage de la position de A en fin de déplacement
    			}
    		}
    	}
    }


    Comment vois-tu que ta boucle ne se fait qu'une fois ?

  5. #5
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 143
    Points
    11 143
    Par défaut
    Citation Envoyé par Antloip Voir le message
    je ne vois pas bien ce que vous sous entendez par là.. le set up n'est pas une boucle, mon loop oui.. est ce que l'ajout du module "delay" crée une boucle au sein de mon code ? je dirai que non.. je ne trouve pas :/
    et l'instruction for() c'est quoi ?

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Ah bah oui bien sur.. j'ai cependant essayé de viré la boucle for et cela marche un peu mieux, le programme répond mais jamais de manière identique.. un coup il va tourner en boucle peut importe l'acceleration reçue du capteur.. un coup de manière non périodique mais assez aléatoire tout de même.
    Est ce que j'aurai du garder la boucle for ?

    Je ne comprends pas également pourquoi les valeurs que je demande à afficher dans le port série ne s'affiche que 15 fois.. puis plus rien au lieu de continuer à s'afficher en temps réelle :/

    Est ce que mon servo revient à la position initiale après chaque déplacement ? je ne pense pas mais je préfère demander.


    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
     
    #include <Servo.h>
     
      Servo s;  // create servo object to control a servo
      unsigned int A; // affichage de la position du moteur
      unsigned int P; 
      unsigned int pos; //Variable moteur
      int y;      // y axis variable
      unsigned int  Yo; // y de réfenrence, voiture immobile pour effectuer ce qui 
       // équivault à une tare 
      unsigned int Y;
     
    void setup()  { 
      Serial.begin(57600);  // opens serial port, sets data rate to 57600 bps
      s.attach(9);  // attaches the servo on pin 9 to the servo object
      Yo=analogRead(2);
      Serial.print("Yo = ");
      Serial.println(Yo);
     
    }
     
    void loop() {
                  {
                    y  = analogRead(2);    // read the first analog input pin
                     {
                       Y=y-Yo; // position angulaire "après tare" 
                       P=Y; // determination de la position angulaire souhaitée (equation temporaire)
                      {
                        s.write(P);              // tell servo to go to position in variable 'pos'      
                        A=s.read();
                       }
                      }
                     }
                  Serial.print("y= ");  // print y adc value
                  Serial.println(y);
                  Serial.print(" a= ");
                  Serial.println(A); // affichage de la position de A en fin de déplacement
                  delay(100);
                 }

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Finalement,
    le programme ré indenter à la manière du message précédent semble fonctionner. Si vous voyez une explication je la veux bien car j'avançais principalement à "taton" comme on dit.
    Merci pour vos réponses.

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 681
    Points
    13 681
    Billets dans le blog
    1
    Par défaut
    Je pense qu'il faut arrêter d'être à tâtons.

    Il faut que ton code soit lisible pour que tu comprennes bien ce que tu fais, et ça passe par l'indentation et la suppression des accolades inutiles.

    Il faut que tu partes d'un code simple, par exemple envoyer de manière continue et infinie une donnée (n'importe laquelle, un compteur que tu incrémentes à chaque fois) sur ta liaison série.

    Il faut que tu rajoutes ensuite tes opérations de contrôle du moteur en sachant pourquoi tu ajoutes ça. Un bon programme / algorithme s'écrit sur papier avec un crayon et est ensuite traduit en code.

    Bon courage

  9. #9
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 143
    Points
    11 143
    Par défaut
    Pour la boucle for, je ne sais pas s'il fallait la garder ou pas, ce n'est pas ce qui m'a gêné dans ton code.

    Tu as écris :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    for( pos=A ; pos=P ; pos +=1 )
    et la question que je me suis posé est la suivante : quelle est la valeur de A lors du premier appel de ta boucle ? J'ai cherché en amont et je suis tombé sur cette ligne : d'où ma question : quelle est la valeur de A lors du premier appel à l'instruction for() ?

    Supprimer for() n'était pas une bonne idée car tu ne t'es pas posé les bonnes questions. Tu as supprimé et puis tu as regardé.

    Deuxième remarque :
    déclarer une variable y] et une variable Y n'est pas une bonne idée. C'est le meilleur moyen de se tromper. Quand écrire y et quand écrire Y ?

Discussions similaires

  1. Problème code arduino
    Par JulienNnnn dans le forum Arduino
    Réponses: 3
    Dernier message: 24/08/2017, 18h06
  2. Homemade Quadcopter/C++ Code sans ARDUINO/MULTIWII
    Par sylvainmahe dans le forum C++
    Réponses: 17
    Dernier message: 23/08/2016, 18h25
  3. Problème avec code arduino
    Par mahaman bahari dans le forum Arduino
    Réponses: 2
    Dernier message: 10/05/2016, 19h03
  4. Algorithme par code Arduino
    Par slender67 dans le forum Arduino
    Réponses: 3
    Dernier message: 20/03/2016, 16h03
  5. Eclipse et Arduino. Volume du code non modifié
    Par #define dans le forum Eclipse C & C++
    Réponses: 2
    Dernier message: 24/06/2013, 12h54

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