Un thermom�tre digital ou parler � I2C � � votre microcontroleur atmel -- deuxi�me partie

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

Hardware

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

[Photo of the Author]

TranslationInfo:

original in en Guido Socher

en to fr Jacques WLODARCZAK

AboutTheAuthor:[A small biography about the author]

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

Abstract:[Here you write a little summary]

Dans cette seconde partie nous connecterons un afficheur et j'expliquerai comment fonctionne le logiciel.

Ceux qui d�couvrent cette s�rie devraient d'abord lire la premi�re partie (f�vrier 2005 - article 365) ; le m�me en fran�ais .

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

[Illustration]

ArticleBody:[The article body]

Les nouveaut�s

Dans l'article pr�c�dent / (traduction en fran�ais) nous avions d�j� �labor� l'essentiel du mat�riel et des fonctionnalit�s afin de mesurer une temp�rature et en transmettre les donn�es � un PC linux. Dans cet article nous ajouterons un affichage LCD et une interface tr�s simple en gtk.

Ajouter ces deux choses est tr�s facile � faire. Aussi, je consacrerai le reste de l'article � expliquer comment le logiciel I2C et le convertisseur analogique vers num�rique fonctionnent.

L'affichage LCD

Pour l'affichage LCD nous utiliserons un afficheur compatible HD44780 comme pour les articles pr�c�dents. Ces afficheurs sont tr�s faciles � utiliser en combinaison avec des microcontr�leurs car vous pouvez leur envoyer des caract�res ASCII.
HD44780 compatible LCD display

Comme pour tous les articles de cette s�rie vous pouvez vous procurer tous les mat�riaux n�cessaires notamment l'afficheur LCD chez shop.tuxgraphics.org
J'utilise le m�me code du pilote LCD que dans les articles pr�c�dents. Les fichiers qui impl�mentent ce pilote LCD sont lcd.c, lcd.h et lcd_hw.h. Ils sont inclus dans le paquet que vous pouvez t�l�charger � la fin de cet article. L'interface pour ce code est vraiment facile � utiliser :
// call this once:
// initialize LCD display, cursor off
lcd_init(LCD_DISP_ON);

// to write some text we first clear
// the display:
lcd_clrscr();
lcd_puts("Hello");
// go to the second line:
lcd_gotoxy(0,1); 
lcd_puts("LCD");
La mani�re dont fonctionnent ces afficheurs HD44780 est d�crite sur LinuxFocus dans l'article de septembre 2002 Comprendre l'affichage LCD HD44780

Le logiciel est �crit de sorte qu'il fonctionne tant avec les afficheurs LCD 16x2 que 20x2.

board change Il y a aussi une actualisation du diagramme du circuit. J'ai d�couvert que certains afficheurs LCD ont une charge capacitive plus �lev�e et une r�sistance moins �lev�e que d'autres. Probablement parce que ils ont une meilleure protection ESD. Cette charge additionelle peut �ventuellement produire des erreurs de bit durant la programmation � In circuit � quand l'afficheur LCD est connect� aux bornes SCK et MOSI.

Dans un premier temps, j'ai essay� de connecter des r�sistances suppl�mentaires dans les lignes vers l'afficheur LCD. Chez moi �a marchait, mais certains, particuli�rement parmi les utilisateurs de laptop, continuaient � conna�tre des probl�mes

Pour �viter tous ces probl�mes, j'ai actualis� le diagramme du circuit et ainsi les bornes D7 et RS de l'afficheur LCD sont maintenant connect�es aux bornes PD7 et PD6. Et ce n'est pas un probl�me de changer �a, m�me si vous avez d�j� fait la plaquette : ajoutez juste un petit fil sous la plaquette et coupez la connection vers PB3 avec une lame.

Circuit diagram

Une petite interface graphique

Pour ceux qui auraient souhait� une interface graphique sur leur bureau, j'en ai fait une tr�s simple. qui consiste en deux �tiquettes qui affichent la sortie sur deux lignes de la commande i2ctemp_linux (i2ctemp_linux est la commande qui lit les temp�rateurs venant du circuit via l'i2c) :
GUI

Maintenant nous avons un chouette thermom�tre avec nombre de possibilit�s : Je profite du reste de cet article pour expliquer quelque peu les m�andres de ce logiciel.

Comment fonctionne une conversion de l'analogique vers du num�rique

L'Atmega8 supporte deux modes. Un o� il mesure en permanence les signaux analogiques et d�clenche une interruption quand la mesure est pr�te. Le logiciel de l'application peut alors utiliser cette interruption pour copier aussit�t le r�sultat venant de deux registres vers une variable.

