Vous êtes sur la page 1sur 73

THEROND Quentin

Anne 2010/2011





Conception dun pse assiette dbiteur de repas sur badge
magntique ou carte RFID.
Rapport de stage dInstitut Universitaire de Technologie
Gnie lectrique et informatique industrielle.






Symotronic Universit Claude Bernard Lyon 1
75 Rue Francis de Prssens 17 rue de France
69100 VILLEURBANNE 69627 Villeurbanne




Tuteur de stage : Mr Stphane MENARD
Enseignant tuteur : Mr Julien VIAL
Stagiaire : Mr Quentin THEROND





Rapport de stage Quentin THEROND 2011 Page 2 sur 73

2011

Rapport de stage



Thme : Conception dun pse assiette dbiteur de repas sur un badge magntique ou une
carte RFID.



Entreprise : SYMOTRONIC

Adresse : Parc Rpublique
75 rue Francis de Prssens
69100 Villeurbanne
Tlphone : 04 72 43 00 55


Centre de formation : Universit Claude Bernard Lyon 1
Dpartement Gnie Electrique et Informatique Industrielle

Adresse : 17 rue de France
69627 Villeurbanne cedex
Tlphone : 04 72 65 53 53


Etudiant : THEROND Quentin

Tuteur de stage : Mr MENARD Stphane

Enseignant tuteur : Mr VIAL Julien











Stage de 10 semaines effectu du 18 avril au 24 juin 2011







Rapport de stage Quentin THEROND 2011 Page 3 sur 73

Remerciements



Je tiens remercier tout particulirement mon tuteur de stage Monsieur Stphane
MENARD, qui ma propos un sujet de stage ambitieux et qui a pris le temps de
maccompagner avec bienveillance dans mon projet. Toujours disponible pour rpondre mes
questions, jai t sensible la confiance quil ma accorde et lautonomie quil ma
laisse. Ce projet complte pleinement la formation dispense par lIUT.


Je souhaite galement remercier tous les collaborateurs de SYMOTRONIC et
Monsieur Marc PURAVET pour leur accueil et pour mavoir rapidement intgr dans leur
entreprise pendant ce stage de fin dtude.


Enfin je remercie tous les professeurs de LIUT Claude Bernard Lyon1, qui, par leur
engagement et la qualit de leur enseignement, mont permis de me doter dune formation
complte dans le domaine de llectricit et de linformatique industrielle.































Rapport de stage Quentin THEROND 2011 Page 4 sur 73





Sommaire

I) Prface 6

II) Prsentation de lentreprise 7

III) Cahier des charges 9

IV) Etude gnrale et technique 10

V) Dveloppement technique 1
re
partie : Contexte technique ... 15

VI) Dveloppement technique 2
me
partie : Etape de la ralisation.. 18

Conception du schma 19

Alimentation 21
Pont de Wheatstone 22
Traitement du signal 22
Eeprom 25
Horloge temps rel 26
Afficheur 26
Microcontrleur 28
Buzzer 28
Programmation 20
Communication RS232 30

Typon 30

Programmation 31

VII) Dveloppement technique 3
me
partie : Tests / suivi / volution 37

VIII) Conclusion technique 41

IX) Bilan personnel 41

X) Annexes 42







Rapport de stage Quentin THEROND 2011 Page 5 sur 73

Table des illustrations

Figure1 : Plan 7
Figure 2 : Organisation de la socit 8
Figure 3 : Prsentation du groupe AGAPES 9
Figure 4 : Diagramme sagittal 10
Figure 5 : Pice daluminium pour les jauges 11
Figure 6 : Balance vue du haut 11
Figure 7 : Photo de la jauge choisie 12
Figure 8 : Lecteur RFID utilis 13
Figure 9 : Carte MIFARE 14
Figure 10 : Protocole MIFARE 14
Figure 11 : Trams 14
Figure 12 : Schma fonctionnel 15
Figure 13 : 2
me
schma ralis (utilis pour le prototype) 18
Figure 14 : ARES 20
Figure 15 : Alimentation 21
Figure 16 : jauge de contrainte en pont 22
Figure 17 : Traitement de signal 22
Figure 18 : Sans condensateur 23
Figure 19 : Avec condensateur 24
Figure 20 : Simulation, ralis avec dautre valeur 24
Figure 21 : Traitement de signal 24
Figure 22 : Droite de Vud en fonction du poids 25
Figure 23 : EEPROM & horloge temps rel 25
Figure 24 : LCD 26
Figure 25 : Microcontrleur 27
Figure 26 : Buzzer 28
Figure 27 : Programmation 29
Figure 28 : MAX232 29
Figure 29: Typon top copper 30
Figure 30 : Typon bottom copper 30
Figure 31 : Typon bottom copper 30
Figure 32 : Typon 3D 30
Figure 33 : Typon en simple face 31
Figure 34 : Typon final double face top copper et bottom copper 31
Figure 35 : MPLAB 31
Figure 36 : ICD2 31
Figure 37 : Algorithme et description du programme principal (main) 32
Figure 48 : Algorithme 33
Figure 39 : Algorithme 33
Figure 40 : Algorithme 34
Figure 41: Algorithme 34
Figure 42 : Tableau de commande 35
Figure 43 : Algorithme 35
Figure 44 : Algorithme 36
Figure 45 : Cblage du prototype 37
Figure 46 : Cblage du prototype zoom 37
Figure 47 : Ecran principal 38
Figure 58 : Dtection badge 38
Figure 59 : Dtection dun mauvais badge 39
Figure 50 : Rglage de lheure 39
Figure 51 : Le plateau de la balance 40



Rapport de stage Quentin THEROND 2011 Page 6 sur 73

I) Prface


Ce dossier a pour objet de prsenter le travail que jai effectu pendant les 10 semaines
de stage de fin de formation lIUT dpartement Gnie Electrique et Informatique
Industrielle. Il contient toutes les informations importantes sur lentreprise et le projet. Ce
projet, ralis pour le compte dune entreprise commerciale, doit rester autant que possible
confidentielle.

Stphane MENARD ma confi la conception dun projet command par lentreprise
SALADE & CO. Lobjet de la commande est de monter un dispositif capable de compter des
assiettes par un systme de pese et de dbiter un ou plusieurs menus en fonction du nombre
dassiettes prises par le client.

Lintrt de ce projet rsidait dans lintgration des technologies analogiques et
numrique et dans lapport de la mcanique de prcision et de la programmation de
microcontrleur dans un mme dispositif

Dans un premier temps jai commenc rdiger le cahier des charges comme me
lavait propos mon tuteur et dans un deuxime temps jai construit le planning de mon stage.
Cela ma permis davoir une bonne vision de mon travail et de bien morganiser. Jai utilis le
modle en V vu en cours pour raliser ce projet.

Jai deux semaines pour trouver les
composants utiliser, deux semaines
pour faire le schma et le typon, trois
semaines de programmation pour
raliser le code et pour finir, trois
semaines pour raliser les tests et les
modifications. Le planning ci-dessous
reprsente les grandes taches du projet.










Rapport de stage Quentin THEROND 2011 Page 7 sur 73

II) Prsentation de lentreprise


SYMOTRONIC :

SY pour systme
MO pour montique
TRONIC pour lectronique


Figure1 : Plan

Lentreprise SYMOTRONIC, situe Villeurbanne, a t fonde en 1996 par Marc
PURAVET.

Cette entreprise spcialis dans les systmes de paiement cashless* technologie
Mifare. Elle est devenue le distributeur officiel de la gamme MICROTRONIC (Suisse) et
travaille en coopration avec CIB, entreprise rachete par Monsieur Marc PURAVET.
Grce la mise en uvre de la Technologie Mifare (Philips NXP), SYMOTRONIC intervient
dans de nombreux domaines o lutilisation dun badge daccs est requise. Porte-monnaie
lectronique, accs payants, accs normal, photocopieur, restauration... Elle effectue ltude et
la ralisation de solutions de logiciels et matriels adapts la montique et son
environnement proche (restauration collective, contrle d'accs, gestion du temps,
rvaluateur carte Bancaire, tlmtrie, etc.).

SYMOTRONIC est une SAS (Socit par Action Simplifie) dont les 98% sont
dtenus par Monsieur PURAVET. Son chiffre daffaires est de 3.064.000 en 2011 et son
capital social de 40 000. Lexportation reprsente 1% du chiffre daffaires de lentreprise.

SYMOTRONIC ralise la majorit de son chiffre daffaires dans les systmes
cashless* pour le vending** c'est--dire les systmes de paiement lectronique pour la
distribution automatique. Cest un domaine o elle sest impose comme une entreprise de
confiance ayant de lexprience et tant capable de fournir des systmes fiables.


*Cashless : Systme de paiement lectronique.
**Vending : distribution automatique.


Rapport de stage Quentin THEROND 2011 Page 8 sur 73

Cette entreprise compte actuellement 9 salaris qui sont :


Figure 2 : Organisation de la socit

Effectif :

Mr Marc PURAVET : Directeur de Symotronic (Ingnieur)
Mr Stphane MENARD : Responsable technique (Ingnieur)
Mr Patrice BARLET : Charg daffaire (Ingnieur)
Mr Francis RIBEIRO : Technicien lectro-informaticien (technicien)
Mr Matthieu MINGAS : Technico lectro-informaticien (technicien)
Mr Philippe AUGOYAT : Dveloppeur informatique (technicien)
Mr David BARAILLY : Dveloppeur web (technicien)
Mr Sylvain CHAPELLUT : Technico lectro-informaticien (technicien)
Mr Cyril MATHIEU : Ingnieur en apprentissage (technicien)

Mme Siham MERA : Comptable DECF mi-temps

Information sur lentreprise :
Compagnie : SYMOTRONIC
Capital : 40.000
Chiffre daffaires : 3.064.000
Sige : Parc Rpublique, 75 Rue Francis de Prssens 69100 Villeurbanne

Tlphone : 04 72 43 00 55

Fax : 04 72 43 00 27
Web : www.symotronic.com

Mail : info@symotronic.com





Rapport de stage Quentin THEROND 2011 Page 9 sur 73

III) Cahier des charges

3.1) Introduction

Le but du systme que lon ma confi est de dbiter un ou plusieurs menus en fonction du
nombre dassiettes que lutilisateur aura prises sur le plateau. Ce dveloppement a t
command par SALADE & CO qui fait partie du groupe AGAPES. Ce groupe possde touts
les enseignes suivantes :


Figure 3 : Prsentation du groupe AGAPES

3.2) Description du systme

La premire tape devra tre le calibrage de la partie pesage des assiettes. Une fois le
calibrage effectu, les utilisateurs pourront prendre une ou plusieurs assiette(s). Si le badge est
sa place le systme, le systme dbitera un ou plusieurs menus. Si le badge nest pas sa
place, alors le systme devra commander un bip davertissement et lafficheur devra indiquer
quil faut soit reposer lassiette soit mettre un badge. La recharge dassiettes sera possible
uniquement avec un badge prvu pour laccs au menu du systme. Le protocole de
communication aura besoin dune horloge temps rel.

3.3) Problmatique rsoudre concernant le systme

Pour la conception du systme, je me suis pos les questions suivantes :

