- Composants requis
- Schéma de circuit et explication de fonctionnement
- Explication de la programmation
Nous savons dans les bureaux, les centres commerciaux et dans de nombreux autres endroits où seule la personne avec carte d'autorisation est autorisée à entrer dans la salle. Ces systèmes utilisent un système de communication RFID. La RFID est utilisée dans les centres commerciaux pour arrêter le vol car les produits sont étiquetés avec une puce RFID et lorsqu'une personne quitte le bâtiment avec la puce RFID, une alarme est déclenchée automatiquement. L'étiquette RFID est conçue aussi petite qu'une partie du sable. Les systèmes d'authentification RFID sont faciles à concevoir et sont bon marché. Certaines écoles et collèges utilisent de nos jours des systèmes de fréquentation basés sur la RFID.
Dans ce projet, nous allons concevoir un système de collecte de péage basé sur la RFID à des fins de sécurité. Donc, ce système ouvre des portes et n'autorise les personnes qu'avec les étiquettes RFID autorisées. Les identifiants de détenteurs d'étiquettes autorisés sont programmés dans le microcontrôleur ATMEGA et seuls ces détenteurs sont autorisés à quitter ou à entrer dans les locaux.
Composants requis
Matériel: microcontrôleur ATmega32, alimentation (5v), programmeur AVR-ISP, JHD_162ALCD (module LCD 16x2), condensateur 100uF (connecté à travers l'alimentation), bouton, résistance 10KΩ, condensateur 100nF, LED (deux pièces), EM-18 (Module de lecteur RFID), IC de pilote de moteur L293D, moteur 5V DC.
Logiciel: Atmel studio 6.1, progisp ou flash magic.
Schéma de circuit et explication de fonctionnement
Dans le circuit du système de collecte de péage RFID illustré ci-dessus, PORTA d'ATMEGA32 est connecté au port de données de l'écran LCD. Ici, nous devons nous rappeler de désactiver la communication JTAG dans PORTC vers ATMEGA en changeant les octets de fusible, si nous voulons utiliser le PORTC comme port de communication normal. Dans l'écran LCD 16x2, il y a 16 broches sur tout s'il y a un rétro-éclairage, s'il n'y a pas de rétro-éclairage, il y aura 14 broches. Nous pouvons alimenter ou laisser les broches du rétroéclairage. Or, dans les 14 broches, il y a 8 broches de données (7-14 ou D0-D7), 2 broches d'alimentation en énergie (1 et 2 ou VSS et VDD ou GND et + 5v), 3 ème broches de la commande de contraste (VEE-contrôle l'épaisseur de la les caractères doivent être affichés), 3 broches de commande (RS & RW & E).
Dans le circuit, vous pouvez observer que je n'ai pris que deux broches de contrôle. Cela donne la flexibilité d'une meilleure compréhension. Le bit de contraste et READ / WRITE ne sont pas souvent utilisés afin qu'ils puissent être court-circuités à la masse. Cela met l'écran LCD en mode de contraste et de lecture le plus élevé. Nous avons juste besoin de contrôler les broches ENABLE et RS pour envoyer des caractères et des données en conséquence.
Les connexions qui sont faites pour LCD, sont données ci-dessous:
PIN1 ou VSS à la terre
Alimentation PIN2 ou VDD ou VCC à + 5v
PIN3 ou VEE à la masse (donne le meilleur contraste pour un débutant)
PIN4 ou RS (sélection de registre) à PD6 du MCU
PIN5 ou RW (lecture / écriture) à la terre (met l'écran LCD en mode lecture facilite la communication pour l'utilisateur)
PIN6 ou E (activé) à PD5 du microcontrôleur
PIN7 ou D0 à PA0
PIN8 ou D1 à PA1
PIN9 ou D2 à PA2
PIN10 ou D3 à PA3
PIN11 ou D4 à PA4
PIN12 ou D5 à PA5
PIN13 ou D6 à PA6
PIN14 ou D7 à PA7
Dans le circuit, vous pouvez voir que nous avons utilisé une communication 8 bits (D0-D7). Cependant, ce n'est pas obligatoire et nous pouvons utiliser une communication 4 bits (D4-D7) mais avec un programme de communication 4 bits devient un peu complexe, j'ai donc préféré la communication 8 bits.
Donc, à partir de la simple observation du tableau ci-dessus, nous connectons 10 broches de l'écran LCD au contrôleur dans lequel 8 broches sont des broches de données et 2 broches pour le contrôle.
Avant d'aller de l'avant, nous devons comprendre la communication série. Le module RFID envoie ici des données au contrôleur en série. Il a un autre mode de communication, mais pour une communication facile, nous choisissons RS232. La broche RS232 du module est connectée à la broche RXD d'ATMEGA.
Les données envoyées par le module RFID sont:
Maintenant, pour l' interface du module RFID, les fonctionnalités suivantes sont requises:
1. La broche RXD (fonction de réception de données) du contrôleur doit être activée.
2. Puisque la communication est série, nous devons savoir chaque fois que les données au revoir sont reçues, afin de pouvoir arrêter le programme jusqu'à ce que l'octet complet soit reçu. Ceci est fait en activant une interruption complète de réception de données.
3. La RFID envoie les données au contrôleur en mode 8 bits. Ainsi, deux caractères seront envoyés au contrôleur à la fois. Ceci est illustré dans la figure ci-dessus.
4. D'après la figure ci-dessus, il n'y a pas de bits de parité, un bit d'arrêt dans les données envoyées par le module.
Les fonctionnalités ci-dessus sont définies dans les registres du contrôleur; nous allons en discuter brièvement,
ROUGE (RXEN): Ce bit représente la fonction de réception de données. Ce bit doit être mis à 1 pour que les données du module soient reçues par le contrôleur. Il active également la broche RXD du contrôleur.
MARRON (RXCIE): Ce bit doit être mis à 1 pour obtenir une interruption après une réception de données réussie. En activant ce bit, nous apprenons à connaître, juste après la réception de données 8 bits.
PINK (URSEL): Ce bit doit être défini avant d'activer d'autres bits dans UCSRC. Après le réglage, les autres bits nécessaires dans UCSRC, URSEL doivent être désactivés ou mis à zéro.
JAUNE (UCSZ0, UCSZ1, UCSZ2): Ces trois bits sont utilisés pour sélectionner le nombre de bits de données que nous recevons ou envoyons en une seule fois.
Étant donné que les données envoyées par le module RFID sont de type 8 bits, nous devons définir UCSZ0, UCSZ1 sur un et UCSZ2 sur zéro.
ORANGE (UMSEL): ce bit est défini selon que le système communique de manière asynchrone (les deux utilisent une horloge différente) ou de manière synchrone (les deux utilisent la même horloge).
Le module et l'automate utilisant une horloge différente, ce bit doit être mis à zéro ou laissé seul car ils sont tous mis à zéro par défaut.
VERT (UPM1, UPM0): Ces deux bits sont ajustés en fonction de la parité des bits que nous utilisons dans la communication.
Étant donné que le module RFID envoie des données sans parité, nous avons mis UPM1, UPM0 à zéro ou ils peuvent être laissés seuls car tous les bits de tous les registres sont mis à zéro par défaut.
BLEU (USBS): Ce bit est utilisé pour choisir le nombre de bits d'arrêt que nous utilisons pendant la communication.
Étant donné que le module RFID envoie des données avec un bit d'arrêt, nous devons simplement laisser le bit USBS seul.
Maintenant, nous devons enfin régler le débit en bauds, à partir de la figure ci-dessus, il est clair que le module RFID envoie des données au contrôleur avec un débit en bauds de 9600bps (bits par seconde).
Le débit en bauds est défini dans le contrôleur en choisissant l'UBRRH approprié.
La valeur UBRRH est choisie en croisant le débit en bauds et la fréquence du cristal du processeur, donc par référence croisée, la valeur UBRR est considérée comme «6», et donc la vitesse de transmission est définie.
Maintenant, comme le montre la figure, deux broches du contrôleur vont à L293D, qui est un H-BRIDGE utilisé pour contrôler la vitesse et le sens de rotation des moteurs CC à faible puissance.
L293D est un circuit intégré H-BRIDGE conçu pour entraîner des moteurs à courant continu de faible puissance et est illustré sur la figure, ce circuit intégré se compose de deux ponts en h et peut donc entraîner deux moteurs à courant continu. Ainsi, ce circuit intégré peut être utilisé pour piloter des moteurs de robot à partir des signaux du microcontrôleur.
Maintenant, comme indiqué précédemment, ce circuit intégré a la capacité de changer le sens de rotation du moteur à courant continu. Ceci est réalisé en contrôlant les niveaux de tension à INPUT1 et INPUT2.
Activer la broche |
Broche d'entrée 1 |
Broche d'entrée 2 |
Direction du moteur |
Haute |
Faible |
Haute |
Tournez à droite |
Haute |
Haute |
Faible |
Tournez à gauche |
Haute |
Faible |
Faible |
Arrêtez |
Haute |
Haute |
Haute |
Arrêtez |
Ainsi, comme indiqué dans le tableau ci-dessus, pour une rotation dans le sens des aiguilles d'une montre, 2A doit être élevé et 1A doit être faible. De même pour le sens anti-horaire, 1A doit être élevé et 2A doit être faible.
Chaque fois qu'une carte autorisée est amenée près du module, le moteur est programmé pour se déplacer dans le sens des aiguilles d'une montre pendant une seconde, pour montrer que le portail de péage est ouvert après une seconde, il revient, indiquant que le portail de péage est fermé. Le fonctionnement de la place de péage est mieux expliqué étape par étape du code C ci-dessous.
Explication de la programmation
Vous trouverez ci-dessous l'explication ligne à ligne du code du système de perception RFID. Vous pouvez comprendre le concept et le fonctionnement de ce projet en lisant le code ci-dessous. Pour télécharger ou copier, vous pouvez trouver le code complet en bas de page.
#include // en-tête pour activer le contrôle du flux de données sur les broches
#define F_CPU 1000000 // indiquant la fréquence du cristal du contrôleur connecté
#comprendre
#define E 5 // donnant le nom «enable» à la 5 ème broche de PORTD, car elle est connectée à la broche d'activation de l'écran LCD
#define RS 6 // donnant le nom «registerselection» à la 6 ème broche de PORTD, car elle est connectée à la broche RS de l'écran LCD
void send_a_command (commande char non signée);
void send_a_character (caractère char non signé);
void send_a_string (char * string_of_characters);
int main (void)
{
DDRA = 0xFF; // mettre porta comme broches de sortie
DDRD = 0b11111110;
_delay_ms (50); // donnant un délai de 50ms
DDRB = 0b11110000; // Prenant quelques broches du portB comme entrée.
UCSRB - = (1 <
UCSRC - = (1 <
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // réglage de la vitesse de transmission // Ce qui suit contient l'ID des balises, celles-ci doivent être modifiées pour différentes balises, elles doivent être mises à jour pour que le projet fonctionne
/ * Après avoir vidé le programme dans le contrôleur, il faut prendre les cartes qui doivent être autorisées et obtenir l'identifiant des tags. Ceux-ci sont obtenus en plaçant l'étiquette à proximité du module RFID et l'ID sera affiché à l'écran. Après avoir obtenu les ID, le programme doit être mis à jour en remplaçant les numéros d'identification ci-dessous par de nouveaux numéros d'identification.
char ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
Maintenant, ci-dessus, nous n'autorisons que cinq cartes, celles-ci peuvent être remplacées par n'importe quel nombre.
Par exemple, considérez que le programme par défaut est vidé dans le contrôleur, récupérez les cartes qui devraient être autorisées. Placez l'un après l'autre près du module, vous obtiendrez l'ID pour chacun d'entre eux sous la forme xxxxxxxx (907a4F87), S'il y a 7 balises que nous avons, alors nous aurons 7 ID de huit bits. * /
// maintenant pour sept cartes ça va comme // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)},; // allouer de la mémoire pour afficher l'ID envoyé par module int i = 0; vote int = 0; int k = 0; send_a_command (0x01); // Effacer l'écran 0x01 = 00000001 _delay_ms (50); send_a_command (0x38); // disant à l'écran que nous utilisons le mode commande / données 8 bits _delay_ms (50); send_a_command (0b00001111); // ÉCRAN LCD allumé et courser clignotant char MEM; // allouer de la mémoire pour stocker l'ID complet de la balise send_a_string ("NUMÉRO RFID"); // envoi de la chaîne send_a_command (0x80 + 0x40 + 0); // déplacement du coursier sur la deuxième ligne tandis que (1) { tandis que (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR stocke les données de huit bits reçues et est pris dans un entier. MEM = COUNTA; // les deux premiers caractères sont mis à jour en mémoire itoa (COUNTA, SHOWA, 16); // commande pour mettre le nombre de variable dans l'écran LCD (nombre de variable, dans quel caractère remplacer, quelle base est variable (dix ici car nous comptons le nombre en base10)) send_a_string (SHOWA); // indiquant à l'écran d'afficher le caractère (remplacé par un nombre variable) de la deuxième personne après avoir positionné le coursier sur l'écran LCD tandis que (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // les troisième et quatrième caractères sont mis à jour en mémoire tandis que (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // cinquième et sixième caractères sont mis à jour en mémoire tandis que (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // septième et huit caractères sont mis à jour en mémoire send_a_string (""); send_a_command (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
pour (i = 0; i <5; i ++) { si ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT)) {// vérification de l'autorisation d'achat en comparant deux caractères à la fois avec les caractères en mémoire PORTB - = (1 <
PORTB & = ~ (1 <
_delay_ms (220); // délai _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); PORTB - = (1 <
PORTB & = ~ (1 <
_delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); PORTB & = ~ (1 <
PORTB - = (1 <
} } UCSRB - = (1 <
} } void send_a_command (commande char non signée) { PORTA = commande; PORTD & = ~ (1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_character (caractère char non signé) { PORTA = caractère; PORTD - = 1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_string (char * string_of_characters) { while (* string_of_characters> 0) { send_a_character (* string_of_characters ++); } } |