Contacts
Enseignant: Jérôme Collin, responsable (local M-4013, poste 5060)
Support technique supplémentaire: Laurent Tremblay (local M-4011, poste 7181)
Chargés de laboratoire: Section 1: Kais Fallouh (Lundi AM)
Romain Lebbadi-Breteau (Mercredi PM)
Section 2: Tristan Rioux (Mardi PM)
Gaëtan Florio (Jeudi AM)
Section 3: Luciano Garin-Iriarte (Lundi PM)
Ely-Cheikh Abass (Jeudi PM)
Section 4: Dorine Dantrun (Mardi AM)
Meriam Ben Rabia (Vendredi AM)
Section 5: Amélie Simard (Mercredi AM)
Abdul-Wahab Chaarani (Vendredi PM)
Section 6: Marc-Antoine Manningham (Mardi soir)
Laurent Bourgon (Jeudi soir)

INF1900

Projet initial de système embarqué

Travail pratique No. 6

Capteurs et conversion analogique/numérique



Objectif: Introduire les interfaces et les capteurs

Date de remise: le lundi 10 mars 17h00 au plus tard

Travail préparatoire: Aucun

Documents à remettre: Le code écrit pour résoudre les deux problèmes sera placé sous Git et sera corrigé par les chargés de laboratoire.

Présentation en classe: fichier PowerPoint


It would appear that we have reached the limits of what it is possible to achieve with computer technology, although one should be careful with such statements, as they tend to sound pretty silly in 5 years”

-

John von Neumann, 1903-1957


Introduction


Le but de ce travail pratique est de prendre connaissance du monde des capteurs et de voir la façon de les interfacer au microcontrôleur. Dans un premier temps, l'attention sera portée sur les capteurs avec une interface numérique. Par la suite, nous verrons les capteurs analogiques et la manière particulière de les interfacer au système. Il convient tout de même de limiter notre étude puisque le domaine des capteurs est extrêmement vaste.


Dans les travaux pratiques précédents, l'accent a été placé sur le traitement automatique de l'information et sur la mécanique du microcontrôleur. Par contre, peu d'effort a été fait sur l'acquisition de l'information à traiter et les entrées en général. Il est maintenant temps de voir comment des capteurs peuvent évaluer des paramètres du monde extérieur et les traduire sous une forme accessible au microcontrôleur.


Il est important de garder en tête que le microcontrôleur traite des signaux numériques, mais que les phénomènes physiques dans l'entourage du robot ont une nature profondément analogique. Par analogique, on entend une grandeur dans un domaine continu, et donc dans lequel il existe une infinité de valeurs possible entre deux points. La température et la vitesse peuvent être classées dans cette catégorie. Cependant, un système numérique, par définition, traite des valeurs discrètes. Un capteur dans notre système devra donc fournir un signal directement sous forme numérique ou encore sous forme de valeurs de tension. Dans ce dernier cas, cette possibilité existe puisque le microcontrôleur possède un convertisseur analogique/numérique intégré pour passer du monde analogique à un monde basé sur des valeurs représentées par des zéros et des uns.


Certains capteurs pourraient être qualifiés de «simples» puisqu'ils se connectent plus ou moins directement au microcontrôleur. Ces capteurs peuvent être des interrupteurs, des détecteurs de niveau, des encodeurs de priorité, des encodeurs de position (comme la roulette d'une souris), etc. Leur caractéristique commune est qu'ils fournissent des valeurs binaires déjà décodées ce qui simplifie l'interface au microcontrôleur.


D'autres capteurs peuvent avoir des interfaces beaucoup plus sophistiquées. Un capteur avec une interface numérique avec un protocole est souvent capable de prendre des données plus complexes et précises. Ils peuvent utiliser des bus de tout type tel SPI (Serial Peripheral Interface), I2C (Inter Integrated Circuit), ou encore une communication série asynchrone ou parallèle. Ils sont souvent remarquablement autonomes et fiables, surtout s'ils possèdent des mécanismes intégrés de correction d'erreurs. Étant donné leur système de contrôle numérique, ces capteurs ont une tendance à coûter plus chers que les capteurs simples. Les exemples de tels capteurs sont nombreux: sonars, caméras spécialisées, thermomètres, détecteurs de fumée, accéléromètres, etc. Ces capteurs peuvent souvent être vus comme des systèmes informatiques complets en eux-mêmes. Il est probable que vous utiliserez de tels capteurs dans quelques semaines.


