Arduino : getting started
Getting started
Ecrire un sketch
Langage et référence
Les programmes écrit pour Arduino ont un nom particulier appelé "Sketch", vous retrouverez ce terme partout dans les documentations que vous pouvez trouver. Les fichiers écrit pour ces Sketch sont des ".ino" et sont écrit en utilisant le langage Processing. Ce langage a une syntaxe qui est très proche du C (également au niveau des types, structures etc) et va permettre avec la librairie de manipuler les entrées/sorties, les communications avec le PC, de faire des opérations mathématiques et encore de faire des conversions de type. Pour plus d'informations sur le langage, on peut consulter cette page.
4 étapes
La programmation d'un Arduino se fait en 4 étapes très simples :
- Brancher l’arduino en USB
- Ecrire un sketch
- Uploader le sketch sur l’arduino via l’USB
- L’arduino exécute le code tant qu’il est alimenté
Structure du code
Afin de simplifier les développements, chaque programme Arduino (Sketch) est articulé sur une structure de code bien définie. Celle-ci est composé de deux fonctions, la première étant setup() qui est appelé une seule fois au chargement du programme et permet d'initialiser des variables ou des librairies, la deuxième étant loop() et qui doit comporter le code principal du programme. Cette dernière va être appelée en boucle indéfiniment tant que l'arduino est alimenté, le comportement de cette fonction pourra donc changer en fonction des entrées et sorties.
Le code ci-dessous permet de voir la structure de base :
void setup() { // put your setup code here, to run once: // initialisation des variables, des librairies,IO etc } void loop() { // put your main code here, to run repeatedly: // Tourne indefiniment, repond et change en fonction des I/O. }
Langages, constantes et méthodes
Cette section a pour but de détailler succinctement les différentes fonctions qui permettent d'interagir avec les entrées/sorties.
Constants
Les constantes vont permettre de définir le comportement des broches dans notre programme. Par exemple le mode (entrée ou sortie) ainsi que les états. Ces constantes seront donc utilisable en paramètres des fonctions que l'on voit par la suite.
- Digital pin mode : définit le comportement des broches numériques.
- INPUT : positionne la broche en entrée et permet de lire les informations des capteurs.
- OUTPUT : positionne la broche en sortie ; fournit un courant de 40mA (suffisant pour allumer une LED mais pas pour les moteurs par exemple).
- Pin level : écrire ou lire à partir d’une I/O numérique
- HIGH :
- en mode OUTPUT : positionne 5 Volts.
- en mode INPUT : reporte HIGH si plus de 3 Volts
- LOW :
- en mode OUTPUT : positionne 0 Volts
- en mode INPUT : reporte LOW si moins de 2Volts
I/O Numériques
Les fonctions ci-dessous permettent de configurer et d'interagir avec les broches numériques. On remarque que à chaque fois, on précise le numéro de la broche tel qu'il est annoté sur notre circuit.
- pinMode(pin, mode) : permet de configurer le comportement (entrée ou
sortie) de la broche passée en paramètre.
Exemple : pinMode(13, OUTPUT); -
digitalWrite(pin, value) : écrit une valeur (HIGH ou LOW) sur une broche configurée en tant que sortie (OUTPUT).
Exemple : digitalWrite(13, HIGH); -
digitalRead(pin) : lit la valeur présente sur la broche spécifiée en paramètre
(HIGH ou LOW).
Exemple : val = digitalRead(13);
I/O analogiques
Les fonctions ci-dessous permettent de configurer et d'interagir avec les entrées analogiques ainsi que les sorties PWM
- analogReference(type) : permet de configurer la valeur de réference pour les
entrées analogiques (i.e la valeur max, built-in ou externe).
Exemple : analogReference(DEFAULT) ; DEFAULT means 5 Volts - analogRead(pin) : lit la valeur présente sur l’entrée analogique. Retourne un
entier de 0 à 1023.
Exemple : var = analogRead(3); -
analogWrite(pin, value) : écrit une valeur analogique (PWM) sur la sortie.
Génére un signal carré. La valeur doit être entre 0 et 255.
Exemple : analogWrite(9, 128);
Serial
Les fonctions ci-dessous permettent de lire et d'écrire des données sur l'interface série.
- Serial.begin(speed) : permet de fixer le nombre de symboles transmis par
seconde.
Exemple : Serial.begin(9600); - Serial.print(data) : envoi des données sous forme ASCII sur l’interface série
(variante avec println()).
Exemple : Serial.print("Hello"); Serial.print(42); - Serial.print(data,format) : variante avec une option format qui permet de
préciser la base (BIN, OCT, DEC, HEX).
Exemple : Serial.print(42,HEX); // gives "2A" -
Serial.read() : lit le premier octet présent sur l’interface série (ou -1 sur aucun).
Voir aussi readBytes(buffer, length).
Exemple : byte inByte = Serial.read();
Hello World !
Maintenant que l'on connait la structure de base du code ainsi que les principales fonctions à utiliser nous pouvons écrire notre premier programme. Le but est ici très simple : faire clignoter une LED. Pour cela, nous allons avoir besoin de seulement deux composants électronique : une LED et une résistance permettant d'abaisser la tension au niveau de la LED pour la protéger. La résistance est branchée comme sur le schéma ci-dessous à la broche numéro 13 (sorties numériques), la LED en série par la suite et sa cathode à GND. En modifiant ainsi la tension au niveau de la broche 13, la tension au niveau de la LED va changer et celle-ci va s'allumer.


Le programme à écrire est alors assez simple, la première chose à faire étant d'initialiser la broche en mode OUTPUT puis dans la fonction loop() de positionner successivement un état HAUT puis un état BAS. La LED va alors clignoter, on peut ajouter des temps d'attente pour contrôler la fréquence de clignotement. Le code à écrire est celui ci-dessous :
// The LED is connected to pin 13 const int led = 13; void setup() { // initialize the pin as an output. pinMode(led, OUTPUT); } void loop() { digitalWrite(led, HIGH); // turn the LED on delay(1000); //wait for a second digitalWrite(led, LOW); // turn the LED off delay(1000); // wait for a second }
Hello World ! (avec PWM)
En plus de vouloir faire clignoter la LED, nous voulons maintenant pouvoir contrôler l'intensité lumineuse de celle-ci et la faire clignoter plus doucement. Il faut alors contrôler de facon linéaire la tension à ses bornes. Ceci est possible en utilisant le mode PWM que nous avons décrit. On connecte la résistance à une broche PWM (ici sur le schéma la 9), la LED en série par la suite et toujours la cathode sur GND. Ainsi en faisant varier la pulsation du signal sur la broche, on fera varier la tension moyenne appliquée aux bornes de la LED, permettant ainsi de contrôler l'intensité lumineuse.


Le code est encore ici très simple, la différence est que l'on ne définit pas le mode de la broche et que l'on va utiliser la fonction analogWrite(). En imbriquant deux boucles dans la fonction loop(), on peut allumer doucement la LED et l'eteindre de la même manière. On augmente ou on diminue de 5 en 5 à chaque tour de boucle la valeur des pulsations en sortie.
const int led = 9;// The LED is connected to PIN 9 void setup() { // nothing to do here this time. } void loop() { // fade in for(int fadeV = 0 ; fadeV <= 255; fadeV +=5) { analogWrite(led, fadeV); delay(30); // wait to see the effect } // fade out for(int fadeV = 255 ; fadeV >= 0; fadeV -=5) { analogWrite(led, fadeV); delay(30); // wait to see the effect } }
Les shields
Afin de pouvoir étendre encore plus les possibilités d'Arduino mais de simplifier la tache au maximum, il existe des cartes d'extension appelées Shield. Ces cartes branchées au dessus de l'Arduino vont permettre de ne pas reinventer la roue et de s'abtenir de cabler des circuits complexes. Certain prefereront les fabriquer suivant les plans fournit (long et laborieux pour les non électroniciens) mais il y a possibilité de les acheter déjà montés (7 sont disponibles sur le store officiel).
Les shields disponibles sont par exemple :
- GSM
- Ethernet
- Wifi
Un exemple
Nous aimerions maintenant bien utiliser du Wifi dans nos programmes afin de communiquer avec l'extérieur mais la conception complète d'une carte parait plutôt laborieuse et complexe. Il est alors possible ici d'utiliser le shield Wifi et la librairie qui est fournit avec. On peut voir ci-dessous un apercu du Shield avec au milieu le circuit permettant les communications Wifi. Celui-ci doit être alimenté en 5 volts, est compatible 802.11 b/g et supporte les cryptages WEP et WPA2.
Supposons que l'on veuille se connecter à un réseau sans fil ouvert et récuperer ensuite notre adresse IP. Pour cela, il est nécessaire d'utiliser la librairie fournit avec le shield et de l'inclure dans notre programme (ici Wifi.h). On pourra ensuite initier la connexion avec Wifi.begin() puis tester le statut pour vérifier si on est bien connecté. Si on est connecté, on peut récuperer notre adresse IP grâce à la fonction Wifi.localIP(). Le code est disponible ci-dessous (simplifié pour des raisons de lisibilité).
#includechar ssid[] = "my_ssid"; int status = WL_IDLE_STATUS; void setup() { Serial.begin(9600); // initialize serial: Serial.print("Connecting to the network: "); status = WiFi.begin(ssid); if (status == WL_CONNECTED) { Serial.println("Connected"); } else ... } void loop(){ Serial.println(Wifi.localIP()); }