Quel capteur utilis pour construire une balance de 0-20Kg avec 0,02Kg de
prcision ?
Comment protger le capteur en cas de surpoids ?
Comment raliser la partie mcanique du systme ?
Comment commander le buzzer pour crer un signal sonore ?
Quelle intensit du buzzer est adapte lenvironnement du systme (dB) ?
Quel afficheur faut-il utiliser ?
Comment communiquer avec le lecteur RFID ? quel protocole ?
Quel est le protocole montaire est utiliser ?


Rapport de stage Quentin THEROND 2011 Page 10 sur 73

Quel microcontrleur utilis ?
Comment faire une alimentation de 5V ?
Comment configurer le signal PWM ?
Comment configurer la communication UART ?
Comment configurer le convertisseur analogique numrique ADC ?
Comment configurer le bus de communication I2C ?
Comment grer la date et lheure ?
Comment stocker les valeurs de calibrage pour le protger en cas de coupure de
courant ?
Comment permettre au personnel daccder au menu du systme ?
Quel protocole utilis pour pouvoir changer les paramtres du menu ?
Quel composant et quel choix technologique faut-il mettre en uvre pour obtenir un
prix de revient de moins de 1000 ?

3.4) Diagramme sagittal


Figure 4 : Diagramme sagittal

L1 : Informe lutilisateur grce un afficheur ou un signal sonore.
L2 : Envoi les informations du badge vers le systme
L3 : Envoi des informations du systme vers le badge
L4 : Grandeur physique du poids des assiettes
L5 : information permettant de savoir si on peut recharger les assiettes ou quelle est lerreur
qui vient de ce produire.


IV) Etude gnrale et technique

4.1) Etude de la partie mcanique.

Pour faire une balance avec une ou plusieurs jauge(s) de contrainte, il faut usiner une pice
mtallique sur laquelle seront colles la ou les jauge(s). Cette pice mtallique est trs
importante pour le bon fonctionnement de la balance. Cest en partie grce elle que lon
pourra dterminer le poids maximum et la prcision de la balance. Par exemple une pice
dacier aura moins de prcision quune pice daluminium mais elle pourra supporter un poids
plus important. Pour la balance que je dois raliser, la pice utilise sera de laluminium car le


Rapport de stage Quentin THEROND 2011 Page 11 sur 73

cahier des charges demande une balance 20Kg avec 0,02Kg de prcision. Les deux trous de
gauche du schema ci-dessous servent fixer la pice mtallique sur son socle. Les trous du
milieu sont l pour fragiliser les pices ce qui permettra davoir une meilleure contrainte. Si la
contrainte nest pas assez grande on pourra percer le trou pour lagrandir. Le trou de droite
sert fixer le plateau sur lequel seront poses les assiettes. Voir schma ci-dessous.

Figure 5 : Pice daluminium pour les jauges.

Aprs avoir dessin la pice, monsieur MENARD a demand un devis chez Concept Mtal.
Le devis propos pour les quatre pices tait de 520 HT. Ces quatre pices seront fixes sur
les angles du socle comme si dessous. Le plateau sera pos par dessus.
Figure 6 : Balance vue du haut
Jauge de contrainte
Balance vue du haut


Rapport de stage Quentin THEROND 2011 Page 12 sur 73

4.2) Etude des jauges de contrainte

Une jauge de contrainte est un lment mtallique coll sur la surface dune pice. Lorsque la
pice est sollicite, elle se dforme. La jauge subit alors la mme dformation que la pice.
Cette dformation modifie certaines caractristiques physiques du matriau, notamment sa
rsistance.

R = (xl)/s On peut montrer que : R/R = Kx o = l/l voir datasheet en annexe.

La variation de la rsistance dune jauge de contrainte est proportionnelle la dformation de
la jauge donc de la surface de la pice sur laquelle elle est fixe. Depuis la dformation, on
peut remonter jusqu' la contrainte dans la pice et donc leffort qui lui est appliqu et vice
versa.
Le matriel le plus utilis pour la fabrication de jauges est le constantan (cuivre et nickel). Ses
caractristiques sont suivantes :
Sensibilit constante mme pour de grandes dformations.
Rsistivit leve, donc grande rsistance pour de petites longueurs, ce qui permet de
raliser de trs petites jauges.
Trs stable et relativement peu affect par les changements de temprature, ce qui est
le plus grand problme rencontr dans la mesure de dformations avec des jauges.

Figure 7 : Photo de la jauge choisie

Effet thermique

Lorsquune jauge est colle sur un substrat
dtermin, elle subit des dformations suite
la dilatation du matriau due aux effets
thermiques. Cest pourquoi les jauges
actuelles sont auto-compenses. Il faudra
donc choisir une jauge dont le coefficient de
dilatation est le plus proche de celui du
substrat sur lequel elle sera colle. Il faut
utiliser une colle EPOXY qui a la
caractristique de suivre la contrainte.










Rapport de stage Quentin THEROND 2011 Page 13 sur 73

Dsensibilisation due la longueur des cbles :

La mesure dune jauge serait parfaite si les cbles de liaison taient trs courts mais le collage
dune jauge sur une structure ncessite de grandes longueurs de cble. Ces cbles prsentent
une rsistance complmentaire R non ngligeable.

Ainsi, au lieu de voir la rsistance de la jauge R
j
, le pont voit une rsistance totale R gale
la somme de R
j
et R. Cependant, la variation de rsistance due la dformation, soit dR
naffecte que R
j
(R

restant constante), ce qui pour effet de dsensibiliser la mesure.

Elongation maximale :

Toutes les jauges ont des limites dallongement ne pas dpasser sous peine de rompre la
grille. Pour les jauges choisies, les fabricants annoncent une longation maximale de 2 4 %.
Attention : il faut aussi tenir compte du type de colle utilise (voir effet thermique).


3.3) Etude de la partie communication avec le lecteur RFID


Figure 8 : Lecteur RFID utilis

Les cartes MIFARE comportent une puce (chip) qui est relie un bobinage. Ce bobinage
permet dalimenter la puce grce un effet dinduction (cest le mme principe que les
transformateurs) quand il est pos sur le lecteur.


Figure 9 : Carte MIFARE



Rapport de stage Quentin THEROND 2011 Page 14 sur 73


Figure 10 : Protocole MIFARE

Pour maider faire le programme de la balance, SYMOTRONIC ma fourni un logiciel
permettant de communiquer avec le lecteur RFID. Ce programme permet denvoyer des
trames RS232 au lecteur pour voir quels sont les octets reus en fonction de la trame envoye.
Voici un exemple de lecture du block 4 de carte RFID.


Figure 11 : Trames
Il faut donc envoyer six trames diffrentes pour lire un block

Le protocole MIFARE : Liste des six trames envoyes et octets reus (hexadcimal).

-MIF Scan (connection)
E: 80.A0.03.00.01
R: A0.01.90.00
-MIF Read_UID (lecture numro de carte)
E: 80.B0.01.00.04
R: B0.E3.09.FB.BD.90.00
-MIF loadkeya (chargement cls)
E: 80.D0.80.00.06
R: D0
E: FF.FF.FF.FF.FF.FF
R: 90.00
-MIF Open_Session (ouvrir session)
E: 80.A2.00.00.04
R: A2.90.00
-MIF Close_session (ferme session)
E: 80.E0.00.00.00
R: 90.00


Rapport de stage Quentin THEROND 2011 Page 15 sur 73

-MIF Read_Block (lire le block 4)
E: 80.B2.00.04.10
R: XX.XXXX.XX

Le protocole de payement: pour des raisons de confidentialit il ma t interdit de divulguer
ces renseignements. je dcrirai donc les grandes lignes et masquerai les informations
sensibles.

La Carte est squence en plusieurs blocks contenant des informations sur lutilisateur et
autre. Il est important de connaitre la date et lheure actuelles pour interagir avec la carte.
Cest pour cela quil faut utiliser une horloge temps rel.

CONCLUSION de ltude gnrale et technique : Le prix de la fabrication des pices pour la
balance tant trop cher pour le projet nous avons cherch une autre solution. Nexistant pas
dautre moyen que la contrainte pour fabriquer une balance avec une telle prcision, nous
avons dcid avec monsieur MENARD dacheter un plateau de balance avec jauge (208 HT
au lieu de 520 HT).


V) Dveloppement technique 1
re
partie : Contexte technique

Figure 12 : Schma fonctionnel

Voir dveloppement technique 2
me
partie pour la description fonctionnelle des blocs
.
FA : Alimentation
Entre
12V
Sortie
+5V et -5V

FS1 : Pont de Wheatstone.
Entre
L4 : Grandeur physique du poids des assiettes


Rapport de stage Quentin THEROND 2011 Page 16 sur 73

Sortie
Pw: Tension analogique des capteurs de pression non traite (4 capteur de 20Kg max)

FS2 : Amplification & rglage du zro.
Entre
Pw : Tension analogique des capteurs de pression non traite (4 capteur de 20Kg max)
Sortie
Capt 1 4 : Tension analogique des capteurs de pression interprtable par le microcontrleur
(4 capteur de 20Kg max)

FS3 : Eeprom.
Entre/ Sortie (Bus)
Sda : Bus de communication pour lenregistrement dans une eeprom
Scl : Horloge

FS4 : Horloge temps rel.
Entre/ Sortie (Bus)
Sda : Bus de communication pour lhorloge temps rel
Scl : Horloge

FS5 : microcontrleur.
Entre
Capt 14 : Tension analogique des capteurs de pression interprtable par le microcontrleur (4
capteur de 20Kg max)
Sda/Scl : Bus de communication I2C avec horloge
Pgd/Pgc : Permet lenvoi du fichier HEX dans le microcontrleur
Rx(TTL) : Rception des trames UART du protocole propritaire de chez STID (w33CHP
iso7816)
Sortie
RC1 : Commande du buzzer
RD06 : Informations envoyes lafficheur.
Tx(TTL) : Envoi des trames UART du protocole propritaire de chez STID

FS6 : ICD Programmation.
Entre
L6 : Communication USB avec le PC pour lenvoi du fichier HEX.
Sortie
Pgd/Pgc : Sortie permettant lenvoi du fichier HEX dans le microcontrleur.

FS7 : Gestion son.
Entre
RC1 : Commande du buzzer
Sortie
L1 : Information sonore destine lutilisateur.

FS8 : Afficheur.
Entre
RD06 : Informations envoyes lafficheur.
Sortie
L1 : Information sonore destine lutilisateur.


Rapport de stage Quentin THEROND 2011 Page 17 sur 73

L5 : Information visuelle destine lutilisateur.

FS9 : Conversion TTL/ RS232.
Entre
Tx(TTL) : Envoi des trames UART du protocole propritaire de chez STID
Rx(RS232) : Envoi des trames en norme RS232 du protocole propritaire de chez STID
Sortie
Tx(RS232) : Envoi des trames en norme RS232 du protocole propritaire de chez STID
Rx (TTL): Envoi des trames UART du protocole propritaire de chez STID

FS10 : Lecteur RFID
Entre
L3 : Communication avec les cartes MIFARE grce un effet dinduction
Rx(RS232) : Trames RS23S du protocole propritaire de chez STID pour le lecteur RFID
Sortie
L2 : Communication avec les cartes MIFARE grce un effet dinduction
Tx(RS232) : Trames RS232 du protocole propritaire de chez STID pour le lecteur RFID

