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]
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]
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.
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.
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.
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) :
Maintenant nous avons un chouette thermom�tre avec nombre de possibilit�s :
- Vous pouvez lire la temp�rature sur place gr�ce � l'afficheur
- Vous pouvez avoir une petite interface graphique sur votre bureau
- Vous pouvez �crire des valeurs, � l'aide d'une t�che cron, dans un fichier,
pour obtenir des statistiques � long terme
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 :
- ADEN: activer le convertisseur analogique vers num�rique, � activer avant de positionner ADSC.
- ADIE : autoriser l'interruption ADC (=autoriser l'appel de SIGNAL(SIG_ADC))
- ADIF : ADC Interrupt Flag (doit �tre positionn� sur 1 avant la conversion)
- ADPS : ADC clock pre-scaler bits : doivent �tre fix�s de telle sorte que la fr�quence d'horloge divis� par le facteur � pre-scale � soit une valeur entre 50 et 200 KHz. Le facteur de division est �gal � 2^ADPS (2 �lev� � la puissance de la valeur des bits ADPS).
Les valeurs ci-dessus (ADPS2=1, ADPS1=0, ADPS0=0 = decimal 4 -> 2^4 = 16
-> division factor = 16) conviennent pour une fr�quence d'horlogue de 1MHz.
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=0 | utilise AREF externe, Vref interne off |
REFS0=0, REFS1=1 | AVCC avec condensateur externe optionel sur la broche AREF |
REFS0=1, REFS1=1 | Tension 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
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
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.
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