Arduino

Arduino Mega

Objectifs de ce cours

L’utilisateur sera capable de réaliser le câblage et la programmation d’un Arduino Uno ainsi que la résolution de panne simple rapportée à ce dernier. L’élève sera également apte à enseigner les bases de programmation en langage C/C++ à des élèves de 1ère et 2ème année en énonçant les bases simplifiées de celle-ci.

Matériels et composants

La breadboard (platine de montage)

platine de montage

Par convention :

  • Noir = masse
  • Rouge = alimentation (+5V, +12V, 5V… ce que vous voulez y amener).

Remarque : Un espace coupe la carte en deux de manière symétrique. Cette espace coupe la liaison des colonnes. Ainsi, sur le dessin ci-dessus on peut voir que chaque colonne possède 5 trous reliés entre eux.

Les fils de liaison

Pour faire la jonction entre les composants électroniques et la breadboard, nous utiliserons des fils de couleurs assez fins

Les fils de liaison

Le bouton poussoir

Un bouton poussoir laisser passer le courant lorsqu’il est poussé et l’interrompt quand il est relâché On peut aussi trouver des boutons poussoirs NO ou NF, ces boutons poussoirs vont nous servir à faire passez des courants électriques dans nos composants électroniques grâce à une action manuelle sur l’extrémité de ceux-ci.

bouton poussoir

La résistance (R)

La résistance s’oppose au passage du courant, proportionnellement à sa “ résistance” exprimée en Ohm. Un code de couleurs, ci-dessous, permet de reconnaître cette valeur. La résistance est un composant non polarisée

La LDR (photorésistance)

C’est une résistance variable, en fonction de la luminosité qu’elle reçoit. Sa résistance diminue quand elle reçoit de la lumière. On s’en sert donc de capteur de luminosité. Non polarisée. Pour lire sa valeur avec une Arduino, il faut également l’associer avec une résistance équivalente à sa résistance maximum ( dans le noir)

La LDR (photorésistance) 1

Le potentiomètre

Le potentiomètre, rotatif ou à glissière, est une résistance variable. Entre les extrémités, il y a la résistance maximale. La patte centrale est le curseur. C’est la résistance entre cette patte centrale et une extrémité que l’on peut faire varier en tournant le bouton. Le potentiomètre est donc un capteur. Il se branche sur les entrées analogiques de l’Arduino. De très nombreux capteurs sont basés sur le principe de résistance variable et se câblent presque de la même façon: la cellule photoélectrique, le capteur de pression, le fil résistif, etc.

potentiomètre

La diode

La diode ne laisse passer le courant que dans un seul sens. C’est un composant polarisé: on reconnait toujours son anneau coloré d’un coté du composant, correspondant à la cathode.

diode

La diode LED

La diode électroluminescente (LED) émet de la lumière. Elle est polarisée: La patte “+” est la plus longue, l’autre patte est la patte “-” . Les broches numériques de l’Arduino, lorsqu’elles sont configurées en sorties et qu’elles sont à l’état 1 ou haut ( HIGH) , fournissent une tension de 5 volts, supérieure à ce que peut accepter une LED. Les LED doivent donc être couplées en série avec une résistance.

La diode LED

La tension de seuil dépend de la couleur et donc de la composition chimique du dopage.

seuil diode

 

broche 13 arduinoRemarque : broche 13 de l’Arduino La broche numérique 13 de l’Arduino est déjà câblée en série avec une résistance de valeur moyenne pour une LED (1 kΩ), on peut donc, dans la plupart des cas, directement lui brancher une LED, comme sur la photo-ci-dessous. Attention de respecter la polarité !! Il ne reste plus qu’à déclarer dans le programme que la broche 13 est configurée en sortie, et le tour est joué pour faire quelques essais.

Sur les autres broches, il faut dimensionner la résistance en série avec la diode !!

Le condensateur (C)

Les condensateurs peuvent stocker un peu de courant si on les charge, mais comme un tonneau percé, ils renvoient ce courant instantanément s’ils sont branchés à un organe consommateur de courant. Les condensateurs sont aussi utilisés pour stabiliser ou filtrer des tensions non désirées. L’unité de sa capacité est le farad, mais les valeurs usuelles sont le μF, nF, pF. Le condensateur peut être polarisé ou non en fonction de sa conception.

condensateur

Le transistor

Le transistor sert à amplifier un signal. Un faible courant de commande peut ainsi être transformé en un courant plus important. On distingue 2 types de transistors, selon leur polarité. Le NPN et le PNP. Un transistor possède 3 pattes : la base (B), l’émetteur (E) et le collecteur (C).

transistor

Le relais

Le relais est un composant à 4 broches minimum. C’est un électroaimant que l’on peut commander en envoyant un petit courant. Au repos, il est normalement fermé, ou normalement ouvert, selon le modèle. On peut s’en servir avec l’Arduino pour commander des machines en haute tension (230V par exemple), ou pour déclencher toute machine ou lumière.

relais

Le servomoteur

Le servomoteur est un moteur (rotatif) qui peut effectuer des rotations très précises (dans une portion de tour seulement) et en un certain nombre de pas (de micro-déplacements). Il y a toutes sortes de servo moteurs. Un des avantages des servo moteurs est sa possibilité de maintenir avec force une position donnée. On peut piloter des rotations avec l’Arduino, quelques fois directement avec la carte si le moteur n’est pas trop puissant, sinon en passant par un montage associé. (shields).

servomoteur

Le vibreur

Un vibreur produit un signal sonore pour alerter d’une situation dangereuse, pour confirmer une minuterie, quand un bouton est pressé, … La tonalité du vibreur ne peut être modifiée, car la fréquence de l’oscillateur est fixée.

vibreur

Le piezo

Le transducteur piézo-électrique est un composant réversible: il peut aussi bien être utilisé en capteur de chocs ou de vibrations qu’en actionneur pouvant émettre des sons stridents parfois modulables.

Le piezo

ARDUINO

4.1. Ca sert à quoi ?

  • Interagir avec le monde réel
  • Lire les données d’un capteur
  • Commander un actionneur
  • Acquisition et transfert de données
  • Traitement numérique du signal
  • Etc.

Carte Arduino

4.2. C’est pour qui ?

Pour les jeunes et les adultes. Tout le monde peut faire ses premières armes avec les composants électroniques et s’initier à leur programmation.