CONCLUSION sur le dveloppement technique 1
er
partie.

Pour que le systme fonctionne correctement et rponde au mieux au cahier des charges, jai
besoin des 11 fonctions ci-dessus.






























Rapport de stage Quentin THEROND 2011 Page 18 sur 73

VI) Dveloppement technique 2
me
partie : Etape de la
ralisation

Ne sachant pas encore que le prix des pices usiner serait aussi couteux, jai ralis deux
schmas diffrents pendant mon stage. Ci-dessous le schma utilis pour le cblage du
prototype et en annexe le 1
er
schma ralis.

Figure 13 : 2
me
schma ralis (utilis pour le prototype)


Rapport de stage Quentin THEROND 2011 Page 19 sur 73

6.1) Liste des composants
55 Resistors


Quantity: References Value Prix HT

2 R1, R46 10k 0.2

8
R2, R3, R14, R15, R26, R27, R38,
R39 22k 0.8

20
R4, R9, R10, R12, R13, R16, R21,
R22, R24, R25, R28, R33, R34, R36,
R37, R40, R45, R48, R54, R55 1k 2

8
R5, R6, R17, R18, R29, R30, R41,
R42 2.2k 0.8

8
R7, R8, R19, R20, R31, R32, R43,
R44 68k 0.8

4 R11, R23, R35, R51 60 0.4

2 R47, R50 470 0.2

1 R49 10 0.1

2 R52, R53 4.7k 0.2

40 Capacitors


Quantity: References Value


5 C1-C4, C43 0.1uF 0.5

2 C5, C6 18pF 0.2

20
C7, C9, C10, C15-C21, C28, C29,
C32-C39 100nF 2

2 C8, C27 100uF 0.2

9 C11-C14, C23-C26, C30 10uF 0.9

2 C22, C31 1nF 0.2

12 Integrated Circuits


Quantity: References Value


1 U1 MAX232 1.2

1 U2 PIC18F4520 6.5

1 U3 7805 1

1 U4 7809 1

4 U5-U7, U12 TL084 34

1 U8 7905 1

1 U9 ICL7660 3

1 U10 DS1307 3.5

1 U11 24LC256 3.5


Rapport de stage Quentin THEROND 2011 Page 20 sur 73


1 Transistors


Quantity: References Value


1 Q13 2N2222 0.1

10 Diodes


Quantity: References Value


4 D1-D4 1N749A 8

4 D5-D8 1N4148 0.5

2 D10, D12

0.5

35 Miscellaneous


Quantity: References Value


1 BUZ1 BUZZER 1.5

9 J1, J3, J13, J18, J20, J27-J29, J39 CONN-H4 1

1 J2 ALIM +12V 0.1

1 J7 programmation 0.2

1 J8 quartz 0.2

1 J9 VBat 1.5

1 J10 CONN-H5 0.2

2 J11 CONN-SIL3 0.2

1 LCD1 LCD122 15

1 X1 CRYSTAL 0.2

4 Plateau balance JAUGE 832

1 Lecteur rfid RFID 76


TOTAL HT:

974



Pour raliser le schma et le typon, jai
utilis la suite Protus avec des logiciels Isis
et Ares. Comme beaucoup des composants
utiliss navaient pas dempreinte, je les ai
conu moi-mme.

Figure 14 : ARES



Rapport de stage Quentin THEROND 2011 Page 21 sur 73

6.2) Alimentation linaire
La fonction alimentation permet de crer, grce une tension dentre de 12V, du +9V, +5V,
0V et du -5V en sortie. Lalimentation 9V permet dviter de mettre un amplificateur rail to
rail qui aurait augment sensiblement le cot du dispositif.

Figure 15 : Alimentation

C8, C27 : Condensateurs chimiques polariss. Ils ralisent le filtrage.
C9, C10 C28, C29, C20 : Condensateurs plastiques, servent dantiparasite pour
supprimer les hautes frquences (ils sont conseills dans la documentation technique).
C30 : Condensateur chimique polaris.
U3 : 7805 rgulateur 5V il permet de rguler la tension dentre 9V DC en une tension
de 5V DC. Daprs la documentation constructeur du 78XX il faut une tension
dentre minimum de la tension de sortie plus Vdrop (2V), soit Ve = Vs + Vdrop = 5 +
2 = 7V minimum, pour un bon fonctionnement du rgulateur.
U4 : 7809 rgulateur 9V il permet de rguler la tension dentre 12V DC en une
tension de 9V DC.
U9 : ICL7660 inverseur de tension il permet dinverser une tension 12V en -12V.
U8 : 7905 rgulateur -5V il permet de rguler la tension dentre -12V DC en une
tension de -5V DC.
R47, D10 : informe de ltat de lalimentation.


Calcul dun radiateur : Hypothse : Isystme = 200mA

Pmax(+ou-5V) = (Tj Ta)/RTHja = (125-25)/65 = 1,5W
Putil(5V) = Isystme*(Ve-Vs) = 200*10^-3*(12-5) = 1,4W
|Putil(-5V)| = Isystme*(Ve-Vs) = 200*10^-3*(-10+5) = 1W

Conclusion : Putil<Pmax, lutilisation dun radiateur pour les rgulateurs nest pas
indispensable temprature ambiante.



Rapport de stage Quentin THEROND 2011 Page 22 sur 73


6.3) Pont de Wheatstone avec jauge de contrainte
Cette fonction permet de fabriquer quatre capteurs de pression. Chaque pont comporte quatre
jauges de contrainte qui varient en fonction de la dformation des matriaux sur lequel est
pose la jauge. Un capteur quatre jauges permet d'avoir une meilleure prcision qu'un
capteur une jauge. Le pont de Wheatstone est ncessaire pour pouvoir mesurer les variations
des rsistances dues leur trop faible variation.

Figure 16 : jauge de contrainte en pont

J : jauge de contrainte place aux quatre extrmits de chaque plateau de la balance. Il
est important quelles soient toutes relies avec des fils de mme longueur et torsads.


6.4) Traitement du signal
La partie traitement du signal permet dalimenter et damplifier la tension fournie par le pont
de Weatstone tout en minimisant le bruit. Cette fonction permet aussi de rgler le 0Volt pour
calibrer la contrainte subie par le matriel au repos.

1
ere
solution :

Figure 17 : Traitement de signal


Rapport de stage Quentin THEROND 2011 Page 23 sur 73

R38, R39 : permet lamplification du pont de Weatstone rglable de 5 10000 en
boucle ferme. Gain = 1 + R39/R38.
R40 R43, POT 10K, D7 et D8 permet de rgler le 0Volt pour calibrer la contrainte
subie par le matriel au repos. Les 1N827 sont des diodes zener compensation de
temprature. ADJ = 6.2xR41/(R40+R41)
Q10 Q12, R35 R37 : cette structure forme un amplificateur de courant pour
lalimentation des jauges de contrainte.
U7 : Un amplificateur spcialement adapt est compatible avec les jauges de
contrainte standard. Son avantage est :
-Grande vitesse
-Pas d'alimentation flottant ncessaire
-Absence d'effets de mode commun
-Une trs grande stabilit
-Un Faible bruit

2
me
solution :

Aprs avoir reu le plateau de la balance et avoir mesur les variations de tension en sortie du
pont, jai dcid de refaire le schma de la partie traitement du signal pour une meilleur
matrise des rsultats.


Figure 18 : Traitement de signal

C32, C33 : ces deux condensateurs permettent de filtrer la sortie. Voire ci-dessous les
deux relevs des oscillogrammes de sortie avec et sans condensateur.


Rapport de stage Quentin THEROND 2011 Page 24 sur 73


Figure 19 : Sans condensateur

Figure 20 : Avec condensateur

U49, U50, R2 R4 : Forme un amplificateur
dinstrumentation. Nutilisant pas un amplificateur
dinstrumentation intgr jai choisi le OPA177 car il a
une drive doffset de 0,3uV/C
Gain = ((R3xR2+R4)/R4) = 45
Fonction de transfert = V49-V50 = (Vbleu-Vmarron) x
((R3xR2+R4)/R4)
U51, R5 R8 : Amplificateur diffrentiel. Permet de
multiplier la diffrence de potentiel entre V49 et V50.
Gain = R7 / R6 = 31
V51 = (V40 V50)x(R7 / R6)
U5D ; R9 R13 ; D1, D5, D9 : Amplificateur
diffrentiel. La tension V51 varie de
-0,98 4,3V. Cette amplificateur diffrentiel associ
une diode zener permet de recentrer la tension sur 0,
+5,2V.
Gain = 1
V52 = (4.3 V51)x(R12 / R13)


Figure 21 : Simulation,
ralis avec dautre valeur

Pour effectuer les tests jai utilis, un AOP TL084 mais celui-ci avait une drive
doffset sur 4C de 100mV (amplifi) en sortie alors que lAOP OPA177 a une
variation de 1,4mV.
On peut remarquer que mme filtre la tension de sortie (Figure 20) nest pas
totalement droite. Mme si les piques de tension sont trop petits pour tre interprts
par le convertisseur A-N (rsolution de 5mv) jai choisi de faire pour lacquisition du
signal une moyenne sur 50 point dacquisition.



Rapport de stage Quentin THEROND 2011 Page 25 sur 73

Tension en fonction du poids :

Le graphique ci-dessous illustre la tension de sortie en fonction du poids. On remarque quelle
est totalement linaire on pourra conter facilement les assiettes grce la relation suivante :
Nombres dassiette = Vud / calibrage.
Exemple : si Vud = 1,32v = 264bits pour le ADC et que calibrage = 0,235v = 47bits on a :
Nombres dassiette = 264/47 = 5 assiettes sur notre plateau.


Figure 22 : Droite de Vud en fonction du poids (0-10Kg ; 0-5V)



6.5) Eeprom & Horloge temps rel
Cette fonction assure grce un bus I2C la communication entre le microcontrleur, leeprom
et lhorloge temps rel.

Figure 23 : EEPROM & horloge temps rel

U10 : Le DS1307 est une horloge temps rel (Real Time Clock), qui fournit secondes,
minutes, heures, jours, dates, mois et annes grce un bus I2C.
0
2
4
6
8
10
12
0,029 1,3 2,565 3,79 5,02
Srie1


Rapport de stage Quentin THEROND 2011 Page 26 sur 73

U11 : Le 24LC256 est une PROM effaable lectriquement (EEPROM), capable de
travailler avec une large gamme dalimentation 1,8 5,5V grce un bus I2C.
C43 : Le condensateur plastique sert dantiparasite pour supprimer les hautes
frquences
Quartz : horlogerie de frquence nominale 32,768 kHz
J9 : Pile de sauvegarde, au lithium 3 V / 48 mAh, la date et l'heure sont conserves
pendant plus de 10 ans en l'absence dalimentation principale

6.6) Afficheur
Il permet laffichage sous forme digitale des informations destination de lutilisateur.
Lcran choisi est un LCD 2x24 avec rtro clairage. Lempreinte de ce composant nexistant
pas sur Ares, jai du la crer.


