Table des matières:

Lecteur RFID AVR/Arduino avec code UART en C : 4 étapes
Lecteur RFID AVR/Arduino avec code UART en C : 4 étapes

Vidéo: Lecteur RFID AVR/Arduino avec code UART en C : 4 étapes

Vidéo: Lecteur RFID AVR/Arduino avec code UART en C : 4 étapes
Vidéo: Développer des applications sur un ATTiny3217 avec l’IDE Arduino. 2024, Novembre
Anonim
Lecteur RFID AVR/Arduino avec code UART en C
Lecteur RFID AVR/Arduino avec code UART en C

La RFID est à la mode, que l'on trouve partout - des systèmes d'inventaire aux systèmes d'identification par badge. Si vous êtes déjà allé dans un grand magasin et avez traversé ces objets ressemblant à des détecteurs de métaux aux points d'entrée/de sortie, alors vous avez vu la RFID. Il existe plusieurs endroits pour trouver de bonnes informations sur la configuration RFID, et cette instructable se concentre sur l'installation du lecteur RFID Parallax (Serial TTL) sur un AVR, en mettant l'accent sur le code C nécessaire pour lire l'entrée série. Le code est en C et n'utilise aucune bibliothèque externe. En fait, il parle directement à 2400 bauds sans utiliser d'UART en se synchronisant sur le débit en bauds du lecteur RFID et en lisant la broche numérique à laquelle il est connecté. Excité? Moi aussi.

Étape 1: Obtenez les marchandises

Obtenez les marchandises
Obtenez les marchandises

