43
Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino J O BONNÉ Lycée J EAN-MONNET BRUXELLES A.E.F.E. 9 janvier 2017 en cours de construction Résumé La carte Arduino connaît depuis quelques années un succès 1 planétaire. Elle permet la réalisation de projets du domaine technologique au domaine artistique 2 . Les logiciels Arduino et Processing ont été bien conçus pour pouvoir écrire des programmes relativement simples pour aborder la programmation avec plaisir. Les bases de l’électricité peuvent être ainsi reprises et progressivement étendues de façons ludique et expérimentale, c’est la vocation de ce document. L’effort d’apprentissage est largement récompensé : la carte Arduino ne se limite pas uniquement aux fonctions de base. Le microcon- trôleur qui la gère recèle ne nombreuses possibilités d’extensions et son logiciel est suffisamment ouvert pour aller bien au delà des exemples qu’il présente dans son menu. Il est notamment possible d’écrire directement en langage C et en langage C++. Des montages complexes peuvent alors être réalisés nécessitant une exécution rapide des lignes de code. Ce document a été essentiellement réalisé par programmation : Le texte avec L A T E X, [4] Les schémas électriques avec Tik Z, package de L A T E X, [8] Le logiciel Fritzing pour incorporer les images, [5] Les lignes de code avec : Le langage Arduino, Le langage Processing, Les bibliothèques controlP5 et G4P de Processing, Le langage C pour les approfondissements. Tous ces logiciels sont gratuits. 1. Prix 23 – On peut découvrir les nombreux montages de l’électronique de base et de faible puissance à bas coût en utilisant une plaque de prototypage «breadboard» (coût inférieur à 8 ) pour les réaliser. 2. Arduino a conquis sa place dans les arts numériques 1

Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

Embed Size (px)

Citation preview

Page 1: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

Projet ArduinoApprendre les bases de l’électronique avec une carte Arduino

JO BONNÉ

Lycée JEAN-MONNET

BRUXELLES

A.E.F.E.

9 janvier 2017en cours de construction

Résumé

La carte Arduino connaît depuis quelques années un succès 1 planétaire. Elle permet la réalisation de projets du domaine technologiqueau domaine artistique 2. Les logiciels Arduino et Processing ont été bien conçus pour pouvoir écrire des programmes relativementsimples pour aborder la programmation avec plaisir.

Les bases de l’électricité peuvent être ainsi reprises et progressivement étendues de façons ludique et expérimentale, c’est la vocationde ce document.

L’effort d’apprentissage est largement récompensé : la carte Arduino ne se limite pas uniquement aux fonctions de base. Le microcon-trôleur qui la gère recèle ne nombreuses possibilités d’extensions et son logiciel est suffisamment ouvert pour aller bien au delà desexemples qu’il présente dans son menu. Il est notamment possible d’écrire directement en langage C et en langage C++. Des montagescomplexes peuvent alors être réalisés nécessitant une exécution rapide des lignes de code.

Ce document a été essentiellement réalisé par programmation :— Le texte avec LATEX, [4]— Les schémas électriques avec Tik Z, package de LATEX, [8]— Le logiciel Fritzing pour incorporer les images, [5]— Les lignes de code avec :

— Le langage Arduino,— Le langage Processing,— Les bibliothèques controlP5 et G4P de Processing,— Le langage C pour les approfondissements.

Tous ces logiciels sont gratuits.

1. Prix ≈ 23 € – On peut découvrir les nombreux montages de l’électronique de base et de faible puissance à bas coût en utilisant une plaque de prototypage«breadboard» (coût inférieur à 8 €) pour les réaliser.

2. Arduino a conquis sa place dans les arts numériques

1

Page 2: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

– Sommaire –

1 Matériel et logiciel 41.1 Alimentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

I Les fonctions de bases 5

2 Sorties numériques - digital output 62.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.2 Programmation d’une sortie numérique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.3 Logique inversée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.4 Le moniteur série intégré à l’IDE Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2.4.1 Son utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.4.2 Amélioration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

3 Sorties PWM – Pulse Width Modulation ou Modulation de Largeur d’Impulsion 93.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93.2 Programmation d’une sortie PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93.3 Commande d’une sortie PWM par le moniteur série . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

4 Signal carré de fréquence audible ou ultrasonore 11

5 Entrées numériques - digital input 125.1 État d’une entrée numérique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

6 Entrées analogiques - analogic input 13

7 Gestion des durées 147.1 Pause . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147.2 Instant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

8 Résumé : principales commandes spécifiques de la carte Arduino 16

II Éléments de programmation avec le logiciel Arduino 17

9 Déclaration de variable 17

10 Conversions 17

11 Opérateurs logiques 17

12 Condition 17

13 Branchement 18

14 Itération avec for ou while 18

15 Changement d’échelle 18

III Éléments de programmation avec le logiciel Processing 19

16 Introduction 19

17 Sélection de commandes Processing 1917.1 Commandes générales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1917.2 Commandes spécifiques de la souris . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1917.3 Commandes spécifiques du clavier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

18 Commande d’une sortie numérique par Processing 20

19 Commande d’une sortie PWM par Processing 21

20 Graphe d’une conversion analogique-numérique avec Processing 22

IV Quelques bibliothèques de Processing 23

21 Introduction 23

22 La bibliothèque controlP5 2322.1 Commande d’une sortie numérique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2322.2 Commande d’une sortie PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

23 La bibliothèque G4P 2523.1 Commande d’une sortie numérique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2523.2 Commande d’une sortie PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

V Approfondissements 27

2

Page 3: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

24 Quelques registres du microcontrôleur Atmega 328 de l’Arduino Uno 28

25 Langage Arduino et langage C 2825.1 Base 10 ou décimale – base 2 ou binaire – base 16 ou hexadécimale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2825.2 Règles d’écriture communément admises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2925.3 Comparaisons et opérations logiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

25.3.1 Comparaisons logiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2925.3.2 Opérations logiques et masque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2925.3.3 Décalages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

26 Fonctions de base en langage C 2926.1 Opérations dans un registre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

26.1.1 Déclaration d’une broche en sortie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2926.2 Sorties numériques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3026.3 Sorties PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

26.3.1 Modification de la fréquence du signal PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3226.4 Entrées numériques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3226.5 Timer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3226.6 Interruptions - Interrupt Service Routine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

26.6.1 Exploitation des timers et des interruptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

ANNEXES 35

A Compléments d’électricité 35A.1 Loi des nœuds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35A.2 Loi des mailles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35A.3 Résistance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

A.3.1 Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35A.3.2 Potentiomètre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35A.3.3 Photorésistance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36A.3.4 CTN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36A.3.5 CTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36A.3.6 Varistance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

A.4 Diode au germanium ou au silicium . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36A.5 Diode LED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36A.6 Diode Zener . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36A.7 Photodiode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37A.8 Transistor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

A.8.1 Variétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37A.8.2 En amplificateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37A.8.3 En tout ou rien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37A.8.4 Phototransistor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37A.8.5 Transistor à effet de champ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

A.9 L’amplificateur opérationnel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38A.9.1 Utilisation en comparateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38A.9.2 Quelques utilisations en amplificateur de tension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

A.9.2.1 montage suiveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38A.9.2.2 montage inverseur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39A.9.2.3 montage non-inverseur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

A.10 Thyristor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39A.11 Relais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39A.12 Triac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39A.13 Optodiac-optotriac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

B Bibliothèque 40B.1 Programme sans bibliothèque mais avec des fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40B.2 Programme avec bibliothèque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

C Expériences diverses 41C.1 Afficher le potentiel du curseur d’un potentiomètre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41C.2 Montrer la relation tension-intensité lumineuse reçue par une photorésistance . . . . . . . . . . . . . . . . . . . . . . . . 41C.3 Afficher la tension de seuil d’une diode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

Glossaire 42

Références bibliographiques 43

3

Page 4: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

Carte Arduino Uno IDE Arduino

1 – Matériel et logiciel

Les expériences décrites dans ce document ont été réalisées avec un ordinateur géré par le système d’exploitation Ubuntu 16.04 LTS 3.

Avec le Terminal d’Ubuntu, on peut installer le logiciel de gestion d’une carte Arduino Uno parsudo apt-get install arduinosuivi du mot de passe.Une icône Arduino IDE apparaît dans le Launcher. On n’obtient pas forcément la toute dernière version par cette méthode. 4

Une carte Arduino Uno R3 est connectée sur un port USB 2.0. Elle n’est pas toujours reconnue automatiquement par Ubuntu. Pourque Arduino IDE puisse gérer la carte, on peut procéder ainsi à partir du Terminal :sudo arduinosuivi du mot de passe. Voir la référence [1]

Le logiciel s’ouvre avec l’indication du port utilisé en bas à droite. Par exemple :\dev\ttyACM0 sur Ubuntu.

Le menu Outils/Port série/ doit normalement indiquer le port utilisé.

Pour vérifier si la connexion entre l’ordinateur et la carte fonctionne bien :Dans Aduino IDE : Fichier/Exemples/01.Basics/BlinkTéléverser (icône Ü)Si la communication est bonne, pendant le chargement du programme dans la carte, les LEDs TX et RX clignotent, puis la LED placéeentre la broche 13 et la masse GND clignote.

Remarque : L’exemple Fichier/Exemples/01.Basics/BareMinimum est le programme minimum que peut charger la carte. LaLED 13 reste alors constamment allumée. 5

1.1 – Alimentation

La carte peut être alimentée :— Par le câble USB,— Par adaptateur secteur 7 V à 12 V ou par des piles sur le jack (⊕ au centre)— Avec une alimentation externe entre 7 V à 12 V avec ⊕ sur la broche Vin et ª sur GND.— Avec une alimentation régulée de 5 V sur la broche 5 V. (à éviter)

Lorsque la carte est alimentée, certaines broches deviennent génératrices de tension régulée :— La broche 3,3 V— La broche 5 V

3. Tous les logiciels utilisés dans ce document sont multiplateformes.4. https://www.arduino.cc/en/Main/Software permet de télécharger la dernière version (1.6.12 en octobre 2016). Après extraction du dossier téléchargé,

