Un thermom�tre num�rique ou comment parler "I2C" � votre microcontr�leur Atmel

ArticleCategory: [Choose a category, do not translate this]

Hardware

AuthorImage:[Here we need a little image from you]

[Photo of the Author]

TranslationInfo:[Author + translation history. mailto: or http://homepage]

original in en Guido Socher

en to fr Jacques WLODARCZAK

AboutTheAuthor:[A small biography about the author]

Guido aime Linux parce que c'est r�ellement un bon syst�me pour d�velopper votre propre mat�riel.

Abstract:[Here you write a little summary]

Le microcontr�leur Atmega8 de chez Atmel poss�de de nombreuses lignes d'entr�e/sortie. C'est le p�riph�rique id�al pour d�velopper n'importe quel �quipement de mesure.

Dans cet article nous voyons comment interconnecter le microcontr�leur � un PC linux � travers une interface RS232 sans la puce MAX232.

ArticleIllustration:[This is the title picture for your article]

[Illustration]

ArticleBody:[The article body]

Introduction

Un pre-requis pour cet article est que vous ayez l'environnement de programmation GCC AVR install� tel que d�crit dans mon article "Programmer le microcontr�leur AVR avec GCC, libc 1.0.4". Si vous voulez �viter des probl�mes d'installation vous pouvez �videmment utiliser le CD de programmation AVR de http://shop.tuxgraphics.org/


Quand vous utilisez ce genre d'appareil �volu� comme une microcontr�leur, pour mesurer des signaux analogiques ou num�riques, vous comptez �videmment pouvoir disposer d'interfaces pour recueillir les donn�es ou envoyer des commandes au microcontr�leur. Dans tous les articles pr�sent�s ici dans le pass�, nous utilisions toujours une communication RS232 avec l'UART qui est inclus dans le microcontr�leur. Le probl�me est que cela requ�rait en suppl�ment une puce MAX232 et 4 condensateurs. Atmel sugg�re aussi qu'un oscillateur � quarz est n�cessaire pour que la communication UART fonctionne de mani�re fiable. En tout cas �a fait beaucoup d'�l�ments suppl�mentaires ... et cela nous pouvons l'�viter !

La quantit� de donn�es � transf�rer entre le PC et le microcontr�leur est habituellement faible (juste quelques octets). Aussi la vitesse importe peu. Ce qui fait que le protocole/bus I2C est tout � fait indiqu� pour remplir cette t�che.

I2C (prononcer � l'anglaise � eye-square-see �) est une interface de communication bidirectionnelle � deux conducteurs. Elle a �t� mise au point par Philips et ils ont prot�g� ce nom. C'est pourquoi d'autres fabricants utilisent un autre nom pour ce m�me protocole. Par exemple Atmel appelle I2C une � interface � deux conducteurs � (TWI : � two wire interface �).

Nombre d'entre vous ont s�rement d�j� utilis� I2C sans le savoir. Toutes les cartes m�res r�centes contiennent un bus I2C pour lire les temp�ratures, les vitesses de ventilateur, des informations � propos de la m�moire disponible... bref toutes sortes d'informations sur le mat�riel. Ce bus I2C est malheureusement indisponible � l'ext�rieur du PC (il n'y pas de connecteur). C'est pourquoi nous devons en inventer un nouveau.

Mais voyons d'abord comment fonctionne � l'interface � deux conducteurs � (le TWI; rappelons qu'il s'agit d'une appellation alternative de I2C).

Comment fonctionne I2C/TWI.

Le cahier des sp�cifications de l'Atmega8 (voir les r�f�rences) contient un descriptif tr�s d�taill� � partir de la page 160. Aussi, je vous en pr�senterai simplement un survol qui vous permettra de comprendre le descriptif dans le cahier des sp�cifications.

Sur le bus I2C vous avez toujours un dispositif ma�tre et de nombreux dispositifs esclaves. Le ma�tre est celui qui initie la communication et contr�le l'horloge. Les deux conducteurs de ce bus sont appel�s SDA (ligne de donn�es) et SCL (canal d'horloge). Chacun des dispositifs reli�s au bus doit �tre aliment� s�par�ment (tout comme pour une communication RS232 traditionnelle). Les deux conducteurs du bus sont normalement raccord�s via une r�sistance de tirage au niveau logique � haut � de 4.7k (+5V pour les circuits imprim�s � 5V). Cela donne une connection �lectrique en � OU � logique entre les dispositifs raccord�s au bus. Un de ceux-ci am�nera une ligne conductrice � la masse quand il voudra transmettre un 0, ou la laissera en position � haute � pour transmettre un 1. Le ma�tre d�bute une communication en envoyant un motif appel� � �tat de d�part � et alors s'adresse au dispositif avec lequel il veut communiquer. Chaque dispositif reli� au bus poss�de une adresse unique sur 7 bits. Apr�s cela le ma�tre envoie un bit qui indique s'il veut lire ou �crire des donn�es. L'esclave reconna�tra alors qu'il a bien compris le ma�tre en lui envoyant un � ack-bit � (bit d'acquittement). Ainsi nous avons maintenant localis� 9 bits de donn�es sur le bus (soit 7 bits pour l'adressage + un bit de lecture + un � ack-bit �).

| d�part | adresse 7-bit de l'esclave |  bit lecture de \
donn�e | attente du bit de r�ception (ack-bit) | ... les donn�es suivent ici
Et ensuite ?

Ensuite nous pouvons recevoir ou transmettre des donn�es. Une donn�e est toujours un multiple de 8 bits (un octet) et doit �tre acquitt�e (acknowledged) par un � ack-bit �. Autrement dit, nous rel�verons toujours des suites de 9 bits sur le bus. Quand la communication est termin�e alors le ma�tre doit transmettre un � �tat de fin �. Aussi le ma�tre doit-il savoir combien de donn�es parviendront quand il les lira en provenance de l'esclave. Ce n'est cependant pas un probl�me du fait que vous pouvez transmettre cette information � l'int�rieur du protocole d'utilisateur. Par exemple nous utiliserons l'octet 0 � la fin d'un mot pour indiquer qu'il n'y plus de donn�e.

Les donn�es sur le conducteur SDA est valide tant que le SCL est � 1. Comme ceci :
SDA H -\       /---\     /---\          /---\      
    L   \-----/     \---/     \--------/     \------....

SCL H ----\     /-\       /-\     /-\    /-\    /-\ 
    L      \---/   \-----/   \---/   \--/   \--/   \-....


  | START |      1 |       1 |     0 |    1 |    0 | 
Une des choses les plus int�ressantes concernant ce protocole est que vous n'avez pas besoin d'un signal d'horloge pr�cis et synchrone. Le protocole continue � fonctionner m�me s'il y a quelques parasites sur le signal d'horloge.

Pr�cis�ment cette propri�t� rend possible l'implantation du protocole I2C dans une application en espace utilisateur sans avoir besoin d'un pilote du noyau ou d'un mat�riel sp�cial (comme un UART). Chouette non ?

La d�marche

Comme dit auparavant nous ne pouvons utiliser le bus I2C interne du PC mais nous pouvons utiliser n'importe quelle interface externe o� nous pourrons envoyer et recevoir des bits de donn�es. Nous utiliserons simplement l'interface RS232 de notre PC. Autrement dit notre interface de communication est encore la m�me que dans les articles pr�c�dents mais nous �pargnons le mat�riel MAX232, des capacit�s, etc.

La partie la plus rude est �videmment d'implanter le protocole I2C en partant de rien. Cela me prit 5 semaines pour le conna�tre et le d�boguer mais maintenant c'est fait et vous n'avez qu'� le copier :-). J'esp�re que lorsque vous l'utiliserez, vous vous souviendrez de ce que ce code repr�sente comme effort.