Vous aurez besoin de la liste de pièces suivante:

  • Lecteur RFID (Parallaxe #28140 39,99 $)
  • Étiquette RFID (Parallaxe #32397 0,99 $)
  • AVR ou clone Arduino (si vous utilisez un AVR d'origine, vous aurez également besoin d'un max232, de condensateurs 5 x 1uF et d'un connecteur DE9)
  • Planche à pain sans soudure

Optionnel

  • en-tête à 4 positions
  • Câble

(et le max232 etc. pour la communication des informations d'étiquette) Vous pouvez également connecter votre écran LCD préféré au lieu d'envoyer des données d'étiquette via RS232.

Étape 2: connectez les pièces

Connectez les pièces
Connectez les pièces
Connectez les pièces
Connectez les pièces
Connectez les pièces
Connectez les pièces

Le côté matériel des choses est assez facile. Au lieu de placer mon lecteur RFID directement dans ma planche à pain, j'ai choisi de fabriquer un câble rapide afin de pouvoir déplacer un peu mieux le lecteur RFID. Pour cela, j'ai juste coupé 4 positions d'une barrette femelle d'embase que j'avais allongée et soudée sur trois fils. Du ruban isolant a complété le connecteur ghetto. Le lecteur RFID dispose de 4 connexions:

  • Vcc
  • PERMETTRE
  • DEHORS
  • Terre

Comme vous l'avez probablement deviné, connectez Vcc à +5V et Gnd à la terre. Parce que le lecteur RFID consomme tellement d'énergie, vous pouvez frapper la broche ENABLE pour l'éteindre et l'allumer à différents intervalles. J'ai simplement choisi de le garder. Parce qu'il est inversé, vous le tirez BAS pour l'activer. Alternativement, vous pouvez le connecter à la terre. Je l'ai connecté à PIND3 pour me donner des options d'activation/désactivation si je le décidais. La broche OUT est l'endroit où le lecteur envoie ses données série après avoir lu une étiquette. Je l'ai connecté à PIND2. Notez que dans l'univers Parallax, le rouge signifie aller. Autrement dit, une LED verte signifie que l'unité est inactive et inactive, tandis qu'une LED rouge signifie que l'unité est active. *hausse les épaules* Allez comprendre.

Étape 3: écrivez le code

Écrire le code
Écrire le code

Pour lire les données du lecteur RFID, vous devez savoir quand une étiquette a été soumise, retirer les données du port série, puis les envoyer quelque part.

Format des données du lecteur RFID

Le lecteur RFID Parallax envoie des données à un rythme fixe et glacial de 2400 bauds. Une étiquette RFID fait 10 octets. Afin de permettre la détection/correction des erreurs, étant donné que le lecteur pourrait être déclenché par un bruit aléatoire, le RFID de 10 octets est délimité par une sentinelle de démarrage et d'arrêt. La sentinelle de départ est le saut de ligne (0x0A) et la sentinelle d'arrêt est le retour chariot (0x0D). Cela ressemble à ceci:

[Démarrer Sentinel | Octet 1| Octet 2| Octet 3| Octet 4| Octet 5| Octet 6| Octet 7| Octet 8| Octet 9| Octet 10| Arrêtez la sentinelle]Ce sont les trois étapes principales.

Savoir quand un tag a été soumis

J'ai utilisé une interruption de changement de broche sur l'AVR qui informe le micrologiciel qu'un changement s'est produit sur une broche surveillée. La configuration de l'AVR pour cela est simple et nécessite de définir le drapeau, d'indiquer au MCU quelle broche vous souhaitez surveiller et de définir le bit d'interruption global. Configurer PCINT

BSET(PCICR, PCIE2); // registre de contrôle d'interruption de changement de broche pcie2 BSET(PCMSK2, PCINT18); // activer l'interruption de changement de broche pour PCINT18 (PD2) BSET (SREG, 7); // Définir le bit I SREGEcrivez votre routine de service d'interruption Vous voulez garder votre ISR court, donc dans mon vecteur d'interruption, je lis l'octet entier, bit par bit, et stocke l'octet dans un tableau global de caractères volatiles. Je fais ce qui suit à chaque interruption:

  • Vérifiez pour vous assurer que je suis sur un peu de démarrage
  • Centrez la synchronisation sur l'impulsion du milieu à 2400 bauds (la vitesse du lecteur RFID)
  • Sauter le bit de départ et faire une pause au milieu du bit suivant
  • Lire chaque bit dans un entier non signé
  • Quand j'ai 8 bits, mets l'octet dans un tableau de caractères
  • Lorsque j'ai collecté 12 octets, informez le MCU que la balise a été lue pour la détection d'erreurs.

J'ai modifié le code SoftSerial de Mikal Hart qui a modifié le code de David Mellis pour les retards déterminés expérimentalement dans les routines série.

Analyser la sortie RS232

La routine PCINT contient le code pour lire la sortie RS232 du lecteur RFID. Lorsque j'ai obtenu 12 octets (RFID 10 octets plus sentinelles), je mets bDataReady sur 1 et laisse la boucle principale traiter les données et les afficher.

// c'est le gestionnaire d'interruptionISR(PCINT2_vect){ if (BCHK(PIND, RFID_IN)) // Le bit de démarrage passe au niveau bas; uint8_t bit = 0; Délai accordé(CENTER_DELAY); // Centrer sur le bit de départ pour (uint8_t x = 0; x < 8; x++) { TunedDelay(INTRABIT_DELAY); // saute un peu, frère… if (BCHK(PIND, RFID_IN)) BSET(bit, x); sinon BCLR(bit, x); } TunedDelay(INTRABIT_DELAY); // ignore le bit d'arrêt RFID_tag[rxIdx] = bit; ++rxIdx; if (rxIdx == 12) bDataReady = 1;}

Affichez votre étiquette

Dans le main(), pendant la boucle for(ever), je vérifie si bDataReady a été défini, signalant que toute la structure RFID a été envoyée. Je vérifie ensuite si c'est une balise valide (c'est-à-dire que les caractères de début et de fin sont 0x0A et 0x0D, respectivement), et si c'est le cas, je l'envoie ma connexion RS232.

for (;;){ if (bDataReady) {#ifdef _DEBUG_ USART_tx_S("Octet de début: "); USART_tx_S(itoa(RFID_tag[0], &ibuff[0], 16)); ibuff[0] = 0; ibuff[1] = 0; USART_tx_S("\nOctet d'arrêt: "); USART_tx_S(itoa(RFID_tag[11], &ibuff[0], 16));#endif if (ValidTag()) { USART_tx_S("\nBague RFID: "); for(uint8_t x = 1; x < 11; x++) { USART_tx_S(itoa(RFID_tag[x], ibuff, 16)); if (x != 10) USART_tx(&apos:&apos); } USART_tx_S("\n"); } rxIdx = 0; bDonnéesPrêt = 0; }}

Étape 4: Code et adieu

Cette page contient un fichier zip avec le code correspondant. Il a été écrit dans AVR Studio 4.16. Si vous utilisez le bloc-notes du programmeur, Eclipse ou vi (ou autre chose), vous devrez copier un Makefile de confiance dans le répertoire et ajouter ces fichiers à la ligne source. Notez également que le timing de la section de lecture en série est basé sur un Microcontrôleur 16 MHz. Si vous utilisez une fréquence d'horloge différente, vous devrez déterminer expérimentalement les retards accordés pour se centrer sur les impulsions de débit en bauds. J'espère que cette instructable vous a aidé d'une manière ou d'une autre. Si vous avez des suggestions sur la façon dont il pourrait être amélioré, n'hésitez pas à me le faire savoir!

Conseillé: