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

C++ Discussion :

Déclaration et prise en charge ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Déclaration et prise en charge ?
    Bonjour,

    J’ai un problème sur une esquisse Arduino (langage C++)
    Dans cette déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const unsigned int StepSizeUs = 10;
    J’aimerais utiliser 10,3 est-ce possible ? si oui pouvez-vous me dire comment ?

    Idem dans ma boucle For :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (pos =  MiddlePos; pos >= LowerPos; pos -= 10)
    J’aimerais aussi utiliser 10,3.

    Merci pour votre aide
    Bien cordialement
    Eric

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 151
    Billets dans le blog
    4
    Par défaut
    C'est écrit unsigned int, donc non tu peux pas utiliser un nombre à virgule..
    Ça signifie quoi 10.3 de toute façon ? Ce truc semble être en microsecondes, donc 10.3 microsecondes euh... ça supporte des nanosecondes ton système ?
    Utiliser un nombre a virgule pour faire un pas et une boucle est une mauvaise idée.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Oui c’est bien 10,3 microsecondes = 1° donnée du constructeur.
    Pouvez-vous me dire comment gérer le nombre a virgule ?
    Pourquoi la boucle ne le gère pas ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je pensais que "float" ???.
    Je ne comprends et maîtrise pas tout, j'essaie de remplacer les servomoteurs du petit robot de mon fils qui sont HS et qui ne se fabrique plus.
    Le programme du petit robot étaient fournis et n'étaient pas censé être modifié.
    Je pensais pouvoir m'en sortir avec le web, n'étant par programmeur! Je me trompais.
    J'espère que vous pourrez m'aider.
    Bien cordialement.
    Dernière modification par Invité ; 25/10/2019 à 12h46.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Voici le code soyez indulgent.
    Pour résumer, mon code fonctionne, mais ne gère pas une incrémentation avec un nombre a virgule.

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    /*************************************
    Simple Arduino sweep sketch in microseconds
     
    Note: The code is written in a simple blocking way and not optimized. It's a terrible
    startingpoint to use in your own code!
     
    PREREQUISITES:
    - Know the lower, higher, and middle values of a servo
     
    INSTRUCTIONS
    - Fill in 'LowerPos', 'UpperPos' and 'MiddlePos'
    - Upload sketch
    - Set Serial Monitor to 115200 baud
    - Set Serial Monitor to "Both NL & CR"
    - Connect a servo to 'ServoPin' (default: pin 9)
    - Press "Send" when the servo is positioned at Middle when you are asked
    *************************************/
     
    #include <Servo.h>
     
    const byte ServoPin = 9;
    //Enter the minimum limit pulse width (in ms)
    const unsigned int LowerPos = 710;
    //Enter the lower maximum pulse width (ms)
    const unsigned int UpperPos = 2300;
    //Middle Calculate Formula
    const unsigned int MiddlePos = ((UpperPos - LowerPos) / 2) + LowerPos;
    // 10,3 Microseconds = 1°
    //####
    // How to declare 10.3?
    // const float StepSizeUs = 10,3;
    // in void loop()=> for => pos += 10,3 and pos -= 10 don't work
    //####
     
    Servo testServo;
     
    // variable to store the servo position
    int pos = MiddlePos;
     
    void setup() {
      Serial.begin(115200);
      testServo.writeMicroseconds(MiddlePos);
      testServo.attach(ServoPin, LowerPos, UpperPos);
     
      Serial.print("Lower value set to ");
      Serial.println(LowerPos);
     
      Serial.print("Upper value set to ");
      Serial.println(UpperPos);
     
      Serial.print("Middle value set to ");
      Serial.println(MiddlePos);
      Serial.println();
      Serial.println("Servo on central location");
      Serial.println("Press \"Send\" to continue");
     
      while(!Serial.available());
      clearSerialBuffer();
    }
     
    void loop() {
        Serial.println("");
      // goes from MiddlePos to UpperPos. 
      //#### (10,3 don't work result like 10) I would like to use StepSizeUs ####
      //for (pos = MiddlePos; pos <= UpperPos; pos = (float)pos + 10.3) {
      for (pos = MiddlePos; pos <= UpperPos; pos += 10) { 
        // in steps of 10 µS
        testServo.writeMicroseconds(pos); // tell servo to go to position in variable 'pos'
        delay(550);
        Serial.print(pos);
        //Serial.print(pos,2); //number after the decimal point
        Serial.print(" "); 
      }
        Serial.println("");
      // goes from MiddlePos to LowerPos. 
      //#### (10,3 don't work result like 10) I would like to use StepSizeUs ####
      //for (pos = MiddlePos; pos <= LowerPos; pos = (float)pos - 10.3) {
      for (pos =  MiddlePos; pos >= LowerPos; pos -= 10) { 
        testServo.writeMicroseconds(pos); // tell servo to go to position in variable 'pos'
        delay(550);
        Serial.print(pos);
        //Serial.print(pos,2); //number after the decimal point
        Serial.print(" ");
       }
        delay(6000);
      }
     
     void clearSerialBuffer(){
      //clear serial buffer (but do nothing with it)
      while(Serial.available()){
        Serial.read();
      }
     }

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Si tu veux un incrémenter des valeurs flottantes d'un incrément non-entier, tu ne dois pas utiliser de vraie addition, car les erreurs d'arrondi se cumulent.

    Par contre tu peux bosser avec ce qu'on appelle de la "virgule fixe": Ici vu que tu as juste un chiffre décimal après la virgule, tu peux travailler avec des valeurs entières multipliées par 10:

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    unsigned int increment10 = 103; //10.3 * 10
    for(unsigned int pos10 = MiddlePos*10 ; pos10 <= UpperPos*10 ; pos10 += increment10)
    {
    	double pos = pos10 / 10.0;
    	//...
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Erreur 3251 : mise à jour non prise en charge
    Par gletare dans le forum Access
    Réponses: 2
    Dernier message: 10/02/2006, 10h17
  2. [VB.Net] Prise en charge de <summary> sous VS2003
    Par tomnie dans le forum Windows Forms
    Réponses: 4
    Dernier message: 16/12/2005, 12h01
  3. Réponses: 2
    Dernier message: 12/05/2005, 10h10
  4. Prise en charge multilingue sur le portal
    Par nic211 dans le forum Oracle
    Réponses: 4
    Dernier message: 07/07/2004, 14h43
  5. [SQL Serveur] prise en charge de l'arabe
    Par lamiae18 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/03/2004, 12h33

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