4.3. Qu’est-ce que c’est

  • Une plate-forme de développement et de prototypage Open Source.
  • Le rôle de la carte Arduino est de stocker un programme et de le faire fonctionn
  • Shields (cartes d’extension) avec des fonctions diverses qui s’enfichent sur la carte Arduino :
    • Relais, commande de moteurs, lecteur carte SD, …
    • Ethernet, WIFI, GSM, GPS, …
    • Afficheurs LCD, Écran TFT, …

4.3.1. Quelques cartes Arduino

  • Arduino uno
  • Arduino nano
  • Arduino MEGA
  • Arduino

cartes Arduino

4.3.2. Divers Shields Arduino

Shields Arduino

4.4. Présentation de la carte UNO

L’Arduino est une plateforme open source d’électronique programmée qui est basée sur une carte à microcontrôleur et un logiciel. Plus simplement, on peut dire que l’Arduino est un module électronique, doté d’un microcontrôleur programmable. Il peut être utilisé pour développer des objets interactifs, munis d’interrupteurs ou de capteurs, et peut contrôler une grande variété de lumières, moteurs ou toutes autres sorties matérielles.

La programmation se fait à l’aide d’un langage proche du C/C++, dont les bases sont faciles d’accès. Le logiciel nécessaire fonctionne à la fois sur Mac OSX, Windows et GNU/Linux et demande très peu de ressources. Comme le prix d’un module Arduino est faible, nous disposons donc d’un excellent outil qui nous permettra d’apprendre les bases de la programmation, de l’électricité, de l’électronique et de l’automation.

carte UNO

Le principe de fonctionnement est simple:

    1. On réalise le programme sur un ordinateur.
    2. On connecte l’ordinateur à l’Arduino via une prise USB.
    3. On envoie le programme sur l’Arduino.
    4. L’Arduino exécute enfin le programme de manière autonome.

4.4.1. Quelques précisions sur la carte

carte Arduino UNO

Le microcontrôleur

Voilà le cerveau de notre carte (en 1). C’est lui qui va recevoir le programme que vous aurez créé et qui va le stocker dans sa mémoire puis l’exécuter.

L’alimentation

Pour fonctionner, la carte a besoin d’une alimentation. Le microcontrôleur fonctionnant sous 5V, la carte peut être alimentée en 5V par le port USB (en 2) ou bien par une alimentation externe (en 3) qui est comprise entre 7V et 12V. Cette tension doit être continue et peut par exemple être fournie par une pile 9V. Un régulateur se charge ensuite de réduire la tension à 5V pour le bon fonctionnement de la carte

La visualisation

Les trois “points blancs” entourés en rouge (4) sont en fait des LED dont la taille est de l’ordre du millimètre. Ces LED servent à deux choses : elle clignote quelques secondes quand on branche la carte au PC. Les deux LED du bas du cadre : servent à le téléchargement du programme dans le microcontrôleur.

La connectique

La carte Arduino ne possédant pas de composants qui peuvent être utilisés pour un programme, mis a par la LED connectée à la broche 13 du microcontrôleur, il est nécessaire de les rajouter. Mais pour ce faire, il faut les connecter à la carte. C’est là qu’intervient la connectique de la carte (en 5a et 5b). Par exemple, on veut connecter une LED sur une sortie du microcontrôleur. Il suffit juste de la connecter, avec une résistance en série, à la carte, sur les fiches de connections de la carte. Cette connectique est importante et a un brochage qu’il faudra respecter.

Les entrées / les sorties digitales

Ce sont les deux rangées de connecteurs de part et d’autre de la carte qui permettent sa connexion au monde extérieur. (D0 à D13)

Voilà le cerveau de notre carte (en 1). C’est lui qui va recevoir le programme que vous aurez créé et qui va le stocker dans sa mémoire puis l’exécuter.

L’alimentation

Pour fonctionner, la carte a besoin d’une alimentation. Le microcontrôleur fonctionnant sous 5V, la carte peut être alimentée en 5V par le port USB (en 2) ou bien par une alimentation externe (en 3) qui est comprise entre 7V et 12V. Cette tension doit être continue et peut par exemple être fournie par une pile 9V. Un régulateur se charge ensuite de réduire la tension à 5V pour le bon fonctionnement de la carte

La visualisation

Les trois “points blancs” entourés en rouge (4) sont en fait des LED dont la taille est de l’ordre du millimètre. Ces LED servent à deux choses : elle clignote quelques secondes quand on branche la carte au PC. Les deux LED du bas du cadre : servent à le téléchargement du programme dans le microcontrôleur.

La connectique

La carte Arduino ne possédant pas de composants qui peuvent être utilisés pour un programme, mis a par la LED connectée à la broche 13 du microcontrôleur, il est nécessaire de les rajouter. Mais pour ce faire, il faut les connecter à la carte. C’est là qu’intervient la connectique de la carte (en 5a et 5b). Par exemple, on veut connecter une LED sur une sortie du microcontrôleur. Il suffit juste de la connecter, avec une résistance en série, à la carte, sur les fiches de connections de la carte. Cette connectique est importante et a un brochage qu’il faudra respecter.

Les entrées / les sorties digitales

Ce sont les deux rangées de connecteurs de part et d’autre de la carte qui permettent sa connexion au monde extérieur. (D0 à D13).

Les entrées sorties digitales

Chacun des connecteurs D0 à D13 peut être configuré dynamiquement par programmation en entrée ou en sortie. Les signaux véhiculés par ces connecteurs sont des signaux logiques compatibles TTL, c’est-à dire qu’ils ne peuvent prendre que deux états HAUT (5 Volts) ou BAS (0 Volt). En pratique, les connecteurs D0 et D1 réservés pour la liaison série asynchrone (port COM virtuel via le câble USB) ne sont pas exploités pour d’autres utilisations. Certains connecteurs peuvent être spécialisés comme sorties PWM (repérées par un ~) .

 

Attention : chacun des connecteurs ne peut fournir ou absorber un courant supérieur à 40 mA

Les entrées analogiques

Par défaut et contrairement aux entrées/sorties digitales qui ne peuvent prendre que deux états HAUT et BAS, ces six entrées peuvent admettre toute tension analogique comprise entre 0 et 5 Volts.

Les bornes d’alimentation

  • GND : Terre (0V)
  • 5V : Alimentation +5V
  • 3.3V : Alimentation +3.3V
  • Vin : Alimentation non stabilisée (= même tension que celle à l’entrée de la carte)