Comme application exemplaire, nous construirons un thermom�tre. Vous pouvez �videmment mesurer n'importe quoi d'autre ou juste utiliser comme interrupteur d'une lumi�re. A vous de voir.

Dans un second article, nous ajouterons un affichage LCD local. En d'autres mots, vous aurez un thermom�tre o� vous lirez la temp�rature directement sur l'affichage et/ou sur votre PC linux. L'affichage viendra dans un second article afin de ne pas alourdir celui-ci.
ntc
Les NTC sont petit, bon march� et suffisamment pr�cis

La sonde de temp�rature

Il est possible d'avoir des sondes de temp�rature calibr�es d'origine (certaines parlent I2C ;-) mais elle sont plut�t ch�res. Les NTC sont meilleur march� et presque aussi bons, m�me sans calibration. Si vous les calibrez quelque peu, vous pouvez parvenir � une pr�cision au-del� de la d�cimale.

Un probl�me pos� par les NTC est qu'ils ne sont pas lin�aires. N�anmoins ce n'est qu'une question de physique des semi-conducteurs pour trouver la bonne formule qui corrige la courbe non lin�aire. Le microcontr�leur �tant un petit ordinateur, les op�rations math�matiques ne sont pas un probl�me. Les NTC sont des r�sistances d�pendantes de la temp�rature. La valeur R du NTC pour une temp�rature donn�e est :
ntc formula
T ou Tc repr�sente la valeur de la temp�rature que nous recherchons. Rn est la valeur de r�sistance du NTC � 25�c. Vous pouvez vous fournir des NTC � 4k7, 10k .... aussi Rn reprend cette valeur.

Le circuit