L'autre mode est appel� mode � par � coups � (single shot). Ici une seule conversion est effectu�e, Le mode par � coups est en plus assez rapide. En tenant compte du temps d'initialisation pr�l�minaire des registres et de l'extraction vous pouvez obtenir 100 conversions par seconde. C'est plus que suffisamment rapide pour nous. Aussi utiliserons-nous ce mode.

Sur notre Atmega8 nous pouvons utiliser les bornes d'entr�es analogiques ADC0 jusque ADC3. En plus de cela il y a les bornes AGND (masse analogique connect�e � la masse normale), AREF (la tension de r�f�rence) et AVCC (connect� au +5V).

Durant la conversion analogique vers num�rique, le signal analogique est compar� avec l'AREF. Un signal analogique �gal � l'AREF correspond � une valeur num�rique de 1023. l'AREF peut �tre n'importe quelle r�f�rence externe entre 0 et 5V. Sans l'utilisation d'une r�f�rence externe vous pouvez encore op�rer une conversion pr�cise par l'usage ou d'une r�f�rence interne (2,56V) ou d'AVCC. Ce qui est utilis� est d�termin� dans le logiciel par les bits REFS0 et REFS1 dans le registre ADMUX.

Le convertisseur analogique vers num�rique peut convertir une des lignes d'entr�e ADC0-ADC3 � la fois. Avant de lancer la conversion vous devez placer des bits dans le registre ADMUX pour indiquer � la puce quel canal utiliser.

Une simple conversion analogique vers num�rique ressemble donc � ceci :
volatile static int analog_result;
volatile static unsigned char analog_busy;

analog_busy=1; // busy mark the ADC function
channel=0; // measure ADC0 
// use internal 2.56V ref
outp((1<<REFS1)|(1<<REFS0)|(channel & 0x07),ADMUX);
outp((1<<ADEN)|(1<<ADIE)|(1<<ADIF)|(1<<ADPS2),ADCSR);
sbi(ADCSR,ADSC); // start conversion
Maintenant le microcontr�leur effectuera la conversion analogique vers num�rique et appelera la fonction SIGNAL(SIG_ADC) une fois pr�t. Dans cette fonction nous pouvons copier le r�sultat vers une variable. Comme programmeur vous devez veiller � lire les 8 bits de faible poids d'abord car le microcontr�leur a un m�canisme de verrouillage pour simuler une lecture � atomique �.
SIGNAL(SIG_ADC) {
        unsigned char adlow,adhigh;
        adlow=inp(ADCL); /* read low first, two lines. Do not combine
                          the two lines into one C statement */
        adhigh=inp(ADCH);
        analog_result=(adhigh<<8)|(adlow & 0xFF);
        analog_busy=0;
}
Apr�s cela nous avons le r�sultat de la conversion � analogique vers num�rique � disponible sous forme de nombre dans la variable � analog_result �. Ceci peut �tre utilis� ailleurs dans le programme. Tr�s facilement.