Un ATmega324PA est doté de ports capables de convertir un signal analogique (voltage) en données numériques. Il le fait grâce à un convertisseur analogique numérique (CAN). Le microcontrôleur peut effectivement lire jusqu'à 8 signaux du port A. Le CAN fonctionne en graduant une plage délimitée par deux voltages en 210 valeurs. La valeur la plus basse pouvant être représentée est 0 volt et la plus haute est la référence analogique (5 volts ou moins). La valeur numérique fournie en sortie est proportionnelle à celle de la tension d'entrée. L'utilisation du CAN est nécessaire lorsqu'un système a recours à des capteurs dépourvus de capacités de communication numérique, même les plus simples. On peut donc placer ces capteurs dans une troisième catégorie, celle des capteurs avec interface analogique. Le deuxième problème de ce laboratoire montrera comment utiliser une photorésistance comme capteur avec interface analogique.


Pour bien comprendre la nature d'un capteur simple, il faut avoir quelques notions de circuits électriques de base. La lecture de cette section du site web est importante. Elle offre un court rafraîchissement sur des notions électriques connues, mais remises dans le contexte du cours.


Problèmes


Avant de passer aux deux problèmes plus bas, il faut placer quelques fils sur un breadboard. Ces fils seront utilisés pour les deux problèmes. Par contre, chaque problème complétera le circuit en rajoutant quelques éléments différents. Trois images montrent comment placer les fils de base. Les fils rouges devront aller à la tension d'alimentation (Vcc) et les noirs à la masse (GND). On reliera donc le câble formé de la paire rouge et noir à une paire de broches appropriées sur la carte mère. Le fil de données (en bleu) du câble brun-bleu sera relié à des broches différentes en fonction du problème. Attention, vous assurez que les languettes de métal de l’intérieur du breadboard n’aient pas tendance à ressortir à l’arrière lors de l’insertion des pièces en surface ce qui risquerait de ne pas établir correctement les connexions électriques nécessaire au circuit.









Problème 1


Connectez un bouton-poussoir blanc (Digi-Key: EG1328-ND) au breadboard. Bien suivre le détail des photos pour une insertion correcte. Placez également un petit condensateur (gris ou bleu) de 0.1 µF (Digi-Key: BC1621-ND) pour réguler l'alimentation au haut, à gauche. Enfin, insérer une résistance de 100K (brun-noir-jaune) (Digi-Key: S100KQTR-ND) un peu plus à droite.


Dans ce circuit, lorsque le bouton-poussoir est relâché, aucun courant ne peut circuler et la tension sur le signal de sortie (bleu ou vert)) est Vcc. Lorsqu'on appuie sur le bouton, le circuit est fermé et la résistance de 100K limite le courant. Le signal de sortie passe à 0 volt. Connectez le signal de sortie au port PD2 de la carte mère. Attention, le cavalier IntEN doit donc être retiré pour éviter que le bouton-poussoir Interupt de la carte mère vienne créer un conflit. Il est absolument nécessaire d'utiliser ce bouton-poussoir blanc sur le breadboard pour résoudre le problème. Celui sur la carte mère doit demeurer inactif. On vous demande aussi de relier votre DEL libre à B0-B1.









Quand le bouton est enfoncé, un compteur qui incrémente 10 fois par seconde est activé. Quand le bouton est relâché ou lorsque le compteur atteint 120, la lumière clignote vert pendant 1/2 seconde. Ensuite, la carte mère ne fait rien. Puis, deux secondes plus tard, la lumière rouge s'allume. Elle devra clignoter (compteur / 2) fois au rythme de 2 fois par seconde. Ensuite, la lumière tourne au vert pendant une seconde. Finalement, elle s'éteint et le robot revient à son état original.


Il n’y a pas beaucoup d’avantage à refaire l’exercice dans SimulIDE puisqu’on a déjà travaillé avec des interrupteurs dans le simulateur. Ici, c’est davantage l’aspect matériel sur le robot qui est important.


Problème 2


Retirez le bouton-poussoir et la résistance de 100K du montage du problème précédent. Insérez une résistance de 10K (brun-noir-orange) (Digi-Key: S10KQTR-ND) à l'endroit où le bouton-poussoir était. Placez la photorésistance (Digi-Key: PDV-P8101-ND) où la résistance de 100K était précédemment. Reliez le fil de données à un port analogique de votre choix (de PA0 à PA7).


La photorésistance est une résistance qui varie (de 4K à 11K dans le présent) en fonction de l'intensité lumineuse. On l'a placée ici en série avec une résistance de 10K. La tension au point de contact entre ces deux résistances variera donc en fonction de la lumière. On peut mesurer cette tension avec le convertisseur analogique/numérique du microcontrôleur. On peut aussi l'évaluer avec le multimètre lors de la mise au point pour être bien certain.