dans le Terminal, accéder au dossier arduino-1.6.12 puis taper ./install.sh pour installer Arduino IDE5. Important : Avant de démarrer un nouveau projet, il se peut que la mémoire de la carte Arduino contienne un ancien programme. Il vaut mieux s’en débarrasser

avant de brancher un nouveau circuit qui pourrait endommager la carte au moment de la mise sous tension. Il faut savoir qu’en téléversant le programme BareMinimumtoutes les broches deviennent des entrées numériques (sauf la broche 13)

4

Page 5: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

Les fonctions de bases

Il faut toujours avoir ces 3 réflexes lorsqu’on fait un montage en électronique :

— Y a-t-il les résistances suffisantes pour que l’intensité du courant ne soit pas trop élevée?— S’il y a des bobines : a-t-on mis les diodes de protection contre les surtensions créées par les bobines?— Ne suis-je pas porteur de charge électrostatique qui pourrait détruire un circuit intégré?

On commence par présenter l’ensemble des fonctionnalités de la carte en utilisant le minimum de matériel, avec aussi uneprogrammation réduite à sa plus simple expression.

Résumé des commandes paragraphe 8

5

Page 6: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

SORTIES

2 – Sorties numériques - digital output

2.1 – Présentation

Lorsqu’une broche est programmée en sortie, elle peut être considérée comme un générateur.

La carte Arduino Uno possède 14 broches numérotées de 0 à 13, qui peuvent être programméessoit au potentiel 0 V soit au potentiel 5 V.

Cependant les broches 0 (RX) et 1 (TX) notamment ont des fonctions particulières pour lacommunication entre l’ordinateur et la carte par le câble USB, il faut éviter de les utiliserautrement.

La broche 13 est par construction reliée à GND (ground) par une LED en série avec unerésistance. Elle permet surtout de vérifier facilement le bon fonctionnement de la connexionentre la carte et l’ordinateur.

Attention : les autres sorties numériques peuvent avoir d’autres fonctions dans le cadre decertains programmes à l’exception de la broche 7.

Les broches GND sont au potentiel 0 V.

Si on doit relier une broche au potentiel 5 V à une broche au potentiel 0 V par une chaînede conducteurs (surtout pas directement par un câble mais par exemple avec une résistancesuffisamment grande – de l’ordre de 500 Ω), ceux-ci sont alors parcourus par un courant quicircule du potentiel le plus élevé vers le potentiel le plus faible. L’intensité de ce courant semesure en ampères (courant fort), milliampères (courant faible) ou microampères (couranttrès faible).

Les cartes peuvent être détériorées si on dépasse une limite de courant. Cette limite n’est que de40 mA pour une sortie numérique. Si on utilise plusieurs sorties numériques, le total ne doitpas dépasser 200 mA.

2.2 – Programmation d’une sortie numérique

La carte Arduino est gérée par un logiciel dédié : on parle du langage Arduino 6. Il est vivement recommandé de commenter les lignesde code d’un programme.

Il y a 2 façons d’ajouter des commentaires dans un programme :

— après // en restant sur la ligne— entre /* et */ sur plusieurs lignes.

Le programme Fichier/Exemples/01.Basics/BareMinimum indique les 2 instructions obligatoires qu’il faudra écrire dans n’im-porte quel programme :

void setup() // les instructions écrites ici ne sont exécutées qu'une seule fois.

void loop() // les instructions écrites ici sont exécutées en boucle.

Quelques expériences avec le programme Fichier/Exemples/01.Basics/Blink :

int led = 13; //on affecte à la variable led la valeur entière 13

void setup() pinMode(led, OUTPUT); //la broche 13 est déclarée en SORTIE

void loop() //en boucledigitalWrite(led, HIGH); //la broche 13 est portée à 5 Vdelay(1000); //durée 1 sdigitalWrite(led, LOW); //la broche 13 est portée à 0 Vdelay(1000); //durée 1 s

On peut remplacer HIGH par 1 et LOW par 0.On peut remplacer OUTPUT par 1 (et INPUT par 0)

6. Le langage Arduino est proche du langage C. Le code C est compatible avec le code Arduino – voir §25 page 28

6

Page 7: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

On peut supprimer la déclaration de variableint led = 13; et remplacer led par 13

Chaque changement sur le programme n’est effectif qu’après avoir téléversé la nouvelle version dans la mémoire de la carte.

Si la carte est alimentée par une source extérieure, débrancher le câble USB ne change rien : le programme est installé dans lamémoire de la carte et exécuté en boucle indéfiniment (ou jusqu’à ce qu’on téléverse un nouveau programme).

On pourra constater aussi que le programme placé en mémoire est sauvegardé même s’il y a coupure de courant.

Programme minimum pour que la broche 13 soit en permanence sous 5 V :

void setup() pinMode(13,1); //la broche 13 est déclarée en SORTIEdigitalWrite(13,1); //la broche 13 est portée à 5 V et la LED est allumée

void loop()

Programme minimum pour que la broche 13 soit en permanence sous 0 V :

void setup() pinMode(13,1); //la broche 13 est déclarée en SORTIEdigitalWrite(13,0); //la broche 13 est portée à 0 V et la LED est éteinte

void loop()

5 V

R

i

0 V

2.3 – Logique inversée

Remarque importante : il ne faut pas associer systématiquement 1 et passage du courant, 0 et absence de courant. Il est toujourspossible de réaliser un circuit en «logique inversée». En effet, les 2 techniques ne sont pas toujours équivalentes, l’intensité du courantproduit n’étant pas forcément égale dans les 2 cas.

5 V

sortienumérique

R

i

0 V

logique

sortienumérique

LED

1 allumée

0 éteinte

5 V

R

i

sortienumérique

0 V

logique inversée

sortienumérique

LED

1 éteinte

0 allumée

2.4 – Le moniteur série intégré à l’IDE Arduino

2.4.1 – Son utilisation

Il est souhaitable de commander la LED non pas en chargeant un nouveau programme mais en modifiant le programme en cours.

Pour intervenir dans le programme en exécution, on passe par le moniteur série accessible par l’icône .

Le moniteur est divisé en 2 parties :— en haut : un cadre qui permet d’envoyer des caractères de l’ordina-

teur vers le «buffer», mémoire-tampon de la carte.— en dessous : ce qui est envoyé de la carte vers l’ordinateur.

Pour que la communication ait lieu entre le moniteur série et l’ordinateur, il faut synchroniser le débit d’informations des 2 côtés : ondéclare par exemple 9600 bauds sur le moniteur et on écrit l’instruction Serial.begin(9600); dans le programme.

7

Page 8: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

Pour commander la LED, il faut pouvoir écrire HIGH ou 1 pour l’allumer ou LOW ou 0 pour l’éteindre dans l’instruction digitalWrite.

On reprend le programme minimum qui allume la LED 13 en permanence.

byte etat=1;byte val1;byte val2;void setup() Serial.begin(9600);pinMode(13,OUTPUT); //la broche 13 est déclarée en SORTIEdigitalWrite(13,etat); //la broche 13 est portée à 5 V et la LED est allumée

void loop() val1=Serial.available(); // val1: nombre de caractères dans le bufferval2=Serial.read(); // val2: transformation du premier caractère en valeur ASCII correspondant. Par

exemple 0 donne 48 et 1 donne 49. Il y a 256 valeurs ASCII disponibles.Serial.print(val1); // écrit sur le moniteur val 1Serial.print(" "); // laisse un espace de 2 caractères sur la même ligneSerial.print(val2); // écrit sur le moniteur val 1 sur la même ligneif (val1>0) // s'il y a un caractère au moins dans le buffer

etat=val2-48; // soustraction valeur ASCII - 48 = 0 ou autre nombredigitalWrite(13,etat); // si 0 LED éteinte, si autre nombre LED allumée

Serial.print(" ");Serial.println(etat); // affichage de etatdelay(1000);

La boucle loop permet de recevoir l’ordre qui permet de commander la LED.

On constate que tous les caractères autres que 0 allument la LED.

On pourra remarquer que l’envoi de certains caractères donnent 2 valeurs ASCII consécutives (par exemple µ ou $).

2.4.2 – Amélioration

Le moniteur série intégré à l’IDE Arduino permet d’envoyer dans la mémoire de la carte des instructions caractères par caractère oupar blocs de caractères qu’il faut ensuite assembler par une programmation qui peut s’avérer fastidieuse.

Pour contourner avantageusement cette difficulté, on peut utiliser le logiciel Processing. Certains exemples accessibles par l’IDEArduino contiennent d’ailleurs des sous programmes à copier coller dans Processing.

Une partie de ce document est consacrée à l’utilisation de Processing dans le but de remplacer le moniteur série de l’IDE Arduino :

Commande d’une sortie numérique par Processing : voir §18 page 20Commande d’une sortie numérique par Processing avec la bibliothèque controlP5 : voir §22 page 23Commande d’une sortie numérique par Processing avec la bibliothèque G4P : voir §23 page 25

8

Page 9: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

3 – Sorties PWM – Pulse Width Modulation ou Modulation de Largeur d’Impulsion

3.1 – Présentation

Les broches 3, (5, 6), 9, 10 et 11 peuvent être utilisées en PWM. On les repère facilement sur la carte : ∼ à côté du numéro de la broche.Les broches 5 et 6 sont cependant à éviter car elles peuvent être perturbées dans la gestion du temps.

Chaque broche déclarée en PWM par une commande analogWrite(<numéro de la broche> , <0 à 255> ) génère un signalcarré : c’est un signal de très courte durée (appelée période) qui se répète identiquement à lui-même (à une fréquence d’environ490 Hz c’est-à-dire que ce signal se répète 490 fois par seconde) :

exemple : si la valeur indiquée est 64, alors pendant 64256 = 0,25 soit 25% du temps, le potentiel de la broche sera à +5 V et le reste du

temps à 0 V. On dit que le rapport cyclique est de 25%.

potentiel PWM

t en ms

allumé éteint

5 V

0 V

période T ≈ 1

490s

32

