LOCODUINO

Calculer avec l’Arduino

Calculer avec l’Arduino (1)

.
Par : Jean-Luc

DIFFICULTÉ :

L’Arduino est programmable, comme cela a été présenté dans « La programmation, qu’est ce que c’est » et il peut manipuler des constantes et des variables qui ont un type, comme on a pu le voir dans « Types, constantes et variables ». Nous avons déjà vu quelques calculs dans ce dernier article et nous allons maintenant examiner plus en détail comment calculer avec l’Arduino et comment utiliser les opérateurs de calcul.

Nous avons déjà rencontré les opérateurs de comparaison dans « Instructions conditionnelles : le if ... else ». Nous n’allons pas revenir dessus mais ce que nous allons voir s’applique également a ces opérateurs.

On combine les opérateurs avec les variables et les constantes, littérales ou symboliques [1], pour construire des expressions plus ou moins complexes. Voici un exemple d’instruction qui affecte à la variable distance le resultat d’une expression :

distance = vitesse * (tempsFin - tempsDebut);

Cette expression calcule la distance parcourue par un train à partir de sa vitesse, de l’instant de départ (tempsDebut) et de l’instant d’arrivée (tempsFin). Le résultat du calcul est rangé dans, on dit également affecté à, la variable distance [2]. Les opérateurs employés ici sont la multiplication (*), la soustraction (-) et l’affectation (=).

Vous avez sans doute remarqué les parenthèses autour de la soustraction. Ces parenthèses sont nécessaires car les opérateurs ont une priorité : la multiplication est plus prioritaire que la soustraction. Que se passerait-il si on retirait les parenthèses comme ceci :

distance = vitesse * tempsFin - tempsDebut;

En l’absence de parenthèses, la multiplication entre vitesse et tempsFin serait effectuée en premier. Puis, en second, la soustraction entre le résultat de la multiplication et tempsDebut serait effectuée. Le résultat serait donc erroné.

Une règle simple a appliquer est de systématiquement mettre des parenthèses pour ne laisser aucune ambiguïté sur l’ordre des calculs [3] !
 

Le signe = est également un opérateur. Il s’agit de l’opérateur d’affectation. Une affectation, par exemple :

a = b + c;

est donc également une expression et par conséquent on peut tout à fait écrire :

d = (a = b + c) + 1;

Ce qui aura pour effet d’ajouter les valeurs contenues dans les variables (ou constantes) b et c, mettre le résultat dans la variable a, ajouter 1 à ce résultat pour le mettre dans la variable d.

En pratique c’est peu utilisé sauf pour initialiser plusieurs variables en une seule ligne. On écrira par exemple :

a = b = c = 0;

Ce qui a pour effet d’initialiser les variables a, b, c et d à 0.

Les quatre opérations

Les opérateurs usuels pour calculer sont l’addition, la soustraction, la multiplication et la division.

  • + est l’opérateur d’addition
  • - est l’opérateur de soustraction
  • * est l’opérateur de multiplication
  • / est l’opérateur de division

Comme nous l’avons vu dans « Types, constantes et variables », le résultat d’un calcul dépend également du type des variables qui figurent dans l’expression, il faut faire attention à ce que le résultat ne soit pas trop grand ou trop petit pour tenir dans le type choisi.

Avec les types entiers : byte, int, word, long ou encore unsigned long, la division est une division entière, ou euclidienne. Elle donne donc un résultat entier : 4/3 donnera 1 et non pas 1,33333333. On peut également calculer le reste de la division entière. Il s’agit de l’opérateur %. Cette opération s’appelle également le modulo. Ainsi 4%3 donnera 1.

À cela s’ajoutent des opérateurs qui rendent l’écriture plus concise. Il s’agit des opérateurs d’incrémentation et de décrémentation ainsi que des quatre opérations combinées avec l’affectation.

Les opérateurs d’incrémentation et de décrémentation

Ces opérateurs sont respectivement notés par ++ et --.
On peut les mettre avant ou après une variable pour l’incrémenter ou la décrémenter. Positionner ces opérateurs avant ou après ne fait pas de différence en ce qui concerne la valeur qui sera mise dans la variable. Par contre cela fait une différence en ce qui concerne la valeur de l’expression. Par exemple :

