Découverte des microcontrôleurs avec le Diduino

De Enseignement secondaire.
Aller à : Navigation, rechercher

Sommaire

Introduction

La plupart d'entre nous sait à quoi ressemble un ordinateur. Il a habituellement un clavier, un moniteur, la CPU (unité centrale de traitement), une imprimante, et une souris. Ces types d'ordinateurs, comme le MAC ou le PC, sont principalement conçus pour communiquer (ou “s’interfacer”) avec les humains.

La gestion de base de données, l'analyse financière, ou même le traitement de textes sont tous accomplis à l'intérieur du boitier qui contient l'unité centrale de traitement, la mémoire, disque dur, etc... Le “calculateur” réel, cependant, a lieu dans l'unité centrale de traitement.

Si vous avez compris, le rôle du moniteur, du clavier, de la souris, et même de l'imprimante est de “connecter” l'unité centrale de traitement au monde extérieur.

Mais savez-vous qu'il y a des ordinateurs tout autour de nous, des programmes qui fonctionnent et des calculs qui se font tranquillement, sans qu’il y ait d’intervention de l’homme? Ces ordinateurs sont dans votre voiture, dans la navette spatiale, dans les jouets de votre frère, et même peut-être à l'intérieur de votre sèche cheveux.

Nous appelons ces derniers des “microcontrôleurs”. Micro parce qu’ils sont petits, et contrôleur parce qu'ils “contrôlent” les machines. Les microcontrôleurs par définition sont conçus pour se relier aux machines, plutôt qu'aux gens. C’est intéressant parce que vous pouvez fabriquer une machine ou un dispositif, écrire des programmes pour les commander et ensuite les laisser fonctionner automatiquement pour vous. Il y a un nombre infini d’applications à base de microcontrôleurs. Votre imagination est le seul facteur de limitation!

Les centaines (sinon milliers) de différentes catégories de microcontrôleurs sont disponibles. Certains sont programmés une fois et produits pour des applications spécifiques, tel que commander votre four à micro-ondes. D'autres sont “re-programmables”, c’est à dire qu’ils peuvent être employés à plusieurs reprises pour différentes applications. Les microcontrôleurs sont incroyablement souples, le même dispositif peut commander une fusée en modèle réduit, un grille- pain, ou même votre circuit de freinage ABS sur les voitures.

Cette expérience nous présentera un microcontrôleur très populaire, l'Atmel ATmega328. Le programmes écrit pour l'ATmega328 proviennent d’une version spéciale du langage C.

Quand nous créons un dispositif à base de microcontrôleur, il agit comme un “cerveau”, dans beaucoup d’exemples nous essayons d'imiter comment nos propres corps fonctionnent.

Votre cerveau reçoit certaines informations afin de prendre des décisions. L’information est recueillie de diverses façons telles que la vue, l’ouïe , le contact, etc... Ces sens détectent ce qui provient du “monde réel” et envoient cette information à votre cerveau pour l'analyse. Réciproquement, quand votre cerveau a pris la décision, il envoie des signaux dans tout votre corps pour faire quelque chose dans le “monde réel”. Utilisant les “inputs”, entrées de vos sens, et les “outputs”, sorties telles que bras, mains, etc.., votre cerveau est connecté et interfaçé au “monde réel”.

Vous êtes en train de conduire sur la route, soudain vos voyez un cerf devant vous. Votre cerveau analyse cette entrée “input”, prend une décision, et puis donne des instructions de “outputs” sorties à vos bras et mains, vous tournez le volant pour éviter d’accidenter l'animal. “Input / décision / output” est la marche à suivre pour les microcontrôleurs . Nous appelons cette “entrée-sortie” : “I/O” en abrégé.

Cette première leçon vous présentera la fonction output de l'ATmega328, et chaque leçon suivante présentera de nouvelles idées et les expériences à essayer. Vous pourrez utiliser les idées de ces leçons pour inventer vos propres applications pour microcontrôleurs et circuits associés.

Généralités

Le Diduino est commercialisé par Didel.

Votre premier programme