256·T

25%224

256·T

75%

3.2 – Programmation d’une sortie PWM

/*Ce programme permet de faire varier de plus en plus fort la luminosité d'une LED placée en série avec une résistance de l'ordre

de 500 ohms.*/

int LED=3; // La broche 3 peut être choisie.

int i=0; // variable de boucle

void setup()

pinMode(LED, OUTPUT); // On déclare la broche 3 en SORTIE

void loop()

for (i=0; i<=255;i++) // toutes les valeurs de 0 à 255 sont utilisées tour à tour

analogWrite(LED,i); // commande générant le signal carré

delay(10); // chaque valeur i dure 10 ms

3.3 – Commande d’une sortie PWM par le moniteur série

float etat;//comme il y a une puissance dans le programme, il faut déclarer en floatfloat val1;float val2;

9

Page 10: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

float total=0;

void setup() Serial.begin(9600);pinMode(3,OUTPUT); //broche 3 en sortieanalogWrite(3,123);//la led 3 brille à moitié

void loop() val1=Serial.available();//val1 nombre de caractères dans le bufferif(val1!=0)// val1: nombre de caractères dans le bufferval2=Serial.read();// val2: transformation du premier caractère en valeur ASCII correspondant. Par

//exemple 0 donne 48 et 1 donne 49. Il y a 256 valeurs ASCII disponibles.Serial.print(val1);// écrit sur le moniteur val 1Serial.print(" ");// laisse un espace de 2 caractères sur la même ligneSerial.print(val2);// écrit sur le moniteur val 1 sur la même ligneif (val1>0)// s'il y a un caractère au moins dans le bufferetat=val2-48;total=total+etat*pow(10,val1-1);// soustraction valeur ASCII - 48 = 0 ou autre nombretotal=constrain(total,0,255);Serial.print(" ");Serial.print(etat);// affichage de etatSerial.print(" ");Serial.println(total);analogWrite(3,total);

delay(100);

else

total=0;delay(100);

10

Page 11: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

4 – Signal carré de fréquence audible ou ultrasonoreLa commande tone(<pin>,<frequence>,<durée>) permet d’obtenir un signal carré de fréquence allant de 31 Hz à 65535 Hz. Ladurée en ms est optionnelle. La broche <pin> doit préalablement être déclarée en sortie.

potentiel

t

5 V

0 V

période T = 1

f

50% 50%

On peut brancher par exemple un haut-parleur d’impédance 8 Ω en série avec une résistance de protection, le tout entre la broche 2et la broche GND :

broche 2

R=220 Ω

8 ΩHP

0 V

Le programme suivant permet d’entendre le la3 pendant 5 secondes :

void setup() pinMode(2,OUTPUT);tone(2,440,5000);

void loop()

noTone(<pin>) arrête le signal.

11

Page 12: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

ENTRÉES

5 – Entrées numériques - digital input

Les broches numérotées de 0 à 13 peuvent être utilisées aussi en entrées numériques.

Lorsqu’une broche est programmée en entrée, elle peut être considérée comme un appareil testeur de tension.

Une entrée numérique lit une tension et la traduit soit par un 0 (entre 0 V et environ 2,5 V – c’est le niveau bas ou LOW) soit par un1 (entre environ 2,5 V et 5 V – c’est le niveau haut ou HIGH). Il y a donc un intervalle de potentiel autour de 2,5 V ou la lecture estincertaine 7. Chaque broche en entrée numérique peut par programmation être reliée au +5 V par l’intermédiaire d’une résistanceinterne de «rappel au plus» (pull-up) de 20 à 50 kΩ. Il faut éviter d’utiliser les broches 0 (RX), 1 (TX) et 13. (voir §2.1)

5.1 – État d’une entrée numérique

Quelques expériences avec le programme Fichier/Exemples/01.Basics/DigitalReadSerial :

/*Ce programme lit l'état de la broche 2 et l'écrit sur le moniteur sérieOn relie avec un câble la broche 2 à GND ou à la broche 5 V ou à la broche 3,3 V*/

int pin = 2;

void setup() Serial.begin(9600); // il faut initialiser la connexion série à 9600 bauds (nombre de symboles transmissibles par seconde)pinMode(pin, INPUT); // on déclare la broche 2 en entrée:

void loop()

int etat = digitalRead(pin); // lit l'état 0 ou 1 sur la broche 2Serial.println(etat); // écrit l'état sur le moniteur suivi d'un retour à la ligne (sinon print)delay(1); // précaution pour éviter que la routine soit trop rapide (en ms)

Il est nécessaire de cliquer sur l’icône pour lire les résultats sur le moniteur série. Attention à vérifier que la vitesse de transmissiondes données est la même que celle indiquée dans le programme : 9600 bauds.

Si le câble relié à la broche 2 n’est pas branché de l’autre côté (« en l’air »), alors l’état de l’entrée devient aléatoire. Pour éviter cela etimposer dans ce cas l’état 1, il suffit de remplacer pinMode(pin, INPUT) par pinMode(pin, INPUT_PULLUP)

On peut remplacer INPUT par 0

7. phénomène d’hystérésis : le passage de 0 à 1 n’a pas lieu pour le même potentiel que pour le passage de 1 à 0. La datasheet du micro-contrôleur garantit quetoute tension inférieure à 1V sera comprise comme un 0 et que toute tension supérieure à 3,5V sera comprise comme un 1.

12

Page 13: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

6 – Entrées analogiques - analogic input

La carte Arduino Uno possède 6 broches numérotées de A0 à A5. Elles peuvent être utilisées en entrée analogique : un potentielentre 0 V et 5 V sera converti en un nombre de 0 à 1023, proportionnellement – c’est le travail d’un CAN convertisseur analogique-numérique intégré au micro-contrôleur de la carte –. Ce nombre peut être récupéré puis utilisé.On remarquera ainsi qu’avec la carteArduino, une variation de 5

1024 ≈ 4,9 mV peut être détectée.

On s’inspire de l’exemple : Fichier/Exemples/01.Basics/AnalogReadSerial :

/*La broche A0 reçoit une tension entre 0 V et 5 V et la convertit en un nombre compris entre 0 et 1023 grâce à un

convertisseur analogique numérique CAN 10 bits (2^10=1024)On relie avec un câble la broche A0 à GND, à la broche 5 V ou à la broche 3,3 V.

*/

void setup() Serial.begin(9600); // il faut initialiser la connexion série à 9600 bits par seconde

void loop()

int valeur = analogRead(A0); // lit la tension sur la broche A0 et la convertitSerial.println(valeur); // écrit la valeur sur le moniteur sériedelay(500); // pause de 0,5 seconde

En plaçant un potentiomètre entre 0 et 5 V et en branchant le curseur sur A0 on peut faire défiler toutes les valeurs de 0 à 1023.

Remarque :

On peut modifier la tension de référence du convertisseur analogique numérique de l’Arduino :

analogReference(INTERNAL); remplace la tension de référence 5 V par une tension de référence de 1,1 V. La conversion reste 10bits. La résolution est alors de l’ordre de 1,1 mV.

analogReference(EXTERNAL); remplace la tension de référence 5 V par la tension appliquée sur la broche AREF; entre 1,1 et 5 V,au travers une résistance de 5kΩ (par précaution bien qu’il y ait une résistance interne de 32kΩ sur la broche AREF;).

analogReference(DEFAULT); impose la tension de référence 5 V.

13

Page 14: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

TEMPS

7 – Gestion des durées

7.1 – Pause

La commande delay(<durée>) arrête le déroulement du programme pendant la durée en millisecondes (ms) indiquée.

La commande delayMicroseconds(<durée>) arrête le déroulement du programme pendant la durée en microsecondes (µs)indiquée.

7.2 – Instant

La commande millis() donne le nombre de ms depuis la mise en route du programme. (jusqu’à 50 jours !).

La commande micros() donne le nombre de µs depuis la mise en route du programme. (jusqu’à 70 minutes environ).

unsigned long time;

void setup()Serial.begin(9600);

void loop()Serial.print("Time: ");time = millis();//affiche le temps depuis que le programme a démarréSerial.println(time);// pause d'une secondedelay(1000);

Attention : Les commandes delay(<durée>) et delayMicroseconds(<durée>) bloquent l’exécution du programme pendant ladurée indiquée : aucune autre tâche ne peut être exécutée pendant cette durée.

byte etatDEL13 = HIGH;byte etatDEL12 = HIGH;unsigned long dateDernierChangement13 = 0;unsigned long dateDernierChangement12 = 0;

void setup() pinMode(13, OUTPUT);pinMode(12, OUTPUT);

void flashDEL13()unsigned long dateCourante = millis();unsigned long intervalle = dateCourante - dateDernierChangement13;

if (etatDEL13 == HIGH && intervalle > 20) // extinction de la DEL car elle est allumee (HIGH) et 20ms se sont ecoulesetatDEL13 = LOW;digitalWrite(13, etatDEL13);dateDernierChangement13 = dateCourante;

else if (etatDEL13 == LOW && intervalle > 980) // allumage de la DEL car elle est eteinte (LOW) et 980ms se sont ecoulesetatDEL13 = HIGH;digitalWrite(13, etatDEL13);dateDernierChangement13 = dateCourante;

void flashDEL12()unsigned long dateCourante = millis();unsigned long intervalle = dateCourante - dateDernierChangement12;

if (etatDEL12 == HIGH && intervalle > 100) // extinction de la DEL car elle est allumee (HIGH) et 100ms se sont ecoulesetatDEL12 = LOW;digitalWrite(12, etatDEL12);dateDernierChangement12 = dateCourante;

else if (etatDEL12 == LOW && intervalle > 200) // allumage de la DEL car elle est eteinte (LOW) et 200ms se sont ecoulesetatDEL12 = HIGH;digitalWrite(12, etatDEL12);dateDernierChangement12 = dateCourante;

14

Page 15: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

void loop()flashDEL13();flashDEL12();

15

Page 16: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

8 – Résumé : principales commandes spécifiques de la carte Arduino

broches (0, 1,) 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 et 13