circuit diagram
Diagramme du circuit. Cliquez sur le diagramme pour une vue plus d�taill�e
Maintenant, nous avons tout ce qu'il faut pour construire notre thermom�tre num�rique. Nous reprenons deux sondes NTC, une pour l'int�rieur, l'autre pour l'ext�rieur. Vous pouvez en ajouter d'autres si vous voulez (conn3, la borne PC2 par exemple est libre). Dans le diagramme du circuit, j'y ai d�j� repris les conducteurs n�cessaires pour le raccordement � un affichage LCD car je n'ai pas envie de reconcevoir un nouveau circuit complet pour le prochain article.

Il y a aussi une LED connect�e. �a co�te pas cher et c'est vraiment utile pour le d�bogage de base. Je l'ai utilis� par exemple pour d�boguer l'�tat I2C de l'engin quand je programmais la communication I2C entre le PC et le microcontr�leur. Durant le fonctionnement courant, nous pouvons le laisser clignoter pour indiquer que des mesures sont en cours.

Pour le reste, le circuit est suffisamment explicite. Le convertisseur analogique-num�rique dans le micro-contr�leur est utilis� pour mesurer la tension sur le NTC qui sera converti en valeurs de temp�rature.

L'Atmega8 pr�sente deux options qui sont utilis�es comme tension de r�f�rence pour le analogique-num�rique. Il peut utiliser soit les 5V (AVcc) soit une r�f�rence interne de 2,56V. Pour la temp�rature int�rieure, nous n'avons pas besoin d'une �tendue de valeurs aussi large que pour le capteur ext�rieur. De +10�c � +40�c devrait normalement suffire. Aussi pouvons-nous utiliser la r�f�rence � 2,5V quand il s'agit de mesurer la sonde d'int�rieur. Cela procure une tr�s grande pr�cision puisque les 1024 valeurs num�riques possibles sont �tal�es sur seulement une port�e de 0 � 2,56V ce qui nous donne une r�solution de 2,5 mV (encore plus pr�cis que sur la plupart des voltm�tres num�riques!).

La borne CD sur la RS232 est une ligne d'entr�e et est connect�e au SDA du bus I2C. Nous l'utilisons pour lire les donn�es venant du micro-contr�leur. DTR et RTS sont des lignes de sorties. Quand le PC envoie des bits de donn�es sur le SDA alors il enclenche le DTR. Le ma�tre I2C (ici le PC linux) contr�le la ligne SCL (horloge). Autrement dit la ligne d'horloge est une ligne de sortie sur la RS232.

Le 78L05 est utilis� pour g�n�rer une alimentation stable et une tension de r�f�rence. Vous pouvez utilisez quasi n'importe quel type d'alimentation AC ou DC entre 7,5V et 12V. 9V est un bon choix.

Fabrication du circuit imprim�

get this kit from the tuxgraphics shop
tuxgraphics.org vend tous les �l�ments requis dans cet article rassembl�s avec un circuit imprim� de bonne facture.
Vous pouvez �videmment r�utiliser le circuit imprim� prototype que nous utilisions dans notre article pr�c�dent. Il faut juste � reconnecter la LED sur la borne 11 et ajouter tout ce qui est nouveau.

Si vous voulez un circuit imprim� de belle apparence alors il est plus indiqu� d'utiliser une nouvelle plaquette. Vu que le circuit est plus compliqu�, il est �vident qu'il faut graver proprement la plaquette du circuit imprim�. Apr�s la lecture de l'article de Iznogood sur linuxfocus � propos de gEDA, j'ai d�cid� d'utiliser �galement gEDA au lieu de Eagle. gschem, l'outil de dessin de sch�mas, est tr�s bon. Il n'a pas une librairie de symboles aussi �tendue que chez Eagle et de ce fait j'ai d� cr�er le symbole pour l'Atmega8, mais c'est tr�s facile d'utilisation et aussi bon que sous Eagle. Quelque peu plus probl�matique est pcb, l'outil pour dessiner les circuits imprim�s. Quand vous venez d'Eagle, vous remarquez tout d'abord qu'il est possible de d�connecter les composants des � pistes �. Afin d'�tre s�r que les bonnes � pistes � soient connect�es aux bonnes broches, vous devez lancer Connects->Optimize rats-nest � l'occasion. Vous devriez d'abord compl�ter le diagramme du circuit et alors fabriquer le circuit imprim�. L'annotation entre les deux est seulement manuelle. top view, position of components

J'ai utilis� le calque de couleur orange pour le dessin. D'une mani�re ou d'une autre, les autres calques ne g�n�reront aucune sortie � l'impression. Le probl�me est que le calque color� en orange est sur la face de la plaquette o� se situent les �l�ments. Si vous �crivez le texte dans ce calque alors il sera en miroir quand vous l'imprimerez sur la plaquette mat�rielle. C'est pourquoi j'ai fait la maquette de base avec pcb et tout le reste avec gimp.