Figure 24 : LCD

Description des broches de lafficheur LCD

7 14 : D0 D7 : Bus de donnes. Dans notre cas le bus est sur 4 bits de D4 D7
6 : E : Entre de validation (ENABLE); elle est active sur front descendant. Lorsque
E=0 les entres du bus de l'afficheur sont l'tat haute impdance.
5 : R/W: Lecture ou criture. (READ/WRITE). Lorsque R/W est au niveau bas,
l'afficheur est en mode "criture", et lorsque R/W est au niveau haut, l'afficheur est en
mode "lecture".
4 : RS: Slection du registre. (REGISTER SELECT). Grce cette broche, l'afficheur
est capable de faire la diffrence entre une commande et une donne. Un niveau bas
indique une commande et un niveau haut indique une donne.
3 : VLC : Cette tension permet le rglage du contraste de l'afficheur.
2 : VCC : +5V
1 : GND : Masse.




Rapport de stage Quentin THEROND 2011 Page 27 sur 73

6.7) Microcontrleur

Il assure grce un traitement programm (logiciel microcontrleur), lacquisition, le traitement
et la restitution des informations. Jai choisi ce microcontrleur car il possde une mmoire de
programme de 32Koctets, une mmoire de donne de 256 octets, de nombreux ports
dentres/sorties, 13 ADC sur 10bits pour la conversion analogique des jauges de contrainte et
une communication UART pour le dialogue avec le lecteur RFID. Il possde galement un
bus I2C pour la communication avec une eeprom externe et une horloge temps rel.

Figure 25 : Microcontrleur

J20 23 : permet de connecter la sortie du traitement du signal au microcontrleur. Ne
connaissant pas encore exactement la sortie, ces quatre Switch sont l pour permettre
ladaptation du signal sur une autre carte avant dtre renvoy au microcontrleur si
besoin.
C7 : Condensateur plastique, sert dantiparasite pour supprimer les hautes frquences.
X1, C5, C6 : structure de quartz et condensateurs permettant de crer une horloge pour
le microcontrleur.
R52, R53 : Resistance de pull-up pour le bus I2C
U2 : Le PIC18F4520 est une architecture tendue base sur la famille des PIC18F452
il offre de nouvelles fonctionnalits comme : un jeu d'instructions tendues, des modes
de gestion de l'alimentation, une vitesse plus leve au niveau du ADC, lUSART a
t renforc et bien dautres nouveauts.



Rapport de stage Quentin THEROND 2011 Page 28 sur 73

Dfinition des entres, sorties du microcontrleur
Entres :

AN0 AN3 : Entres analogiques avec une rsolution 10bits, elle permet de convertir la
tension analogique fournie par lamplificateur de jauge en signal numrique interprtable par
le microcontrleur.
RX : Permet la rception des trames UART pour la communication avec le lecteur de carte
RFID.
SDA : Permet la communication avec leeprom et lhorloge temps rel grce un bus I2C
OSC1, OSC2 : Entres dhorloge relie loscillateur quartz
MCLR : Entre permettant la remise zro du microcontrleur.
PGD : Broche permettant la programmation du microcontrleur.
PGC : Broche permettant la programmation du microcontrleur.

Sorties :

RC1 : Commande du buzzer
RC2 : Commande de la LED D12 pour la maintenance
RD0 RD6 : Commande permettant la communication avec le LCD
SDA : Permet la communication avec leeprom et lhorloge temps rel grce un bus I2C
SCL : Horloge pour le bus I2C
TX : Permet la transmission des trames UART pour la communication avec le lecteur de carte
RFID.


6.8) Buzzer
La fonction buzzer permet dinformer lutilisateur grce un signal sonore.

Figure 26 : Buzzer

R46 : Resistance de 100K pour assurer un facteur de saturation du transistor de 10.
Q13 : Transistor NPN fonctionnant en commutation pour commander le buzzer.
BUZ1 : le buzzer cre un signal sonore pour avertir lutilisateur en cas de problme.


6.9) Programmation
Cette fonction permettant la connexion dun ICD pour la programmation du microcontrleur.


Rapport de stage Quentin THEROND 2011 Page 29 sur 73


Figure 27 : Programmation

J7 : permet la connexion et lenvoi du fichier HEX programmer dans le
microcontrleur.
R1 : permet de fixer un potentiel de 5v sur MCRL pour empcher le reset du
microcontrleur.

6.10) Communication RS232
Cette fonction permet de raliser la liaison RS232 vers des circuits TTL. Il gnre les tensions
ncessaires la norme RS232 de l'ordre +10V/-10V partir de 5V en utilisant uniquement
des condensateurs externes.


Figure 28 : MAX232

U1 : Le max 232 est un circuit permettant de faire une conversion bipolaire des
signaux TTL et RS232.
C1, C3 : servent de doubleur de tension
C2, C4 : servent dinverseur de tension



Rapport de stage Quentin THEROND 2011 Page 30 sur 73

6.11) Typon
Tous les typons ont t faits la main.
Top copper :

Figure 29 : Typon top copper

Bottom copper :

Figure 30,31 : Typon bottom copper

6.12) Vue 3D du future prototype


Figure 32 : Typon 3D
Aprs avoir fini le typon, nous avons fait
faire un devis avec un collgue
technicien chez J3T et PCB lectronique
pour connaitre le prix dune carte. J3T
nous a propos un devis de 450 pour la
carte. Le prix tant trop lev pour le
cot de revient du prototype. Jai ralis
un typon plus petit sans la partie
traitement du signal.

La carte de prototype sera donc en trois parties :

-pont de Weatstone
-traitement du signal
-le reste (microcontrleur, eeprom, RS232, horloge temps rel, affichage)



Rapport de stage Quentin THEROND 2011 Page 31 sur 73


Figure 33 : Typon en simple face

Finalement aprs avoir tout test et cbl jai ralis, un troisime typon en double face pour
faire tirer la carte en grande srie. PCB lectronique nous a adress un devis de 234,85 HT
pour 5 cartes.

Figure 34 : Typon final double face top copper et bottom copper


6.13) Programmation


Jai ralis la partie programmation
grce au logiciel gratuit MPLAB
fourni par MICROCHIP. Ce
logiciel est un outil de
dveloppement permettant de
programmer des microcontrleurs
de type PIC en langage C ou en
assembleur.


Figure 35 : MPLAB


Rapport de stage Quentin THEROND 2011 Page 32 sur 73


Figure 36 : ICD2

Jai utilis avec le logiciel MPLAB le programmateur
MPLAB ICD2 qui permet denvoyer le fichier compil
(.HEX) dans le microcontrleur.

Apres avoir cr un nouveau projet avec MPLAB et avant de commencer programmer, jai
adapt ou cr toutes les bibliothques inclure (pour le PIC18F4520) dont javais besoin
pour raliser le programme.
p18f4520.h
main.h
lcd.h
usart.h
ADC.h
i2c.h
i2c2.h
delay.h
ds1307.h
eeprom24lc.h

Une fois les fichiers inclus et la compilation faite sans erreur, jai ralis les algorithmes du
programme.

Figure 37 : Algorithme et description du programme principal (main)



Rapport de stage Quentin THEROND 2011 Page 33 sur 73

Jai cr lalgorithme du programme principal de manire prendre en compte un maximum
derreurs que lutilisateur peut faire de manire consciente ou inconsciente. Exemple des
contrles pris en compte:

- Cohrence du badge
- Contrainte sur la balance
- Prise dassiette sans crdit ou sans carte
- Carte non formate
- Compteur max diffrent de 0 et inferieur 56
- Compteur > compteur max
- Code site faux
- Date errone
- Dtection dune ou plusieurs assiettes
-

Lalgorithme principal comporte aussi une machine 2 tats qui permet daccder au menu
du systme. Celui-ci comporte une machine quatre tats (rglage de lheure, rglage code
site, recharge assiette, calibrage).


Exemple de fonction ralise :

La fonction ci-dessous permet louverture de la session de la carte MIFARE grce la
communication UART



void MIF_Open_Session(void)
{

USARTWriteByte(0x80);
USARTWriteByte(0xA2);
USARTWriteByte(0x00);
USARTWriteByte(0x00);
USARTWriteByte(0x04);

while(USARTReadByte()!=0xA2);

for(Badge.inc=1;Badge.inc<5;Badge.inc++)
{USARTWriteByte(Badge.NumKey[Badge.inc]);}

while(USARTReadByte()!=0x00);
}


Figure 38 : Algorithme


La fonction ci-dessous permet lacquisition de lheure et de la date grce un bus I2C



Rapport de stage Quentin THEROND 2011 Page 34 sur 73


Figure 39 : Algorithme
void acq_horloge(void)
{
Horloge.sec = lire_ds1307(0x00);
Horloge.min = lire_ds1307(0x01);
Horloge.heu = lire_ds1307(0x02);
Horloge.jour = lire_ds1307(0x03);
Horloge.date = lire_ds1307(0x04);
Horloge.mois = lire_ds1307(0x05);
Horloge.annee = lire_ds1307(0x06);

if((Horloge.heu==0x23)&&(Horloge.min==0x59)&&(Horloge.sec>
0x50))
{
Horloge.date_hier = lire_ds1307(0x04);
Horloge.mois_hier = lire_ds1307(0x05);
Horloge.annee_hier = lire_ds1307(0x06);
}
}

La premire fonction ci-dessous tourne en boucle tant que lon dtecte le badge. Elle fait
sonner le buzzer une fois pour signaler lutilisateur quil peut retirer sa carte du lecteur. La
deuxime fonction est identique mais elle fait biper le buzzer tant que lutilisateur ne retire
pas sa carte. Elle est appele en cas de problme. Exemples : mauvais badge, code site faux,
etc.

void Attente(void)
{
PORTCbits.RC1 = 1;
DelayMs(80);
PORTCbits.RC1 = 0;
do{affichage_H_date();
MIF_Scan();
Lire_RFID();
}while(Badge.ok==vrai);
}

void Attente_erreur(void)
{
do{affichage_H_date();
PORTCbits.RC1 = 1;
DelayMs(150);
PORTCbits.RC1 = 0;
MIF_Scan();
Lire_RFID();
}while(Badge.ok==vrai);
}


Figure 40: Algorithme

La fonction ci-dessous permet denvoyer les valeurs de lhorloge grce un bus I2C aux
adresses indiques dans la datasheet de lhorloge temps rel.
void Chargement_horloge(void)
{
ecrire_ds1307(0x07,0b00010000);
ecrire_ds1307(0x00,Horloge.sec);
ecrire_ds1307(0x01,Horloge.min);
ecrire_ds1307(0x02,Horloge.heu);
ecrire_ds1307(0x03,Horloge.jour);
ecrire_ds1307(0x04,Horloge.date);
ecrire_ds1307(0x05,Horloge.mois);

Figure 41 : Tableau de commande


Rapport de stage Quentin THEROND 2011 Page 35 sur 73

ecrire_ds1307(0x06,Horloge.annee);
}


La fonction affichage_H_date permet de rcuprer la date et lheure stockes dans lhorloge
temps rel en hexadcimal puis de la convertir en DCB et de lafficher.