pinMode(<numéro de la broche> ,OUTPUT) la broche est une SORTIE

digitalWrite(<numéro de la broche> ,HIGH) la sortie est portée à +5 V

digitalWrite(<numéro de la broche> ,LOW) la sortie est portée à 0 V

tone(<pin>, <frequence> , <durée>) la sortie est un signal carré la durée est optionnelle

noTone(<pin>) arrête le signal carré

pinMode(<numéro de la broche> ,INPUT) la broche est une ENTRÉE lit 0 ou 1 si elle est en l’air

pinMode(<numéro de la broche> ,INPUT_PULLUP) la broche est une ENTRÉE lit 1 si elle est en l’air

int etat = digitalRead(<numéro de la broche>) lit l’état de l’ENTRÉE 0 ou 1

broches A0, A1, A2, A3, A4, A5

int valeur = analogRead(<numéro de la broche>) lit la valeur de l’ENTRÉE 0 à 1023

analogReference(<option>); DEFAULT : 5 V INTERNAL : 1,1 V EXTERNAL : entre 1,1 et 5 V

PWM – broches 3, (5, 6), 9, 10 et 11

analogWrite(<numéro de la broche> , <valeur>) 0 à 255 «pseudo-analogique»

moniteur série

Serial.begin(<vitesse en bauds>) ouverture de la communicationsérie

Serial.print(<valeur>) écrit valeur dans le moniteur sé-rie sans retour à la ligne

Serial.println(<valeur>) écrit valeur dans le moniteur sé-rie avec retour à la ligne

valeur=Serial.available() indique le nombre de caractèresdans le buffer du moniteur

maximum 128

valeur=Serial.read() convertit en valeur ASCII le pre-mier caractère dans le buffer dumoniteur

durée

delay(<durée>) pause en ms

delayMicroseconds(<durée>) pause en µs

millis() permet d’utiliser la durée en msdepuis le démarrage d’un pro-gramme

micros() permet d’utiliser la durée en µsdepuis le démarrage d’un pro-gramme

16

Page 17: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

Éléments de programmation avec le logiciel Arduino

9 – Déclaration de variable

exemple de syntaxe occupation mémoire commentaire

boolean b = true; true ou false b = !b; inverse l’état

unsigned char myChar = 'A';synonyme : byte

0 à 255 (8 bits – 1 byte) code ASCII de A = 65

char myChar; -128 à 127 (8 bits – 1 byte) le résultat est un caractère non un chiffre

byte b = B10010; 0 à 255 (8 bits – 1 byte) B10010 nombre binaire

int led = 13; −2×1015 à 2×1015-1 (16 bits – 2 bytes) -32768 à 32767

unsigned int led = 13;synonyme : word

0 à 65535 (2×1016-1) (16 bits – 2 bytes)

long var = <valeur>; −2147483648 à 2147483647 (32 bits – 4bytes)

unsigned long var = <valeur>; 0 à 429496729 (2×1032-1) (32 bits – 4bytes)

float n = 1.117;synonyme : double

−3,4028235×1038 à 3,4028235×1038

(32 bits – 4 bytes)précision 6 ou 7 décimales.

int led[8]=4,5,6,7,8,9,10,11; déclare un tableau de 8 constantes

const byte pinLED = 13; déclare une valeur qui ne changera pas au cours du programme

10 – ConversionsLes nombres entiers peuvent être entrés ou obtenus dans les bases 10 (base décimale), 2 (base binaire) et 16 (base hexadécimale). Pardéfaut, c’est la base 10 qui est prise en compte.

void setup()Serial.begin(9600);Serial.println(123,BIN);//123 en décimal = 111101 en binaire = 7B en hexadécimalSerial.println(B1111011,DEC); //préfixe B pour entrer un nombre binaireSerial.println(123,HEX);Serial.println(0x7B,DEC); //préfixe 0x pour entrer un nombre hexadécimal

void loop()

11 – Opérateurs logiquesAttention : = est une affectation et== est une égalité.

!= différent de

si P est Vrai, !P est faux.

&& renvoie Vrai uniquement si les deux conditions sont vraies ensemble.

|| renvoie Vrai si et seulement si une des valeurs est Vraie.

^ renvoie Vrai si une seule des conditions est vrai et l’autre fausse.

12 – Conditionint seuil = 80 ;int valeur = analogRead(A0) ;if (valeur > seuil)// traitement si la valeur est strictement supérieureelse // facultatif// traitement si la valeur est inférieure ou égale

17

Page 18: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

if (analogRead(0) > 400) // si la valeur analogique du capteur > 400return 1; // renvoie 1

elsereturn 0; // renvoie 2

13 – Branchementbyte boutonActif = 0 ;// traitement qui permet de savoir sur quel bouton on a appuyé, contient 0 si aucun bouton n'a été utiliséswitch ( boutonActif )case 1 :// traitement si c'est le bouton 1break ;case 2 :// traitement si c'est le bouton 2break ;case 3 :// traitement si c'est le bouton 3break ;default :// traitement si aucun bouton n'a été utilisébreak ;

14 – Itération avec for ou whileint tab[128] ; // définition d'un tableau d'entiers contenant 128 cases, indexées de 0 à 127int somme = 0 ;for (int i = 0 ; i < 128 ; i++) //i = i +1somme += tab[i] ;//somme = somme + tab[i]float moyenne = somme / 128.0 ;//128.0 float et non entier

int state = LOW ; // on suppose le bouton inactivéwhile (state == LOW)digitalWrite(LED1, HIGH) ; // on allume la LED d'alarmedelay(500) ; // on attend une demi-secondedigitalWrite(LED1, LOW) ; // on éteint la LED d'alarmedelay(500) ; // on attend une demi-secondestate = digitalRead(button) ;digitalWrite(LED2, HIGH) ; // on allume la LED indiquant un bon fonctionnement

do // instructions de la boucle

while (condition);

15 – Changement d’échelleval2 = map(val1,400,1000,0,255);

18

Page 19: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

Éléments de programmation avec le logiciel Processing

16 – IntroductionCertains exemples de programmes présentés dans l’IDE Arduino contiennent des sous-programmes à copier-coller dans le logicielProcessing.

Un programme Processing pourra notamment remplacer avantageusement le moniteur série. On peut créer à l’écran une interfacede commande de la carte Arduino avec des boutons, des curseurs, des fenêtres . . .

Attention : bien que Arduino et Processing soient produits par la même communautéde développeurs, les syntaxes sont proches mais pas identiques.

Processing est multiplateforme, on peut le télécharger et l’installer à partir du sitehttps://processing.org/download/?processing.

Pour lancer facilement Processing sur Ubuntu, une solution consiste à ouvrir le fichierprocessing avec l’éditeur Geany dont les fonctionnalités sont plus complètes que cellesde Gedit) et taper F5.

L’IDE Processing ressemble beaucoup à l’IDE Arduino.

Remarque : La partie inférieure de l’IDE Processing est une console sur laquelle on peutrecueillir des données résultant de l’exécution du programme en cours. Elle n’a doncpas le même usage que la partie inférieure de l’IDE Arduino sur laquelle on recueillenotamment des messages d’erreurs.

Fichier/Exemples est un bon moyen pour apprendre à programmer en langage Processing.

On remarquera que sans aucune ligne de programme, simplement en appuyant sur l’icône Ï qui exécute le programme, on obtientun résultat : un carré gris de 100 pixels de côté.

Contrairement à l’IDE Arduino, il est possible d’écrire directement des lignes de code sans les insérer dans des procédures void ()et obtenir un résultat après compilation.

En général, un programme Processing, à l’instar d’un programme Arduino, comporte ces 2 procédures :

void setup() dans laquelle les lignes de code sont exécutées une seule fois, et

void draw() dans laquelle les lignes de code sont exécutées en bouche.

Dans le cadre de ce document, il s’agit d’abord d’utiliser les exemples des 2 IDE pour remplacer le moniteur série d’Arduino par unprogramme Processing qui s’avérera beaucoup plus évolutif.

17 – Sélection de commandes Processing

17.1 – Commandes générales

17.2 – Commandes spécifiques de la souris

17.3 – Commandes spécifiques du clavier

19

Page 20: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

18 – Commande d’une sortie numérique par ProcessingL’exemple suivant reprend en l’épurant Fichier/Exemples/Serial/SimpleWrite de l’IDE Processing :

On commande l’allumage ou l’extinction d’une LED par déplacement de la souris sur un carré :

Voici le programme à téléverser dans la carte Arduino :

char val; //val est une variable de type char, chaîne de caractères

void setup() pinMode(3, OUTPUT); //broche 3 en sortie numériqueSerial.begin(9600); //établit la communication carte - ordinateur

void loop() while (Serial.available()) //tant qu'il y a des données dans le bufferval = Serial.read(); //le premier caractère dans le buffer est luif (val == 'H') //si ce caractère est HdigitalWrite(3, HIGH); //allume la LED else digitalWrite(3, LOW); //si ce n'est pas H, la LED est éteintedelay(100); //pause de 0,1 seconde

Programme Progressing associé :

import processing.serial.*; //mise en service de la bibliothèque de gestion decommunication par le port USB

Serial port; //obligatoireint val; //déclaration de variable entière

void setup()size(200, 200); //crée un carré (par défaut Processing crée un carré

de 100 de côté)port = new Serial(this, "/dev/ttyACM0", 9600); //ouverture de la communication entre l'

ordinateur et la carte

void draw() //création du dessinif (mouseX<100) //partie gauche du carré

port.write('H'); //envoie un H vers la carteelse

port.write('L'); //envoie un L vers la carte

200px

200p

x0 < mouseX < 100 100 < mouseX < 200

20

Page 21: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

19 – Commande d’une sortie PWM par ProcessingL’exemple suivant reprend en l’épurant Fichier/Exemples/04 Communication/Dimmer de l’IDE Arduino :

On commande l’allumage progressive ou l’extinction progressive d’une LED par déplacement de la souris sur un rectangle :

Voici le programme à téléverser dans la carte Arduino :

