
Introduction
Cette approche a pour but de prĂ©senter et dâinitier Ă lâutilisation dâArduino. Les cartes Arduino sont conçues pour rĂ©aliser des prototypes et des maquettes de cartes Ă©lectroniques pour lâinformatique embarquĂ©e.
Elles permettent un accĂšs simple et peu couteux de plus, elles sont entiĂšrement libres de droit, autant sur lâaspect du code source (Open Source) que sur lâaspect matĂ©riel (Open Hardware). Ainsi, il est possible de refaire sa propre carte Arduino dans le but de lâamĂ©liorer ou d'enlever des fonctionnalitĂ© inutiles au projet.
Le langage Arduino se distingue des langages utilisĂ©s dans l'industrie de l'informatique embarquĂ©e de par sa simplicitĂ©. En effet, beaucoup de librairies et de fonctionnalitĂ©s de base occulte certains aspects afin de gagner en simplicitĂ©. Cela en fait un langage parfait pour rĂ©aliser des prototypes ou des petites applications dans le cadre de hobby, mĂȘme au niveau des radioamateurs.
Les possibilités des cartes Arduino sont énormes, un grand nombre d'application ont déjà été réalisé et testées par bon nombre d'internautes. On retrouve par exemple diverse formes de robot ou des stations météos. D'autres exemples d'applications sont disponibles sur le web aux adresses suivantes : hackaday.com/category/arduino-hacks/
instructables.com/technology/arduino/
Le site référence est sans aucun doute celui de la marque www.arduino.cc
1. Présentation de la carte
Il existe actuellement beaucoup de types de carte, les plus importantes sont : l'Arduino Uno, Arduino Lenardo, Arduino Mega, Arduino Mega ADK, Arduino Due, Arduino Nano, Arduino Mini Pro et Arduino Yun. Nous nous intéresserons à la carte Arduino UNO mais d'abords un tour du propriétaire :
A. La carte est composĂ©e dâun microcontrĂŽleur
Les cartes Arduino font partie de la famille des microcontrĂŽleurs. Les microcontrĂŽleurs (en notation abrĂ©gĂ©e ”c, ou uc ou encore MCU en anglais) sont des composants intĂ©grĂ©s qui contiennent dans un mĂȘme boĂźtier un microprocesseur, de la mĂ©moire, et des pĂ©riphĂ©riques courants, tels que timer, liaison sĂ©rie asynchrone, liaison sĂ©rie synchrone, ports dâentrĂ©e sortie logiques, contrĂŽleur de bus CAN, convertisseur analogique numĂ©rique, etc. On peut comparer un microcontrĂŽleurs Ă un ordinateur classique, mais avec un systĂšme dâexploitation rĂ©duit et avec une puissance de calcul considĂ©rablement plus faible.
Les microcontrĂŽleurs sont inĂ©vitables dans les domaines de lâinformatique embarquĂ©e, de lâautomation et de lâinformatique industrielle.Ils permettent de rĂ©duire le nombre de composant et de simplifier la crĂ©ation de cartes Ă©lectroniques logiques.
B. CaractĂ©ristiques techniques de lâArduino UNO
Câest la premiĂšre version stable de carte Arduino. Elle possĂšde toutes les fonctionnalitĂ©s dâun microcontrĂŽleur classique en plus de sa simplification dâutilisation.
Elle utilise une puce ATmega328P [1] cadencĂ©e Ă 16Mhz. Elle possĂšde 32 KB de mĂ©moire flash destinĂ©e Ă recevoir le programme, 2 KB de SRAM (mĂ©moire vive) et 1 KB dâEEPROM (mĂ©moire morte destinĂ©e aux donnĂ©es). Elle offre 14 pins (broches) dâentrĂ©es/sorties numĂ©riques (donnĂ©es acceptĂ©e 0 ou 1) [2] dont 6 pouvant gĂ©nĂ©rer des PWM (Pulse Width Modulation). Elle permet aussi de mesurer des grandeurs analogiques grĂące Ă ces 6 entrĂ©es analogiques [3]. Chaque broche est capable de dĂ©livrĂ© un courant de 40 mA pour une tension de 5V.
Cette carte Arduino peut aussi sâalimenter et communiquer avec un ordinateur grĂące Ă son port USB [4]. On peut aussi lâalimenter avec une alimentation comprise entre 7 V et 12 V grĂące Ă son connecteur Power Jack [5]. Son prix mini est actuellement environ 19.50 ⏠đ
C. Un atout : les shields
Pour la plupart des projets, il est souvent nĂ©cessaire dâajouter des fonctionnalitĂ©s aux cartes Arduino. PlutĂŽt que dâajouter soit mĂȘme des composants extĂ©rieurs (sur une platine dâessai, circuit imprimĂ© etc .) il est possible dâajouter des shields. Un shield est une carte que lâon connecte directement sur la carte Arduino qui a pour but dâajouter des composants sur la carte. Ces shield viennent gĂ©nĂ©ralement avec une librairie permettant de les contrĂŽler.
Photo du site randomnerdtutorials.com
On retrouve par exemple, des shields Ethernet, de contrĂŽle de moteur, lecteur de carte SD, etc.
Le principal avantage de ces shields est leurs simplicitĂ© dâutilisation. Il suffit de les emboiter sur la carte Arduino pour les connecter, les circuits Ă©lectronique et les logiciels sont dĂ©jĂ faits et on peut en empiler plusieurs. Câest un atout majeur pour ces cartes pour pouvoir tester facilement de nouvelles fonctionnalitĂ©s. Cependant il faut bien garder Ă lâesprit que les shields ont un prix. Suivant les composants quâils apportent, leurs prix peuvent aller de 5 Ă 100 ⏠!
Pour faire fonctionner ces cartes nous avons besoin d'un logiciel.
2. Présentation du logiciel
A. IDE Arduino
Un IDE (environnement de dĂ©veloppement) libre et gratuit est distribuĂ© sur le site dâArduino (compatible Windows, Linux et Mac Ă lâadresse arduino.cc/en/main/software. Dâautres alternatives existent pour dĂ©velopper Arduino (extensions pour CodeBlocks, Visual Studio, Eclipse, XCode, etc.) mais nous nâaborderons ici que lâIDE officiel.
Actuellement c'est la version 1.8.8 qui est utilisée. Une fois téléchargé, vous l'installez et jusqu'ici pas de soucis.
Il vous crée une icÎne sur le bureau, que vous ouvrez ...
Lâinterface de lâIDE Arduino est plutĂŽt simple, il offre une interface minimale et Ă©purĂ©e pour dĂ©velopper un programme sur les cartes Arduino ou tout autres microcontrĂŽleur. Il est dotĂ© dâun Ă©diteur de code avec coloration syntaxique [1] et dâune barre dâoutils rapide [2]. Ce sont les deux Ă©lĂ©ments les plus importants de lâinterface, câest ceux que lâon utilise le plus souvent.
On retrouve aussi une barre de menus [3] plus classique qui est utilisĂ© pour accĂ©der aux fonctions avancĂ©es de lâIDE. Enfin, une console [4] affichant les rĂ©sultats de la compilation du code source, des opĂ©rations sur la carte, câest le dĂ©bogueur.
B. Langage Arduino
Le langage Arduino est inspirĂ© de plusieurs langages. On retrouve notamment des similaritĂ©s avec le C, le C++, le Java et le Processing. Le langage impose une structure particuliĂšre typique de lâinformatique embarquĂ©e. La fonction « setup » contiendra toutes les opĂ©rations nĂ©cessaires Ă la configuration de la carte (directions des entrĂ©es sorties, dĂ©bits de communications sĂ©rie, etc.).
La fonction « loop » elle, est exĂ©cutĂ©e en boucle aprĂšs lâexĂ©cution de la fonction « setup ». Elle continuera de boucler tant que la carte nâest pas mise hors tension, redĂ©marrĂ©e (par le bouton 'reset'). Cette boucle est absolument nĂ©cessaire sur les microcontrĂŽleurs Ă©tant donnĂ© qu'ils n'ont pas de systĂšme d'exploitation. En effet, si lâon omettait cette boucle, Ă la fin du code produit, il sera impossible de reprendre la main sur la carte Arduino qui exĂ©cuterait alors du code alĂ©atoire.
Au niveau de la syntaxe, on retrouve des similaritĂ©s avec les langages prĂ©cĂ©demment citĂ©s. La dĂ©claration des variables se fait gĂ©nĂ©ralement dans lâespace global (de façon Ă partager les variables les plus importantes entre les deux fonctions principales). On retrouve les types de base suivant :
Il existe dâautres types de base mais ils ne sont quâun alias de ceux citĂ©s prĂ©cĂ©demment, la liste des types est disponible sur la page des rĂ©fĂ©rences du site Arduino arduino.cc/en/Reference/HomePage. La dĂ©claration des variables suit cette syntaxe : (const) ([]) (= valeur);   Voici un exemple :
float univers = 42.0 ;
char lettre = 'b';
String chaine = "Hello World " ;
long tableau[12] ;
boolean vrai = true ;
On retrouve les opérateurs les plus courants pour les types de bases. Parmi eux, = (affectation), == (comparaison), != (différence), <, >, <=, >=, && (et logique), || (ou logique), ! (non logique). On retrouve aussi les opérateurs mathématiques (+, -, *, /, %) et les opérateurs logiques bit à bit (^ (XOR), & (et), | (ou), ~(non), << (décalage logique à gauche), >> (décalage logique à droite).
Voici quelques exemples dâutilisation de structure de contrĂŽle.
         switch (variable) {
             case 1 :
doSomething(10) ;
         break ;
         case 0 :
doSomething(1) ;
         default :
doSomething(0) ;
}
} else if ( variable > 4 ) {
            while ( variable != 10 ) {
variable = doSomethingElse(variable-1) ;
}
} else {
          for ( int i = 0 ; i < 10 ; i++ ) {
variable = variable *2 ;
}
}
Les fonctions, les structures et les classes se dĂ©clarent de la mĂȘme façon quâen C++. Elles se dĂ©clarent sous cette forme :
struct <nom>{
<type> <nom du champ> ;
} ;
Fonction :
<type de retour> <nom>(<paramĂštre>) {
<instruction>
}
Classe :
class <nom> {
public :
<attributs et champ publics>
private :
<attributs et champ privés>
protected :
<attribut et champ privés>
} ;
3. Les fonctionnalités de base
A. Les entrées et sorties
Le langage Arduino vient avec un nombre important de fonction de base permettant dâinteragir avec son environnement. Les fonctions les plus utilisĂ©e sont les fonctions dâentrĂ©e/sortie. Ce sont elles qui permettent dâenvoyer ou de mesurer une tension sur une des broches de la carte.
Dans un premier temps, avant d'effectuer une mesure ou d'envoyer une commande, il est nĂ©cessaire de dĂ©finir la direction des broches utilisĂ©es. Pour cela on fait appel Ă la fonction 'pinMode' en lui donnant dâune part, la broche concernĂ©e, et dâautre part, la direction, cela se traduit comme ceci :
pinMode(1,OUTPUT) ; // Broche 1 en sortie
pinMode(2,INPUT) ; // Broche 2 en entrée
}
Cette configuration faite, on peut procĂ©der Ă lâutilisation des broches. Toutes les broches sont capables dâĂ©crire et de lire des donnĂ©es numĂ©riques c'est-Ă -dire des 0 (0V) ou des 1 (5V)). Mais, certaines disposent de fonctionnalitĂ© supplĂ©mentaire.
Tout dâabord, toutes les cartes Arduino possĂšdent des entrĂ©es analogiques. Ce sont les broches A0-A1-A2 etc. Elles permettent de lire des tensions analogiques (comprise entre 0 et 5V) et de le convertir en entier (compris entre 0 et 1023) proportionnellement Ă la tension mesurĂ©e. Certaines cartes Arduino possĂšdent des sorties analogiques faisant lâopĂ©ration inverse (met une tension sur la broche proportionnellement Ă lâentier donnĂ©), mais ce nâest pas le cas pour lâArduino UNO.
Pour pouvoir tout de mĂȘme contrĂŽler des composants autrement quâen « tout ou rien » il est possible dâutiliser des broches PWM. Ce sont les broches annotĂ©s par un tilde ~ sur la carte.
Les PWM (Pulse Width Modulation) sont utilisĂ©es pour synthĂ©tiser des signaux analogiques en modulant le temps passĂ© Ă lâĂ©tat 1 (5V).
En utilisant une frĂ©quence relativement Ă©levĂ©e, les PWM permettent de commander certains composants comme s'il recevait une tension analogique. Cela provient du fait que les composants utilisĂ©s dans lâĂ©lectronique analogique, ne changent pas dâĂ©tats instantanĂ©ment. Par exemple, une ampoule Ă incandescence reste chaude un court instant aprĂšs avoir Ă©tĂ© Ă©teinte. Ce phĂ©nomĂšne est gĂ©nĂ©ralement invisible Ă lâĆil nu. GrĂące Ă elles, on pourra par exemple faire varier lâintensitĂ© dâune LED. La plupart des cartes Arduino utilisent des PWM cadencĂ©es Ă 490 Hz environ.
Toutes ces fonctionnalitĂ©s sur les broches dâentrĂ©es /sorties sont utilisables par le biais de quatre fonctions :
- digitalRead (pin) : mesure une donnĂ©e numĂ©rique sur une des broches, la broche en question doit ĂȘtre rĂ©glĂ©e 'en entrĂ©e'
- digitalWrite (pin, value) : Ă©crit une donnĂ©e numĂ©rique sur une des broches, la broche concernĂ©e doit ĂȘtre rĂ©glĂ©e 'en sortie'. Le paramĂštre 'value' doit ĂȘtre Ă©gal Ă HIGH (Ă©tat 1 soit 5V) ou LOW(Ă©tat 0 soit 0V)
- analogRead (pin) : mesure une donnĂ©e analogique sur une des broches (compatible seulement), la broche doit ĂȘtre rĂ©glĂ©e sur 'entrĂ©e'
- analogWrite (pin, value) : Ă©crit une donnĂ©e sous forme de PWM sur une des broches (compatible uniquement), la broche doit ĂȘtre rĂ©glĂ©e 'en sortie'. Le paramĂštre 'value' doit ĂȘtre compris dans lâintervalle [0;255]
B. La gestion du temps
Pour la plupart des applications de domotique, il est nĂ©cessaire de faire intervenir des intervalles de temps. Par exemple, pour gĂ©rer le temps dâappui sur un bouton ou pour faire une sonnerie qui se rĂ©pĂšte un certains nombre de fois. Le langage Arduino fournis quelques fonctions permettant de gĂ©rer ce temps.
Il est possible dâinsĂ©rer une pause dans son programme pendant un instant. Pour cela, on utilise les fonctions « delay » et « delayMicroseconds » qui insĂšre une pause suivant le paramĂštre passĂ© (en milliseconde pour lâun, en microseconde pour lâautre). Cependant ces fonctions bloquent le microcontrĂŽleur, on ne peut alors plus effectuer aucune action.
En plus dâinsĂ©rer une pause, il est possible de mesurer le temps. De la mĂȘme maniĂšre que les fonctions de dĂ©lai, on utilise les fonctions « millis et « micros » qui donnent le nombre de milliseconde (respectivement microseconde) depuis le lancement de la carte. Attention, ces fonctions incrĂ©mente une variable (interne). Ces variables se remettent Ă zĂ©ro une fois le maximum atteint (overflow). La variable utilisĂ©e pour les millisecondes atteint sont maximum au bout de 49 jours et 17 heures et la variable utilisĂ©e pour les microsecondes au bout de 71 minutes et 34 secondes environ. Il faut donc faire attention lors de lâutilisation de ces fonctions pour des utilisations longues durĂ©es.
C. Les interruptions
Il est parfois nĂ©cessaire en informatique embarquĂ©e, dâattendre un Ă©vĂ©nement externe (appui sur un bouton, donnĂ©es dâun capteur, etc.) pour effectuer une action. Pour ce type de problĂšme, on utilise les interruptions. Les interruptions sont des portions de code (fonctions) appelĂ©s lorsque quâun Ă©vĂ©nement (interne ou externe) survient et a besoin dâĂȘtre traitĂ© sur le champ.
Il faut cependant faire attention, ce mĂ©canisme interrompt le code exĂ©cutĂ©, il est prioritaire par rapport au reste du code. Vu quâil est possible de mesurer les Ă©vĂ©nements ponctuellement (via les fonctions dâentrĂ©es/sorties) on utilise gĂ©nĂ©ralement les interruptions pour du code critique (arrĂȘt dâurgence par exemple) ou des Ă©vĂ©nements non-ponctuels (transmissions de donnĂ©es depuis un ordinateur par exemple).
Aussi, le nombre dâinterruption externe est limitĂ© Ă 2 sur la plupart des cartes Arduino. Les interruptions sont utilisables sur les broches compatibles seulement (broches 2 et 3 sur lâArduino UNO). Pour choisir la fonction et la broche utilisĂ©e pour lâinterruption, on utilise la fonction « attachInterrupt ». On peut utiliser « detachInterrupt » pour supprimer lâinterruption. Il est possible de partir en interruption sur 4 types dâĂ©vĂ©nements :
- LOW : Lorsque la broche est Ă lâĂ©tat 0 (0V)
- RISING : Lorsque la broche passe de lâĂ©tat 0 (0V) Ă lâĂ©tat 1 (5V) (front montant)
- FALLING : Lorsque la broche passe de lâĂ©tat 1 (5V) Ă lâĂ©tat 0 (0V) (front descendant)
- CHANGE : Lorsque la broche change dâĂ©tat (front montant et front descendant)
Voici un exemple dâutilisation :
void appuiBouton() {
etat =!etat; // Changement dâĂ©tat
}
void setup() {
pinMode(2,INPUT); // Broche 2 en entrée
attachInterrupt(0,appuiBouton,RISING); // On attache Ă lâinterruption 0 (broche 2) la fonction 'appuiBouton' sur un front montant
}
On remarque lâapparition du mot clef volatile avant la dĂ©claration de la variable 'etat'. Ce mot clef est nĂ©cessaire pour toutes les variables qui sont modifiĂ©es dans une interruption. Cela Ă une incidence sur la maniĂšre dont le compilateur traite lâaccĂšs Ă la variable.
Il est parfois nĂ©cessaire de dĂ©sactiver temporairement les interruptions par exemple lorsque lâon exĂ©cute du code critique (activation dâun moteur, etc.). Deux fonctions permettent de changer lâactivation des interruptions interrupts et noInetrrupts pour activer (respectivement dĂ©sactiver) les interruptions.
4. Un peu de pratique ...
A. Hello Led
Nous allons maintenant passer Ă la pratique. (c'est quand mĂȘme le plus amusant). Pour cette premiĂšre manipulation, il est demandĂ© de faire clignoter une LED de façon rĂ©guliĂšre. Vous pouvez soit utiliser une LED avec une rĂ©sistance en sĂ©rie sur une breadboard. Ou alors, vous pouvez utiliser la LED directement sur lâArduino (broche 13 sur la carte Arduino UNO). Pour y arriver il faut aller chercher le nom « Blink » dans le programme installĂ© prĂ©cĂ©dement.
Une fois que vous avez cliquĂ© sur « Blink », une nouvelle fenĂȘtre va apparaĂźtre. Elle va contenir le programme « Blink ».
Quelques explications s’imposent
La premiĂšre chose Ă faire est dâinitialiser la broche LED_BUILTIN en tant que broche de sortie avec la ligne
pinMode(LED_BUILTIN, OUTPUT);
Dans la boucle principale, vous allumez le voyant avec la ligne :
digitalWrite(LED_BUILTIN, HIGH);
Cela fournit 5 volts à l'anode à LED. Cela crée une différence de tension entre les broches de la LED qui s'éclaire. Ensuite, vous l'éteignez avec la ligne :
digitalWrite(LED_BUILTIN, LOW);
Cela ramÚne la broche LED_BUILTIN à 0 volt et éteint le voyant. Entre l'activation et la désactivation, vous souhaitez disposer de suffisamment de temps pour permettre à une personne de voir le changement delay()
commandes delay()
indiquent donc au conseil de ne rien faire pendant 1 000 millisecondes, ou une seconde. Lorsque vous utilisez la commande delay()
, rien dâautre ne se produit pendant cette pĂ©riode. Une fois que vous avez compris les exemples de base, consultez d'autres exemples pour savoir comment crĂ©er un dĂ©lai tout en effectuant dâautres tĂąches.
Si vous dĂ©sirez envoyer le programme « Blink » vers la carte et voir ce que vous avez rĂ©alisĂ©, il faut dire au logiciel quel est le type de carte vous avez. C'est assez simple jusqu'ici. Vous sĂ©lectionnez le nom de votre carte, pour notre exemple il sâagit de la carte « Arduino/Genuino Uno ». Allez dans le menu « outils » puis dans « type de carte » comme sur la capture.
Choisissez maintenant le port de connexion de la carte. Allez dans le menu « Outils » puis « Port ». Là , vous choisissez le port COM de votre ordinateur dédié à votre carte.
Ă prĂ©sent, il va falloir envoyer le programme dans la carte. Pour ce faire, il suffit de cliquer sur le bouton « TĂ©lĂ©verser », en jaune-orangĂ© sur la captureâŻ:
En bas [4] dans la partie affichant les rĂ©sultats de la compilation du code source, vous voyez le texteâŻ: « Compilation du croquis » puis « TĂ©lĂ©versementâŠÂ», cela signifie que le logiciel est en train dâenvoyer le programme dans la carte. En mĂȘme temps, une barre d'avancement du tĂ©lĂ©chargement (voir flĂšche orange) montre aussi l'avancement de l'opĂ©ration. Une fois terminĂ©, il s'affiche « TĂ©lĂ©versement terminĂ© » et signale ainsi que le programme a bien Ă©tĂ© chargĂ©.
Et la lumiĂšre jaillit YESSS đ
Si vous souhaitez expĂ©rimenter, essayez de faire ce mĂȘme programme en utilisant la fonction « millis » plutĂŽt que « delay »
5. Quelques librairies
En plus de la simplicitĂ© du langage et des nombreuses fonctionnalitĂ©s quâoffre. LâIDE vient avec un nombre important de librairies Ă©vitant ainsi dâimplĂ©menter des fonctions courantes dans lâinformatique embarquĂ©e.
Une des librairies les plus utilisĂ©e est celle implĂ©mentant la communication sĂ©rie. La majoritĂ© des cartes Arduino possĂšde un Ă©mulateur de connexion sĂ©rie pour communiquer au travers de lâUSB. Ainsi, on peut communiquer avec lâordinateur sur lequel la carte Arduino est connectĂ©e. Cela permet, par exemple, de dĂ©boguer un programme en affichant la valeur des variablesou simplement afficher la valeur des capteurs.Cette librairie Ă Ă©tĂ© directement implĂ©mentĂ©e dans le langage Arduino. On peut accĂ©der Ă la communication sĂ©rie (au travers lâUSB) grĂące Ă lâobjet Serial. Une autre librairie existe pour communiquer par liaison sĂ©rie via une des broches de la carte.
Il est parfois nĂ©cessaire de stocker des informations mĂȘme aprĂšs lâarrĂȘt de la carte. Il est possible de stocker une petite quantitĂ© dâinformation sur la mĂ©moire EEPROM (Electricaly Erasable Programmable Read Only Memory) intĂ©grĂ©e. Une librairie est aussi fournie pour dialoguer avec cette mĂ©moire. Il est possible de lire et dâĂ©crire sur cette mĂ©moire sans rien ajouter sur la carte. Cette mĂ©moire est accessible via lâobjet EEPROM et en ajoutant la librairie du mĂȘme nom.
Attention, la mĂ©moire EEPROM Ă une durĂ©e de vie limitĂ©e (environ 100000 cycles dâĂ©critures). Il faut donc veiller Ă ne pas Ă©crire rĂ©pĂ©titivement les donnĂ©es.
Dâautres alternatives existent pour ajouter de plus grandes quantitĂ©s de mĂ©moires mortes Ă lâArduino (carte SD notamment) mais cela demande lâajout de composants externes.
Pour terminer, il existe aussi des librairies permettant de contrĂŽler des composants externes. Parmi ces librairies, une des plus populaires est celle contrĂŽlant des servomoteurs. Un servomoteur est un composant Ă©lectronique composĂ© dâun moteur et dâune carte dâasservissement. On peut le contrĂŽler en position (c'est-Ă -dire choisir lâangle du moteur) grĂące aux PWM. Une librairie Arduino est implĂ©mentĂ©e pour contrĂŽler simplement ces moteurs : la librairie Servo. Il faut toutes fois faire attention Ă Ă©viter dâalimenter les servomoteurs directement sur une des broches dâalimentation de la carte. En effet, un servomoteur consomme une quantitĂ© important de courant (suivant le couple exercĂ© par le moteur). Il est donc fortement conseillĂ© de relier les servomoteurs sur des alimentations externes (batteries, piles de 9V, etc.).
Et vous voilĂ fin prĂȘt pour le monde fabuleux de l’ARDUINO
Avec les remerciements de Julien Lechalupé pour l'inspiration de son cours dont vous pouvez retrouver l'original à cette adresse fablab.univ-tlse3.fr/wiki/images/9/92/Cours_arduino_v0.2.pdf