La valeur retournée par le convertisseur est de 10 bits. Par contre, les derniers 2 bits sont sûrement sans signification et peuvent donc être négligés ce qui permet de réduire le format des données à 8 bits. Le traitement des données s'en trouvera simplifié. Utiliser le port A0 pour effectuer vos conversions. On vous demande aussi de relier votre DEL libre à B0-B1.











Dans SimulIDE, il existe une photorésistance qu’on peut monter avec une résistance en série de la même façon que sur le breadboard. La tension au point de contact entre ces deux résistances variera donc en fonction de la lumière. On peut mesurer cette tension avec le convertisseur analogique/numérique du microcontrôleur. On pourra aussi l'évaluer avec le multimètre virtuel lors de la mise au point pour être bien certain du matériel avant de passer à l’écriture du logiciel. Il faudra aussi placer une source de lumière virtuelle, qui est une ampoule et qui est aussi une composante de SimulIDE. Voici donc les deux nouvelles composantes si vous voulez faire l’exercice aussi avec le simulateur. Toutefois, il est impératif de faire l’exercice d’abord avec la carte et le breadboard.




Une classe (can.h et can.cpp) permet le contrôle du convertisseur analogique/numérique. Référez à la documentation d'Atmel pour bien comprendre le fonctionnement de ce périphérique interne. De plus, vous devrez ajuster la référence analogique à +5.0 volts pour cet exercice. Concrètement, il faut ajuster le potentiomètre de manière à régler le voltage de sortie du diviseur de tension sur la carte mère pour que la broche 32 (AREF) du ATmega324PA soit à 5 volts. Il vous faudra donc utiliser le multimètre et votre petit tournevis à tête plate pour y arriver. L’alimentation de la carte peut difficilement se faire par le câble USB dans ce cas, car la tension fournie par l’USB est inférieure à 5 volts. Il vaut mieux utiliser la source de tension au laboratoire (ou, au pire, une pile rectangulaire 9 volts) pour alimenter la carte.


De plus, vous devrez ajuster la référence analogique à +5.0 volts pour cet exercice. Sur la carte mère, il faut ajuster le potentiomètre de manière à régler le voltage de sortie du diviseur de tension pour que la broche 32 (AREF) du ATmega324PA soit à 5 volts. Il faut donc utiliser le multimètre et un petit tournevis à tête plate pour y arriver.




Avec SimulIDE, il y a quelques façons de parvenir à cet ajustement, mais le mieux est d’ajouter quelques composantes pour arriver à une réalité plus près de ce qui est en place sur la carte mère, pour conserver un parallèle entre les deux. On peut donc y aller avec ce qui suit :




Arrivons à l’exercice lui-même enfin! Faire un robot pouvant se faire bronzer...

Si la lumière est basse (en cachant la photorésistance), la DEL prendra la couleur verte.

Si la lumière est à un bon niveau (lumière ambiante), la DEL tournera à l'ambré.

Si la lumière est trop forte (photorésistance sous une lampe de poche), la DEL devient rouge.


Questions intéressantes à vous demander...



Qualité du code


La règle 43 porte sur la conversion explicite de type et est à regarder. La 50 est sur la durée de vie des variables. Enfin, les règles 51 et 52 sont sur l’initialisation de variables utilisées dans des boucles.


Soumission du programme


Ces deux programmes seront corrigés. Ils devront être placés dans votre entrepôt Git. Pour faciliter la correction, les programmes devront être dans un répertoire précis et être accompagnés d'un Makefile. XY est votre numéro d'équipe. Vous pouvez nommer les fichiers de la façon que vous le désirez à l'intérieur des deux répertoires suivants, tant que le code peut être compilé avec la commande «make»:


https://githost.gi.polymtl.ca/git/inf1900-XY/tp/tp6/pb1/

https://githost.gi.polymtl.ca/git/inf1900-XY/tp/tp6/pb2/


Il faut se souvenir que Linux est sensible à la casse (case sensitive) et que les chemins précédents doivent être exacts. De plus, il faudra placer sous Git les fichiers can.h et can.cpp pour que le code puisse être compilé correctement. Il est possible que vos fichiers soient directement annotés par les chargés de laboratoire durant la correction. Un fichier correction.txt sera placé dans le répertoire tp6 lorsque la correction sera terminée. Les programmes seront corrigés selon le barème de la section évaluation du site web.