int c = 0;
int d = c++;

aura pour effet de mettre la valeur 1 dans c et la valeur 0 dans d. En effet, le fait que ++ soit placé après c signifie que la valeur initialement présente dans c est affectée à d puis ensuite c est incrémenté.

À l’inverse, le fait de mettre l’opérateur devant la variable comme ceci :

int c = 0;
int d = ++c;

aura pour effet de mettre la valeur 1 dans c et la valeur 1 dans d. En effet, le fait que ++ soit placé avant c signifie que c est d’abord incrémenté puis la valeur maintenant présente dans c est affectée à d.

Si dans une expression plus compliquée, ces opérateurs apparaissent plusieurs fois et opèrent sur la même variable, on s’y perd rapidement. Une bonne pratique consiste donc à utiliser cet opérateur seul dans les expressions.

Les opérateurs combinés avec l’affectation

Ces opérateurs permettent une plus grande concision. Par exemple, au lieu d’écrire :

a = a + (c * d);

on écrira :

a += c * d;

Il en existe un pour chaque opérateur : +=, -=, *=, /= et %=.

Les nombres à virgule

Un petit mot sur les nombres à virgule. Nous allons assez rarement les utiliser mais si les entiers ne suffisent pas, ils sont nécessaires. On utilise pour ces nombres le type float qui occupe 4 octets. float signifie flottant en anglais et à un rapport avec la façon dont la position de la virgule est codée dans ce type. On parle de flottant car le nombre de chiffre avant et après la virgule change selon les besoins.

Aucun des Arduino disponibles ne possède d’unité de calcul matérielle sur le type float. Les calculs sont donc très lents [4]. Un constante float se déclare comme suit :

const float pi = 3.14159;

Notez le point qui sépare la partie entière de la partie décimale. On note à l’anglo-saxonne avec un point et non une virgule.

Lorsque l’on mélange des calculs avec des nombres entiers et des nombres flottants, il faut être méfiant. Notamment lorsqu’un entier est divisé par un autre pour affecter le résultat à un flottant, la division reste une division entière ce n’est qu’après que le résultat est converti en nombre flottant pour être affecté à la variable flottante. Par exemple :

int a = 200;
int b = 150;
float c = a / b;
Serial.println(c);

affichera 1.00 car la division est une division entière alors qu’on ce serait attendu à obtenir 1.33. Pour obtenir une division flottante, il faut forcer le type d’une des entiers. Forcer se dit cast en jargon informatique anglais. Il s’agit d’expliquer qu’en fait la variable a ou b doit être convertie en nombre flottant avant de faire la division. Ce forçage engendrera l’utilisation de la division flottante au lieu de la division entière. Il suffit pour cela de préfixer la variable ou la constante à forcer par le type voulu entre parenthèses comme ceci :

int a = 200;
int b = 150;
float c = (float)a / b;
Serial.println(c);

Ici la variable entière a est forcée en type flottant. Cette fois le résultat affiché est bien 1.33.

La seconde partie de cet article sera consacrée aux opérateurs de manipulation des bits.

La suite de la série d’articles avec « Répéter des instructions : les boucles ». Si ce n’est pas déjà fait lisez également « La programmation, qu’est ce que c’est », « Types, constantes et variables » et « Instructions conditionnelles : le if ... else »