4.5. La programmation, qu’est-ce que c’est ?

Dans cette première partie, nous ferons nos premiers pas avec Arduino. Nous allons avant tout voir de quoi il s’agit exactement, essayer de comprendre comment cela fonctionne, puis installerons le matériel et le logiciel pour ensuite enchainer sur l’apprentissage du langage de programmation nécessaire au bon fonctionnement de la carte Arduino. La carte Arduino est une carte électronique qui ne sait rien faire sans qu’on lui dise quoi faire. Pourquoi ? Et bien c’est dû au fait qu’elle est programmable. Cela signifie qu’elle a besoin d’un programme pour fonctionner.

Un programme :

Un programme est une liste d’instructions qui est exécutée par un système. Par exemple votre navigateur internet, est un programme. On peut analogiquement faire référence à une liste de course ou une recette de cuisine.

Chaque élément de cette liste est une instruction qui vous dit : “Va chercher le lait” ou “Va chercher le pain”, etc. Dans un programme le fonctionnement est similaire :

  • Attendre que l’utilisateur rentre un site internet à consulter
  • Rechercher sur internet la page demandée
  • Afficher le résultat

Tel pourrait être le fonctionnement de votre navigateur internet. Il va attendre que vous lui demandiez quelque chose pour aller le chercher et ensuite vous le montrer. Eh bien, tout aussi simplement que ces deux cas, une carte électronique programmable suit une liste d’instructions pour effectuer les opérations demandées par le programme. Des programmes, on peut en trouver de partout. Mais restons concentré sur Arduino. Le programme que nous allons mettre dans la carte Arduino, c’est nous qui allons le réaliser. Voici un exemple de programme C qui peut être envoyé directement dans la mémoire de l’Arduino.

programme cligner une LED

Ce langage est appelé langage C. Ce langage a besoin d’un logiciel pour être écris et envoyé la carte Arduino. Ce logiciel est totalement gratuit et disponible sur le NET à l’adresse suivante ICI. Le programme, une fois installé, à pour icone : Cliquez deux fois dessus pour accéder aux lignes de code.

4.6. Le langage C

Le C est un langage incontournable qui en a inspiré beaucoup d’autres. Inventé dans les années 70, il est toujours d’actualité dans la programmation système et la robotique. Il est plutôt complexe, mais si vous le maîtrisez-vous aurez des bases de programmation très solides ! Dans ce cours, vous commencerez par découvrir le fonctionnement de la mémoire, des variables, des conditions et des boucles.

4.7. L’environnement de programmation

Programmer avec le logiciel IDE Arduino L’IDE (environnement de développement intégré) fonctionnant sur divers systèmes d’exploitation qui permet d’éditer le programme sur un ordinateur et de le transférer via le port usb.

IDE Arduino

IDE Arduino détails

Coloration syntaxique de l’IDE:

En orange, apparaissent les mots-clés reconnus par le langage Arduino comme les fonctions .

En bleu, apparaissent les mots-clés reconnus par le langage Arduino comme des constantes.

En gris, les commentaires qui ne seront pas exécutés dans le programme.

Déclarer un commentaire de deux manières différentes :

  • tout ce qui se trouve après « // » sera un commentaire.
  • on encadrer des commentaires sur plusieurs lignes entre « /* » et « */ ».

Instructions de base

5.1. Liste d’instructions

5.2 Arduino Condensé – Résumé fonctions

5.2. Résumé des instructions

Voici cependant un résumé très rapide des principales instructions que nous utiliserons

Syntaxe du langage (Arduino):

La syntaxe d’un langage de programmation est l’ensemble des règles d’écritures liées à ce langage. On va donc voir dans ce sous chapitre les règles qui régissent l’écriture du langage Arduino. La structure de base du langage de programmation Arduino est assez simple et comprend au moins deux parties. Ces deux parties, ou fonctions, contiennent des blocs d’instructions.

Setup() est l’initialisation du programme et loop() est l’exécution du programme. Ces deux fonctions sont impérativement requises pour que le programme fonctionne. La fonction setup() doit suivre la déclaration des variable au tout début du programme. Il s’agit de la première fonction à exécuter dans le programme. Elle est exécutée une seule fois et sert à établir le mode d’une broche (pinMode) ou à initialiser la communication série.

La fonction loop() suit immédiatement et comprend le code à exécuter en continue – lisant les capteurs en entrée et déclenchant les actionneurs en sortie, etc. Cette fonction est le noyau de tout programme Arduino et réalise l’essentiel du travail.

void setup()
{
     Blocs instructions ;
}

void loop()
{
     Blocs instructions ;
}

Setup:  La fonction setup() n’est appelée qu’une fois au démarrage du programme. Utilisez-là pour initialiser le mode des broches ou fixer le débit de communication série. Il doit être dans tout les programmes même si il n’y a aucune instruction à jouer.

void setup()
{
     pinMode(broche, OUTPUT); // Configuer la "broche" comme sortie
}

Loop: Après avoir appelé la fonction void setup(), la fonction void loop() fait une boucle (loop en anglais) infinie permettant de contrôler la carte arduino, tant que le programme ne change pas. Les fonctions void setup() et void loop() sont les 2 fonctions obligatoires en arduino, mais d’autres peuvent être créées

void loop()
{
        digitalWrite(broche, HIGH); //met la broche en "ON"
        delay(1000); //pause pendant une seconde
        digitalWrite(broche, LOW); //met la broche en "OFF"
        delay(1000); //pause pendant une seconde
}

Les accolades {} : Les accolades (ouvrantes ou fermantes) définissent le début et la fin d’une fonction ou d’un bloc d’instructions, comme pour la fonction void loop() ou les instructions if et for. Une accolade ouvrante { est toujours suivie par une accolade fermante }. Une accolade non fermée donne des erreurs ou des programmes lors de la compilation mais peut être dure à corriger en cas de programmes très longs. L’environnement Arduino inclue un système de vérification des accolades. Il suffit de cliquer sur une accolade pour voir sa “paire” se surligner.

type fonction()
{
     instructions;
}

Le point-virgule : Le point-virgule est utilisé pour finir une instruction et séparer les éléments d’un programme. On l’utilise, par exemple, pour séparer les éléments de la boucle for.

