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 :

Capteur ultrasons


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2015
    Messages : 21
    Par défaut Capteur ultrasons
    Bonjour/bonsoir à tous et à toutes,

    Moi et mes collègues de terminales STI2D planchons sur notre projet pour le bac, en spécialité SIN (d'où notre présence ici, vous me direz). Nous devons concevoir un orgue électrique automatisé, et nous devons retoucher la soufflerie afin qu'elle aussi soit autonome, et nous passerons pour cela par l'utilisation d'un capteur. Ayant démarrés le C uniquement cette année, nous rencontrons des difficultés avec le programme. Pour faire simple, nous utilisons un capteur à ultrasons qui doit calculer la distance entre le ballon d'air et lui même, et, en fonction de la distance ( distance<2cm vitesse=diminue // distance>2 vitesse=augmente), modifier la vitesse du rotor, donc le débit d'air afin que le ballon garde une constante, de manière à ce que les flûtes n'aient jamais d'arrêt ou de surplus d'air lorsque que l'orgue jouera. Voici notre avancée actuelle sur le code en question :
    (oui le code parle d'un servomoteur car nous nous entrainons sur cela)

    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
    #include <Servo.h>
    Servo myservo;
    int pos =0;
    int augmente =1; 
    int ultrason (7);
    int cm;
     
    void setup()
    {
        myservo.attach(5);
        myservo.write(90);
    }
     
     
    void loop()
    {
    while (cm<5)
    {
    if (augmente)
    pos++;
    if(!augmente)
    pos--;
    if(pos>180)
    augmente =0;
    if (pos<0)
    augmente =1; 
    myservo.write(pos); 
    delay(15);
    }
    }
     
    /*for(pos = 0; pos < 180; pos += 1) 
    { 
    myservo.write(pos); 
    delay(15); 
    }
    for(pos = 180; pos>=1; pos-=1) 
    { 
    myservo.write(pos); 
    delay(15); 
    }
    }*/

    Merci d'avance

  2. #2
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 253
    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 253
    Par défaut
    Salut Tintin,
    Quelle est la question ?
    Sur quoi bloques tu exactement ?

    Il va falloir être plus précis que ça si tu veux que l'on t'aide ou que l'on t'aiguille (sans pour autant tout faire à ta place.)

    A+

  3. #3
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2015
    Messages : 21
    Par défaut
    Bonsoir Vincent,
    Nous devons faire de l'asservissement de position pour que la soufflerie donne un volume d'air constant. Pour cela, nous devons régler la vitesse du "ventilateur" en fonction de la hauteur de la soufflerie pour que celle-ci n'explose pas ou soit dégonflée.
    Nous avons donc réalisé un code et nous aimerions savoir si nous sommes sur la bonne route, nous hésitons à utiliser le "while" ou le "for" qui est en commentaire dans le code, car avec "for", nous n'y arrivons pas, arduino nous mets une erreur.

    Merci et bonne soirée

  4. #4
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 253
    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 253
    Par défaut
    Tu es dur Tintin,
    C'est un projet top secret pour que tu ne me dises même pas l'erreur que tu donnes le compilateur sur la boucle for ?
    Il faut que tu donnes plus d'info, je comprends que tu ais ton projet en tête et que tout ce que tu dis te semble précis mais pour nous ce n'est pas le cas.
    Regarde les questions que je dois me poser pour tenter de comprendre ce que tu souhaites faire (regarde les commentaires que j'ai mis dans ton code)

    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
    #include <Servo.h>
    Servo myservo; 
     
    int pos =0; 
    int augmente =1; 
     
    int ultrason (7); /* ???? untrason (7) ??? Un prototype de fonction ? */
     
    int cm; /* cm n'est pas initialisée */
     
     
    /* Je ne vois pas où cette fonction est utilisée dans le programme principale qui s'appelle "main" ? */
    void setup()
    {
        myservo.attach(5);
        myservo.write(90);
    }
     
    /* Je ne vois pas où cette fonction est utilisée dans le programme principale qui s'appelle "main" ? */
    void loop()
    {
        while (cm<5) /* cm n'étant pas initialisée ni utilisée, la comparaison n'est pas possible et forme un boucle sans fin 
                        sauf si cm est initialisée et modifiée par une fonction d'interruption, puisqu'elle est globale c'est possible */
        {
            if (augmente) /* écrire ça est équivalent à "Si augmente est VRAI Alors pos++ Fin Si" en sachant que toutes valeurs différentes de 0 est forcément VRAI */
                pos++;
     
            if(!augmente) /* écrire ça est équivalent à "Si augmente est FAUX Alors pos-- Fin Si" en sachant que seule la valeur 0 est FAUSSE */
                pos--;
     
    /* 
     * Si pos > 180 alors augmente = 0, donc au prochain tour de while on aura des pos-- jusqu'à ce que pos arrive à -1
     * une fois à -1, augmente passe à 1 et au prochain tour de while on aura des pos++ jusque 181.
     *
     * C'est ce que tu souhaites faire ? 
     * 
     *
     */
     
            if(pos>180)
                augmente =0;
     
            if (pos<0)
                augmente =1; 
     
         myservo.write(pos); 
         delay(15);
        }
     
    }
     
    /* Donne moi le message d'erreur du compilateur pour que je comprenne un peu mieux */
     
    /*for(pos = 0; pos < 180; pos += 1) 
    { 
    myservo.write(pos); 
    delay(15); 
    }
    for(pos = 180; pos>=1; pos-=1) 
    { 
    myservo.write(pos); 
    delay(15); 
    }
    }*/
    Peut être qu'en reformulant plus simplement ce que tu souhaites ça ira mieux ?

    Par exemple :
    J'ai une variable "cm" qui contient l'info de mon capteur ultrason. Elle varie de ? à ?.
    Je voudrai que la variable "pos", qui est destinée au pilotage de mon ventilateur fasse telle ou telle chose en fonction de "cm".



    A+
    Vincent

  5. #5
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2015
    Messages : 21
    Par défaut
    Je vais essayer de répondre à vos questions, mais n'ayant pas le matériel à disposition avant demain après-midi, je ne peux pas avancer, désolé. Je vous prépare un petit fichier du problème "simplifié" et de ce que nous souhaitons faire. Merci encore, à demain après-midi

  6. #6
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    @Vincent :
    /* Je ne vois pas où cette fonction est utilisée dans le programme principale qui s'appelle "main" ? */
    void setup()
    {
    myservo.attach(5);
    myservo.write(90);
    }

    /* Je ne vois pas où cette fonction est utilisée dans le programme principale qui s'appelle "main" ? */
    void loop()
    Je vais répondre à ces deux questions :
    Quand on programme avec un arduino le code comprend 2 fonctions essentielles :
    -setup()
    qui permet l'initialisation des entrées / sorties de la platine. Dans cette fonction tu peux également initialiser tes variables.
    Cette fonction est exécutée 1 fois, lors de la mise sous tension de la platine, juste après son initialisation.
    - loop() qui, comme son nom l'indique est une boucle infinie. Cela correspond au main.

    Donc le main() que l'on retrouve dans les code C ou C++ est sous-entendu dans les codes conçus pour Arduino.
    La structure du code posté par TintinTerm est donc juste


    @TintinTerm
    Je ne vois nulle part la configuration de tes pins de ton Arduino.
    - Tu utilises un capteur ultra-son. Mais sur quelle entrée l'as-tu branché ?
    - Pour pouvoir piloter le servomoteur il faut également configurer la sortie laquelle as-tu choisi ?
    - Dans tes boucles tu ne lis aucune entrée (= la valeur du capteur ultra-son) donc dans ce cas comment piloter le servomoteur ?

    Je vois des délais de 15ms à quoi correspondent-ils ?

  7. #7
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 253
    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 253
    Par défaut
    Citation Envoyé par Auteur Voir le message
    @Vincent :


    Je vais répondre à ces deux questions :
    Quand on programme avec un arduino le code comprend 2 fonctions essentielles :
    -setup()
    qui permet l'initialisation des entrées / sorties de la platine. Dans cette fonction tu peux également initialiser tes variables.
    Cette fonction est exécutée 1 fois, lors de la mise sous tension de la platine, juste après son initialisation.
    - loop() qui, comme son nom l'indique est une boucle infinie. Cela correspond au main.

    Donc le main() que l'on retrouve dans les code C ou C++ est sous-entendu dans les codes conçus pour Arduino.
    La structure du code posté par TintinTerm est donc juste
    Salut Auteur,
    Je n'ai jamais utilisé Arduino (ATMEL si je ne m'abuse ?) J'ai travaillé, à l'époque où j'étais developpeur électronique, sur du TEXAS MSP430, un peu de ARM chez NXP et sur quelques PIC.
    Merci pour ces élements je comprends mieux.

  8. #8
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2015
    Messages : 21
    Par défaut
    Demain je vous mettrais un code bien propre avec les commentaires nécessaire à coté, merci Auteur pour ton aide

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Citation Envoyé par Vincent PETIT Voir le message
    Salut Auteur,
    Je n'ai jamais utilisé Arduino (ATMEL si je ne m'abuse ?) J'ai travaillé, à l'époque où j'étais developpeur électronique, sur du TEXAS MSP430, un peu de ARM chez NXP et sur quelques PIC.
    Merci pour ces élements je comprends mieux.
    Effectivement, la platine Arduino incorpore un micro-contrôleur ATMEL. Tu devrais essayer, c'est un régal de programmer ces micro-contrôleurs en utilisant cette interface. Tu peux mettre les mains de le cambouis en développant des bibliothèques. Par exemple TintinTerm utilise la bibliothèque servo.h.

  10. #10
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 250
    Billets dans le blog
    48
    Par défaut
    Bonsoir,

    Citation Envoyé par TintinTerm Voir le message
    Pour faire simple, nous utilisons un capteur à ultrasons ...
    Peut-être qu'il faudrait aussi préciser le capteur que tu utilises. Il y en a qui fonctionnent en analogique, d'autres en largeur d'impulsion, en signaux série TTL, en I2C...

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

Discussions similaires

  1. [STM32] Capteurs ultrasons + bip sonore STM32F4
    Par safaensi dans le forum Embarqué
    Réponses: 2
    Dernier message: 06/02/2015, 08h41
  2. commande d un capteur des ultrasons à l'aide du langage VHDL
    Par moussaoui.yasir dans le forum VHDL
    Réponses: 1
    Dernier message: 04/11/2013, 15h34
  3. Réponses: 0
    Dernier message: 20/06/2013, 00h32
  4. Modulation d'un signal pour capteur ultrasons
    Par inter69 dans le forum Signal
    Réponses: 4
    Dernier message: 05/01/2008, 18h29

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