[1Pour savoir ce qu’est une constante symbolique ou une constante littérale, lisez « Types, constantes et variables »

[2Encore du vocabulaire militaire ! quand je vous disais que l’ordinateur exécutait des instructions et que les instructions étaient des ordres

[3l’alternative étant d’apprendre l’ordre de priorité des 43 opérateurs qui existent ainsi que l’ordre des calculs quand les operateurs ont des priorités identiques.

[4Tout est relatif. Les calculs sont lents comparés aux calculs sur des nombre entiers mais la vitesse est tout de même respectable.

25 Messages

  • Calculer avec l’Arduino (1)logiciel Fritzing 14 décembre 2015 18:58, par Paul-Bansse (touraine33)

    Bonjour, je voudrais savoir avant de télécharger Fritzing s’il y a une version en Français.
    Articles très pédagogiques pour un novice.
    Merci

    Répondre

  • Comment lancer le calcul 13 février 2017 14:43, par Francois

    Bonjour

    Je commence en programmation avec Arduino.

    Je veux faire un calcul... de quoi de banal.. mais je ne sais pas comment executer le script... Je sais comment le televerser dans la carte... si je veux juste que le logiciel me donne la valeur du calcul... comment on fait ? Je vais écrire l’équation .. mais ensuite sur quel bouton appuyer pour lancer le calcul ?

    Répondre

  • Calculer avec l’Arduino (1) 13 février 2017 18:37, par Jean-Luc

    Bonjour,

    la question est plutôt de savoir comment envoyer les résultats d’un calcul à l’ordinateur afin qu’il l’affiche. En effet, une fois le sketch téléversé sur l’arduino, il s’exécute et les calculs se font. Pour afficher le résultat sur l’ordinateur, vous pouvez consulter Bibliothèque Serial, et http://eskimon.fr/104-arduino-302-e.... Une alternative est d’afficher sur un écran LCD.

    Répondre

    • Calculer avec l’Arduino (1) 13 février 2017 19:22, par Francois

      Donc si je comprend bien... je dois televerser le script dans le arduino pour que le calcul s’effectu... Il n’est donc pas possible d’executer directement le calcul sans l’arduino...comme avec un logiciel genre ’’ Matlab’’ ou ’’ Mapple’ ?

      Répondre

      • Calculer avec l’Arduino (1) 13 février 2017 19:54, par Jean-Luc

        Ce n’est pas à proprement parler un script. Le langage de l’Arduino est du C/C++. Il doit donc être compilé. Si votre programme ne fait pas usage des fonctions de bibliothèque de l’arduino et fait seulement des calculs, rien n’empêche de le compiler sur l’ordinateur. Il existe également des simulateurs comme par exemple https://www.sites.google.com/site/u...

        mais on s’éloigne de sujet. Cela a-t-il un rapport avec le modélisme ferroviaire ?

        Répondre

  • Calculer avec l’Arduino (1) 21 juin 2017 19:41, par hakim

    est ce que vous pouvez m’expliquer la fonction modulo

    Répondre

  • Calculer avec l’Arduino (1) 3 octobre 2017 23:28, par sanscervelle

    Bonjour,

    Où puis je trouver :

    [3] l’alternative étant d’apprendre l’ordre de priorité des 43 opérateurs qui existent ainsi que l’ordre des calculs quand les operateurs ont des priorités identiques.

    Merci

    Répondre

  • Calculer avec l’Arduino (1) 3 février 2019 17:44, par PECOURT Jean-Louis

    Bonjour,
    Je commence à découvrir Arduino, pour l’instant en théorie. Les TP commenceront quand j’aurai fait quelques achats...
    Une chose me chiffonne dans l’article ci-dessus. Il est écrit :
    Avec les types entiers : byte, int, word, long ou encore unsigned long, la division est une division entière, ou euclidienne. Elle donne donc un résultat entier : 4/3 donnera 1 et non pas 1,33333333. On peut également calculer le reste de la division entière. Il s’agit de l’opérateur %. Cette opération s’appelle également le modulo. Ainsi 4%3 donnera 1.
    QUESTION : Le résultat du modulo 4%3 ne devrait-il pas être 0,33 et non 1 comme indiqué ?
    Cordialement
    J.L.

    Répondre

  • Calculer avec l’Arduino (1) 15 mai 2019 15:11, par hugo nourry

    bonjour,
    voila je dois faire un calcul en pourcentage mais je n’y arrive pas en gros je recois des impulsions d’un compteur que je remet en Kwh puis j’additionne mes deux compteur pour avoir le total des deux et ensuite je divise un compteur sur le total et je le multiplie par 100 mais quand je veut l afficher cela reste a 0 est ce que le probleme est qu’il y a des virgules ou autre merci de me renseigner.

      ES=compt3 * 10;
      EE=compt4 * 10;
      ET=ES + EE;
      TES=ES / ET;
      TEE=EE / ET;
      PES=TES * 100;
      PEE=TEE * 100;
    
      Serial.print(" | ");
      Serial.print(PES);
      Serial.print(" | ");
      Serial.print(PEE);

    merci bonne journée.

    Répondre

  • Calculer avec l’Arduino (1) 15 mai 2019 19:27, par Jean-Luc

    Bonsoir.

    Sans connaître le type de vos variables, il est impossible de répondre à cette question.

    Répondre

  • Calculer avec l’Arduino (1) 29 avril 2020 15:37, par nico

    Bonjour, je souhaiterais incrémenter,décrémenter
    multiplier et diviser une variable.
    mon code incrémente,décrémente mais je n’arrive
    pas à trouver pour qu’il multiplie et divise.
    Merci de votre aide.

       int BPA = 2 ; // addition
       int BPB = 4 ; // soustraction
       int BPC = 3 ; // multiplication
       int BPD = 5 ; // division
    
       int etat_BPA ;
       int etat_BPB ;
       int etat_BPC ;
       int etat_BPD ;
    
       float compteur = 0 ;
    
       void setup ( ) 
       {
       Serial.begin ( 9600 ) ;
       
       pinMode ( BPA , INPUT_PULLUP ) ;
       pinMode ( BPB , INPUT_PULLUP ) ;
       pinMode ( BPC , INPUT_PULLUP ) ;
       pinMode ( BPD , INPUT_PULLUP ) ;
       }
       void loop ( ) 
       {
       etat_BPA  =  digitalRead ( BPA ) ;
       if ( etat_BPA == LOW )
       {
       compteur    ;
       }
       etat_BPB = digitalRead ( BPB ) ;
       if ( etat_BPB == LOW ) 
       {
       compteur -- ;
       }
       etat_BPC = digitalRead ( BPC ) ;
       if ( etat_BPC == LOW )
       {
       compteur  *10 ;
       }
       etat_BPD = digitalRead ( BPD ) ;
       {
       if ( etat_BPD == LOW )
       compteur  /10 ;
       }
       Serial.println ( compteur ) ;
       }

    Répondre

    • Calculer avec l’Arduino (1) 29 avril 2020 23:11, par Jean-Luc

      Je soupçonne que la réponse à vos questions est dans l’article. L’avez vous lu ?

      Répondre

      • Calculer avec l’Arduino (1) 30 avril 2020 04:38, par nico

        Bonjour oui je l’ai lu j’ai mis *=10 et /=10
        Mais ça ne marche toujours pas.
        Avez vous la modification de code à faire.
        Merci de votre patience, je débute.

        Répondre

  • Calculer avec l’Arduino (1) 29 avril 2020 22:47, par msport

    Bonjour,
    si vous avez un projet ferroviaire, présentez vous et décrivez votre projet sur le forum.
    Dans le cas contraire, vous vous êtes trompé de site.

    Répondre

  • Calculer avec l’Arduino (1) 20 mai 2021 16:49, par Odysseus

    Hey j’ai une requette urgente, j’ai besoin de convertir une distance (cm) en pourcentage avec un ultrasonic sensor et j’ai du mal a trouver de l’aide, j’espere que vous saurez m’aider merci !

    Si vous savez m’aidez pouvez vous me répondre a l’adresse zerther@hotmail.com

    Répondre

  • Calculer avec l’Arduino (1) 20 mai 2021 18:55, par msport

    Bonjour,
    je crains que vous ne vous soyez trompé de forum.
    Cordialement

    Voir en ligne : Mesurer une distance avec un capteur à ultrason

    Répondre

  • Calculer avec l’Arduino (1) 7 décembre 2021 13:29, par Charlie

    bonjour j’espère que vous allé bien moi ça va.
    J’aimerai savoir comment l’on calcule un coefficient sur arduino voila voila

    Répondre

  • Calculer avec l’Arduino (1) 7 décembre 2021 18:18, par msport

    Bonjour,

    vous êtes sur forum spécialisé dans le modélisme ferroviaire.
    Vous aurez des réponses plus détaillées sur un forum dédié à l’apprentissage comme :

    Cordialement

    Voir en ligne : Référence Arduino français

    Répondre

Réagissez à « Calculer avec l’Arduino (1) »

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

Rubrique « Programmation »

Les derniers articles

Les articles les plus lus