Comme pour toute interruption vous devez appeler sei(); pour les autoriser globalement. Ce qui devrait �te fait quelque part dans le programme principal (ce n'est pas montr� ci-dessus).
Il y a quelques � drapeaux � que je vais vous expliquer bri�vement : L'Atmega8 offrent de nombreuses possibilit�s de s�lection de la tension de r�f�rence. Ce dernier est compar� � notre tension d'entr�e analogique. C'est la tension qui correspond � une valeur num�rique de 1023.
REFS0=0, REFS1=0utilise AREF externe, Vref interne off
REFS0=0, REFS1=1AVCC avec condensateur externe optionel sur la broche AREF
REFS0=1, REFS1=1Tension de R�f�rence Interne de 2.56V avec condensateur externe (optionel) sur la broche AREF
Une capacit� optionnelle sur la borne AREF peut �tre utilis�e pour supprimer le bruit (noise) et stabiliser la tension AREF.

Comment fonctionne la communication I2C : du c�t� de l'Atmega8

J'ai d�j� expliqu� dans la partie 1 (February2005 article365) comment le protocole I2C fonctionne. Jetons maitenant un coup d'oeil sur le logiciel. L'Atmega8 poss�de un support mat�riel pour une communication I2C. Aussi vous n'aurez pas besoin d'impl�menter ce protocole. Par contre vous devrez impl�menter un m�canisme d'�tat (state machine) qui dira � l'Atmega8 quoi faire ensuite. Voici un exemple :

On re�oit un paquet I2C avec l'adresse de notre propre esclave. L'Atmega8 fera alors appel � la fonction SIGNAL(SIG_2WIRE_SERIAL) avec le code d'�tat 0x60 (pour d'autres �v�vements nous aurions eu d'autres codes).

--> Nous devons maintenant fixer un nombre en registre pour dire � l'Atmega8 quoi faire ensuite. Dans ce cas nous lui dirons : recevoir la partie � donn�es � et en accuser r�ception.

Quand les donn�es sont re�ues nous serons appel�s par le code de statut 0x80.

--> Maintenant nous lisons les octets de donn�es et disons � l'Atmega8 de r�ceptionner les prochains le cas �ch�ant.

Quand la communication est termin�e nous avons un code de statut 0xA0 (stop condition) et disons � notre application qu'un message complet � �t� re�u.

L'enti�ret� du m�canisme d'�tat pour le mode esclave I2C et tous les �tats possibles, sont expliqu�s dans le livre de sp�cifications page 183 (voir le lien dans la section � r�f�rences � � la fin de l'article).

La transmission des donn�es est tout � fait similaire, jetez un oeil sur le code !

Comment fonctionne la communication I2C : du c�t� de Linux

i2c input stage D'abord un mot � propos du mat�riel. M�me si I2c est un bus nous n'utiliserons qu'une connection poste � poste entre un esclave et le PC Linux comme ma�tre I2C. Nous pouvons ainsi �pargner la r�sistance de pull-up du fait que l'esclave peut faire chuter la ligne sans cr�er de court circuit. Nous mettrons simplement une r�sistance de 4.7 K dans ce circuit.

La tension doit �tre ajust�e : c'est effectu� gr�ce � une diode Zener qui limite les tensions n�gatives � -0.7V et les positifs � maximum +5.1.

Apr�s une �tude approfondie des entrailles de l'Atmeag8, j'en vins finalement � la conclusion que la protection interne de l'Atmeag8 lors de l'entr�e est probablement suffisante car les courants qui traversent la r�sistance de 4.7 K sont tr�s faibles. Nous n'aurons pas besoins d'une diode Zener. Ceci dit, �a ne peut faire de tort d'en avoir une.

Le logiciel I2C de Linux impl�mente de mani�re basique une pile I2C compl�te. Je souhaite utiliser un petit utilitaire de ligne de commande qui ne n�cessite pas de biblioth�que sp�ciale ou un module du noyau. Cela fonctionnera par lui-m�me.

Si vous fouillez dans le fichier i2c_m.c (voir le t�l�chargement) vous pouvez constater que chaque message I2C est construit bit par bit.

Pour g�n�rer les � bits � nous devons brancher les bornes physiques sur l'interface rs232. C'est fait avec les appels ioctl :
        // set RTS pin:
        int arg=TIOCM_RTS;
        ioctl(fd, TIOCMBIS, &arg);
... ou pour produire un z�ro :
        // clear RTS pin:
        int arg=TIOCM_RTS;
        ioctl(fd, TIOCMBIC, &arg);
Si vous voulez porter cette pile vers un autre OS, vous n'avez qu'� changer ces lignes, le reste est du pur C.

USB vers RS232

Pour les laptops qui n'ont plus � ce jour d'interface rs232 pour pouvez simplement utiliser l'adaptateur USB/rs232. J'utilise un adaptateur sans marque qui contient une puce Prolific 2303. L'adaptateur en question appara�t comme suit dans le fichier /proc/bus/usb/devices : Vendor=067b ProdID=2303 Rev= 2.02. Voyez aussi "Use your ATEN UC-232A USB adapter with Linux (Linuxfocus, November 2001, article 223)".

Conclusion

mount the sensor J'utilise maintenant le thermom�tre depuis deux mois et je l'appr�cie vraiment car on peut lire directement sur l'afficheur et vous avez la possibilit� de stocker les donn�es sur votre PC. Vous pouvez les lire, dessiner des graphiques et faire des statistiques. Chouette !

Le capteur ext�rieur doit �tre prot�g� de la pluie (et du soleil). Vous pouvez essayer de l'envelopper dans du plastique mais je ne le recommande pas. Quelque soit la mani�re dont l'aurez attach�, la pluie finira par y p�n�trer et stagner. Le NTC est tr�s robuste et il importe peu qu'il soit un tantinet humide pourvu qu'il puisse s�cher. Utiliser un tube de comprim�s retourn� que vous laissez ouvert � la base. De cette fa�on l'eau pourra sortir.


the thermometer


Vous pouvez de nouveau commander toutes les pi�ces (LCD display, PCB, microcontr�leur, ...) au magasin en ligne tuxgraphics : shop.tuxgraphics.org.
Bon amusement !

R�f�rences