void affichage_H_date(void)
{
UC8 txt29[2] = ":";
UC8 txt30[2] = "/";
UC8 txt31[2] = " ";
UC8 conversion_DCB=0;

acq_horloge();
LCDLine1();
conversion_DCB = Horloge.heu/16;
Bin2BCD(conversion_DCB);
LCDwrite(Least_Sig_Byte);
conversion_DCB = Horloge.heu%16;
Bin2BCD(conversion_DCB);
LCDwrite(Least_Sig_Byte);
text_display(txt29);
conversion_DCB = Horloge.min/16;
Bin2BCD(conversion_DCB);
LCDwrite(Least_Sig_Byte);
conversion_DCB = Horloge.min%16;
Bin2BCD(conversion_DCB);
LCDwrite(Least_Sig_Byte);
text_display(txt31);
conversion_DCB = Horloge.date/16;
Bin2BCD(conversion_DCB);
LCDwrite(Least_Sig_Byte);
conversion_DCB = Horloge.date%16;
Bin2BCD(conversion_DCB);
LCDwrite(Least_Sig_Byte);
text_display(txt30);
conversion_DCB = Horloge.mois/16;
Bin2BCD(conversion_DCB);
LCDwrite(Least_Sig_Byte);
conversion_DCB = Horloge.mois%16;
Bin2BCD(conversion_DCB);
LCDwrite(Least_Sig_Byte);
text_display(txt30);
conversion_DCB = Horloge.annee/16;
Bin2BCD(conversion_DCB);
LCDwrite(Least_Sig_Byte);
conversion_DCB = Horloge.annee%16;
Bin2BCD(conversion_DCB);
LCDwrite(Least_Sig_Byte);
DelayMs(50);
}



Figure 42 : Algorithme
La fonction ci-dessous permet de rcuprer et de stocker les informations dun block dans un
tableau. Cette fonction est importante car on ne peut pas crire quun seul octet dans un bloc il
faut rcrire tout le bloc. On rcupre donc le bloc, on change les octets que lon veut et on
renvoie le bloc.


Rapport de stage Quentin THEROND 2011 Page 36 sur 73


void Lire_RFID_BLOCK(void)
{

Badge.pas_bon=0;

if(USARTReadByte()==0xB2)
{
for(Badge.inc=1;Badge.inc<18;Badge.inc++)
{
Badge.acquisition_donnee[Badge.inc] =
USARTReadByte();
}

while(USARTReadByte()!=0x00);

}else
{
USARTReadByte();
Badge.pas_bon=1;}}


Figure 43 : Algorithme


Rapport de stage Quentin THEROND 2011 Page 37 sur 73


Figure 44 : Algorithme
La fonction protocole_monetaire
permet dcrire les informations
importantes pour le paiement dans
les blocks de la carte MIFARE
concerne (voir protocole pour
connaitre les blocks). Lalgorithme
nest pas accompagn du programme
car ces informations sont
confidentielles.
La premire partie permet de trouver
le bon bloc. La deuxime permet de
trouver quels octets doivent tre
remplacs dans le bloc. On peut aussi
remarquer que la fonction tourne en
boucle tant que lon ne dpasse pas
Badge.total[0]. Le tableau
Badge.total contient la valeur du
nombre dassiette(s) pris par
lutilisateur. Exemples : si
lutilisateur prend cinq assiettes,
alors on excutera le protocole de
paiement cinq fois.

CONCLUSION sur le
dveloppement technique 2
me

partie : La conception de cette partie
a t trs intressante car en plus de
mettre en uvre de nombreuses
connaissances vues en cours, jai t
entrepris des recherches pour savoir
comment raliser une balance,
comment fonctionne le bus I2C,
viter les drivs doffset, etc. Jai
donc acquis de nouvelles
connaissances. Jai galement
constat que le cot de fabrication
dune carte lectronique est
important dans le prix de revient
dun prototype. Cela est du aux
pertes importantes de matire
premire pour la conception dune
seule unit. Cest pourquoi il ny a
que 10 euros de diffrence entre une
et cinq carte(s). Il faut compter 450
pour faire une carte et 460 pour 5
cartes.



Rapport de stage Quentin THEROND 2011 Page 38 sur 73

VII) Dveloppement technique 3me partie : Tests / suivi /
volution

Figure 45 : Cblage du prototype


Figure 46 : Cblage du prototype zoom
- Microcontrleur
- LCD 2x24
- Buzzer
- Contraste
- Horloge temps rel
- Lecteur RFID
- Badge MIFARE
-assiettes (0,4Kg)
-Plateau de la balance
-Amplification et rglage du
zro


Rapport de stage Quentin THEROND 2011 Page 39 sur 73

Aprs avoir cbl le maximum dlments du systme sur une platine, jai test le programme
pour voir sil tait conforme au cahier des charges. Jai galement snif les trames
envoyes et reues grce un logiciel que SYMOTRONIC ma fourni. Cela ma permis de
remarquer que certains octets communiquaient en mme temps. Mme si cela ne posait pas de
problme dans la pratique, jai modifi le programme pour que le dialogue se droule sans
quil y ait denvoi et de rception en mme temps par les deux systmes communiquants.

Figure 47 : Ecran principal (affichage de lhorloge temps rel et attente dun badge)

Vrification des trames envoyes et reues :

Carte ok mais pas dassiette prise :


Figure 48 : Dtection badge

Carte ok avec prise dassiette :

Une fois lassiette prise, incrmentation du compteur puis suite du protocole dans les
diffrents blocs concerns.




- Dtection de la carte
MIFAR
- Block contenant les
informations utilisateur
et le protocole de
paiement
Incrmentation du compteur aprs la
prise dassiette.


Rapport de stage Quentin THEROND 2011 Page 40 sur 73

Mauvaise carte :

La dtection dune mauvaise carte se fait quand lon dtecte une erreur dans le protocole.



Figure 49 : Dtection dun mauvais badge

Rglage de lheure :

Le rglage de lheure et de la date se fait grce un badge prvu cet effet. Un protocole a
t tabli spcifiquement pour accder au menu du systme.


Figure 50 : Rglage de lheure

Recharge dassiette(s)

La recharge dassiette est possible grce au badge qui permet daccder au menu. Cette partie
permet de recharger les assiettes et dafficher leur nombre sur lcran LCD. Voir photo ci-
dessous.

Erreur dans le protocole


Rapport de stage Quentin THEROND 2011 Page 41 sur 73


Ci-dessous est prsent le plateau de la balance avec les jauges de contrainte

Figure 51 : Le plateau de la balance

Sachant quil faut compter 520 pour raliser les quatre pices daluminium nous
avons dcid dacheter un plateau dj tout fait. Pour ce faire jai t en contact avec deux
entreprises, Bizerba et Kern. La premire nous a propos des plateaux avec une sortie
analogique entre 0 et 5V proportionnelle au poids pour 1000 le plateau. Soit 4x1000=4000
pour les plateaux dun systme. Kern nous a propos des plateaux sans traitement pour 208
soit 832 pour un systme. Le devis de Kern tant plus adapt notre budget, nous avons
choisi dacheter un plateau chez ce constructeur.

Ce plateau comporte en sortie la tension analogique du pont de Wheatstone qui est
directement reli la carte lectronique. La tension est ensuite traite pour donner une droite
entre 0 et 5V proportionnelle au poids puis reli au convertisseur ADC du microcontrleur. La
conversion analogique permet au programme de compter les assiettes grce au code ralis.
Une fois que lon dtecte le nombre dassiettes prises sur le plateau, on va aller lcrire sur la
carte grce la communication UART. Pour vrifier que lcriture sest bien droule avec
les bons octets aux bons endroits, jai utilis le mme appareil que SYMOTRONIC ma prt
en dbut de stage pour lire les informations. Aprs avoir remarqu quelques erreurs jai,
modifi mon code et refait les tests jusquau respect du cahier des charges.




- Les jauges colles sur
les pices
daluminiums.
- Le pont de Wheatstone
- Fil dalimentation


Rapport de stage Quentin THEROND 2011 Page 42 sur 73

VIII) CONCLUSION TECHNIQUE :

A la date de remise de mon rapport, jai pu tester la quasi totalit du systme. Laccs au
menu fonctionne correctement. Jai pu changer le code site, la date et lheure, la recharge des
assiettes et faire le calibrage du systme. Jai galement test la prise dassiette et lcriture du
protocole dans la carte en fonctionnement nominal. Il me reste encore faire lcriture et la
lecture dans leeprom en cas de coupure de courant. Je devrais recevoir le typon le 22 juin. Il
me restera assembler le prototype avant de linstaller sur site le 24 juin. La russite de mon
projet se dtermine par une conformit au cahier des charges et des tests exhaustifs de la
partie hardware. Le software pourra subir de lgres modifications.

La ralisation de ce systme ma permis de passer en revue toutes les phases dun projet
en commenant par ltablissement du cahier des charges, ltude, la ralisation jusquaux
tests. Jai tudi des protocoles de communication, des lecteurs RFID, les logiciels. Jai faire
preuve dautonomie, dinitiative, desprit critique et dorganisation afin dtre le plus efficace
possible pour achever mon travail avec succs.

Grce ce stage, jai amlior mes connaissances en lectronique et en programmation.
Jai acquis des connaissances dans la communication I2C et dans le domaine des
amplificateurs oprationnels ainsi que dans les mthodes utilises pour la fabrication de
systme de prcision, jauge de contrainte et pont de Wheatstone.


IX) CONCLUSION GENERALE :

Ces dix semaines de stage pass chez SYMOTRONIC mont apport beaucoup plus que
des connaissances techniques. Depuis mon BEP dlectronique, je navais jamais eu
loccasion de mettre profit mes connaissances dans le monde professionnel. Ce stage ma
confort sur le dans le choix du domaine professionnel que jai fait six ans en arrire. A
lissu de ce premier cycle dtudes suprieures je souhaite plus que jamais poursuivre mes
tudes en cole dingnieur en lectronique.

Jai galement remarqu quavoir de bonnes connaissances techniques nest pas suffisant
pour la ralisation dun projet et quil faut savoir faire preuve de polyvalence : Discussion
avec le client, appel doffre et ngociation des prix avec les fournisseurs et rdaction de
documents. Cette exprience ma amene considrer limportance des changes relationnels.

Jai eu lopportunit de faire mon stage dans une petite entreprise. Cela ma permis de
voir quel poste chaque personne occupait et en quoi chacun tait important pour le bon
fonctionnement de lentreprise.

Pour finir, je retiens que pour envisager une carrire dans le mtier qui me passionne, je
ne devrai minvestir dans mon travail, accepter les dplacements voire les missions
ltranger, mamlior dans lcriture des dossiers et la pratique de langlais. Jai constat que
la qualit de lenseignement de lIUT ma permis de madapter rapidement au milieu
professionnel et diffrentes mthodes de travail.




Rapport de stage Quentin THEROND 2011 Page 43 sur 73










Sommaire des annexes

1
er
schma ralis 43

Datasheet: LCD 44

Datasheet: EEPRPM 45

Datasheet: PIC18F4520 47

Datasheet : Horloge temps rel 47

Datasheet : Jauge de contrainte 48

Datasheet : Buzzer 51

