Developpez.com - Rubrique Arduino

Le Club des Développeurs et IT Pro

Cours pour débuter dans la programmation d'une carte Arduino,

Un tutoriel de Nicolas Le Boulaire

Le 2020-03-04 22:10:30, par nlbmoi, Membre éprouvé
Bonsoir

J'ai rédigé un tutoriel pour débuter dans Arduino : https://nboulaire.developpez.com/tutoriels/Arduino/cours-debuter-programmation-arduino/

Merci pour vos commentaires et bonne lecture !
  Discussion forum
7 commentaires
  • Jay M
    Expert confirmé
    Bonjour @cilodix

    Lorsque vous faites une lecture de la sortie du convertisseur analogique vers numérique (ADC) par la fonction analogRead() vous effectuez un échantillonnage de la tension présentée sur la broche choisie, par exemple A0. Cette valeur numérique est entre 0 et 1023 car l’échantillonnage se fait sur 10 bits sur un UNO.

    Ensuite on peut choisir quelle est la référence de tension pour l’ADC, c’est à dire avec quelle tension maximale il fait son échantillonnage par la fonction analogReference(). Si on ne dit rien, par défaut ce sera 5 volts sur un UNO.

    Donc quand la lecture de l’ADC dit 0 c’est qu’on avait 0 Volt sur la broche et quand la lecture de l’ADC dit 1023 c’est qu’on avait 5 Volt sur la broche et entre les deux c’est une droite.

    Une formule qui permet de passer donc de la valeur numérique lue vers la tension est la fonction affine Y = aX+ b passant par ces deux points (0,0) et (1023,5).

    Comme on passe par l’origine b=0 et la pente c’est 5.0 / 1023.0 d’où la formule
    Code :
    valeurCapteur * 5.0 / 1023.0;
    (Il y a un débat entre les puristes pour savoir s’il vaut mieux diviser par 1024 ou 1023. Mon point de vue c’est que les deux donnent une évaluation possible de la valeur d’origine puisqu’on a échantilloné. Chaque valeur numérique corrrespond en réalité à toute une plage de tension d’origine et on n’a pas une fonction affine mais une fonction en escalier discontinue par morceaux). La division par 1023 est sympathique car elle donne un joli 5V tout rond si vous lisez 1023 donc c’est ce que je préfère, mais faut bien se souvenir que la valeur calculée a une incertitude d’environ 5mV.)
  • Jay M
    Expert confirmé
    Merci pour cette contribution

    Je suis partisan d’apprendre très tôt à respecter une cohérence de type et de ne pas dépendre de promotions automatiques cachées par le langage et d’éviter les valeurs magiques parsemées dans le code. Quand vous proposez de faire
    Code :
    1
    2
    3
     {
      boolean etatBouton = digitalRead(2);
      if (etatBouton == 1)
    ca me choque donc un peu
    un booléen est vrai ou faux, la fonction digitalRead ne retourne pas vrai ou faux mais un concept d’état de la tension sur cette pin avec HIGH ou LOW représenté par un entier de type int.

    Je proposerais
    Code :
    1
    2
    3
    const byte pinBouton = 2;
    int etatBouton = digitalRead(pinBouton);
    if (etatBouton == HIGH)
  • nlbmoi
    Membre éprouvé
    Bonjour Jay M,

    Merci de ta remarque, très pertinente : je modifierai le type de etatBouton ainsi que le test du if.
  • Jay M
    Expert confirmé
    Merci

    et j'ai vu que vous traitez de cela dans la partie "Amélioration de la lisibilité du code d’un programme" (et la notion de const est aussi importante car elle permet au compilateur de faire des optimisations.)

    j'ai repéré quelques autres améliorations:

    * Quand vous parlez de
    la ligne 31, on convertit en fait une valeur d’une échelle (qui va de 0 à 1023) en une valeur dans une autre échelle (qui va de 0 V à 5 V). Au lieu de faire un produit en croix, on peut utiliser une instruction Arduino qui fait la même chose :

    Code :
    map(valeur, limite_inf_1,  limite_sup_1, limite_inf_2, limite_sup_2)
    où valeur est la valeur à convertir, limite_inf_1 et limite_sup_1 sont les limites de la 1re échelle dans laquelle est mesurée la valeur (dans notre cas 0 et 1023), limite_inf_2 et limite_sup_2 sont les limites de la nouvelle échelle (dans notre cas 0 et 5 V) → la ligne 31 pourrait donc s’écrire de manière équivalente :

    Code :
    float tension = map(valeurTemp, 0, 1023, 0, 5);
    --> map() travaille uniquement en entier donc vous auriez dans tension uniquement un entier de 0 à 5 (et 5 uniquement si vous avez obtenu 1023 pile) même si vous stockez le résultat dans un nombre décimal.

    * dans "Les précautions pour éviter de détruire la carte Arduino voire plus", vous dites
    la résistance d’un fil est quasi nulle (mettons 0,1 W pour le calcul)
    ou encore
    La valeur minimale est de 125 W, mais il vaut mieux prévoir un peu plus et opter pour une résistance de 220 W.

    --> il ne s'agit pas de Watts mais d'Ohm bien sûr (peut-être le symbole ("Ω" ne s'affiche-t-il pas bien ?)

    * je vous suggère aussi de prendre 115200 (voir plus) comme débit par défaut pour le port Série. il n'y a plus aucune raison d'aller à 9600 bauds comme au temps des premier arduino. en fait aller lentement risque de générer certains bugs de timing dans les programme car un appel à print devient bloquant dès que vous avez plus de 64 octets à émettre en attente.

    bravo et merci encore pour ce partage !
  • nlbmoi
    Membre éprouvé
    Envoyé par Jay M
    * Quand vous parlez de

    --> map() travaille uniquement en entier donc vous auriez dans tension uniquement un entier de 0 à 5 (et 5 uniquement si vous avez obtenu 1023 pile) même si vous stockez le résultat dans un nombre décimal.
    Ah oui, c'est juste : j'ajouterai une petite précision.

    Envoyé par Jay M

    * dans "Les précautions pour éviter de détruire la carte Arduino voire plus", vous dites ou encore --> il ne s'agit pas de Watts mais d'Ohm bien sûr (peut-être le symbole ("Ω" ne s'affiche-t-il pas bien ?)
    J'ai corrigé une partie des symboles qui restaient mais apparemment pas tous : j'ai effectivement un souci lors de l'exportation (que je passe par la police symbol ou par l'insertion d'un caractère spécial) qui n'affiche pas les lettres grecques.

    Envoyé par Jay M

    * je vous suggère aussi de prendre 115200 (voir plus) comme débit par défaut pour le port Série. il n'y a plus aucune raison d'aller à 9600 bauds comme au temps des premier arduino. en fait aller lentement risque de générer certains bugs de timing dans les programme car un appel à print devient bloquant dès que vous avez plus de 64 octets à émettre en attente.
    En pratique, j'opte désormais pour 115200 mais comme j'ai repris certaines anciennes versions de mes programmes, j'avoue ne pas avoir fait la mise à jour le débit.

    Envoyé par Jay M

    bravo et merci encore pour ce partage !
    Merci
  • f-leb
    Responsable Arduino et Systèmes Embarqués
    Plus de raison de ne pas s'y mettre, merci pour ce cours
  • cilodix
    Candidat au Club
    bonsoir monsieur,
    tout d'abord merci beaucoup pour votre cours qui m'a permis d'acquérir vraiment rapidement les bases d'arduino
    j'ai une petite question : à quoi sert l'opération:

    float valeurTension = valeurCapteur * 5.0 / 1023.0; dans le programme de mesure de lumisoté avec une photo-résistance, je me doute qu'il s'agit d'une conversion avec le binaire mais je n'arrive pas à savoir exactement quoi

    merci d'avance et bonne soirée.