N'importe quel système de microcontrôleur (ou ordinateur) se compose de deux composants primaires: matériel et logiciel. Le matériel est l’ensemble des composants physiques réels du système. Le logiciel est une liste d'instructions qui résident à l'intérieur du matériel. Nous créerons maintenant le matériel, et écrirons alors un programme logiciel pour le “contrôler”.

Afin que notre microcontrôleur agisse sur le monde réel, nous devons assembler un certain “hardware” matériel. Nous utiliserons une carte appelée “Diduino”:

Diduino.jpg

Cette carte a été créée pour simplifier les branchements du matériel se reliant à l'ATmega328: le câble de programmation USB, et des fils sont nécessaires pour être reliés aux bornes d'entrée-sortie de l'ATmega328. Il y a également une “plaque d'expérimentation” (le bloc blanc avec les trous ). C'est dans cette zone que nous construirons nos circuits.

La LED

Nous allons utiliser pour écrire notre premier programme une LED. Une LED est comme un ampoule avec la particularité qu'elle ne peut se brancher que dans un sens. Vous remarquerez que la LED a deux pattes de tailles différents: la plus grande est l'anode (+) et la plus courte la cathode (-).

LED.png

La LED que vous allez utiliser se trouve déjà sur le Diduino. Regardez bien, elle se trouve à droite de la plaque d'expérimentation, juste au-dessus du connecteur rouge. Elle est tout petite !

L'interface de programmation

Vous allez ouvrir le logiciel Diduino:

Ide prog mini 400.png

Vous avez une barre en haut avec différents icônes:

Barre boutons presentation 400.png

Les boutons Vérifier/Compiler et Transférer le programme vers la carte vous serons particulièrement utiles.

Dans le menu "Tools->Board", il vous faudra choisir "Arduino Duemilanove w/ ATmega328".

Dans le menu "Tools->Serial Port", il vous faudra essayer les différentes possibilités avec le programme suivant. Vous verrez le message "Done Uploading" si tout a fonctionné. Sinon vous aurez un message en rouge. Dans ce cas, il vous faudra essayer un autre port.

Le programme

sh: 1: highlight: not found

Vous devez spécifier un langage comme ceci : <source lang="html">...</source>

Langages supportés pour la coloration syntaxique :

(erreur en chargeant la liste des langages supportés)

Pour transférer le programme sur l'ATmega328 et l'exécuter et branchez le câble USB à l'ordinateur. Puis cliquez sur la deuxième flèche pour compiler et pour envoyer le programme à l'ATmega328 et il s'exécutera une fois chargé.

Analyse du programme

Les trois première lignes représentent un commentaire:

sh: 1: highlight: not found

Vous devez spécifier un langage comme ceci : <source lang="html">...</source>

Langages supportés pour la coloration syntaxique :

(erreur en chargeant la liste des langages supportés)

Un commentaire sur plusieurs lignes commence toujours par /* et se termine par */.

sh: 1: highlight: not found

Vous devez spécifier un langage comme ceci : <source lang="html">...</source>

Langages supportés pour la coloration syntaxique :

(erreur en chargeant la liste des langages supportés)

Le bloc ci-dessus est exécuté une fois lorsque la carte est mise sous tension ou lorsque l'on appuie sur le bouton Reset (il se trouve en haut à gauche sur la carte). Ce bloc initialise la carte. Notez qu'il est composé de void setup() puis de tout une série d'instructions entre les accolades { instructions }. Cela s'appelle une fonction. Nous y reviendrons plus tard.

La ligne // Initialise la patte 13 comme sortie est un commentaire sur une seule ligne.

Un microcontrôleur se présente ainsi:

Microcontroleur.jpg

Il est composé de plusieurs pattes. Ces pattes sont utilisées pour brancher des composants électroniques dessous et en programmant le microcontôleur, on peut interagir avec ces composants. Dans cet exercice, une LED est branchée sur la patte 13 du microcontrôleur. On a numéroté les pattes pour ne pas s'y perdre !