Devis PCB 52

Datasheet : Inverseur de tension 53

Datasheet : MAX232 54

Le programme intgral 55




Rapport de stage Quentin THEROND 2011 Page 44 sur 73

1
er
schma ralis






Rapport de stage Quentin THEROND 2011 Page 45 sur 73

Datasheet : LCD






Rapport de stage Quentin THEROND 2011 Page 46 sur 73

Datasheet : EEPROM




Rapport de stage Quentin THEROND 2011 Page 47 sur 73





Rapport de stage Quentin THEROND 2011 Page 48 sur 73

Datasheet : PIC18F4520

Datasheet : Horloge temps rel




Rapport de stage Quentin THEROND 2011 Page 49 sur 73

Datasheet : Jauge de contrainte



Rapport de stage Quentin THEROND 2011 Page 50 sur 73




Rapport de stage Quentin THEROND 2011 Page 51 sur 73




Rapport de stage Quentin THEROND 2011 Page 52 sur 73

Datasheet : Buzzer




Rapport de stage Quentin THEROND 2011 Page 53 sur 73

Devis PCB




Rapport de stage Quentin THEROND 2011 Page 54 sur 73


Datasheet : Inverseur de tension









Rapport de stage Quentin THEROND 2011 Page 55 sur 73


Datasheet : MAX232



Rapport de stage Quentin THEROND 2011 Page 56 sur 73

Le programme intgral : ne contient pas les includes.
/*********************************************************************
Configuration du micro
OSC = oscillateur
WDT = watchdog
*********************************************************************/
#pragma config OSC = HS
#pragma config WDT = OFF

/*********************************************************************
Bibliothque
*********************************************************************/
#include <p18f4520.h>
#include <main.h>
#include <lcd.h>
#include <usart.h>
#include <07 ADC.h>
#include <i2c.h>
#include <i2c2.h>
#include <delay.h>
#include <ds1307.h>
#include <eeprom24lc.h>

/*********************************************************************
Definition type
*********************************************************************/
typedef unsigned char UC8;
typedef char C8;
typedef unsigned int UI16;
typedef int I16;
typedef unsigned float UF16;
typedef float F16;

/*********************************************************************
Definition
*********************************************************************/
#define vrai 1
#define faux 0
#define UID_recharge2 0xFF
#define UID_recharge1 0xFF
#define vert 0
#define rouge 1
#define sel_num 0x01

/*********************************************************************
Fonction
*********************************************************************/
void temps4s(void);
void InterruptHandlerHigh(void);
void Config_d_interuption(void);
void Acquisition_CAN(void);
void Initialisation_structure(void);
void MIF_Scan(void);
void MIF_Read_UID(void);
void MIF_loadkeya(void);
void MIF_Open_Session(void);
void MIF_Close_session(void);
UC8 MIF_Read_Block(UC8 block);
void MIF_Write_Block(UC8 block);


Rapport de stage Quentin THEROND 2011 Page 57 sur 73

void Lire_RFID(void);
void utilisateur(void);
void Lire_RFID_BLOCK(void);
void Bin2BCD (unsigned char);
void Affiche_ID(void);
void Affiche_recharge(void);
void acq_horloge(void);
void affichage_H_date(void);
void Attente(void);
void Attente_erreur(void);
void servez_vous(void);
void Chargement_horloge(void);
void Menu_systeme(void);
void assiette_actu(void);
void assiette_prec(void);
void PCD_output(UC8 couleur);
void protocole_monaitaire(void);
void Lire_RFID_autre_BLOCK(void);
void MIF_Write_autre_Block(UC8 block);
void calibrage(void);
void affichage_nbautilisateur(void);

/*********************************************************************
Structure
*********************************************************************/
struct capteur
{
UI16 capt1;
UI16 capt2;
UI16 capt3;
UI16 capt4;
UC8 choix;
UC8 erreur;
UC8 assiette1;
UC8 assiette1_pr;
I16 pourcent_erreur[2];
UI16 calibre[3];
UI16 moyenne[50];
UC8 diviseur_lin;
};

struct RFID
{
UC8 acquisition_donnee[20];
UC8 acquisition_autre_donnee[20];
UC8 inc;
UC8 type;
UC8 prestation;
UC8 total[2];
UC8 ok;
UC8 NumKey[5];
UC8 nb_possibe;
UC8 num_caisse;
UC8 code_site[2];
UC8 erreur;
UC8 pas_bon;
UC8 desk_num;
UC8 transaction;
UC8 block_monais;
};


Rapport de stage Quentin THEROND 2011 Page 58 sur 73


struct Temps
{
UC8 heu;
UC8 min;
UC8 sec;
UC8 jour;
UC8 date;
UC8 date_hier;
UC8 mois;
UC8 mois_hier;
UC8 annee;
UC8 annee_hier;
};


/*********************************************************************
Variable global
*********************************************************************/
struct capteur Gestion;
struct RFID Badge;
struct Temps Horloge;
unsigned char Most_Sig_Byte,Middle_Sig_Byte,Least_Sig_Byte;
UC8 effL2[25] = " ";

/*********************************************************************
programme principal
*********************************************************************/
#pragma code
void main()
{
UC8 txt1[10] = " Bonjour,";
UC8 txt18[23] = "mauvais badge ";
UC8 txt19[23] = "Enlever le badge ";
UC8 txt15[23] = "reposez assiette(s) ";
UC8 txt14[21] = " Erreur de badge: ";
UC8 pre[14] = "prechauffage:";
UC8 boucle=0;
UC8 i=10;
TRISA = 0b11111111;
PORTA = 0b00000000;
TRISC = 0b10011000; // portc en sortie =0, entre=1
PORTC = 0b00000000; // portc = 0

Initialisation_structure(); // initialisation des diff variables
LCDInit(); // initialisation LCD
DisplayClr(); // effacer le LCD
USARTInit(); // initialisation UART
ADC_Init(); // initialisation ADC
//Acquisition_CAN(); // acquisition des 4 ports analogique
i2c_init(); // init i2c

Chargement_horloge();
affichage_H_date();
text_display(txt1);
PCD_output(vert);

for(i=10;i>0;i--)
{LCDLine2();
text_display(pre);


Rapport de stage Quentin THEROND 2011 Page 59 sur 73

Bin2BCD(i);
LCDwrite(Most_Sig_Byte);
LCDwrite(Middle_Sig_Byte);
LCDwrite(Least_Sig_Byte);
DelaySec(1);
}

while(1)
{
do{
if(Badge.pas_bon==1)
// =1 mavais badge
{MIF_Close_session();
LCDLine2();
text_display(txt18);
Attente_erreur();
DelayMs(50);
Badge.pas_bon=faux;
}else{
// le badge et Ok
utilisateur();
assiette_prec();}
do{
// attente d'un badge + verification prise d'assiette
assiette_actu();
if(Gestion.assiette1>Gestion.assiette1_pr)
{
PORTCbits.RC1 = 1;
DelayMs(50);}
else
{PORTCbits.RC1 = 0;}
if((Gestion.assiette1<Gestion.assiette1_pr))
{LCDLine2();
text_display(txt15);
PORTCbits.RC1 = 1;}
else
{PORTCbits.RC1 = 0;utilisateur();}
affichage_H_date();
MIF_Scan();
//fonction d'autentification lecteur RFID
Lire_RFID(); //lire
les informations envoy par le lecteur RFID
}while(Badge.ok==faux);
Badge.ok==vrai;

MIF_Read_UID(); //fonction
lecteur RFID
MIF_loadkeya(); //fonction
chargement de la cl A
MIF_Close_session();
MIF_Open_Session();
MIF_Read_Block(4);
Lire_RFID_BLOCK();
}while(Badge.pas_bon==1);


if((Badge.acquisition_donnee[1]==UID_recharge1)&&(Badge.acquisition_donnee[2]==UID_recharge2
)) //si octets 1&2 =0xFF alors carte de rglage
{
Menu_systeme();


Rapport de stage Quentin THEROND 2011 Page 60 sur 73

Attente();
Acquisition_CAN();
}
else
{
MIF_Close_session(); //fonction de fermeture de la session
MIF_Open_Session(); //fonction d'ouverture de la session
MIF_Read_Block(4); //fonction lecture du block
Lire_RFID_BLOCK(); //lire les informations envoy par le
lecteur RFID

LCDLine2();

if((Badge.acquisition_donnee[16]==0xFC)&&(Badge.acquisition_donnee[2]>0)) // badge format ok
{

if((Badge.acquisition_donnee[6]==Badge.code_site[0])&&(Badge.acquisition_donnee[7]==Badge.code
_site[1])) // code site ok
{

if((Badge.acquisition_donnee[1])<(Badge.acquisition_donnee[2])) //compteur < compteur max
{

if(((Horloge.date_hier==Badge.acquisition_donnee[3])&&(Horloge.mois_hier==Badge.acquisition_don
nee[4])&&(Horloge.annee_hier==Badge.acquisition_donnee[5]))||((Horloge.date==Badge.acquisition_donnee[3
])&&(Horloge.mois==Badge.acquisition_donnee[4])&&(Horloge.annee==Badge.acquisition_donnee[5])))//date
J-1
{
servez_vous();
assiette_prec();

do{ affichage_H_date();

if(Gestion.assiette1>Gestion.assiette1_pr)//bip si appuis sur la balance
{
PORTCbits.RC1 = 1;
}
else{
PORTCbits.RC1 = 0;
}
MIF_Scan();
//fonction d'autentification lecteur RFID
Lire_RFID();

assiette_actu();

if((Gestion.assiette1<Gestion.assiette1_pr)||(Badge.ok==faux))
{boucle=0;}else{boucle=1;}
}while(boucle==1);
DelaySec(2);assiette_actu();

if(Gestion.assiette1<Gestion.assiette1_pr)
{
MIF_Close_session();
//fonction de fermeture de la session
MIF_Open_Session();
//fonction d'ouverture de la session
MIF_Read_Block(4);
//fonction lecture du block


Rapport de stage Quentin THEROND 2011 Page 61 sur 73

Lire_RFID_BLOCK();
//lire les informations envoy par le lecteur RFID
Badge.total[0] =
(Gestion.assiette1_pr - Gestion.assiette1);
affichage_nbautilisateur();
Badge.acquisition_donnee[1] =
(Badge.acquisition_donnee[1]+ Badge.total[0]);
MIF_Write_Block(4);
Badge.acquisition_donnee[1] =
(Badge.acquisition_donnee[1]-Badge.total[0]);
protocole_monaitaire();
DelaySec(2);
}
LCDLine2();
text_display(txt19);
Attente();
}else
{
text_display(txt14);
Bin2BCD(4);
LCDwrite(Least_Sig_Byte);
Attente_erreur(); }
}else
{
text_display(txt14);
Bin2BCD(3);
LCDwrite(Least_Sig_Byte);
Attente_erreur();
}
}else
{
text_display(txt14);
Bin2BCD(2);
LCDwrite(Least_Sig_Byte);
Attente_erreur();}
}else
{
text_display(txt14);
Bin2BCD(1);
LCDwrite(Least_Sig_Byte);
Attente_erreur();
}
}
}
}

