# Micro contrôleurs AVR/Arduino

L' arduino est un nom générique donné à un ensemble de platines ayant une connectique très spécifique. Son but est de pouvoir recevoir des "shields" qui ne sont autres que des périphériques spécifiques. Le nombre de shields est en constante augmentation. Des périphériques relativement complexes sont ainsi proposés :
* WIFI
* USB maître
* Commandes de moteurs pour la robotique
et bien d'autres encore ...
L'environnement de programmation est basé sur un Environnement de développement intégré (IDE dans la suite de ce chapitre) très simple à utiliser. Le langage utilisé est un dérivé du C, en fait du C++ dont on cache certaines parties.
Internet permet de trouver facilement de la documentation sur Arduino. Pour ne pas faire de redondance avec ce genre de documentation, nous allons présenter des problèmes assez techniques dans ce chapitre. Le genre de problème qu’il est difficile de trouver résolu. Nous avons, par exemple, décidé d'ajouter en fin de ce chapitre l’utilisation de platines Arduino avec le compilateur avr-gcc, autrement dit sans l'environnement ARDUINO. Nous aborderons aussi le problème des claviers USB, complexe à cause de nos claviers AZERTY et de nos caractères accentués.

## Des platines libres

Les platines sont naturellement vendues mais elles sont toujours proposés aux amateurs (de grandes sensations) de manière complètement libre. Il est donc possible en principe de fabriquer sa propre carte Arduino, mais cela devient de plus en plus difficile avec les évolutions des processeurs. On est passé des boîtiers DIP du processeur AVR ATMega8 aux boîtiers CMS ou SMD (pour Surface-Mount Device) des AVR ATMega 328 (32 broches). Travailler avec ce genre de boîtier est devenu difficile pour l'amateur, aussi éclairé soit-il.
S'il vous est possible de fabriquer des platines même à échelles industrielles, il vous est en revanche interdit de leur donner "Arduino" comme nom. C'est pour cela que l’on a vu fleurir des noms concurrents assez évocateurs : Freeduino, Sanguino, Seeduino, Uduino, Diduino, etc.
Nous vous présentons ci-contre un exemple typique de platine Arduino. Regardez ses connecteurs typiques (entourés de rouges), c’est avec eux que l’on connecte les "shields".

## Le langage Arduino

Comme nous avons déjà eu l’occasion de le dire, le langage de programmation est basé sur le langage C/C++. Voyons cela un peu plus en détail.
Voici en image comment se présente l’Environnement de développement intégré ci-dessous à droite.
La référence du langage Arduino peut facilement être trouvée ici.

### Langage C et Arduino

La compréhension de cette section nécessite une connaissance du langage C. Rappelons qu’il existe une Introduction au langage C dans la Wikiversité. On peut voir la programmation en langage arduino de la manière suivante : un programme en C ayant la structure :
Dans ce programme vous n'aurez qu’à écrire la fonction loop et la fonction setup. Autrement dit tout ce qui est présenté dans le listing ci-dessus vous est caché mais est ajouté de manière automatique.
On remarquera que setup est appelé une seule fois alors que loop est appelé dans une boucle infinie. Rappelons enfin que la traduction du mot anglais "loop" est "boucle".
Nous espérons que vous avez bien remarqué que la seule chose qui manque au programme ci-dessus pour être complet est naturellement :
et donc que c’est la seule chose que vous avez à faire en programmant votre Arduino.

### Un exemple de programme

L'entrée anglaise de wikipédia sur le sujet propose l'exemple suivant :
Ce programme tout simple fait clignoter une LED reliée à la broche 13 (avec une résistance bien sûr) toutes les secondes.

## Exemples de réalisations

Nous allons présenter dans cette section un exemple de réalisation et ses programmes associés. Nous espérons que des collègues viendront compléter cette partie pour diversifier les matériels utilisés.

### Présentation du matériel utilisé

Un shield (bouclier) a été réalisé à l’IUT de Troyes pour l'enseignement des bases de la programmation Arduino. Sa documentation peut être consultée dans ce lien (WIKI interne à GEII Troyes).

### Afficher sur deux afficheurs sept segments

Les programmes de cette section sont dépendants de la partie matérielle présentée plus haut et surtout ici.

#### Connexion du shield utilisé aux sept segments

Les 2 afficheurs ne peuvent pas être utilisés simultanément. L'état de la sortie mux (arduino port 4 ou PD4) permet de sélectionner l'un ou l'autre. En allumant successivement l'un puis l'autre rapidement, on a l'illusion qu’ils sont tous 2 allumés.
Les segments des afficheurs sont câblés de façon analogue comme décrit ci-dessous :
| Segment | pt | g | f | e | d | c | b | a |
| Arduino Pin | 11 | 9 | 10 | 8 | 7 | 6 | 12 | 13 |
| Port UNO | PB3 | PB1 | PB2 | PB0 | PD7 | PD6 | PB4 | PB5 |
Voici sous forme schématique la documentation correspondante :
Cet ordre pour le brochage peut sembler étrange. Mais elle est liée à des contraintes de routage du shield.

### Utiliser une interruption pour allumer une LED

Encore une fois ce programme est très dépendant de la partie matérielle présentée plus haut et surtout ici.
Un appui sur le bouton allume la LED tandis qu'un nouvel appui l’éteint :
Ce programme est intéressant pour montrer comment utiliser une interruption avec l'Arduino. Cette interruption se déclenche sur un front montant ("RISING") mais peut l'être sur tout changement de niveau ("CHANGE"), ou sur front descendant ("FALLING").

## Utiliser "Processing" pour afficher des données graphiques

Processing est un environnement de programmation permettant de réaliser du graphisme avec un environnement de type Arduino. La seule différence est qu'au lieu de programmer les célèbres "setup" et "loop" on trouvera ici "setup" et "draw". L'autre grande différence c’est que le langage utilisé est Java. Voici donc un exemple destiné à réaliser l’affichage sous forme de bar-graphe des valeurs provenant d'un seul capteur.

### D'abord le programme Arduino

Nous n'utilisons pas de protocole mais envoyons directement la valeur d'un seul capteur en continu.

### Ensuite le programme "processing"

Le programme processing est un peu plus complexe :
Nous reviendrons sur cet exemple en le complétant plus tard.