Note : Oublier le point-virgule à la fin d’une ligne donne une erreur de compilation. Le message d’erreur peut parfois faire référence au point-virgule oublié, mais pas toujours. Si le message d’erreur est illogique et incompréhensible, une des premières choses à faire est de vérifier s’il n’y a pas un point-virgule manquant.

int x=13; // on déclare la variable x avec initialisation à 13

Les paragraphes commentaires /*…..*/ : Un commentaire (sur une ligne ou sur plusieurs) est une zone de texte qui est ignoré par le programme lors de la compilation et qui est utilisé afin de décrire le code ou pour le commenter pour faciliter sa compréhension auprès de personnes tiers. Un commentaire commence par /* et fini avec */ et peut faire plusieurs ligne. De par le fait que les commentaires soient ignorés et qu’ils ne prennent pas d’espace mémoire, ils peuvent être utilisés généreusement, par exemple pour débuger une partie du code.

Note : Il est possible de faire un paragraphe d’une seule ligne avec /* */ mais on ne peut pas inclure un second bloc dans le premier.

/* ceci est un paragraphe de commentaire commencé
ne pas oublier de le refermer
*/

Les lignes de commentaires // : Une seule ligne de commentaire commence par // et fini à la fin de la ligne de code. Tout comme le paragraphe de commentaires, la ligne est ignorée lors de la compilation et ne prend pas de mémoire. La ligne de commentaire est souvent utilisée pour donner des informations ou pour rappeler quelque chose à propos d’une ligne.

Les variables : Une variable est une façon de nommer et de stocker une information/valeur afin de l’utiliser plus tard dans le programme. Comme son nom l’indique, une variable est une valeur qui peut être continuellement modifiée à l’opposé d’une constante qui ne change jamais de valeur. Une variable a besoin d’être déclarée et on peut lui assigner une valeur que l’on veut stocker, mais cela est optionnel. Le code suivant déclare une variable nommé inputVariable et lui assigne une valeur lue via analogRead sur la broche 2. Une variable peut être déclarée à de nombreux endroits dans le programme, l’emplacement de sa déclaration détermine quelles parties du programme auront accès à cette variable.

int v_1=0; // déclare v_1 et lui assigne la valeur 0
int v_2=analogRead(2); // assigne la valeur de la broche analogique 2 à la variable v_2

Les types de données: 

  • byte: Byte permet de stocker une valeur entière sur 8 bits (pas de chiffre à virgule donc). Cela permet d’aller de 0 à 255.

byte

  • int: Int (pour integers, entier) est le type de base pour les chiffres (sans virgule) des variables. Le stockage se fait sur 16 bits, permettant d’aller de 32 767 à – 32 768.

int

  • Long : Il s’agit d’un type de variable de grande taille : la donnée (chiffre sans virgule) est stockée sur 32 bits. Cela permet d’aller de 2 147 483 647 à – 2 147 483 648.

long

  • Float : Ce type permet de stocker les chiffres “flottant” ou chiffre à virgule. Le float bénéfice d’une meilleure résolution que les entiers (int) : ils sont stockés sur 32 bits, soit de 3,4028235^38 à – 3,4028235^38. Note : Les chiffres flottants ne sont pas exacts et il arrive que des résultats étranges ressortent de leur

float

  • Bool : Le type bool prend 2 valeurs : Vrai (true) ou Faux (false). Il est stocké sur 8 bits et se comporte ainsi :
    • 0 = FAUX = FALSE
    • 1 = VRAI = TRUE

bool

  • Char : Le type char est utilisé pour stocker une lettre. Le stockage se fait sur 8 bits et permet de stocker une seule Note : Pour assigner une valeur à la variable char, on l’écrira entre ‘.

char

  • string: Il ne s’agit pas exactement d’un type de variable, il s’agit d’une classe. La classe String est comparable a une variable possédant ses propres fonctions. String permet de  stocker  une chaîne de caractères, comme pourrait le faire un tableau de caractère. String permet de réaliser des opérations sur les chaînes de caractères plus complexes que ce qui se ferait sur un tableau de caractères.

string

Les opérations arithmétiques

Les opérations d’arithmétique incluent les additions, les soustractions, les multiplications et les divisions. Elles retournent respectivement la somme, la différence, le produit et le quotient des 2 opérants. L’opération est réalisée en utilisant les types de données des opérants, de façon à ce que, par exemple, 9 / 4 donnera 2 plutôt que 2,25 car 9 et 4 sont des entiers (int), or le type “int” ne peut être un chiffre à virgule. Cela veut aussi dire que le résultat peut être trop grand pour le type  de  variable  initiale.Les opérations arithmétiques

Les opérations d’incrémentation

Les opérateurs d’incrémentation permettent de réaliser une opération simple, ils sont communément utilisés dans la boucle for, voir plus bas. Il en existe 2 : l’incrémentation et la décrémentation.

Les opérations d'incrémentation

Les opérations de comparaison

La comparaison d’une variable ou d’une  constante avec une autre est souvent utilisée afin  de tester  si une condition spécifique est vraie ou non. Dans les exemples suivants, l’opérateur est utilisé pour indiqué une condition :

Les opérations de comparaison

 Les opérateurs logiques

Les opérateurs logiques sont utilisés pour comparer deux expressions/conditions. Ils renvoient TRUE (vrai) ou FALSE (faux) selon l’opération. Il y a trois opérateurs logiques : AND  (et), OR  (ou) et NOT (contraire), ils sont souvent utilisés dans les if (voir plus bas) :

 Les opérateurs logiques

Les constantes

Le langage Arduino possède des valeurs prédéfinies; elles sont appelée constantes. Elles sont utilisées pour rendre un programme plus simple à lire. Il en existe différents groupes.

 

  • Vrai / Faux (True / False): Il s’agit de variable du type booléen. FALSE signifie que la constante est à 0 alors que TRUE désigne l’état  différent  de 0 : cela peut être 1 (par convention) mais cela  peut  aussi être -1, 2, -200, …
if(b==TRUE)
{
  instructions;
}

  • Haut / Bas (High / Low): Il s’agit des constantes utilisées pour lire ou pour écrire sur les broches, soit le niveau HIGH (ON, 1, 5 volts) soit le niveau LOW (OFF, 0, 0 volts).