/*********************************************************************
Fonction permettant d'crire dans les bons blocks (voire protocole
AGAPES application 20090311)
*********************************************************************/
void protocole_monaitaire(void)
{
UC8 sortie,i=0;

do
{i++;
sortie=0;
Badge.inc=0;
Badge.block_monais=5;
Badge.acquisition_donnee[1]++;


Rapport de stage Quentin THEROND 2011 Page 62 sur 73

do{
if((Badge.acquisition_donnee[1]>=(1+Badge.inc))&&(Badge.acquisition_donnee[1]<=(4+Badge.inc)))
{
sortie=vrai;
}
else
{
Badge.block_monais++;

if((Badge.block_monais==7)||(Badge.block_monais==11)||(Badge.block_monais==15)||(Badge.block_
monais==19))
{Badge.block_monais++;}
Badge.inc=Badge.inc+4;
}
}while(sortie==faux); // permet de trouver le bon block

if(Badge.acquisition_donnee[1]!=0)
{
Badge.transaction = Badge.acquisition_donnee[1]%4;
if(Badge.transaction==0)
{Badge.transaction = 4;}
}
else
{
Badge.transaction = 1;
}
Badge.transaction = (Badge.transaction*4)-4; //permet de trouver la transaction

MIF_Read_Block(Badge.block_monais); //fonction lecture du block
Lire_RFID_autre_BLOCK();

Badge.acquisition_autre_donnee[Badge.transaction+1]=Horloge.heu;
Badge.acquisition_autre_donnee[Badge.transaction+2]=Horloge.min;
Badge.acquisition_autre_donnee[Badge.transaction+3]=Badge.desk_num;
Badge.acquisition_autre_donnee[Badge.transaction+4]=sel_num;

MIF_Write_autre_Block(Badge.block_monais);

if(i<Badge.total[0])
{Badge.total[1]=vrai;}
else{
Badge.total[1]=faux;}
}while(Badge.total[1]==vrai); // tourne en boucle autant de fois que le nombre d'assiette
Badge.total[0]=0;
}
/*********************************************************************
Menu du systme (voire protocole pour les rglages)
*********************************************************************/
void Menu_systeme(void)
{
UC8 txtC[23] = "chargement des donnees";
switch(Badge.acquisition_donnee[14])
{
case 1: LCDLine2();
text_display(txtC);
MIF_Read_Block(5);
Lire_RFID_BLOCK();
Badge.num_caisse=Badge.acquisition_donnee[1];
Badge.code_site[0]=Badge.acquisition_donnee[8];
Badge.code_site[1]=Badge.acquisition_donnee[9];


Rapport de stage Quentin THEROND 2011 Page 63 sur 73

break;
case 2: LCDLine2();
text_display(txtC);
MIF_Read_Block(5);
Lire_RFID_BLOCK();
Horloge.min = Badge.acquisition_donnee[6];
Horloge.heu = Badge.acquisition_donnee[5];
Horloge.jour = Badge.acquisition_donnee[1];
Horloge.date = Badge.acquisition_donnee[2];
Horloge.mois = Badge.acquisition_donnee[3];
Horloge.annee = Badge.acquisition_donnee[4];
Chargement_horloge();
break;
case 3: Affiche_recharge();
break;
case 4: calibrage();
break;
case 5: LCDLine2();
text_display(txtC);
MIF_Read_Block(5);
Lire_RFID_BLOCK();
Gestion.diviseur_lin=Badge.acquisition_donnee[1];
break;
default:;
}
}

void calibrage(void)
{
UC8 i;
UC8 txt13[23] = "Poser une assiette ";
Gestion.capt1=0;
for(i=0;i<50;i++){
Gestion.moyenne[i] = ADC_Convert(0);
Gestion.capt1=Gestion.capt1+Gestion.moyenne[i];
}
Gestion.calibre[0]=Gestion.capt1/50;//poid sans assiette
DelayMs(5);
LCDLine2(); // mettre le curseur ligne 1
text_display(txt13);
do{
affichage_H_date();
MIF_Scan(); //fonction d'authentification lecteur RFID
Lire_RFID(); //lire les informations envoy par le
lecteur RFID
}while(Badge.ok==vrai);

for(i=0;i<50;i++){
Gestion.moyenne[i] = ADC_Convert(0);
Gestion.capt1=Gestion.capt1+Gestion.moyenne[i];
}
Gestion.calibre[1]=Gestion.capt1/50;// poid avec 1 assiette
Gestion.diviseur_lin=((Gestion.calibre[1]-Gestion.calibre[0])-13);// poids d'1 assiette
//=((UC8)(1000/Gestion.calibre[1]));
LCDLine2();
Bin2BCD(Gestion.diviseur_lin);
LCDwrite(Most_Sig_Byte);
LCDwrite(Middle_Sig_Byte);
LCDwrite(Least_Sig_Byte); DelaySec(3);
}


Rapport de stage Quentin THEROND 2011 Page 64 sur 73

/*********************************************************************
Fonction d'attente avec un bip de validation
*********************************************************************/
void Attente(void)
{
PORTCbits.RC1 = 1;
DelayMs(80);
PORTCbits.RC1 = 0;
do{
affichage_H_date();
MIF_Scan(); //fonction d'authentification lecteur RFID
Lire_RFID(); //lire les informations envoy par le
lecteur RFID
}while(Badge.ok==vrai);
}

/*********************************************************************
Fonction d'attente avec bip continu
*********************************************************************/
void Attente_erreur(void)
{ PCD_output(rouge);
do{
affichage_H_date();
PORTCbits.RC1 = 1;
DelayMs(150);
PORTCbits.RC1 = 0;
MIF_Scan(); //fonction d'authentification lecteur RFID
Lire_RFID(); //lire les informations envoy par le
lecteur RFID
}while(Badge.ok==vrai);
PCD_output(vert);
}

/*********************************************************************
Information pour l'utilisateur
*********************************************************************/
void servez_vous(void)
{ UC8 TXT[21] = "Servez-vous! (max:";
text_display(TXT);
Badge.nb_possibe = (Badge.acquisition_donnee[2]-Badge.acquisition_donnee[1]);
Bin2BCD(Badge.nb_possibe);
LCDwrite(Middle_Sig_Byte);
LCDwrite(Least_Sig_Byte);
LCDwrite(')');
}

/*********************************************************************
Fonction d'attente 4sec
*********************************************************************/
void temps4s(void)
{
I16 i,u;
for (u=0;u<6200;u++)
{
Nop();
for(i=0;i<40;i++)
{
}
Nop();
}


Rapport de stage Quentin THEROND 2011 Page 65 sur 73

}



/*********************************************************************
Configuration du timer1
*********************************************************************/
void Config_d_interuption(void)
{
T1CON = 0x0B; //Config Timer1
PIE1bits.TMR1IE = 1; //mise 1 du timer1
INTCONbits.PEIE = 1; //mise 1 des priphriques d'interruption
INTCONbits.GIE = 1; //mise 1 des d'interruptions globale
PIR1bits.TMR1IF = 0; //effacer timer1 et indicateur de dbordement
TMR1H = 0x80; //chargement de la valeur du timer1
TMR1L = 0x00;
}

/*********************************************************************
Sauter l'interruption
*********************************************************************/
#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh (void)
{
_asm
goto InterruptHandlerHigh
_endasm
}

/*********************************************************************
Fonction de calibrage des capteurs
*********************************************************************/
#pragma code
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh (void)
{
//PORTB=0xFF;
if (PIR1bits.TMR1IF)
{
PIR1bits.TMR1IF = 0;
TMR1H = 0x80;
TMR1L = 0x00;
}
}

/*********************************************************************
Acquisition des 4 ports analogique
*********************************************************************/
void Acquisition_CAN(void)
{
for(Gestion.choix=0;Gestion.choix<4;Gestion.choix++)
{
switch(Gestion.choix)
{
case 0: Gestion.capt1 = ADC_Convert(Gestion.choix);
break;
case 1: Gestion.capt2 = ADC_Convert(Gestion.choix);
break;
case 2: Gestion.capt3 = ADC_Convert(Gestion.choix);
break;


Rapport de stage Quentin THEROND 2011 Page 66 sur 73

case 3: Gestion.capt4 = ADC_Convert(Gestion.choix);
break;
default:Gestion.erreur = 1;
}
}
}

/*********************************************************************
Fonction d'initialisation des diff variables
*********************************************************************/
void Initialisation_structure(void)
{
Gestion.capt1 = 0;
Gestion.capt2 = 0;
Gestion.capt3 = 0;
Gestion.capt4 = 0;
Gestion.choix = 0;
Gestion.erreur = 0;
Gestion.assiette1 = 0;
Gestion.assiette1_pr = 0;
Gestion.diviseur_lin = 47;

Badge.inc = 0;
Badge.type = 0;
Badge.prestation = 0;
Badge.ok = 0;
Badge.total[0] = 0;
Badge.total[1] = 0;
Badge.nb_possibe = 0;
Badge.num_caisse = 0x08;
Badge.code_site[0] =0x19;
Badge.code_site[1] =0xC9;
Badge.erreur = 0;
Badge.pas_bon = 0;
Badge.desk_num = 0x06;
Badge.transaction = 1;

Horloge.heu = 0x23;
Horloge.min = 0x59;
Horloge.sec = 0x30;
Horloge.jour = 0x02;
Horloge.date = 0x31;
Horloge.date_hier=0;
Horloge.mois = 0x12;
Horloge.mois_hier=0;
Horloge.annee =0x11;
Horloge.annee_hier=0;
}


/*********************************************************************
Fonction d'authentification lecteur RFID
*********************************************************************/
void MIF_Scan(void)
{
USARTWriteByte(0x80);
USARTWriteByte(0xA0);
USARTWriteByte(0x03);
USARTWriteByte(0x00);
USARTWriteByte(0x01);


Rapport de stage Quentin THEROND 2011 Page 67 sur 73

}

/*********************************************************************
Fonction lecteur RFID
*********************************************************************/
void MIF_Read_UID(void)
{
USARTWriteByte(0x80);
USARTWriteByte(0xB0);
USARTWriteByte(0x01);
USARTWriteByte(0x00);
USARTWriteByte(0x04);

for(Badge.inc=0;Badge.inc<6;Badge.inc++)
{Badge.NumKey[Badge.inc] = USARTReadByte();}
while(USARTReadByte()!=0x00);

}

/*********************************************************************
Fonction chargement de la cl A
*********************************************************************/
void MIF_loadkeya(void)
{
USARTWriteByte(0x80);
USARTWriteByte(0xD0);
USARTWriteByte(0x80);
USARTWriteByte(0x00);
USARTWriteByte(0x06);

while(USARTReadByte()!=0xD0);

USARTWriteByte(0xFF);
USARTWriteByte(0xFF);
USARTWriteByte(0xFF);
USARTWriteByte(0xFF);
USARTWriteByte(0xFF);
USARTWriteByte(0xFF);
while(USARTReadByte()!=0x00);
}