void setup()Serial.begin(9600); //ouverture de la communication entre l'ordinateur et la cartepinMode(3, OUTPUT); //broche 3 en sortie

void loop() byte brightness;if (Serial.available())

brightness = Serial.read();analogWrite(3, brightness);

Programme Progressing associé :

import processing.serial.*;Serial port;

void setup() size(255, 200);port = new Serial(this, "/dev/ttyACM0", 9600);

void draw() port.write(mouseX);

255px

200p

x

0 255mouseX

21

Page 22: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

20 – Graphe d’une conversion analogique-numérique avec ProcessingUn potentiomètre est placé entre 5 V et 0 V,le curseur sur l’entrée analogique A0.

Programme Arduino :

int mesure=0; //variable résultat de la conversion analogique numérique

void setup() Serial.begin(9600); //connexion ordinateur carte

void loop()mesure=analogRead(0); //lecture de la tension et conversionSerial.println(mesure); //envoi de la valeur sur le moniteur sériedelay(100);

Programme Processing :

import processing.serial.*;Serial port;int x = 1;float y = 0;

void setup () size(400, 300);port = new Serial(this, "/dev/ttyACM0", 9600);background(255);

void draw () stroke(255,0,0);point(x, height - y);if (x >= width) x = 0;background(255); else x++;

void serialEvent (Serial port) String caracteres = port.readStringUntil('\n');//recueille ce qui vient de la carte tant

qu'il n'y a pas de <<retour chariot>>if (caracteres != null) caracteres = trim(caracteres);//enlève les espaces blancs entre caractèresy = float(caracteres);//convertit la chaîne en nombrey = map(y, 0, 1023, 0, height);//transforme les valeurs pour que toute la hauteur de l'é

cran puisse être occupé

22

Page 23: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

Quelques bibliothèques de Processing

21 – IntroductionDes bibliothèques complètent Processing. Elles peuvent permettre d’éviter de nombreuses lignes de code en fournissant descommandes prêtes à l’emploi : par exemple un bouton pour commander une LED. On se limitera dans ce document à 2 d’entre elles :controlP5 et G4P.

22 – La bibliothèque controlP5

22.1 – Commande d’une sortie numérique

Programme à écrire dans l’IDE Arduino :

char val; //val est une variable de type char, chaîne de caractères

void setup() pinMode(3, OUTPUT); //broche 3 en sortie numériqueSerial.begin(9600); //établit la communication carte - ordinateur

void loop() while (Serial.available()) //tant qu'il y a des données dans le bufferval = Serial.read(); //le premier caractère dans le buffer est luif (val == 'H') //si ce caractère est HdigitalWrite(3, HIGH); //allume la LED else digitalWrite(3, LOW); //si ce n'est pas H, la LED est éteintedelay(100); //pause de 0,1 seconde

Programme à écrire dans l’IDE Processing :

import processing.serial.*; //mise en service de la bibliothèque de gestion decommunication par le port USB

import controlP5.*;Serial port; //obligatoireControlP5 cp5;

int val; //déclaration de variable entière

void setup()size(250, 150);port = new Serial(this, "/dev/ttyACM0", 9600);cp5 = new ControlP5(this);cp5.addButton("allume")

.setPosition(50,50)

.setSize(50,50);

cp5.addButton("eteint").setPosition(150,50).setSize(50,50);

void draw()

public void allume() port.write('H');

public void eteint() port.write('L');

23

Page 24: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

22.2 – Commande d’une sortie PWM

Programme à écrire dans l’IDE Arduino :

void setup()Serial.begin(9600); //ouverture de la communication entre l'ordinateur et

la cartepinMode(3, OUTPUT); //broche 3 en sortie

void loop() byte brightness;if (Serial.available())

brightness = Serial.read();analogWrite(3, brightness);

Programme Progressing associé :

import processing.serial.*;import controlP5.*;Serial port;ControlP5 cp5;int sliderValue = 100;

void setup() size(255, 200);cp5 = new ControlP5(this);cp5.addSlider("sliderValue").setPosition(80,50)

.setRange(0,255);

port = new Serial(this, "/dev/ttyACM0", 9600);

void draw() port.write(sliderValue);

24

Page 25: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

23 – La bibliothèque G4P

23.1 – Commande d’une sortie numérique

Programme à écrire dans l’IDE Arduino :

char val; //val est une variable de type char, chaîne de caractères

void setup() pinMode(3, OUTPUT); //broche 3 en sortie numériqueSerial.begin(9600); //établit la communication carte - ordinateur

void loop() while (Serial.available()) //tant qu'il y a des données dans le bufferval = Serial.read(); //le premier caractère dans le buffer est luif (val == 'H') //si ce caractère est HdigitalWrite(3, HIGH); //allume la LED else digitalWrite(3, LOW); //si ce n'est pas H, la LED est éteintedelay(100); //pause de 0,1 seconde

Programme Progressing associé :

Premier onglet :

import processing.serial.*;import g4p_controls.*;Serial port;

public void setup()size(200, 100, JAVA2D);createGUI();customGUI();port = new Serial(this, "/dev/ttyACM0", 9600);

public void draw()background(230);

public void customGUI()

Deuxième onglet :

public void button1_click1(GButton source, GEvent event) port.write('H');

public void button2_click1(GButton source, GEvent event) port.write('L');

public void createGUI()G4P.messagesEnabled(false);G4P.setGlobalColorScheme(GCScheme.BLUE_SCHEME);G4P.setCursor(ARROW);surface.setTitle("Sketch Window");button1 = new GButton(this, 56, 13, 80, 30);button1.setText("Allume");button1.addEventHandler(this, "button1_click1");button2 = new GButton(this, 55, 56, 80, 30);button2.setText("Eteint");button2.addEventHandler(this, "button2_click1");

GButton button1;GButton button2;

25

Page 26: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

23.2 – Commande d’une sortie PWM

Programme à écrire dans l’IDE Arduino :

void setup()Serial.begin(9600); //ouverture de la communication entre l'ordinateur et

la cartepinMode(3, OUTPUT); //broche 3 en sortie

void loop() byte brightness;if (Serial.available())

brightness = Serial.read();analogWrite(3, brightness);

Programme Progressing associé :

Premier onglet :

import processing.serial.*;import g4p_controls.*;Serial port;

public void setup()size(200,100, JAVA2D);port = new Serial(this, "/dev/ttyACM0", 9600);createGUI();customGUI();

public void draw()background(210);port.write(cs.getValueI());

public void customGUI()

Deuxième onglet :

public void custom_slider1_change1(GCustomSlider source, GEvent event)

public void createGUI()G4P.messagesEnabled(false);G4P.setGlobalColorScheme(GCScheme.BLUE_SCHEME);G4P.setCursor(ARROW);surface.setTitle("Sketch Window");cs = new GCustomSlider(this, 51, 28, 100, 40, "grey_blue");cs.setShowValue(true);cs.setShowLimits(true);cs.setLimits(127, 0, 255);cs.setNumberFormat(G4P.INTEGER, 0);cs.setOpaque(false);cs.addEventHandler(this, "custom_slider1_change1");

GCustomSlider cs;

26

Page 27: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

Approfondissements

27

Page 28: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

Cette partie nécessite de connaître quelques éléments de l’architecture du microcontrôleur Atmega328 de l’Arduino Uno.

24 – Quelques registres du microcontrôleur Atmega 328 de l’Arduino Uno

Le microcontrôleur est un Atmega 328. Les broches sont regroupées en ports 8 bits 8

port B

bit broche

AREF

GND

5 13 PB5

4 12 PB4

3 11 PB3

2 10 PB2

1 9 PB1

0 8 PB0

port C

bit broche

0 A0 PC0

1 A1 PC1

2 A2 PC2

3 A3 PC3

4 A4 PC4

5 A5 PC5

port D

bit broche

7 7 PD7

6 6 PD6

5 5 PD5

4 4 PD4

3 3 PD3

2 2 PD2

1 1 PD1

0 0 PD0

25 – Langage Arduino et langage CLe langage Arduino se veut être une simplification du langage C. Des instructions écrites en langage C peuvent être intégréesdans le code Arduino. On peut même écrire un code entièrement écrit en C dans l’IDE Arduino. Les bibliothèques avr/io.h etutil/delay.h sont intégrées dans l’installation de l’IDE Arduino.

Le langage C permet notamment de gagner du temps à l’exécution d’un programme. Il est bien mieux adapté lorsqu’on intervient enmême temps sur plusieurs broches d’un même port du microcontrôleur.

25.1 – Base 10 ou décimale – base 2 ou binaire – base 16 ou hexadécimale

Base 2 : 0,1 Base 10 : 0,1,2,3,4,5,6,7,8,9 Base 16 : 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F

1 0 1 0 1 0 1 1

8=8×

+ 0=4×

+ 2=2×

+ 0=1×

==A

conversion en hexadécimal : AB

8=8×

+ 0=4×

+ 2=2×

+ 1=1×

B

×128

=128 +

×64=0 +

×32=

32 +

×16=0 +

conversion en décimal : 171

×8=8 +

×4=0 +

×2=2 +

×1=1 = 171

8. Certains bits ne sont pas utilisés.

28

Page 29: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

binaire décimal hexadécimal binaire décimal hexadécimal binaire décimal hexadécimal

00000000 0 0 00001111 15 F 01000000 64 40

00000001 1 1 00010000 16 10 01111111 127 7F

00000010 2 2 00010100 20 14 10000000 128 80

00000100 4 4 00011111 31 1F 10101011 171 AB

00001000 8 8 00100000 32 20 11110000 240 F0

00001010 10 A 00111111 63 3F 11111111 255 FF

25.2 – Règles d’écriture communément admises

Les constantes ont un nom qui commence par une majuscule, par exemple ValeurMaxLes variables ont un nom qui commence par une minuscule demiPeriode.Une accolade fermante est seule sur une ligne, sauf pour le do..while

#define Led 13 au lieu de int Led=13; ou de const int Led=13;.

On économise ainsi de la mémoire.

25.3 – Comparaisons et opérations logiques

25.3.1 – Comparaisons logiques

