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 :

Problème de programmation


Sujet :

Arduino

  1. #1
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 6
    Par défaut Problème de programmation
    Bonjour à tous,
    Je suis actuellement en classe de 1ère S option Science de l'ingénieur. Fin février, nous avons à rendre un dossier (le TPE, travail pratique encadré). Avec mon groupe, nous avons choisi de travailler sur l'assistance du vélo électrique (V.A.E), et plus précisément le déclenchement de cette assistance. L'assistance doit se déclencher que dans certains cas :
    - vitesse < 25km/h --> V
    - action sur les pédales --> P
    - niveau d'assistance choisi --> N
    - Pas d'appui sur les freins --> F

    Sur notre carte Arduino, chaque condition est "associé" à une variable binaire (0 ou 1), sauf la vitesse, que nous souhaitons faire varier à l'aide d'un potentiomètre (c'est donc une entrée analogue). Notre prof nous a dit d'utiliser une équation logique (que voici : Assistance=V¯.P.N.F¯), déduite d'une table de vérité. Or, les cases d'une table de vérité ne peuvent prendre que des états 0 ou 1, alors que notre potentiomètre peut prendre de multiples valeurs. Nous ne savons donc pas comment inclure cela dans notre équation logique.
    Indépendament, nous avons réussi à faire fonctionner notre potentiomètre, mais évidement, lorsque nous introduisons le "programme potentiomètre" dans le programme simulant le déclenchement de l'assistance, cela ne fonctionne pas.
    Voici notre programme en l'état actuel :
    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
    const int nivAssist=4; //Associe la variable au pin 4
    const int pedalage=5;  //Associe la variable au pin 5
    const int frein=6;     //Associe la variable au pin 6
    const int potpin=7;    //Associe la variable au pin 7
    int val;
     
    const int vitesseMoteurA=12; 
    const int sensMoteurA=3;
     
    const int avant=1; 
    int vitesse=255;
     
    boolean lect_vMax;
    boolean lect_nivAssist;
    boolean lect_pedalage;
    boolean lect_frein;
    boolean assistance;
     
    void setup()
    {
      //Définie les variables en entrée
      pinMode(potpin, INPUT);
      pinMode(nivAssist, INPUT);
      pinMode(pedalage, INPUT);
      pinMode(frein, INPUT);
     
      //Définie les variables en sortie
      pinMode(sensMoteurA, OUTPUT);
      pinMode(vitesseMoteurA, OUTPUT);
     
      Serial.begin(9600);
    }
     
    void loop()
    {
      lect_nivAssist = digitalRead(nivAssist); 
      lect_pedalage = digitalRead(pedalage);
      lect_frein = digitalRead(frein);
      val = analogRead(A0);           //Associe la variable val à des valeurs analogiques de 0 à 1023
      val = map(val, 0, 1023, 0, 40); //Définie proportionnellement les valeurs 0 à 40 sur l'entrée analogique A0
      delay(15); 
     
      assistance=nivAssist&pedalage&!frein; 
     
      //Affiche sur le moniteur série l'état de chaque variable
      Serial.print("Vitesse=");
      Serial.println(val);
      Serial.print("Niveau d'assistance=");
      Serial.println(nivAssist);
      Serial.print("Pedalage=");
      Serial.println(pedalage);
      Serial.print("Frein=");
      Serial.println(frein);
      Serial.print("Assistance=");
      Serial.println(assistance);
      Serial.println(" ");
      delay(1000);
     
      if(assistance==1&val<=25)
        {
        digitalWrite(vitesseMoteurA, vitesse);
        digitalWrite(sensMoteurA, avant);
        }
      else
        {
        digitalWrite(sensMoteurA, LOW);
        }
    }
    En espérant une prompt réponse, merci

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 135
    Par défaut
    La condition logique associée à la vitesse est : Vitesse < 25km/h.
    Quand la vitesse passe ce seuil? la condition change d'état.
    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
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par martin.lelarge Voir le message
    Notre prof nous a dit d'utiliser une équation logique (que voici : Assistance=V¯.P.N.F¯), déduite d'une table de vérité. Or, les cases d'une table de vérité ne peuvent prendre que des états 0 ou 1, alors que notre potentiomètre peut prendre de multiples valeurs. Nous ne savons donc pas comment inclure cela dans notre équation logique.
    Vitesse < 25km/h. (0)
    Vitesse >= 25km/h. (1)

    Ya que 2 cas. Tu as bien une condition binaire.

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 205
    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 205
    Billets dans le blog
    48
    Par défaut
    Salut,

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    assistance=nivAssist&pedalage&!frein;

    nivAssist, pedalage et frein sont les numéros des pins

  5. #5
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 6
    Par défaut
    Citation Envoyé par f-leb Voir le message
    Salut,

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    assistance=nivAssist&pedalage&!frein;

    nivAssist, pedalage et frein sont les numéros des pins
    En effet, ce sont des pins, mais nous devons aller lire leur état (0 ou 1) pour tester notre équation logique. Je ne comprend pas ce que cela change...

  6. #6
    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
    Citation Envoyé par martin.lelarge Voir le message
    En effet, ce sont des pins, mais nous devons aller lire leur état (0 ou 1) pour tester notre équation logique. Je ne comprend pas ce que cela change...
    Ce que f-leb te pousse a faire, c'est de nous montrer :

    1) où dans le code tu lis ces broches ?
    2) qu'est ce que tu fais de ces valeurs lues ensuite ?
    3) et que tests tu ?

    Tu devrais trouver tout seul ton erreur.
    A+

  7. #7
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 6
    Par défaut
    Merci pour toutes vos réponses, mais je ne sais pas comment démarrer une action après l'atteinte d'une valeur analogique définie :
    Si vitesse < 25 km/h : état logique 1
    Si vitesse => 25 km/h : état logique 0
    L'entrée analogique va de 0 à 1023 : de 0km/h à 50km/h (j'ai changé j'ai mis 50 ou lieu de 40km/h comme mis dans le poste pour que ce soit plus simple), donc
    < 25 km/h pour toutes les valeurs < 501.
    Mais je ne sais pas comment traduire cela en langage C++
    Merci

  8. #8
    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 martin.lelarge Voir le message
    Si vitesse < 25 km/h : état logique 1
    Si vitesse => 25 km/h : état logique 0
    L'entrée analogique va de 0 à 1023 : de 0km/h à 50km/h (j'ai changé j'ai mis 50 ou lieu de 40km/h comme mis dans le poste pour que ce soit plus simple), donc
    < 25 km/h pour toutes les valeurs < 501.
    Mais je ne sais pas comment traduire cela en langage C++
    quand même Quel est l'instruction du "si ... alors" en C++ ?
    Vous l'avez écrit dans le code posté dans le 1er message.



    https://www.arduino.cc/en/Reference/If
    https://www.arduino.cc/en/Reference/Boolean

  9. #9
    Invité de passage
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 1
    Par défaut
    Je suis avec Martin pour ce projet et je voudrais savoir si on peut "ruser" en faisant ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(assistance==1&val<=25)
        Serial.print("Assistance=1");
      else
        Serial.print("Assistance=0");
    On a pas le matériel pour tester donc on fait par tâtonnement.. De plus on a jamais programmé sur Arduino.. Donc on galère En tout cas merci de nous aider !
    Benjamin

  10. #10
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 6
    Par défaut
    Ca y est ! Après pas mal de recherche et de réflexion, je pense être arrivé à la solution (qui est finalement très simple) !
    Voici le code (j'ai juste modifier la fin) :

    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
     
    const int nivAssist=4; //Associe la variable au pin 4
    const int pedalage=5;  //Associe la variable au pin 5
    const int frein=6;     //Associe la variable au pin 6
    const int potpin=7;    //Associe la variable au pin 7
    int val;
     
    const int vitesseMoteurA=12; 
    const int sensMoteurA=3;
     
    const int avant=1;
    int vitesse=255;
     
    //déclaration des variables binaires représentant l'état des entrées et de la sortie
    boolean lect_nivAssist;
    boolean lect_pedalage;
    boolean lect_frein;
    boolean assistance;
     
    void setup()
    {
      //Définie les variables en entrée
      pinMode(potpin, INPUT);
      pinMode(nivAssist, INPUT);
      pinMode(pedalage, INPUT);
      pinMode(frein, INPUT);
     
      //Définie les variables en sortie
      pinMode(sensMoteurA, OUTPUT);
      pinMode(vitesseMoteurA, OUTPUT);
     
      Serial.begin(9600);
    }
     
    void loop()
    {
      lect_nivAssist = digitalRead(nivAssist); 
      lect_pedalage = digitalRead(pedalage);
      lect_frein = digitalRead(frein);
      val = analogRead(A0);           //Associe la variable val à des valeurs analogiques de 0 à 1023
      val = map(val, 0, 1023, 0, 50); //Définie proportionnellement les valeurs 0 à 50 sur l'entrée analogique A0
      delay(15); 
     
      //Affiche sur le moniteur série l'état de chaque variable
      Serial.print("Vitesse=");
      Serial.println(val);
      Serial.print("Niveau d'assistance=");
      Serial.println(nivAssist);
      Serial.print("Pedalage=");
      Serial.println(pedalage);
      Serial.print("Frein=");
      Serial.println(frein);
      Serial.println(" ");
      delay(1000);
     
     if(val<=25&assistance==1)
    {
    Serial.print("Assistance=");
    Serial.println("1");
    }
    else
    {
    Serial.print("Assistance=");
    Serial.println("0");
    }
    }
    Je n'ai pas pu tester, mais je pense que cela marche. Merci de me dire s'il y a des erreurs, et puis merci de vos précieux conseils !

  11. #11
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par martin.lelarge Voir le message
    Merci pour toutes vos réponses, mais je ne sais pas comment démarrer une action après l'atteinte d'une valeur analogique définie :
    Si vitesse < 25 km/h : état logique 1
    Si vitesse => 25 km/h : état logique 0
    L'entrée analogique va de 0 à 1023 : de 0km/h à 50km/h (j'ai changé j'ai mis 50 ou lieu de 40km/h comme mis dans le poste pour que ce soit plus simple), donc
    < 25 km/h pour toutes les valeurs < 501.
    Mais je ne sais pas comment traduire cela en langage C++
    Merci
    Concrètement tu as deux solutions :
    Soit tu travailles directement avec les valeurs de l'entrée analogique.
    Soit tu converti ça en vitesse et tu travailles avec la vitesse.

    La deuxième solution est préférable (plus lisible) si ça ne pose pas de problème de temps d'exécution (ici, pas de problème).

    La fonction analogRead() permet de récupérer l'entrée analogique (une valeur de 0 à 1023 donc) -> vous n'avez pas de problèmes avec ça.
    La fonction map() permet de faire une interpolation linéaire pour ramener la valeur lue dans un intervalle utile -> à priori pas de problèmes non plus.
    Puis un if permet de tester cette valeur -> même principe que pour "frein".

    Du coup il n'y a aucune différence entre tes entrées digitales (oui / non; ou vrai / faux; ou 1/0; enfin tu vois le principe) et ton entrée analogique.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int const pinFrein = 6;
     
    bool frein = digitalRead(pinFrein);
    // tu as directement un bool
     
    int val = analogRead(A0); // 0 à 1023
    val = map(val, 0, 1023, 0, 50); // 0 à 50 (ou 49, faut vérifier la doc)
    bool vitesseSuperieureA25 = val > 25; // true si vitesse > 25; false sinon
    // tu as un bool aussi -> tu peux l'utiliser comme frein.

    Citation Envoyé par Benji.gtn Voir le message
    Je suis avec Martin pour ce projet et je voudrais savoir si on peut "ruser" en faisant ça :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(assistance==1&val<=25)
        Serial.print("Assistance=1");
      else
        Serial.print("Assistance=0");
    Ça marche aussi.

    Attention quand même à différencier pin et valeur lue.

    @martin, assistance n'est pas initialisée; sinon c'est bon.

    edit: '&' et '&&' sont deux choses complètement différentes.
    Un ET dans une condition c'est '&&'.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 6
    Par défaut
    Merci beaucoup de toutes vos aides et tous vos conseils !!! Je pense que je fermerai la discussion ce soir alors.

  13. #13
    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
    Sauf que... vous n'avez pas lu les liens que j'avais postés.

    Le ET logique en C++ c'est && et non & :
    if (assistance==1 && val<=25)

    [edit] oups pas vu que Iradrille avait fait la même remarque [/edit]

  14. #14
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 6
    Par défaut
    Si si nous avons lu les liens que tu avais posté ! En fait j'ai modifié l'ancien programme que j'avais fait (avant de venir sur le forum), donc mon ''&'' était faux, et c'est celui-ci que j'ai copié sur le forum (c'est un peu embrouillé, mais pas de problème j'ai bien mis ''&&'').
    Merci encore

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

Discussions similaires

  1. Petit problème de programmation.
    Par willow.A dans le forum C
    Réponses: 3
    Dernier message: 08/01/2007, 16h36
  2. Problème en programmant un GUI swing
    Par kaelem dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 05/01/2007, 11h59
  3. Problème de programmation orientée objet
    Par dan65 dans le forum WinDev
    Réponses: 8
    Dernier message: 17/09/2006, 01h04
  4. problème finalisation programme
    Par depelek dans le forum Installation, Déploiement et Sécurité
    Réponses: 9
    Dernier message: 02/05/2006, 16h17
  5. Réponses: 1
    Dernier message: 26/09/2005, 19h29

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