digitalWrite(13,HIGH);

  • Entrée / Sortie (Input / Output): Ces constantes sont utilisées avec la fonction pinMode(), elles définissent le type de broche digitale :
    •      INPUT pour entrée
    •      OUTPUT pour sortie
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);

Les structures de contrôle

  • if: La structure de test “if” (si) vérifie si une certaine condition est atteinte, par exemple si une valeur est égale à un certain nombre, et exécute des instructions contenu dans la structure. Si la condition est  fausse,  le programme quitte la structure et reprend à la ligne suivante. Le format du if est :
if(x==10)
{
    intructions;
}

  • if …. else: if… else (si…sinon) est utilisé pour dire “sinon fait…”. Par exemple, si on veut tester une entrée digitale et faire ne action si elle vaut HIGH et d’autres actions si elle vaut LOW, on écrira :
if(x==HIGH)
{
 intruction 1;
 intruction 2;
 ...
}
else
{
 intruction a;
 intruction b;
 ...
}

  • Switch … case: La structure switch… case (commutateur de cas) permet de dresser une liste de tests ou de cas (comme le “if”) et d’exécuter le code correspondant si un des cas du test est vrai. La principale différence entre le switch… case et le if… else est que le switch… case permet de continuer les tests même si un des cas est vrai, contrairement au if…else qui quittera dans le même cas.
switch(Variable)
{
 case A: inst 1;
 case B: inst 2;
 case C: inst 3;
 case D: inst 4;
}
 

Variable sera comparée à A, si le test est vrai, inst 1 sera exécuté. Une fois le code exécuté (ou si le test est faux), ” Variable ” sera comparé à B et  ainsi de suite. Dans le cas  où on voudrait s’arrêter à un des cas, on ajoutera l’instruction break. De plus, si aucun des cas n’est vérifié, on peut ajouter le cas default qui sera exécuté si aucun test n’est vrai.

switch case

  • For : La structure for (pour) est utilisée afin de répéter une série d’instructions (comprise entre les accolades) le nombre de fois voulu. Un compteur à incrémenter est souvent utilisé afin de sortir de la boucle une fois le nombre de tour fait. Cette structure est composée de trois parties séparées par un point-virgule (;) dans l’entête de la boucle :

for

L’initialisation       d’une       variable       locale,       ou       compteur d’incrémentation, permet d’avoir une variable ne servant qu’une fois dans le programme. A chaque tour de boucle, la condition de l’entête est testée. Si cette condition est vraie, doSomething est exécuté ainsi que l’expression d’incrémentation et la condition est de nouveau  testée. Quand la condition devient fausse, la boucle prend fin. L’exemple suivant commande avec un entier i à 0, on vérifie s’il  est inférieur à 20 et si c’est vrai, on l’incrémente de 1 et on  exécute le programme contenu dans les accolades :

exemple for

  • While : La boucle “while” (tant que) continuera infiniment tant que l’expression entre parenthèse est  Quelque chose doit changer afin de modifier la condition sinon le programme ne sortira jamais de la boucle while. Cela peut être dans le code,  comme l’incrémentation d’une variable,  ou une condition extérieure, comme le test d’un capteur. L’exemple suivant test si “someVariable” est inférieur à 200 et si c’est vrai, le code entre les accolades est exécuté et la boucle continue tant que “someVariable” est inférieure à 200.

exemple while

  • do … while : La boucle do… while (faire… tant que) fonctionne de la même façon que la boucle while, à la seule exception que la condition est testée à la fin de la boucle, de ce fait le code dans la boucle s’exécute toujours au moins une L’exemple suivant assigne à la variable “x” la valeur lireCapteur(), puis fait une pause de 50ms    et continue infiniment tant que x est plus petit que 100.

do while

 

Les entrées et sorties numériques

  • pinMode(pin, mode) : Utilisée dans le void setup(), cette fonction permet de configurer une broche soit en entrée (INPUT) soit en sortie (OUTPUT).

pinMode

  • digitalRead(pin) : Cette fonction permet de lire la valeur à la broche digitale indiquée. La valeur lue étant soit HIGH soit La broche ciblée ne peut être qu’une variable ou une constante comprise entre 0 et   13 (pour les Arduino Uno).

digitalRead

  • digitalWrite(pin, value) : Il s’agit du contraire de digitalRead() : cette fonction permet de fixer une sortie digitale soit au niveau HIGH soit au niveau LOW. Cette sortie est comprise entre 0 et 13 sur Arduino Uno et doit être spécifiée soit par une variable soit par une constante.

digitalWrite

Les entrées et sorties analogiques

  • analogRead(pin) : Cette fonction permet d’aller lire la valeur sur une sortie analogique avec 10 bits de résolution. Elle ne fonctionne que sur les broches analogiques (0-5) et renvoie un résultat compris entre 0    et 1023.

Note : Les broches analogiques ne sont pas des broches digitales, elle ne nécessite pas d’être déclarée comme des sorties ou des entrées.

analogRead

  • analogWrite(pin, value) : analogWrite permet d’envoyer un pseudo-signal analogique en utilisant le matériel via les  broches possédant un “pulse width modulation” (PWM ou modulation de largeur d’impulsions).  Sur les Arduino les plus récents (équipé du contrôleur ATmega168), cette  fonctionnalité  se trouve sur les broches 3, 5, 6, 9, 10 et 11. Sur les plus  anciennes (ATmega8),  seules les  broches 9, 10 et  11 étaient équipées. Ce signal  est envoyé sous forme de valeur, comprise   entre 0 et 255.

analogWrite

  • delay(ms) : delay permet de marquer une pause dans le programme, le temps est en millisecondes
  • millis() :Cette fonction renvoie le nombre de millisecondes écoulé depuis que l’Arduino a commencé à exécuté le programme actuel sous l’état d’un unsigned long.

La communication Série

  • serial.begin(débit) : Permet le port série et donne la vitesse de transmission (ou débit, en bits par seconde ou bauds). La vitesse usuelle est de 9600 bauds avec les ordinateurs mais d’autres vitesses sont supportées.

serial.begin

Note : Lorsque la liaison série est utilisée, les broches digitales 0 (RX) et 1 (TX) ne peuvent être utilisées en même temps.

  • serial.println(données): Permet d’envoyer des données sur le port série et d’automatiquement retourner à la  ligne  ensuite. La commande Serial.print() fonctionne de la même façon mais sans le retour à la ligne, pouvant être moins facile à lire via le moniteur série.

serial.println

 

5.3. La bibliothèque

Une bibliothèque est un ensemble de fonctions qui s’ajoutent aux fonctions de base du logiciel   de l’Arduino et qui adressent plus particulièrement un domaine spécifique de la programmation comme, par exemple :

  • EEPROM – lire et écrire dans cette zone de mémoire permanente du micro-contrôleur ;
  • Ethernet – accéder à un réseau TCP/IP comme Internet, mais ça peut être aussi un réseau local à votre domicile, avec l’aide de la carte Ethernet ;
  • LiquidCrystal – utiliser un écran LCD ;
  • SD – lire et écrire une carte SD de technologie flash et formatée en FAT16 ou FAT32, sauf reformatage de votre part, toutes les cartes SD le sont ;
  • Servo – piloter des servomécanismes ;
  • WiFi – se connecter à un réseau sans fil à partir d’une carte WiFi ;
  • Wire – Communiquer entre Arduino et avec des périphériques capteurs, actionneurs avec le protocole

A noter que ces bibliothèques sont installées en même temps que l’IDE. Vous n’aurez pas à   les ajouter. Mais surtout, il existe des multitudes de bibliothèques dans pratiquement tous les domaines, ce qui donne à l’Arduino cette puissance incontestable et son succès.

Ce paragraphe concerne donc l’installation de librairies supplémentaires qui n’y sont pas au départ.

Bibliothèque ou Librairie ?

Avant de commencer, revenons sur un point de traduction. Arduino est un projet où l’anglais prédomine. Library est normalement traduit littéralement en français  par  bibliothèque.  Cependant l’anglicisme a pris le dessus et vous trouverez beaucoup de pages en français où on parle de librairie Arduino. Nous allons voir dans cet article comment installer une bibliothèque qui n’est pas de base dans l’IDE Arduino.

Où les trouver ?

Comme Arduino est un projet communautaire, vous trouverez des bibliothèques sur le web en général. Quelques bibliothèques sont recensées sur le site officiel . Si vous ne trouvez  pas  votre  bonheur, une recherche avec le type de shield ou de composant accompagné de Arduino et library vous donnera les pointeurs souhaités.

Où les installer ?

C:\Users\nom du PC\Documents\Arduino\libraries

Vous voyez que les bibliothèques officielles ne sont pas dans ce répertoire. Afin que chaque utilisateur de l’ordinateur y ait accès, elles sont installées dans un répertoire qui diffère du précédent et même selon les ordinateurs :

  • sous Windows 32 bits, dans C :\Program Files\Arduino\libraries ;
  • sous Windows 64 bits, dans C :\Program Files (x86)\Arduino\libraries ;

Vous pourrez faire une installation ici si vous en avez les droits pour faire profiter tous les utilisateurs de l’ordinateur de cette bibliothèque. Toutefois, ce n’est pas une procédure prévue dans l’IDE Arduino et c’est inutile si vous êtes le seul à programmer sur Arduino avec votre ordinateur.

Méthode d’installation

Dans l’IDE Arduino, vous avez le menu Croquis/Inclure une bibliothèque/Ajouter la bibliothèque .ZIP… Vous sélectionnez l’archive de la bibliothèque et vous cliquez sur OK. Elle est installée. Redémarrez l’IDE pour profiter de la bibliothèque.

Depuis les récentes versions de l’IDE Arduino, un Gestionnaire de bibliothèques est disponible  par la commande Croquis/Inclure une bibliothèque/Gérer les bibliothèques… Il permet de  retrouver une liste détaillée des bibliothèques présentes, de les mettre à  jour  lorsqu’une  évolution a été détectée chez son créateur, et d’en installer de nouvelles proposées automatiquement. Cette liste peut être triée par thème, ou par état (installées, à mettre à jour…)

Désinstallation

Supprimez simplement le répertoire de la bibliothèque et redémarrez l’IDE pour que ça soit pris  en compte

Atelier – Travaux pratiques

6.1. TP 1 : Test de fonctionnement de la carte

Avant de commencer à  programmer la tête  baissée, il faut, avant toutes choses, tester le bon fonctionnement de la carte. Car ce serait idiot de programmer la  carte  et chercher les erreurs dans le programme alors que le problème vient de la carte ! Nous allons tester notre matériel en chargeant un programme qui fonctionne dans la carte.

1ère étape : ouvrir un programme

Nous allons choisir un exemple tout simple qui consiste à faire clignoter une LED. Son nom est Blink et vous le trouverez dans la catégorie Basics :

Test de fonctionnement de la carte

Une fois que vous avez cliqué sur Blink, une nouvelle fenêtre va apparaître. Elle va contenir le programme Blink. Vous pouvez fermer l’ancienne fenêtre qui va ne nous servir plus à rien. Voici un aperçu de la fenêtre de programmation. C’est CE programme tout fait que nous allons essayer d’envoyer à la carte électronique.

blink LED

Mais avant  d’envoyer le programme Blink vers la carte, il faut dire au logiciel quel est le nom de  la carte et sur quel port elle est branchée. Choisir la carte que l’on va programmer. Ce n’est pas très compliqué, le nom de votre carte est indiqué sur elle. Pour nous, il s’agit de la carte “Uno”. Allez dans le menu “Tools” (“outils” en français) puis dans “Board” (“carte” en français). Vérifiez que c’est bien le nom “Arduino Uno” qui est coché. Si ce n’est pas le cas, cochez-le.

type carte Arduino UNO

Ensuite, choisissez le port de connexion de la carte. Allez dans le menu Tools, puis Serial port. Là, vous choisissez le port COM X, X étant le numéro du port qui est affiché. Ne choisissez pas COM1 car il n’est quasiment jamais connecté à la carte. Dans mon cas, il s’agit de COM5 :

Type de port

Pour la dernière étape, il va falloir envoyer le programme dans la carte. Pour ce faire,  il  suffit  de cliquer sur le bouton Téléverser, en blanc sur la photo :

Téléverser le code

 

  • Les messages d’informations: Vous verrez tout d’abord le message “Compilation du croquis en cours…”  pour vous informer  que le programme est en train d’être compilé en langage machine avant d’être envoyé. Ensuite vous aurez ceci :

Les messages d’informations

En bas dans l’image, vous voyez le texte : “Téléversement…“, cela signifie que le logiciel est en train d’envoyer le programme dans la carte. Une fois qu’il a fini, il affiche un autre message :

Les messages d’informations 1

Le message affiché : “Téléversement terminé” signale que le programme  à bien  été chargé  dans la carte. Si votre matériel fonctionne, vous devriez avoir une LED sur la carte qui clignote :  Si vous n’obtenez pas ce message mais plutôt un truc en rouge, pas d’inquiétude, le matériel  n’est pas forcément défectueux ! En effet, plusieurs erreurs sont possibles :

  • l’IDE recompile avant d’envoyer le code, vérifier la présence d’erreur
  • La voie série est peut-être mal choisi, vérifier les branchements et le choix de la voie série
  • l’IDE est codé en JAVA, il peut être capricieux et bugger de temps  en temps (surtout  avec la voie série…) : réessayez l’envoi!

bugger arduino

6.2. TP 2 : Allumage de LED(s)

But:

Allumer une diode LED avec plusieurs variantes :

  1. Allumer une LED
  2. Faire clignoter une LED
  3. Faire clignoter 2 LED
  4. Faire clignoter 3 LED
  5. Chenillard 6 LED
  6. BONUS : Créer une fonction paramétrée “clignotantLED” (paramètres : n°broche et durée (ms))

Schéma électrique:

Schéma électrique

Solutions :

  • variante “b”

void setup()
{
        pinMode(2, OUTPUT);
        // met la pin numérique en sortie
}
void loop()
{
        digitalWrite(2, LOW); // allume la LED delay(1000); // attend une seconde digitalWrite(2, HIGH); // éteint la LED delay(1000); // attend une seconde
}

  • variante “c”

void  setup()
{
        pinMode(2, OUTPUT);
        pinMode(3, OUTPUT);
}
void loop()
{
        digitalWrite(2, LOW);
        digitalWrite(3, HIGH);
        delay(500);
        digitalWrite(2, HIGH);
        digitalWrite(3,LOW);
        delay(500);
}
  • variante “d”

int L1 = 2;
int L2 = 3;
int L3 = 4;

void setup() {
        pinMode(L1, OUTPUT);
        pinMode(L2, OUTPUT);
        pinMode(L3, OUTPUT);
}
void loop()
{
        digitalWrite(L1, LOW);
        delay(500);
        digitalWrite(L2, LOW);
        delay(500);
        digitalWrite(L3, LOW);
        delay(500);
        digitalWrite(L1, HIGH);
        digitalWrite(L2, HIGH);
        digitalWrite(L3, HIGH);
        delay(500);
}
  • variante “e”

void setup()
{
        pinMode(2, OUTPUT); // LED D1
        pinMode(3, OUTPUT); // LED D2
        pinMode(4, OUTPUT); // LED D3
        pinMode(5, OUTPUT); // LED D4
        pinMode(6, OUTPUT); // LED D5
        pinMode(7, OUTPUT); // LED D6
}

void loop()
{
        delay(200); digitalWrite(7, HIGH); digitalWrite(2, LOW);
        delay(200); digitalWrite(2,HIGH); digitalWrite(3,LOW);
        delay(200); digitalWrite(3,HIGH); digitalWrite(4,LOW);
        delay(200); digitalWrite(4,HIGH); digitalWrite(5,LOW);
        delay(200); digitalWrite(5,HIGH); digitalWrite(6,LOW);
        delay(200); digitalWrite(6,HIGH); digitalWrite(7,LOW);
}

TP 3 : Feux routiers

But :

Réaliser un feu de signalisation routier. Pour info, le feu rouge dure 3 secondes et le feu orange dure 1 seconde (conseil : le TP 2 vous aidera pour la  réalisation de cet atelier)

Feux routiers

Schéma électrique :

 Schéma électrique

Solution :

//définition des broches
const int led_rouge_feux_1 = 2;
const int led_jaune_feux_1 = 3;
const int led_verte_feux_1 = 4;
const int led_rouge_feux_2 = 5;
const int led_jaune_feux_2 = 6;
const int led_verte_feux_2 = 7;

void setup()
{
        //initialisation en sortie de toutes les broches
        pinMode(led_rouge_feux_1, OUTPUT);
        pinMode(led_jaune_feux_1, OUTPUT);
        pinMode(led_verte_feux_1, OUTPUT);
        pinMode(led_rouge_feux_2, OUTPUT);
        pinMode(led_jaune_feux_2, OUTPUT);
        pinMode(led_verte_feux_2, OUTPUT);

        //on initialise toutes les LED éteintes  au  début du programme (sauf les deux feux rouges)
        digitalWrite(led_rouge_feux_1, LOW);
        digitalWrite(led_jaune_feux_1, HIGH);
        digitalWrite(led_verte_feux_1, HIGH);
        digitalWrite(led_rouge_feux_2, LOW);
        digitalWrite(led_jaune_feux_2, HIGH);
        digitalWrite(led_verte_feux_2, HIGH);
}

void loop()
{
        // première séquence
        digitalWrite(led_rouge_feux_1, HIGH);
        digitalWrite(led_verte_feux_1, LOW);
        delay(3000);
        // deuxième séquence
        digitalWrite(led_verte_feux_1, HIGH);
        digitalWrite(led_jaune_feux_1, LOW);
        delay(1000);
        // troisième séquence
        digitalWrite(led_jaune_feux_1, HIGH);
        digitalWrite(led_rouge_feux_1, LOW);
        delay(1000);

        /* deuxième partie du programme, on s'occupe du feux numéro 2 */
        // première séquence
        digitalWrite(led_rouge_feux_2, HIGH);
        digitalWrite(led_verte_feux_2, LOW);
        delay(3000);
        // deuxième séquence
        digitalWrite(led_verte_feux_2, HIGH);
        digitalWrite(led_jaune_feux_2, LOW);
        delay(1000);
        // deuxième séquence
        digitalWrite(led_jaune_feux_2, HIGH);
        digitalWrite(led_rouge_feux_2, LOW);
        delay(1000);
        // le programme va reboucler et revenir au début
}

TP 4 : Boutons poussoirs et LED