La ligne pinMode(13, OUTPUT); initialise la patte 13 du microcontrôleur comme sortie, c'est-à-dire que des données seront envoyées depuis le microcontrôleur vers cette patte. On peut aussi initialiser les pattes comme entrée, c'est-à-dire que le microcontrôleur lira des données venant de l'extérieur comme un interrupteur pressé ou non.

sh: 1: highlight: not found

Vous devez spécifier un langage comme ceci : <source lang="html">...</source>

Langages supportés pour la coloration syntaxique :

(erreur en chargeant la liste des langages supportés)

Le bloc ci-dessus est exécuté de manière répétée tant que le robot est alimenté, c'est à dire que lorsque que le programme arrive à }, il retourne à { puis exécute à nouveau les instructions. On remarque la structure void loop() (loop veut dire boucle) et une série d'instructions entre les accolades { instructions }.

Avec l'instruction digitalWrite(13, HIGH);, l'ATmega328 envoie du courant sur la patte D13 à Vdd ce qui a pour effet d'allumer la LED.

L'instruction delay(500); indique à l'ATmega328 de ne rien faire pendant 500ms soit 1/2 seconde.

La durée est un paramètre de l'instruction delay.

Avec l'instruction digitalWrite(13, LOW);, l'ATmega328 coupe le courant sur la patte D13 ce qui a pour effet d'éteindre la LED.

L'instruction delay(500); indique à l'ATmega328 à nouveau de ne rien faire pendant 500ms soit 1/2 seconde.

Le résultat est donc que la LED s'allume pendant 1/2 seconde, puis s'éteint pendant une 1/2 seconde puis s'allume pendant 1/2 seconde, puis s'éteint pendant une 1/2 seconde etc et donc elle clignote.

A vous de jouer

Modifiez le programme pour que la LED s'allume pendant 1s puis s'éteigne pendant 2s.

Votre premier circuit

Description du matériel

Circuit de développement:

Diduino.jpg

Plaque d'expérimentation:

PlateauDouillesDR a.png

Maintenant, c'est vous allez découvrir comment fonctionne une LED. Une LED doit toujours être montée avec une résistance en série (l'une à la suite de l'autre). Vous allez construire un circuit en connectant la LED et la résistance dans les connecteurs de la plaque d'expérimentation.

Ce plateau possède deux rangées de connecteurs noirs à gauche et deux rangées de connecteurs à droite. Ces connecteurs ont des noms qui leur sont attribués: Vdd (+5 V), Vin (tension non stabilisée qui arrive directement depuis l'alimentation) et Vss (0 V ou la masse). Ces connecteurs vont fournir le courant nécessaire à votre circuit.

Les connecteurs à droite sont numérotés D0, D1, ... à D13. Ils permettent de connecter votre circuit aux pattes d'entrées/sorties de l'ATmega328.

La plaque d'expérimentation permet de connecter les composants entre eux et de construire des circuits. Il y a 17 rangées. Dans chaque rangée, il y a deux groupes de 5 colonnes séparés par une tranchée au milieu. Tous les connecteurs dans une rangé de 5 sont connectés entre eux. Donc si on branche deux éléments dans un groupe de 5 connecteurs, ils seront reliés entre eux.

Résistance

Resistance.png

Voici comment lire la valeur de la résistance:

Donc Jaune-Violet-Brun = 4-7-0 = 470Ω.

Vous pouvez utiliser l'outil suivant pour trouver les couleurs d'une résistance en fonction de sa valeur ou sa valeur en fonction de ses couleurs.

Pour plus d'explication sur ce thème, voir cette vidéo et cette vidéo.

Le circuit

Maintenant construisez le circuit suivant.

Attention aux couleurs de la résistance. Si vous n'avez pas de résistance de 470Ω, vous pouvez utilisez 330Ω ou 220Ω.

Vous pouvez utiliser l'outil suivant pour trouver les couleurs d'une résistance en fonction de sa valeur ou sa valeur en fonction de ses couleurs.

Activite1Circuit1DR b.png Activite1Circuit1DR a.png

Vérifiez bien que la LED est branchée dans le bon sens (voyez le signe + représenté sur le dessin qui représente la longue patte de la LED. Celle-ci est branchée sur le connecteur rouge).

Fonctionnement de la LED

Activite1FonctionnementLED.png

Les connecteurs Vdd et Vss représente la différence de potentiel comme sur les connecteurs d'une pile. Vdd est comme le + d'une pile et Vss comme le - d'une pile. Schématiquement parlant, la différence de potentiel signifie qu'il y a une différence de voltage entre deux points: dans un pile, +5V pour Vdd (+) et 0V pour Vss (-). Cela permet au courant d'aller d'un point à un autre. Le schéma ci-dessus indique comment la différence de potentiel appliquée au circuit en utilisant une pile engendre la circulation d'électrons. Le flot d'électrons est appelé le courant électrique. Le courant est limité par la résistance. La valeur de la résistance est exprimée en Ohms (Lettre grecque Omega: Ω). Plus la valeur est grande, plus le courant est limité. Ce courant permet d'allumer la LED.

S'il n'y pas de différence de potentiel, par exemple si Vdd est connecté à Vdd ou Vss à Vss, alors le courant ne circule pas.

Une LED est toujours branchée avec une résistance.

Voici la représentation schématique de notre circuit:

Activite1Circuit2.png

Cette représentation est utilisée en électronique. La différence de potentiel à travers le circuit est appelée le voltage. Les signes + et - montre le voltage appliqué à un circuit. Les flèches montrent le sens dans lequel le courant circule et est en fait dans la direction opposée au sens de circulation des électrons. Cette manière de montrer le sens de circulation du courant dans une représentation schématique nous vient de Benjamin Franklin qui ne connaissait pas encore l'existence des électrons quand il a décidé d'utiliser cette représentation pour la circulation du courant passant du positif vers le négatif. Quand le physiciens ont découvert le sens de circulation des électrons, il était trop tard pour changer la convention utilisée partout.

Maintenant essayez le circuit suivant:

Activite1Circuit3DE b.png Activite1Circuit3DE a.png

Que se passe-t-il? Pourquoi?

Contrôler la LED avec l'ATmega328

Vous allez maintenant réaliser un circuit que vous allez contrôler en utilisant le microcontrôleur.

L'idée est d'utiliser le microcontrôleur pour réaliser les deux circuits que vous avez réalisés dans l'exercice précédent:

Activite1Circuit4 DR.png

L'ATmega328 est composé de pattes d'entrées/sorties digitales (D0 à D13). Ces pattes peuvent être utilisées comme des interrupteurs comme indiqué ci-dessus: quand D12 est sur Vss, le courant ne circule pas et quand D12 est sur Vdd, le courant circule et la LED s'allume.

L'ATmega328 permet bien sûr d'allumer et d'éteindre la LED bien plus vite qu'un humain.

Le circuit

Modifiez maintenant votre circuit de la manière suivante:

Activite1Circuit5 DR b.png Activite1Circuit5 DR a.png

La résistance est très importante: si trop de courant circule dans le circuit, vous pourriez endommager la LED, l'ATmega328 ou d'autres élémemts du circuit. La résistance permet de réduire le courant qui circule.

Le programme

Maintenant que votre circuit est prêt, il vous faut écrire un programme qui va indiquer à l'ATmega328 ce qu'il doit faire. Nous avons déjà vu un tel programme, celui pour faire clignoter la LED branchée sur la patte 13. Vous allez donc le modifier pour l'adapter au circuit que vous venez de réaliser.

A vous de jouer

Vous allez maintenant brancher 3 LED, une rouge, une jaune et une verte de façon à obtenir un feu de circulation.

Vous avez déjà la LED rouge branchée sur la patte 12. Vous utiliserez les pattes 11 et 10 pour les deux autres LED. N'oubliez pas les résistances.

Quand vous avez terminé votre montage, modifiez le programme précédent pour allumer les unes après les autres les trois LED comme un feu qui passe du vert au rouge en passant par l'orange.

Compter et répéter

Dans l'exercice précédent, vous avez vu comment faire clignoter la LED un nombre indéfini de fois ou bien seulement une seule fois.

Dans cet exercices, vous allez faire clignoter la LED un nombre déterminé de fois.

Pour cela vous allez utiliser une boucle for. Cette boucle permet d'exécuter un certain nombre de fois une groupe d'instructions.

Le programme

Voici le programme qui vous permettra d'allumer et éteindre 10 fois la LED.

sh: 1: highlight: not found

Vous devez spécifier un langage comme ceci : <source lang="html">...</source>

Langages supportés pour la coloration syntaxique :

(erreur en chargeant la liste des langages supportés)

Enregistrer votre fichier sous le nom LEDClignote10Fois puis exécutez le. Observez ce qui se passe.

Analyse du programme

La ligne byte compteur; permet de créer une variable compteur qui sera utilisée comme variable de boucle. Byte indique le type de la variable, c'est-à-dire le type de données que l'on pourra stocker dans cette variable. Le type byte permet de stocker des valeurs comprises entre 0 et 255.

Vous trouverez des informations sur les différents types de variables sur ce site.

La ligne for(compteur=0 ; compteur<10 ; compteur++) { instructions } faire varier la variable compteur de 0 à 9 (en l'augmentant à chaque fois de 1: c'est ce que fait l'instruction compteur++) et à chaque fois exécute toutes les instructions jusqu'à l'accolade }. Cela va donc avoir l'effet de répéter le code suivant 10 fois:

sh: 1: highlight: not found

Vous devez spécifier un langage comme ceci : <source lang="html">...</source>

Langages supportés pour la coloration syntaxique :

(erreur en chargeant la liste des langages supportés)

Vous connaissez déjà les lignes suivantes.

Modifier le programme

Changer la ligne for(compteur=0 ; compteur<10 ; compteur++) en for(compteur=0 ; compteur<20 ; compteur++). Que se passe-t-il?

Changer la ligne for(compteur=0 ; compteur<10 ; compteur++) en for(compteur=20 ; compteur<120 ; compteur+=10. Que se passe-t-il? Quelles sont les valeurs de compteur affichées?

Le bouton poussoir

De nombreux appareils électroniques utilise les boutons poussoirs: le clavier de l'ordinateur, la souris, votre calculatrice, la télécommande de la télévision, le téléphone portable, etc. Dans chacun de ces appareils, un microcontrôleur scanne ces boutons poussoirs et attend que leur état change, c'est-à-dire qu'ils soient pressés ou relâchés. Quand c'est le cas, le microcontrôleur le détecte et agit en conséquence.

A la fin ce cette activité, vous saurez comment utiliser les boutons poussoirs et comment vérifier leur changement d'état et que faire quand le bouton est pressé ou relâché.

Dans l'activité 1, vous avez programmé l'ATmega328 pour envoyer du courant ou le couper et vous avez utilisé des LED pour voir concrètement l'effet que cela a. Envoyer un signal signifie programmer une patte du microcontrôleur comme sortie.

Dans cette activité, nous allons voir comment utiliser une patte du microcontrôleur comme entrée. Dans ce cas, l'ATmega328 "écoute" les changement de signaux haut/bas au lieu de les envoyer lui-même. Ces signaux seront envoyé à l'aide d'un bouton poussoir et vous allez programmer le Basic Stamp pour vérifier si le bouton poussoir est pressé ou non.

Fonctionnement

Le bouton poussoir est comme un interrupteur et il peut donc être utiliser pour allumer ou éteindre une LED. Vous pouvez voir ci-dessous à quoi ressemble le bouton poussoir:

BoutonPoussoir1 DR.png Push button.jpeg

Son fonctionnement est simple: le bouton poussoir agit comme un interrupteur entre les pattes 1 et 2. Si on presse le bouton poussoir, les pattes 1 et 2 sont donc mises en contact.

Le schéma ci-dessous représente schématiquement les deux positions possibles du bouton poussoir, pressé et non pressé:

BoutonPoussoir2 DR.png

Votre premier circuit avec le bouton poussoir

Vous allez réaliser le montage suivant.

Attention aux couleurs de la résistance. Si vous n'avez pas de résistance de 470Ω, vous pouvez utilisez 330Ω ou 220Ω.

Vous pouvez utiliser l'outil suivant pour trouver les couleurs d'une résistance en fonction de sa valeur ou sa valeur en fonction de ses couleurs.

Acitivite2Circuit1 DR b.png Acitivite2Circuit1 DR a.png

Voici maintenant la représentation schématique du montage:

Acitivite2Circuit2 DR.png

Quand on appuie sur le bouton poussoir, le circuit est fermé et le courant circule de + (Vdd) vers - (Vss).

Lire l'état d'un bouton avec l'ATmega328

Voici le montage que vous allez réaliser.

Attention aux couleurs de la résistance. 10kΩ signifie 10000Ω. C'est comme avec km et m.

Vous pouvez utiliser l'outil suivant pour trouver les couleurs d'une résistance en fonction de sa valeur ou sa valeur en fonction de ses couleurs.

Acitivite2Circuit4 DR b.png Acitivite2Circuit4 DR a.png

Quand le bouton poussoir est pressé, l'ATmega328 détecte qu'il y a du courant sur D3. Ici encore, le courant est fénéant et il va aller là où il y a le moins de résistance (c'est-à-dire là où la résistance est la plus petite).

A l'intérieur, cela a pour effet de placer la valeur 1 dans la mémoire qui stocke les informations relatives aux pattes d'entrées/sorties.

Quand le bouton poussoir est relâché, le courant ne peut plus aller avec D3 et donc l'ATmega328 ne détecte pas de courant sur D3.

A l'intérieur, cela a pour effet de placer la valeur 0 dans la mémoire qui stocke les informations relatives aux pattes d'entrées/sorties.

Voici schématiquement ce qui se passe:

Acitivite2Circuit5 DR b.png

Programmer l'ATmega328 pour lire une entrée

Vous allez utiliser le code suivant:

sh: 1: highlight: not found

Vous devez spécifier un langage comme ceci : <source lang="html">...</source>

Langages supportés pour la coloration syntaxique :

(erreur en chargeant la liste des langages supportés)

Ce code est très simple: il envoie dans la fenêtre de Serial Monitor de l'ordinateur la valeur de digitalRead(3) qui est l'espace mémoire qui stocke l'état 0 ou 1 du bouton poussoir que nous avons vu plus haut. La fenêtre Serial Monitor permet de recevoir des données venant de la carte Diduino. C'est très pratique pour afficher des données qui sont lues par le microcontrôleur pendant l'exécution du programme.

Contrôler une LED avec le bouton poussoir

Nous allons maintenant utiliser le bouton poussoir pour allumer et éteindre une LED en fonction de l'état dans lequel il se trouve.

C'est bien sûr l'ATmega328 qui va s'occuper de cela.

Le circuit

Vous devez normalement déjà avoir le circuit suivant (avec deux LED en plus mais ce n'est pas grave):

Acitivite2Circuit7 DR b.png Acitivite2Circuit7 DR a.png

Nous avons ici deux circuits: un premier avec le bouton poussoir relié à D3 et un deuxième avec une LED reliée à D12.

Le programme

Vous allez utiliser ici une nouvelle instruction: if ... else/code> qui est une condition.

Le programme que vous allez écrire fera la chose suivante:

Notez l'instruction ==. Cette instruction vérifie si deux expressions sont égales. Si elles le sont, alors le résultat sera vrai (true) sinon le résultat sera faux (false).

Voici le code à compléter:

sh: 1: highlight: not found

Vous devez spécifier un langage comme ceci : <source lang="html">...</source>

Langages supportés pour la coloration syntaxique :

(erreur en chargeant la liste des langages supportés)

A vous de jouer

Vous avez un circuit avec trois LED et un bouton poussoir: vous avez donc tous les éléments pour réaliser un véritable feu de circulation.

A chaque fois que le bouton est pressé, vous allez allumer successivement la LED orange puis la LED rouge en attendant une seconde entre chaque, attendre 5s puis allumer successivement la LED orange puis la LED verte en attendant une seconde entre chaque.

A vous d'écrire le programme.

Outils personnels
Espaces de noms
Variantes
Actions
Navigation
Boîte à outils