Projet TIPE : obtenir d'un signal "créneau", une liste en binaire

Bonjour à tous,

Je suis en prépa et pour terminer mon TIPE, je cherche à créer un lecteur de carte RFID.

Pour cela, je dispose d'un signal "créneau" qui apparaît en gros quand je couple ma carte RFID avec une bobine, je souhaite le transformer en liste binaire que je comparerai par la suite à une autre liste binaire de référence. Voila à quoi ressemble le signal (en jaune).

|500x300

Ainsi, ma liste devrait ressembler à cela et contient 128 valeurs : 01001010110 (une liste binaire où deux 0 ou deux 1 peuvent se succéder.

Après avoir chercher pas mal de temps comment faire avec les fonctions delay, micros ou PulseIn, je suis bloqué.

Si des informations sont manquantes ou si ce post n'est pas suffisamment clair, je pourrai préciser.

Merci de votre réponse, Cowentin

Bonjour

A mon avis, le problème principal est si la série commence par 0, a moins que tu puisses avoir un "top" de départ de lecture.

Pour le reste, en gérant correctement une interruption , cela parait faisable relativement facilement surtout si tu connais la période de transmission.

Pierre

Tout d’abord, merci d’avoir pris le temps de répondre.
J’ai essayé d’utiliser delay pour pouvoir venir prendre des valeurs toutes les 250microsecondes, le problème étant qu’au bout de 128 prises de valeurs le mini décalage entre chaque prise est tel que la prise de valeur est faussée vers la fin.

En fait, il s’agit de 128 valeurs ( que j’interprète comme des 1 ou des 0 ) qui se répètent tant que la carte est couplée avec la bobine.
Pour moi il s’agissait d’appliquer un algorithme de ce type (j’avoue manquer cruellement d’expérience sur arduino et les programmes que j’ai établi jusqu’à présent n’ont pas été concluant) :

DEBUT ALGO :

t1=250 microsec #constantes de temps équivalente à un 0 si état bas ( ou un 1 si état haut )
t2= 500 microsec #constantes de temps équivalente à deux 0 si état bas ( ou deux 1 si état haut )

-création d’une liste vide “l”.
-detection du front montant.
-boucle “tant que longueur de l <128”, faire :
-prendre le temps entre le front montant et le prochain front descendant:

  • si t2-temps>temps-t1: #on cherche à savoir si le temps obtenu est plus près d’une seule période ou de 2
    alors ajouter un 1 à la liste l
    sinon ajouter un 1 puis rajouter un 1 (rajouter deux 1 à la suite)
    -prendre le temps entre ce front descendant et le prochain front montant:
  • si t2-temps>temps-t1:
    alors ajouter un 0 à la liste l
    sinon ajouter un 0 puis rajouter un 1 (rajouter deux 1 à la suite)

FIN ALGO

On devrait obtenir une liste d’au plus 131 valeurs que je souhaiterais par la suite comparé avec une liste de référence.
L’idée est de pouvoir reconnaitre la carte en question et d’afficher après vérification “carte valide”

Si vous avez des pistes, des programmes similaires ou une ébauche, je vous en serai largement reconnaissant,
Corentin

Bonjour,

c'est un genre de code manchester que tu as là, fais une recherche dans cette direction

je n'ai pas encore compris exactement comment tu distingues les 0 et les 1, donc je n'ai pas pu vérifier la validité de ton algo. Qui est semble-t-il un bon début. peux expliquer clairement (avec un petit dessin et un exemple parlant c'est mieux) comment sont distingués les 0 et les 1 ?

|500x194

Bonsoir,

Merci d'avoir répondu.

Voila un schéma, en espérant que cela puisse éclairer un peu.

En gros, ma liste devrait se comporter de 1 et de 0 en s'appuyant sur ce signal "créneau". Pour moi, le départ de l'algorithme semble peu important tant qu'il ne s'interrompt pas et que tous les 0 et les 1 sont recensés sans en oublier ou en sauter.

Il y a en effet 128 bits qui définissent la carte RFID que j'utilise (et la différencie des autres) et ces 128 bits se répètent à l'infini. J'espère pouvoir avoir une liste remplie de 128 valeurs (minimum), à la suite et dans l'ordre, que je pourrai comparer à une autre liste binaire de référence.

Corentin

Bonjour, jamais vu ce protocole, mais je vais te faire confiance.

voici grosso modo ce que je propose c'est la plus simple des méthodes, ne fonctionne que si le signal est fiable (pas parasité)

constantes : t1min = 200 µs t1max = 300 µs t2min = 400 µs t2max = 600 µs

unsigned long old_time unsigned long new_time unsigned integer duration

-création d'une liste vide "bits_list"

-détection du 1er front montant -> déclenchement de l'interruption old_time = micros(); interruptions configurées sur front descendants

-détection fronts descendants -> déclenchement de l'interruption new_time = micros(); duration = new_time - old_time; old_time = new_time; si duration compris entre t1min et max : ajout d'un 1 à bit_list si duration compris entre t2min et max : ajout de deux 1 à bit_list arrêt si 128 bits interruptions configurées sur front montants

-détection fronts montants -> déclenchement de l'interruption new_time = micros(); duration = new_time - old_time; old_time = new_time; si duration compris entre t1min et max : ajout d'un 0 à bit_list si duration compris entre t2min et max : ajout de deux 0 à bit_list arrêt si 128 bits interruptions configurées sur front descendants

Merci pour la réponse, et votre algorithme. Je suis en épreuves en ce moment, je vous tiens au courant quand je l'aurai essayé. Corentin

Bonjour,

J'ai finalement retranscrit votre programme mais je n'ai pas trouvé de fonctions permettant de rajouter un 1 ou un 0 à la liste bits_liste (à part une supposée fonction push back)

Je joins le programme.

Y'a t'il une fonction permettant un tel ajout ?

|500x436 |413x500

Pu**in mais arrêtez avec ces copies d’écran illisibles et LISEZ CECI
Désolé, mais ça tombe sur toi

Merci pour votre réponse des plus pertinentes Kamill. Il s'agissait juste de faire vérifier le programme par trimarco. Par contre, si vous pouviez m'aider à trouver un fonction ajoutant un 1 ou un 0 à une liste vide, cela me serait plus utile que votre précédente remarque. Cowentin.

Bonjour,

ils y a plusieurs méthodes, mais je vais aller au plus simple

tu dimensionne ton tableau bits_list[] à 128 éléments, une fois pour toutes, sans initialiser ceux-ci, ce n'est n'est nécessaire

ton tableau est créé

reste à le renseigner avec les nouvelles valeurs qui arrivent : tu utiliseras le fameux compteur i et écriras : bits_list = 0 ou 1 selon le résultat du test