IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Cours pour débuter dans la programmation d'une carte Arduino,
Un tutoriel de Nicolas Le Boulaire

Le , par nlbmoi

0PARTAGES

8  0 
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 !

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de Jay M
Expert confirmé https://www.developpez.com
Le 23/12/2020 à 5:56
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 : Sélectionner tout
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.)
2  0 
Avatar de Jay M
Expert confirmé https://www.developpez.com
Le 05/03/2020 à 7:09
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 : Sélectionner tout
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 : Sélectionner tout
1
2
3
const byte pinBouton = 2;
int etatBouton = digitalRead(pinBouton);
if (etatBouton == HIGH)
1  0 
Avatar de nlbmoi
Membre éprouvé https://www.developpez.com
Le 05/03/2020 à 7:59
Bonjour Jay M,

Merci de ta remarque, très pertinente : je modifierai le type de etatBouton ainsi que le test du if.
1  0 
Avatar de Jay M
Expert confirmé https://www.developpez.com
Le 05/03/2020 à 12:15
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 : Sélectionner tout
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 : Sélectionner tout
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 !
1  0 
Avatar de nlbmoi
Membre éprouvé https://www.developpez.com
Le 05/03/2020 à 13:54
Citation Envoyé par Jay M Voir le message
* 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.

Citation Envoyé par Jay M Voir le message

* 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.

Citation Envoyé par Jay M Voir le message

* 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.

Citation Envoyé par Jay M Voir le message

bravo et merci encore pour ce partage !
Merci
1  0 
Avatar de f-leb
Responsable Arduino et Systèmes Embarqués https://www.developpez.com
Le 11/03/2020 à 22:38
Plus de raison de ne pas s'y mettre, merci pour ce cours
1  0 
Avatar de cilodix
Candidat au Club https://www.developpez.com
Le 23/12/2020 à 0:11
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.
1  0