Le résultat d’une comparaison est : true (vrai ou 1) ou false (faux ou 0).

égal supérieur supérieur ou égal inférieur inférieur ou égal différent

== > >= < <= !=

25.3.2 – Opérations logiques et masque

Un masque noté m (dans le tableau le plus à droite dans ce paragraphe) permet de fixer à 0 ou à 1 certains bits dans un octet sans queles autres bits soient affectés même transitoirement. C’est notamment important pour des opérations sur le port D pour lequel lesbits 0 et 1 permettent la communication USB entre l’ordinateur et la carte.

not ~ and & Or | Xor ^

a = 10110101 a = 10100101 a = 10100101 a = 10100101

b = 00011111 b = 00011111 b = 00011111

~ a = 01001010 a & b = 00000101 a | b = 10111111 a ^ b = 10111010

a xxxxxxxx

m 01100111

a & m 0xx00xxx

a | ~m 1xx11xxx

a & ~m x00xx000

a | m x11xx111

25.3.3 – Décalages

unsigned signed

a = 10110101 a = 10110101 a = 10110101 a = 10110101

a >> 3 = 00010110 a << 4 = 01010000 a >> 3 = 11110110 a << 4 = 01010000

26 – Fonctions de base en langage C

26.1 – Opérations dans un registre

Chacun des ports B,C et D est associé à un registre de direction, respectivement DDRB , DDRC et DDRD. Ces registres permettent dedéclarer les broches 1 à 13 en entrée (0 potentiel 0 V) ou en sortie (1 potentiel 5 V) :

26.1.1 – Déclaration d’une broche en sortie

Par exemple, on veut déclarer la broche 13 en sortie sans changer l’état des autres broches. C’est donc le bit 5 du port B qui estconcerné.

1. L’instruction pour mettre à 1 le bit 5 de DDRB pour le mettre en sortie est :

DDRB |= B100000; ou DDRB = DDRB | B100000;le symbole | est un OU logique. On compare l’état de l’octet DDRB à 00100000. Le résultat est tel que seul le bit 5 est modifié.

29

Page 30: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

exemple : 10010010 OR 00100000 = 10110010

Remarques :

— On aurait pu aussi écrire DDRB |= 32; en décimal ou DDRB |= 0x20; en hexadécimal.— Ou encore DDRB |= (1<<5); qui met à 1 le bit 5. En complément :

(1<<2) 00000100 écrit 1 en binaire et déplace de 2 bits vers la gauche

(3<<2) 00001100 écrit 3 en binaire et déplace de 2 bits vers la gauche

(4>>1) 00000010 écrit 4 en binaire et déplace de 1 bit vers la droite

(3>>1) 00000001 écrit 3 en binaire et déplace de 1 bit vers la droite

(4>>4) 00000000 écrit 4 en binaire et déplace de 4 bits vers la droite

2. L’instruction pour mettre à 1 le bit 5 de PORTB et mettre la broche 13 à 5 V :

PORTB |= B100000;

On reprend ci-dessous le programme de clignotement de la LED 13 :

void setup() DDRB |= B100000;void loop() PORTB |= (1<<5);delay(1000);PORTB &= ~(1<<5);delay(1000);

1<<5 écrit 1 en binaire et déplace de 5 bits vers la gauche soit 00100000~(1<<5) est l’inverse bit à bit soit 11011111L’opération ET logique laisse inchangés tous les bits de PORTB sauf le bit 5 qui est mis à 0exemple : 10110010 AND 11011111 = 10010010

Encore plus court :

void setup() DDRB |= 32;void loop() PORTB ^= (1<<5);delay(1000);

26.2 – Sorties numériques

Le programme ci-dessous permet de faire clignoter jusqu’à 6 LEDs (chacune en série avec une résistance) sur les broches 8 à 13 ( 0,5 sallumé puis 0,5 s éteint)

//#include <avr/io.h>//#include <util/delay.h>

int main (void)

DDRB |= 0x3F;//les broches 8 à 13 sont mises en sortie

while (1) PORTB |= 0x3F;//les broches 8 à 13 sont portées au potentiel 5V_delay_ms(500);

PORTB &= ~0x3F;//les broches 8 à 13 sont portées au potentiel 0V_delay_ms(500);

return 0;

Les 2 programmes équivalents ci-dessous illustrent le principe d’un chenillard : celui-ci fonctionne avec 3 LEDs sur les broches 8, 9 et10 :

30

Page 31: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

#define B0 0x01#define B1 0x02#define B2 0x04#define D 500void setup() DDRB |= 0x3F;void loop() PORTB = B0;//broche 8 au potentiel 5V

_delay_ms(D);PORTB = B0 | B1;//broches 8 et 9 au potentiel 5V_delay_ms(D);PORTB = B1;//broche 9 au potentiel 5V_delay_ms(D);PORTB = B1 | B2;//broche 9 et 10 au potentiel 5V_delay_ms(D);PORTB = B2;//broche 10 au potentiel 5V_delay_ms(D);PORTB = B2 | B0;//broche 8 et 10 au potentiel 5V_delay_ms(D);

//#include <avr/io.h>//#include <util/delay.h>

#define B0 0x01#define B1 0x02#define B2 0x04

#define D 500

int main (void)

DDRB |= 0x3F;//les broches du port B sont mises ensortie

while (1) PORTB = B0;//broche 8 au potentiel 5V_delay_ms(D);PORTB = B0 | B1;//broches 8 et 9 au

potentiel 5V_delay_ms(D);PORTB = B1;//broche 9 au potentiel 5V_delay_ms(D);PORTB = B1 | B2;//broche 9 et 10 au

potentiel 5V_delay_ms(D);PORTB = B2;//broche 10 au potentiel 5V_delay_ms(D);PORTB = B2 | B0;//broche 8 et 10 au

potentiel 5V_delay_ms(D);

return 0;

26.3 – Sorties PWM

Ce programme permet de créer un signal PWM sur la LED 13

int main (void)unsigned char ctr, brightness, speed;DDRB |= 0x20;ctr = 0;for(brightness = 0; ; brightness++)for(ctr = 0; ctr < 255; ctr++)for(speed = 0; speed < 128; speed++)if (ctr < brightness)PORTB |= 0x20;

elsePORTB &= ~0x20;

return 0;

Ce programme crée un signal PWM sur les broches 5 et 6 :

int main (void)TCCR0A |= _BV(WGM01) | _BV(WGM00);TCCR0A |= _BV(COM0A1) | _BV(COM0A0);TCCR0A |= _BV(COM0B1);

OCR0A = 0;OCR0B = 0;TCNT0 = 0;

TCCR0B |= _BV(CS00);

DDRD |= _BV(PORTD5) | _BV(PORTD6);

while (1)OCR0A++;OCR0B++;_delay_ms(10);

return 0;

31

Page 32: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

26.3.1 – Modification de la fréquence du signal PWM

Par défaut la fréquence du signal PWM est 490 Hz. Dans certains circuits, par exemple si un moteur est alimenté par une tensionPWM de 490 Hz,cette fréquence peut ne pas être souhaitée car elle génère un son audible désagréable.

/* ----------------------------------------------Exemple 1 de l'article Timers IVN = 1 pour le prescalerLa PWM de frequence 62500 Hzest sur la sortie 3 du module UNO-------------------------------------------------*/

void setup()pinMode (3, OUTPUT);TCCR2A = 0b00100011;TCCR2B = 0b00000001;OCR2B = 128;

void loop()

/* ---------------------------------------------Exemple 2 de l'article Timers IVN = 8 pour le prescalerLa PWM de frequence 3921,6 Hzest sur la sortie 11 du module UNO------------------------------------------------*/

void setup()pinMode (11, OUTPUT);TCCR2A = 0b10000001;TCCR2B = 0b00000010;OCR2A = 128;

void loop()

26.4 – Entrées numériques

Dans ce programme on déclare la broche 2 en entrée et on la met en pull-up interne. Ensuite, on entre 0 ou 5V et on observe la LED13 allumée ou éteinte.

int main (void)DDRB |= 0x3F;//broches 8 à 13 en sortieDDRD &= 0xFB;//met la broche 2 en entréePORTD |= 0x04;//pull-up: met la broche 2 est à 5V en interne via une résistance de 100 kohms environ

while (1) if (PIND & 0x04)//PIND & 0x04 = 1 : si la broche 2 est à 5VPORTB &= ~0x20;//met la broche 13 à 0V la LED est éteinte

elsePORTB |= 0x20;//met la broche 13 à 5V la LED est allumée

return 0;

26.5 – Timer

Un timer est un compteur capable de compter le temps qui s’écoule au rythme de l’horloge interne du microcontrôleur (16 MHz). S’ilcompte de de 0 à 255 (ou en hexadécimal de 00 à FF), on dit que son registre comporte 8 bits. Lorsqu’il arrive à 255, il repasse donc à 0en entraînant la mise à 1 d’un bit particulier appelé flag dans un registre de contrôle associé au timer.

Il est possible de diviser la fréquence d’horloge par 8, 32, 64, 128, 256 ou 1024 ; pour cela, il faut utiliser d’autres registres de contrôleassociés au timer.

Le microcontrôleur de l’Arduino Uno possède 3 timers :— Le timer0, sur 8 bits, utilisé par les fonctions delay(), millis(), micros() et les PWM sur les broches 5 et 6.— Le timer1, sur 16 bits, utilisé par les PWM sur les broches 9 et 10 (et par la bibliothèque Servo).— Le timer2, sur 8 bits, utilisé par la fonction Tone() et par les PWM sur les broches 3 et 11.

32

Page 33: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

26.6 – Interruptions - Interrupt Service Routine

Une interruption (de courte durée) consiste à interrompre provisoirement le programme que l’Arduino exécute pour qu’il effectue unautre travail. Quand cet autre travail est terminé, l’Arduino retourne à l’exécution du programme et reprend à l’endroit exact où ill’avait laissé.

Attention : une interruption ne peut pas être arrêtée par une autre interruption. Par contre elles sont exécutées dans un ordre depriorité.