Avant de commencer, ce qu’il faut savoir sur les boutons ! pour câbler un bouton poussoir sur la  carte  Arduino, on pourrait penser qu’il suffit de le connecter comme suit. Lorsque le bouton est pressé, l’entrée est à 5 V, mais lorsque le bouton n’est pas pressé,  elle  n’est pas définie car elle est “en l’air”. Les entrées du  microcontrôleur  équipant l’Arduino sont très sensibles et elles réagissent à la tension qui leur est appliquée. En conséquence, l’entrée laissée en l’air peut avoir n’importe quelle valeur comprise entre 0 et 5 V et être interprétée comme un LOW ou un HIGH par l’instruction digitalRead(…).

Boutons poussoirs et LED

Lorsque l’on fait de l’électronique, on a toujours peur des perturbations (générées par plein de choses : des lampes à proximité, un téléphone portable, un doigt sur le circuit,  l’électricité statique, …). On appelle ça des contraintes de CEM. Ces perturbations sont souvent inoffensives,  mais perturbent beaucoup les montages électroniques. Il  est  alors nécessaire d’en prendre compte lorsque l’on fait de l’électronique de signal. Par exemple, dans certains cas on peut se retrouver avec un bit de signal qui vaut 1 à la place de 0, les données reçues sont donc fausses.

résistance de pull-up

Pour contrer ces effets nuisibles, on place en série avec le bouton une résistance de pull-up. Cette résistance sert à “tirer” (“to pull” in english) le potentiel vers le haut (up) afin d’avoir un signal clair sur la broche étudiée. Sur le schéma suivant, on voit ainsi qu’en temps normal le “signal” à un potentiel de 5V. Ensuite, lorsque l’utilisateur appuiera sur le bouton une connexion sera faite avec la masse. On lira alors une valeur de 0V pour le signal. Voici donc un deuxième intérêt de la résistance de pull-up, éviter le court-circuit qui serait généré à l’appui.

Que peux-tu dire sur la résistance de pull-down ?

Filtrer les rebonds:

Les boutons ne sont pas des systèmes mécaniques parfaits. Du coup, lorsqu’un appui est fait dessus, le signal ne passe pas immédiatement et proprement de 5V à 0V. En l’espace de quelques millisecondes, le  signal  va “sauter” entre 5V et 0V plusieurs fois avant de se stabiliser. Il se passe le même phénomène lorsque l’utilisateur  relâche le bouton. Ce genre d’effet n’est pas désirable, car il peut engendrer des parasites au sein de votre programme (si vous voulez détecter un appui, les rebonds vont vous en générer une dizaine en quelques millisecondes, ce qui peut être très gênant dans le cas d’un compteur par exemple). Voilà, ci-contre, un exemple de chronogramme relevé lors du relâchement d’un bouton poussoir. Pour atténuer ce phénomène, nous allons utiliser un condensateur en parallèle avec le bouton. Ce composant servira ici  “d’amortisseur”  qui absorbera les rebonds (comme sur une voiture avec les cahots de la route). Le condensateur, initialement chargé, va se décharger lors de l’appui sur le bouton. S’il y a des rebonds, ils seront encaissés par le condensateur durant cette décharge. Il se passera le phénomène inverse (charge du condensateur) lors du relâchement du bouton. Ce principe est illustré à la figure ci-contre :

Filtrer les rebonds

Résistance interne de pull-up

Il faut savoir qu’il existe des résistances de pull-up en interne du microcontrôleur de l’Arduino, ce qui évite d’avoir à les rajouter par nous mêmes par la suite. Ces dernières ont une valeur de 20 kiloOhms. Elles peuvent être utilisés sans aucune contraintes techniques. Cependant, si vous les mettez en marche, il faut se souvenir que cela équivaut à mettre la broche à l’état haut (et en entrée évidemment). Donc si vous repassez à un état de sortie ensuite, rappelez vous bien que tant que vous ne l’avez pas changée elle sera à l’état haut. Un TP mettra en lumière la marche à suivre pour activer ces résistances internes.

Résistance interne de pull-up

Remarque importante :

 Attention, pour le pin 13, il est déconseillé d’utiliser le mode INPUT_PULLUP. Si vous devez vous servir du pin 13 comme pin de lecture, préférez un montage avec une résistance externe en pull-up ou pull-down. L’explication se trouve dans le fait que le pin 13 est aussi    lié à une LED et une résistance. Il ne fournira donc pas du +5V, mais du +1.7V à cause de    la LED et de la résistance en série qui baissent la tension. De ce fait la lecture sera toujours  à LOW.

But :

Allumer la LED en fonction de l’état du bouton. Cet exercice comporte plusieurs variantes :

  1. Allumer une LED avec un bouton poussoir
  2. Allumer une LED avec deux BP en fonction logique OU
  3. Allumer une LED avec deux BP en fonction logique ET
  4. Allumer une LED avec un BP et l’éteindre avec l’autre BP
  5. Lire les états des boutons sur le port série

Remarque : On utilisera les résistances de pull-up internes de l’Arduino et on ne prendre pas de précautions par rapport aux possibles rebonds des boutons !

Schéma électrique :

Schéma électrique LED

Solution :

  • variante “a”
//le bouton connecté à la broche 2 de la carte Adruino
const int bouton = 2;

//la LED à la broche 12
const int led = 12;

//variable qui enregistre l'état du bouton
int etatBouton;

void setup()
{
        pinMode(led, OUTPUT); //la led est une sortie
        pinMode(bouton, INPUT); //le bouton est une entrée
        etatBouton = HIGH; //on initialise l'état du bouton comme "relaché"
}
void loop()
{
        etatBouton = digitalRead(bouton); // bouton = 2
        if(etatBouton == HIGH) //test si le bouton a un niveau logique HAUT
        {
                digitalWrite(led,HIGH); //la LED reste éteinte
        }
        else //test si le bouton a un niveau logique BAS
        {
                digitalWrite(led,LOW); //la LED est allumée
        }
}

  • variante “b”
void setup()
{
        pinMode(2, INPUT_PULLUP); //mode lecture pour le bouton avec résistance interne pullup
        pinMode(3, INPUT_PULLUP); //mode lecture pour le bouton avec résistance interne pullup
        pinMode(12, OUTPUT);
}
void loop()
{
        boolean etatS1 = digitalRead(2);
        //lecture bouton S1 et stockage dans etatS1
        boolean etatS2 = digitalRead(3);
        //lecture bouton S2 et stockage dans etatS2
        if ((etatS1==LOW)||(etatS2==LOW))
        {
                digitalWrite(12,LOW); //Led allumée
        }
        else
        {
                digitalWrite(12,HIGH);
        }
}

Ressources