Gr�ce � shop.tuxgraphics.org, vous n'aurez pas � vous lancer dans des manipulations chimiques hasardeuses et courir la ville pour trouver les bons composants. Ils vendent tous les �l�ments requis par cet article. De cette mani�re, vous pourrez vous concentrer sur la partie la plus agr�able et assembler ce circuit avec succ�s.

L'assemblage

Quand vous monterez le circuit soyez attentif aux �l�ments pour lesquels la polarit� compte : les condensateurs chimiques, les diodes, les zeners, le 78L05, la LED et le microcontr�leur.

Avant d'ins�rer le microcontr�leur sur son support, vous devriez v�rifier l'alimentation. Si elle est d�fectueuse, non seulement vous aurez des mesures de temp�ratures incorrectes mais vous risquez aussi de d�truire le microcontr�leur. C'est pourquoi connectez l'alimentation externe (par exemple une pile de 9V) et v�rifiez avec un voltm�tre que vous avez exactement 5V sur la broche du support du microcontr�leur. A l'�tape suivante vous connectez le circuit au port RS232 de votre PC linux et lancez le programme i2c_rs232_pintest avec diverses combinaisons de signaux.
i2c_rs232_pintest -d 1 -c 1
i2c_rs232_pintest -d 0 -c 1
i2c_rs232_pintest -d 1 -c 0
Ce programme met les bornes RTS aux valeurs de tension pr�vues (utilis� comme SCL, option -c) et DTRn (utilis� comme SDA, option -d) du port RS232. Le port RS232 a un niveau de voltage d'environ 10V. Derri�re la diode zener, vous devriez mesurer seulement -0,7 pour une valeur binaire de 0 et + 4-5 V pour une valeur binaire de 1.

N'ins�rez le microcontr�leur qu'apr�s que votre circuit ait pass� tous ces tests.

Utiliser la communication I2C

T�l�chargez (voyez les r�f�rences) le fichier linuxI2Ctemp tar.gz et d�compactez-le. La communication I2C est implant�e dans deux fichiers :
i2c_avr.c -- the i2c statemachine for the atmega8
i2c_m.c   -- the complete i2c protocol on the linux side
J'ai donn� � l'Atmega8 l'adresse d'esclave 3. Pour envoyer la cha�ne � hello � � l'Atmega8, vous ex�cuterez les fonctions C suivantes :
address_slave(3,0); // renseigne l'esclave que nous allons envoyer quelquechose
i2c_tx_string("hello");
i2cstop(); // se d�gager du bus I2C

du c�t� du microcontr�leur vous devriez recevoir le mot "hello" avec
i2c_get_received_data(rec_buf);
Tr�s facile. Lire des donn�es venant du microcontr�leur est similaire. Jeter un oeil sur le fichier i2ctemp_avr_main.c pour voir comment �a fonctionne quand les lectures de temp�rature sont effectu�es.

Quelle temp�rature fait-il ?

Pour compiler et charger le code pour le microcontr�leur, lancez les commandes suivantes � partir du r�pertoire du paquet linuxI2Ctemp.
make
make load
Compilez les deux programmes i2c_rs232_pintest et i2ctemp_linux
make i2c_rs232_pintest
make i2ctemp_linux
ou simplement utilisez les versions pr�compil�es se trouvant dans le r�pertoire � bin �.

Pour lire la temp�ratures lancez simplement:
i2ctemp_linux
... et cela affichera les temp�ratures d'int�rieur et d'ext�rieur. Pour faire en sorte que ces donn�es soient disponibles sur un site web, je sugg�re de ne pas lancer directement i2ctemp_linux du serveur car la communication I2C est tr�s lente. Il est pr�f�rable de le lancer � partir d'une t�che cron et, de l�, de l'�crire dans un fichier html. Un exemple de script est inclus dans le fichier README du paquet linuxI2Ctemp.

Conclusion

Le protocole I2C requiert tr�s peu de mat�riel suppl�mentaire et est optimis� pour la transmission ou la r�ception de faibles quantit�s de donn�es. C'est exactement ce qu'il nous faut si nous souhaitons communiquer avec notre microcontr�leur. C'est vraiment une tr�s �l�gante solution !

Dans cet article, je me suis focalis� essentiellement sur la partie mat�rielle. Si vous aimez cet article alors j'en �crirai aussi un second dans lequel je d�crirai comment le sofware fonctionne. Sp�cialement, comment faire la conversion analogique-num�rique et comment l'implantation du protocole I2C fonctionne. Pour ce prochain article nous pouvons aussi ajouter un affichage LCD et une conversion entre Farenheit et Celsius.

References