Remarque : les méthodes d’interruptions présentées ci-après s’exécutent sur les broches 2 et 3. Il en existe d’autres moins riches enfonctionnalités sur d’autres broches.

attachInterrupt(<numero>, <interruption>, <mode>); est l’instruction qui déclenche une interruption.

Détails : <numero> : 0 ou 1 sur un Arduino Uno, ce qui correspond respectivement aux broches 2 et 3. 9

<interruption> : nom de la fonction appelée, par exemple maRoutine().

<mode> peut prendre les valeurs suivantes :

LOW : l’interruption est déclenchée tant que la broche concernée est LOW. Pendant ce temps, loop() ne sera pas exécuté.

CHANGE : l’interruption est déclenchée quand la broche concernée passe de LOW à HIGH ou bien de HIGH à LOW

RISING : l’interruption est déclenchée quand la broche concernée passe de LOW à HIGH

FALLING : l’interruption est déclenchée quand la broche concernée passe de HIGH à LOW.

Remarque : il s’écoule environ 3 µs entre le déclenchement de l’interruption et l’exécution de la première instruction.

detachInterrupt(<numero>); est l’instruction qui déconnecte l’interruption.

26.6.1 – Exploitation des timers et des interruptions

Le microcontrôleur Atmega328 possède 3 Timers : Timer0 et Timer2 (comptage 8 bits) et Timer1 (comptage 16bits)

Autres programmes de clignotement de la LED 13

unsigned char cpt=0;//volatile unsigned char cpt=0;ISR(TIMER2_OVF_vect)cpt++;if(cpt==61) PORTB ^=(1<<5);cpt=0;void setup()TCCR2A=0;TCCR2B=B111;TIMSK2=0x01;DDRB |= B100000;PORTB &= ~(1<<PORTB5);//sei();void loop()

ISR() fonction associée à une source d’interruption, ici TIMER2_OVF_vectTCCR2A=0; Les bits 0 et 1 doivent être à 0 pour un mode normal (par oppositionau mode PWM)

TCCR2B=B111; Les bits 0, 1 et 2 permettent de diviser la fréquence du micro-contrôleur par un nombre appelé prescaler

bits 001 010 011 100 101 110 111

prescaler 1 8 32 64 128 256 1024

Le registre TCNT2 8 bits déborde tous les 256 incréments, c’est-à-dire à la fré-quence de 16/(1024*256) MHz ≈ 61 Hz

TIMSK2=1; rend actif l’overflow

Comme le compteur cnt évolue de 0 à 61, la LED est allumée ou éteinte environ1 s.

9. Sur un Arduino Mega, les numéros 0 à 5 sont possibles et correspondent, dans l’ordre, aux broches 21, 20, 19, 18, 2 et 3.

33

Page 34: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

//volatileunsigned char cpt;ISR(TIMER2_COMPA_vect)cpt++;if(cpt==40) PORTB ^=(1<<5);if(cpt==50)PORTB ^=(1<<5);cpt=0;void setup()TCCR2A=B010;OCR2A=156;TCCR2B=B111;TIMSK2=B010;DDRB |= B100000;PORTB &= ~(1<<PORTB5);//sei();void loop()

Autre source d’interruption : TIMER2_COMPA_vectOCR2A=156; ce registre compare sa valeur à celle de TCNT2La LED s’allume 1/10 de seconde puis s’éteint 4/10.de seconde. Elle s’allumebrièvement 2 fois par seconde.

ISR(INT0_vect)PORTB ^= (1<<5);void setup()DDRB |= B100000;PORTB &= ~(1<<5);DDRD &= B11111011;PORTD |= (1<<2);EIMSK |= 1;EICRA = B10;//sei();void loop()

Autre source d’interruption : INT0_vect

volatile uint8_t intrs;

ISR (TIMER0_OVF_vect)intrs++;

#if 1if ( intrs >= 61 ) PORTB ^= _BV (5);intrs = 0;

#else

PORTB = ((intrs >> 2) & 0x0e);#endif

intmain (void)

TCCR0B |= _BV(CS02) | _BV(CS00);

TIMSK0 |= _BV(TOIE0);

DDRB = 0xff;TCNT0 = 0;intrs = 0;

sei();

while (1)

34

Page 35: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

ANNEXES

A – Compléments d’électricité

A.1 – Loi des nœuds

Ïi1Ï

i2

Ïi3i1 = i2 + i3

A.2 – Loi des mailles

A B C uAC = uAB +uBC

A.3 – Résistance

A.3.1 – Généralités

5 VA

I

R = 500 Ω

B

0 V

Elle sert à ralentir le courant. Cela se traduit par un échauffement.

Exemple : Une résistance R = 500 Ω est placée entre 2 points A et B d’un circuit. A est au potentiel+5 V et B au potentiel 0 V. On a donc une différence de potentiel (ou tension) UAB = 5 V.

Loi d’Ohm : UAB = R · I

La résistance est donc traversée par I = UAB

R= 5

500= 0,01 A = 10 mA

L’échauffement d’un composant est directement lié à la puissance (énergie par seconde) qu’il dissipe.Pour la calculer : P = UAB · I

Exemple : P = 5×0,01 = 0,05 Watt (W) = 50 mW.

Attention! Toujours bien vérifier le maximum de puissance supportée par un composant.

code de couleurs :

Ne Manger Rien Ou Jeûner Voilà Bien Votre Grande Bêtise

Noir Marron Rouge Orange Jaune Vert Bleu Violet Gris Blanc

0 1 2 3 4 5 6 7 8 9

A.3.2 – Potentiomètre

Grâce à son curseur se déplaçant sur la résistance, il a 2 usages :

5 V

R

0 V

pouvoir disposer d’une résistance réglable de 0 à sa valeur maximum. On utilise alors une extrémitéde la résistance et le curseur. Il est alors utilisé en rhéostat.

Remarque : Sur le schéma, R est une résistance de protection pour limiter le courant quand lecurseur du potentiomètre est à 5 V.

5 V

0 V

pouvoir disposer d’une différence de potentiel réglable entre 0 et la différence de potentiel entre les2 extrémités de la résistance. C’est l’utilisation la plus fréquente.

35

Page 36: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

A.3.3 – Photorésistance

5 V

ã

R

0 V

Sa résistance est très élevée lorsqu’elle est dans le noir. Elle devient très faible lorsqu’elle est forte-ment éclairée. Contrairement au phototransistor ou à la photodiode, sa réponse et relativementlente et non linéaire par rapport aux variations d’intensité lumineuse.

Pour avoir une lecture de tension dans le même sens que la quantité de lumière reçue par laphotorésistance, il vaut mieux prendre la tension aux broches de R, résistance de protection, plutôtque la tension aux broches de la photorésistance.

Il peut être intéressant de comparer avec la photodiode ou le phototransistor en captant la lumièreémise par une source d’intensité lumineuse variable : lampe à incandescence, lampe fluorescente. . ..On pourra aussi tracer les nombres obtenus par le CAN en fonction du temps sous Processing.

A.3.4 – CTN

Sa résistance diminue lorsque la température augmente. On pourra réaliser un thermomètre, la difficulté résidant dans le caractèrenon affine de R(T).

A.3.5 – CTP

Sa résistance augmente lorsque la température augmente.

A.3.6 – Varistance

Sa résistance n’est pas constante : elle varie en fonction de la tension appliquée.

A.4 – Diode au germanium ou au silicium

5 V

I

R

anode

cathode

0 V

Elle ne laisse pas passer le courant si elle est branchée dans l’autre sens que celui de la figure.

Elle laisse passer le courant dans le sens indiqué par la figure à condition que la tension entre sesbroches dépasse une valeur caractéristique appelée tension de seuil.

Pour une diode au germanium, la tension de seuil est de l’ordre de 0,2 V.

Pour une diode au silicium, la tension de seuil est de l’ordre de 0,7 à 0,8 V.

A.5 – Diode LED

Elle laisse passer le courant en émettant de la lumière dans le sens indiqué par la figure 10 à condition que la tension entre ses brochesdépasse une valeur caractéristique appelée tension de seuil.

Pour une LED émettant dans le rouge, la tension de seuil est de l’ordre de 2 V.

La tension de seuil dépend de la couleur émise.

V@2mA V@20mA

Infra-rouge 1.05 1.2

Rouge 1.8 2.0

Jaune 1.9 2.1

Verte 1.8 2.4

Blanche 2.7 3.2

Bleue 2.8 3.5

A.6 – Diode Zener

Ces diodes ont un comportement identique aux diodes au silicium dans le sens passant (seuil de 0,7 à 0,8 V)

Dans l’autre sens, elles sont bloquantes jusqu’à un seuil souvent de l’ordre de quelques volts. En clair, elles ont 2 seuils et n’ontd’intérêt que pour le deuxième qui permet d’avoir facilement une tension régulée dans un circuit.

10. anode vers cathode, la cathode a un fil plus court

36

Page 37: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

A.7 – Photodiode

Elle laisse passer un courant proportionnel à la quantité de lumière reçue. Contrairement à la photorésistance, la photodiode a uneréponse très rapide.

A.8 – Transistor

A.8.1 – Variétés

Il existe de nombreuses sortes de transistors. On se limite ici aux transistors NPN, PNP et MOSFET.

•BRB

iB

•C

RC

iC

•E

•C

RC

iC

•E

•B

RB

iB

La figure de gauche représente le montage fondamental d’un transistor NPN : un générateur alimente par un courant très faible labase B du transistor. Ce courant permet à un autre générateur d’alimenter le collecteur C du transistor par un courant beaucoup plusfort (par exemple 100 fois). S’il n’y a pas de courant arrivant par la base, il ne peut y en avoir côté collecteur.

La figure de droite représente le montage fondamental d’un transistor NPN avec un seul générateur.

Si le transistor NPN est au silicium, alors UBE est de l’ordre de 0,7 à 0,8 V.

A.8.2 – En amplificateur

Un transistor est caractérisé par un facteur d’amplification en courant : β= iC

iB

Ce facteur caractérise le transistor. Sa valeur est souvent comprise entre 20 et 400.