/*********************************************************************
Fonction de fermeture de la session
*********************************************************************/
void MIF_Close_session(void)
{
USARTWriteByte(0x80);
USARTWriteByte(0xE0);
USARTWriteByte(0x00);
USARTWriteByte(0x00);
USARTWriteByte(0x00);

while(USARTReadByte()!=0x00);
}
/*********************************************************************
Fonction d'ouverture de la session
*********************************************************************/
void MIF_Open_Session(void)
{
USARTWriteByte(0x80);


Rapport de stage Quentin THEROND 2011 Page 68 sur 73

USARTWriteByte(0xA2);
USARTWriteByte(0x00);
USARTWriteByte(0x00);
USARTWriteByte(0x04);

while(USARTReadByte()!=0xA2);

for(Badge.inc=1;Badge.inc<5;Badge.inc++)
{USARTWriteByte(Badge.NumKey[Badge.inc]);}
Badge.pas_bon=USARTReadByte();

while(USARTReadByte()!=0x00);
}

/*********************************************************************
Fonction lecture du block
*********************************************************************/
UC8 MIF_Read_Block(UC8 block)
{
USARTWriteByte(0x80);
USARTWriteByte(0xB2);
USARTWriteByte(0x00);
USARTWriteByte(block);
USARTWriteByte(0x10);
}

/*********************************************************************
Fonction d'criture du block
*********************************************************************/
void MIF_Write_Block(UC8 block)
{

USARTWriteByte(0x80);
USARTWriteByte(0xD2);
USARTWriteByte(0x00);
USARTWriteByte(block);
USARTWriteByte(0x10);
while(USARTReadByte()!=0xD2);

for(Badge.inc=1;Badge.inc<17;Badge.inc++)
{USARTWriteByte(Badge.acquisition_donnee[Badge.inc]);}
while(USARTReadByte()!=0x00);
}

void MIF_Write_autre_Block(UC8 block)
{

USARTWriteByte(0x80);
USARTWriteByte(0xD2);
USARTWriteByte(0x00);
USARTWriteByte(block);
USARTWriteByte(0x10);
while(USARTReadByte()!=0xD2);

for(Badge.inc=1;Badge.inc<17;Badge.inc++)
{USARTWriteByte(Badge.acquisition_autre_donnee[Badge.inc]);}
while(USARTReadByte()!=0x00);

}



Rapport de stage Quentin THEROND 2011 Page 69 sur 73

/*********************************************************************
Lire les informations envoyes par le lecteur RFID
*********************************************************************/
void Lire_RFID(void)
{
for(Badge.inc=0;Badge.inc<4;Badge.inc++)
{Badge.acquisition_donnee[Badge.inc] = USARTReadByte();}
if (Badge.acquisition_donnee[1]==0x01)
{Badge.ok=vrai;}else{Badge.ok=faux;}
}


/*********************************************************************
Lire les informations envoyes par le lecteur RFID UID
*********************************************************************/
void Lire_RFID_BLOCK(void)
{Badge.pas_bon=0;
if(USARTReadByte()==0xB2)
{
for(Badge.inc=1;Badge.inc<18;Badge.inc++)
{Badge.acquisition_donnee[Badge.inc] = USARTReadByte();}
while(USARTReadByte()!=0x00);
}else
{USARTReadByte();
Badge.pas_bon=1;
}
}

/*********************************************************************
Lire les informations envoyes par le lecteur RFID UID
*********************************************************************/

void Lire_RFID_autre_BLOCK(void)
{Badge.pas_bon=0;
if(USARTReadByte()==0xB2)
{
for(Badge.inc=1;Badge.inc<18;Badge.inc++)
{Badge.acquisition_autre_donnee[Badge.inc] = USARTReadByte();}
while(USARTReadByte()!=0x00);
}else
{USARTReadByte();
Badge.pas_bon=1;
}
}


/*********************************************************************
Fonction d'affichage des instructions utilisateur
*********************************************************************/
void utilisateur(void)
{
UC8 txt13[23] = "Mettre votre badge ";
LCDLine2(); // mettre le curseur ligne 1
text_display(txt13);
}


/*********************************************************************
Fonction de conversion char en BCD
*********************************************************************/


Rapport de stage Quentin THEROND 2011 Page 70 sur 73

void Bin2BCD (unsigned char temp)
{
Least_Sig_Byte = temp;
for (Most_Sig_Byte = 0 ; Least_Sig_Byte >= 100 ; Least_Sig_Byte>=100?(Least_Sig_Byte -=
100):Least_Sig_Byte, Most_Sig_Byte++ );
for (Middle_Sig_Byte = 0 ; Least_Sig_Byte >= 10 ; Least_Sig_Byte>=10?(Least_Sig_Byte -=
10):Least_Sig_Byte, Middle_Sig_Byte++);
Most_Sig_Byte += 0x30;
Middle_Sig_Byte += 0x30;
Least_Sig_Byte += 0x30;
}

/*********************************************************************
Fonction d'affichage de l'ID
*********************************************************************/
void Affiche_ID(void)
{
UC8 txt14[5] = "Num:";
UC8 txt16[2] = ".";
LCDLine2(); // mettre le curseur ligne 1
text_display(txt14);
for(Badge.inc=5;Badge.inc>1;Badge.inc--) //aff du num badge
{
Bin2BCD(Badge.NumKey[Badge.inc]);
LCDwrite(Most_Sig_Byte);
LCDwrite(Middle_Sig_Byte);
LCDwrite(Least_Sig_Byte);
if(Badge.inc>2)
{text_display(txt16);}
}
}


/*********************************************************************
Fonction d'information pour la recharge d'assiette
*********************************************************************/
void Affiche_recharge(void)
{
UC8 txt20[23] = "Recharger assiette:";
do{assiette_actu();
LCDLine2();
text_display(txt20);
Bin2BCD(Gestion.assiette1);
LCDwrite(Most_Sig_Byte);
LCDwrite(Middle_Sig_Byte);
LCDwrite(Least_Sig_Byte);
DelayMs(50);
affichage_H_date();
MIF_Scan(); //fonction d'autentification lecteur RFID
Lire_RFID(); //lire les informations envoy par le
lecteur RFID
}while(Badge.ok==vrai);

}


/*********************************************************************
Fonction d'acquisition de l'horloge temps rel
*********************************************************************/
void acq_horloge(void)


Rapport de stage Quentin THEROND 2011 Page 71 sur 73

{
Horloge.sec = lire_ds1307(0x00);
Horloge.min = lire_ds1307(0x01);
Horloge.heu = lire_ds1307(0x02);
Horloge.jour = lire_ds1307(0x03);
Horloge.date = lire_ds1307(0x04);
Horloge.mois = lire_ds1307(0x05);
Horloge.annee = lire_ds1307(0x06);
if((Horloge.heu==0x23)&&(Horloge.min==0x59)&&(Horloge.sec>0x50))
{
Horloge.date_hier = lire_ds1307(0x04);
Horloge.mois_hier = lire_ds1307(0x05);
Horloge.annee_hier = lire_ds1307(0x06);
}
}

/*********************************************************************
Permet la conversion hexa DCB et l'affichage de l'horloge
*********************************************************************/
void affichage_H_date(void)
{
UC8 txt29[2] = ":";
UC8 txt30[2] = "/";
UC8 txt31[2] = " ";
UC8 conversion_DCB=0;

acq_horloge();
LCDLine1();
conversion_DCB = Horloge.heu/16; //Heure
Bin2BCD(conversion_DCB);
LCDwrite(Least_Sig_Byte);
conversion_DCB = Horloge.heu%16;
Bin2BCD(conversion_DCB);
LCDwrite(Least_Sig_Byte);
text_display(txt29);
conversion_DCB = Horloge.min/16; //minute
Bin2BCD(conversion_DCB);
LCDwrite(Least_Sig_Byte);
conversion_DCB = Horloge.min%16;
Bin2BCD(conversion_DCB);
LCDwrite(Least_Sig_Byte);
text_display(txt31);
conversion_DCB = Horloge.date/16; //date
Bin2BCD(conversion_DCB);
LCDwrite(Least_Sig_Byte);
conversion_DCB = Horloge.date%16;
Bin2BCD(conversion_DCB);
LCDwrite(Least_Sig_Byte);
text_display(txt30);
conversion_DCB = Horloge.mois/16; //mois
Bin2BCD(conversion_DCB);
LCDwrite(Least_Sig_Byte);
conversion_DCB = Horloge.mois%16;
Bin2BCD(conversion_DCB);
LCDwrite(Least_Sig_Byte);
text_display(txt30);
conversion_DCB = Horloge.annee/16; //anne
Bin2BCD(conversion_DCB);
LCDwrite(Least_Sig_Byte);
conversion_DCB = Horloge.annee%16;


Rapport de stage Quentin THEROND 2011 Page 72 sur 73

Bin2BCD(conversion_DCB);
LCDwrite(Least_Sig_Byte);

DelayMs(50);

}

/*********************************************************************
Envoi des trames pour la configuration de l'horloge temps rel
*********************************************************************/
void Chargement_horloge(void)
{
ecrire_ds1307(0x07,0b00010000);
ecrire_ds1307(0x00,Horloge.sec);
ecrire_ds1307(0x01,Horloge.min);
ecrire_ds1307(0x02,Horloge.heu);
ecrire_ds1307(0x03,Horloge.jour);
ecrire_ds1307(0x04,Horloge.date);
ecrire_ds1307(0x05,Horloge.mois);
ecrire_ds1307(0x06,Horloge.annee);}

/*********************************************************************
Conversion de poids en nombres d'assiettes
*********************************************************************/
void assiette_actu(void)
{UC8 i=1;
for(i=0;i<50;i++){
Gestion.moyenne[i] = (UI16)ADC_Convert(0);
Gestion.capt1=Gestion.capt1+Gestion.moyenne[i];
}
Gestion.capt1=Gestion.capt1/50;
DelayMs(5);
Gestion.assiette1=(UC8)(Gestion.capt1/Gestion.diviseur_lin);
}
/*********************************************************************
Conversion de poids en nombres d'assiettes
*********************************************************************/
void assiette_prec(void)
{UC8 i=1;
for(i=0;i<50;i++){
Gestion.moyenne[i] = (UI16)ADC_Convert(0);
Gestion.capt1=Gestion.capt1+Gestion.moyenne[i];
}
Gestion.capt1 = Gestion.capt1/50;
DelayMs(5);
Gestion.assiette1_pr = (UC8)(Gestion.capt1/Gestion.diviseur_lin);
}

/*********************************************************************
Commande de la LED du lecteur RFID
*********************************************************************/
void PCD_output(UC8 couleur)
{
USARTWriteByte(0x80);
USARTWriteByte(0xCD);
USARTWriteByte(0x00);
switch(couleur)
{
case 0: USARTWriteByte(0x7F);
break;


Rapport de stage Quentin THEROND 2011 Page 73 sur 73

case 1: USARTWriteByte(0xBF);
break;
default:;
}
USARTWriteByte(0x00);
USARTReadByte();
USARTReadByte();
}

/*********************************************************************
Affichage du nombre dassiettes prises par lutilisateur.
*********************************************************************/
void affichage_nbautilisateur(void)
{
UC8 txt20[20] = "assiette(s) prise :";
LCDLine2();
text_display(txt20);
Bin2BCD(Badge.total[0]);
LCDwrite(Middle_Sig_Byte);
LCDwrite(Least_Sig_Byte);
}