Méthode pour utiliser un transistor en amplificateur de courant : On calcule la valeur maximum de iC : c’est le courant de saturationdu transistor. En connaissant β on en déduit la plus grande valeur possible de iBmax et on calcule la valeur RB correspondante.

A.8.3 – En tout ou rien

On s’arrange pour que iB ait 2 valeurs possibles : 0 et dans ce cas iC = 0 ou plusieurs fois la valeurs de iBmax et alors le transistor estsaturé.

A.8.4 – Phototransistor

•C

RC

iC

•E

Il fonctionne comme le transistor, le courant de base étant remplacé par l’intensité du faisceaulumineux qu’il reçoit.

A.8.5 – Transistor à effet de champ

Il existe des transistors à effet de champ ou MOSFET. Le tableau ci-dessous résume les différences entre ces transistors et lestransistors PNP ou NPN :

37

Page 38: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

transistor bipolaire (PNP ou NPN) MOSFET

Accumulation de charge dans la base et le collecteur pas d’accumulation de charge

Vitesse de commutation moyenne élevée

Coefficient de température du courant IC positive ID négative

Impédance d’entrée faible forte

Temps de stockage 1 à 2 µs nul

Mise en parallèle difficile facile

Pertes en commutation élevée faible

Coût réduit élevé

Commande par une source de : courant tension

A.9 – L’amplificateur opérationnel

C’est un circuit intégré ayant les 2 propriétés suivantes :— Les intensités de courant dans les 2 entrées sont négligeables.— La tension entre les 2 entrées est négligeable (sauf si elle est imposée par le circuit extérieur auquel cas, l’amplificateur

opérationnel est utilisé en comparateur).L’alimentation d’un amplificateur opérationnel dépend du modèle : elle peut être symétrique (par exemple -15 V, 0 V, +15 V) ou non(par exemple 0 V, 5 V). Ces potentiels sont souvent des potentiels de saturation pour le potentiel de sortie (sauf en cas de phénomènede résonance).

Certains modèles sont des amplificateurs opérationnels de puissance.

A.9.1 – Utilisation en comparateur

+E+

E−S

V+

V−

V+ et V− sont les potentiels d’alimentation de l’amplificateur opérationnel.

Si VE+ > VE− alors VS = V+

Si VE+ < VE− alors VS = V−

A.9.2 – Quelques utilisations en amplificateur de tension

A.9.2.1 – montage suiveur

+E+

E−• S

V+

V−

VS = VE+

intérêt : disposer d’une tension identique mais avec possibilitéd’une intensité de courant plus importante avec un amplificateuropérationnel de puissance.

38

Page 39: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

A.9.2.2 – montage inverseur

+E+

E−

R1

•E R2

• S

V+

V−

VS =−VER2

R1

A.9.2.3 – montage non-inverseur

+•E ou E+

E−

R1

R2

• S

V+

V−

VS = VE

(1+ R2

R1

)

A.10 – Thyristor

A.11 – Relais

A.12 – Triac

A.13 – Optodiac-optotriac

39

Page 40: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

B – BibliothèqueVoici un exemple simple permettant de comprendre comment créer une bibliothèque (on l’appellera Morse). Le programmeci-dessous a pour effet de produire un signal lumineux SOS en morse : · · ·−−−· · ·B.1 – Programme sans bibliothèque mais avec des fonctions

int pin = 13;

void setup()pinMode(pin, OUTPUT);

void loop()dot(); dot(); dot();\\dot() et dash() sont des fonctions définies juste aprèsdash(); dash(); dash();dot(); dot(); dot();delay(3000);

void dot()digitalWrite(pin, HIGH);delay(250);digitalWrite(pin, LOW);delay(250);

void dash()digitalWrite(pin, HIGH);delay(1000);digitalWrite(pin, LOW);delay(250);

B.2 – Programme avec bibliothèque

Une bibliothèque est composée de 2 fichiers :— un fichier d’en tête Morse.h contenant les définitions des fonctions disponibles— un fichier source Morse.cpp contenant l’implémentation du code c’est à dire le code à l’intérieur des fonctions qui ont été

définies dans le fichier d’en tête.On crée ensuite un dossier Morse dans lequel on place les fichiers Morse.h et Morse.cpp. Ce dossier est à placer dans Arduino/libraries/

Morse.h

#ifndef Morse_h // si Morse_h n'estpas défini

#define Morse_h // on le définit

#include <Arduino.h> // pour pouvoirutiliser les constantes ou lesfonctions Arduino

class Morse // déclaration de classepublic:Morse(int pin);void dot();void dash();private:int _pin; // propriété privée : _pin

est le numéro de la broche àutiliser. Lors de l'initialisation de l'objet Morse,on peut à la fois mettre pin enmode OUTPUT et le stocker pour nepas avoir à le redonner lorsqu'

on fera un appel à une autre méthode.

#endif // fin du if

Morse.cpp

#include <Arduino.h>#include "Morse.h"

Morse::Morse(int pin)pinMode(pin, OUTPUT);_pin = pin;

void Morse::dot()digitalWrite(_pin, HIGH);delay(250);digitalWrite(_pin, LOW);delay(250);

void Morse::dash()digitalWrite(_pin, HIGH);delay(1000);digitalWrite(_pin, LOW);delay(250);

SOS.ino

#include <Morse.h>

Morse morse(13);

void setup()

void loop()morse.dot(); morse.dot(); morse.dot();morse.dash(); morse.dash(); morse.dash

();morse.dot(); morse.dot(); morse.dot();delay(3000);

40

Page 41: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

C – Expériences diverses

C.1 – Afficher le potentiel du curseur d’un potentiomètre

Un potentiomètre de 50 kΩ est placé entre +5 V et GND. Le curseur est relié à l’entrée analogique A0de la carte. La résolution du CAN est 10 bits soit 210 = 1024 pas.

void setup() Serial.begin(9600);

void loop() int val = analogRead(A0);Serial.println(val/1023.0*5.0,3);//pour que le résultat soit un nombre à virgule avec 3

chiffres après la virgule.delay(1000);

5 V

I

R = 50 kΩ A0

0 V

C.2 – Montrer la relation tension-intensité lumineuse reçue par une photorésistance

La résistance de la photorésistance diminue si elle est éclairée. On prendra donc la tension aux broches de la résistance placée ensérie pour que l’évolution de la valeur lue aille dans le même sens que la quantité de lumière reçue par la photorésistance.

void setup() Serial.begin(9600);

void loop() int val = analogRead(A0);Serial.println(val/1023.0*5.0,3);//pour que le résultat soit un nombre à virgule avec 3

chiffres après la virgule.delay(1000);

5 V

ãi

R ≈ 500 Ω

0 V

A0

C.3 – Afficher la tension de seuil d’une diode

On réalise le montage ci-contre. Pour différentes diodes (silicium, germanium ou LED) on relève lestensions de seuil. Par exemple environ 2 V pour une LED rouge.

void setup() Serial.begin(9600);

void loop() int val = analogRead(A0);Serial.println(val/1023.0*5.0,3);//pour que le résultat soit un nombre à virgule avec 3

chiffres après la virgule.delay(1000);

5 V

I

R

A0LED

0 V

41

Page 42: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

– Glossairedédié spécifique, qui ne peut être utilisé qu’avec une carte Arduino. Il est possible de gérer la carte avec des logiciels écrits avec

des langages généraux comme Python mais nécessitant l’utilisation une bibliothèque de commandes spécifiques. 6

ground il y a souvent confusion dans la signification de ce mot : dans certains cas, il s’agit de la prise de terre, dans d’autres cas,c’est la masse (connexion avec la carcasse métallique de l’appareil). Enfin, et c’est le cas avec la carte Arduino, c’est le potentiel0 V conventionnellement fixé car on ne mesure pas de potentiel mais une différence de potentiel ou tension avec le voltmètre. 6

Launcher lanceur d’application en cliquant sur la petite icône à gauche du Bureau Ubuntu. 4

potentiel On utilise souvent l’analogie hydraulique pour faire comprendre cette notion : le courant électrique s’écoule d’unpotentiel haut vers un potentiel bas comme l’eau s’écoule d’un endroit haut vers un endroit plus bas. 6, 9, 13, 35

Processing Logiciel libre particulièrement adapté à la création plastique et graphique interactive. 1

Terminal ou console fonctionnant en écrivant des lignes d’instruction, par exemple pour lancer un programme. L’instructionsudo est souvent indispensable pour une exécution des lignes de commande en tant que propriétaire : le mot de passe estalors requis. 4

Téléverser terme spécifique au langage Arduino : charger le programme dans la mémoire de la carte. Quand on clique sur l’icôneTéléverser le programme est compilé, c’est-à-dire retraduit automatiquement dans un autre langage, appelé langage machine,très complexe mais seul capable d’être compris par le micro-contrôleur. 4

Ubuntu L’une des distributions gratuites de Linux. La version 16.04 LTS est la version d’avril (04) 2016 LTS Long Term Support,sachant qu’il y a une version LTS tous les 2 ans. Tous les six mois, en avril et en octobre, une version – la plupart non LTS – esttéléchargeable. 4

42

Page 43: Projet Arduino - jobonne.orgjobonne.org/projetArduino.pdf · Projet Arduino Apprendre les bases de l’électronique avec une carte Arduino JO BONNÉ Lycée JEAN-MONNET BRUXELLES

– Références[1] . URL: http://blog.opensensors.io/blog/2014/09/13/getting-started-with-arduino-on-linux/.

[2] . URL: https://processing.org/download/?processing.

[3] . URL: https://www.arduino.cc/en/Main/Software.

[4] . URL: https://www.overleaf.com/6845477jbwtvfgxyjqc#/23342181/.

[5] . URL: http://fritzing.org/home/.

[6] . URL: http://joanna.iwr.uni-heidelberg.de/rlab/download/atmega-tutorial.pdf.

[7] . URL : http://perso-laris.univ-angers.fr/~cottenceau/ArduinoCottenceau1112.pdf.

[8] Till Tantau. URL: http://ctan.triasinformatica.nl/graphics/pgf/base/doc/pgfmanual.pdf.

43