Acquisition d'un champs magnétique avec la TMR 6201

Bonjour à tous !

Je suis actuellement en stage, et on m’a demandé de faire l’acquisition d’un champs magnétique (afin de réaliser par la suite un scanner). Pour réaliser cela, je suis équipé de fils, d’un Arduino Uno et de la TMR 6201.

Pour faire l’acquisition, j’ai utilisé ce code :

#define XRANGE  50 
int x,gss;
void setup(){
  Serial.begin(9600);
}   
void loop(){
  int aValue =analogRead(0);
  x = map(aValue, 0, 1024, 0, XRANGE);
  gss = map(aValue, 102, 922, -640, 640);
  Serial.print("|"); 
  for (int i=0;i<x;i++){
    if(i==XRANGE/2-1)Serial.print("|");
    else Serial.print("-");
  }
  Serial.print("O");
  for (int i=x+1;i<XRANGE;i++){
    if(i==XRANGE/2-1)Serial.print("|");
    else Serial.print("-");
  }
  Serial.print("|");
  Serial.print(gss);
  Serial.println("Gauss");
  delay(1000);
}

Le résultat c’est que j’acquiert bien une valeur de champ magnétique, mais celle-ci n’est, de une, pas centré sur 0 alors que je n’y applique aucun champs (peut-être du au champs de la Terre mais bon j’en doute). De deux, lorsque j’approche un aimant, le champs varie (tout va bien) mais diminue ! Je passe alors en négatifs… Ducoup je comprends pas trop trop, je pense que mon programme n’est très certainement pas optimisé, et que j’ai du foirer dans mon code je sais pas trop où.
Ducoup s’il existe un Dieu de la TMR 6201 qui passe aux alentours, ou n’importe quelle autre personne plus calée que moi (c’est à dire tout le monde), son aide serait précieuse.

En vous remerciant de m’avoir lu !

Re

J’avais oublié la datasheet de la TMR 6201, la voici donc…

Désolé pour le double post, je découvre ce forum et n’ai pas trouvé l’option pour rajouter des link/fichiers avec Edit

TMR6201-EN-V1.1 (1).pdf (479 KB)

Bonjour

capteur très particulier : pont de 4 magnéto-résistances à effet tunnel (TMR)

  1. Pourquoi utiliser ce capteur ? Dans quel contexte est-il utilisé ? Quels élements doivent être scannés ?

  2. Comment est gérée la sortie différentielle du capteur, le schéma recommandé sur la doc a-t-il été reproduit pour relier le capteur à la carte Arduino ? Shéma du câblage actuel ?

Bonjour !

Oui j'ai du me renseigner parce que je ne savais pas que ce genre de capteur existait (apparemment ils sont plus précis que les AMR ou Hall effect sensor).

Pour le contexte, eh bien la première étape serait d'effectuer une mesure "d'intensité d'un champs. Comme application, je dois être capable de mesurer le champs magnétique émis à différents points d'un billet de banque (par exemple). L'application future serait de pouvoir imager ou faire une carte du champs magnétique renvoyé par un objet (j'ai légalement pas le droit d'en dire plus vu que c'est un projet "top-secret" no joke). Mais le principe reste le même que le billet de banque, obtenir une carte et pouvoir identifier quelles parties d'un objet émette un champs, et quelles sont celles qui n'en émettent pas.

Pour la sortie du capteur, je ne sais pas comment elle est gérée, j'ai commencé hier le projet et j'ai clairement pas trop eu de renseignement (mon tuteur est indien donc barrière de la langue un peu). Ducoup ne comprenant pas trop comment ça marche, je me suis juste contenté de relier la borne V+ de la TMR à A0 de l'arduino. Sinon Vcc est branché au 5V et Gnd à la masse.

Cordialement (et désolé pour le schéma).

j’ai du me renseigner parce que je ne savais pas que ce genre de capteur existait

idem

Le capteur est organisé en pont de Wheatstone, la grandeur éléctrique a exploiter est la différence entre les tensions IN+ et IN-
pont TMR.png

Une première solution est de reproduire le montage à 4 AOP recommandé par le fabricant.
Sinon faire un montage remplisssant la même fonction.

Une petite carte à HX711 ferait peut être l’affaire si elle est assez rapide pour la vitesse du balayage envisagé (scan)
Autre piste : un module Groove de ce type.… ou équivalent

C'est bizarre parce que la seule chose que je pense avoir compris de ce qu'il m'a dit est que nous n'avions pas besoin du montage après :confused:
Le montage en sortie du pont permet d'obtenir une tension différentielle exacte si j'ai bien compris ?
Peut-être que dans l'application on se fiche d'avoir la valeur exacte mais juste une tension "différente"...
En tout cas merci beaucoup !

Tant que vous êtes la... Est-il possible de créer une map des données acquises à partir de Arduino IDE ? Et surtout de la voir du dessus, ou est-il nécessaire d'utiliser des software spécifiques ?

Bien cordialement !

-Investir dans un capteur sophistiqué de ce type et n'exploiter qu'un une branche du pont parait bizarre....

-le tuteur a peu être joué sur les mots : pas la peine de reproduire le montage proposé... si on remplit autrement sa fonction !!

-le pont fournit une tension différentielle ; il faut l'amplifier et sortir une tenique référencée à la masse

-il est possible dans le carte Arduino (dans la limite de la méémoire disponible !) de mémoriser les données acquises. Je ne suis pas certain de comprendre '...et de la voir du dessus.. '
S'agit-il de produire une image 2D représentant la 'cartographie' magnétique de l'objet scanné ?

Pour être honnête, je crois qu'il a juste pris le capteur car ce sont ceux qui sont utilisés par les banques pour scanner les billets et vérifier l'authenticité.

Très bien je vais revoir ça avec lui histoire d'éclaircir cette histoire. Je vais quand même suivre la datasheet et réaliser le montage avec les AOP.

Pour ce qui est de la carte, oui c'est exactement ça, désolé j'avais pas les mots justes. Il faudrait pouvoir cartographier le champs magnétique produit par un objet, et ainsi pouvoir facilement repérer quelles parties de l'objet sont "magnétiques".

Cordialement.

Si tu as une Arduino Mega2560 tu peux faire des mesures différentielles.
Il faudra juste "bricoler" un peu à la main car les librairies standards ne gèrent pas ce mode de fonctionnement.

Il me semble que c'est aussi possible avec une carte Leonardo (ATMega 32u4)

"Investir dans un capteur sophistiqué de ce type et n'exploiter qu'un une branche du pont parait bizarre...."
Si une des branches du pont sert uniquement à caractériser le champ magnétique ambiant, et que l'autre a ub senseur sensible aux particularités locales du champ magnérique (portions magnétisées d'un billet/d'un ticket de metro), ce n'est pas absurde.

oui mais la grande proximité physique des deux branches du pont ne facilte pas ce type d’exploitation (distinction ambiant/local)

Je n'ai qu'une Uno, pas de leonardo ni de mega.

Bien cordialement.

Up sur l'avancement !

Au final j'ai réalisé le diagramme, ce qui a marché (j'ai bien une mesure d'intensité maintenant).

Pour ce qui est de la cartographie, je pense passer par Matlab qui me ferait un plot 3D ou 2D (ducoup obligé de faire un capteur de position aussi mais c'est une autre histoire). Mais la au niveau du code je suis un peu bloqué par mon niveau en Arduino.

Pour l'instant mon programme Arduino se résume à :

#include  
#define //Je les met toujours pour ne pas les oublier si je dois définir et inclure quelque chose

float Mag;       //Variable qui me store la valeur du champ
int val =0 ;     //Variable assignée au code Matlab

void setup()
{
Serial.begin(9600)
Serial.println('a');   //ligne de hand-shake entre Matlab et Arduino
char 'a'= 'b';
while (a!='b')
   {
    a= Serial.read();
   }
}
void loop()
{ 
   while (Serial.available() == 0)
   {
   }
    if (Serial.available>0)      //lignes de commande pour commencer la récupération des données par Matlab
    {
     val = Serial.read();
     if (val='R')                     
        {
         getMagnetic();           //C'est la mon problème, je voudrais créer une fonction qui a gardé en mémoire les valeurs de Mag
         Serial.println(Mag);
        }
    }
}
// int getMagnetic ?

Donc j'aimerais savoir comment garder les données acquises en mémoire, et si on est obligé de passé par l'EEPROM... Sachant qu'ici les valeurs à sauvegardées sont directement lues sur A0 (Arduino Uno)

Bien cordialement.

Combien de données devez vous sauvegarder?

Bonjour,

Je dirais au maximum 200 ou 250 (grand grand maximum).

Cordialement.

Bon, en admettant que ce sera des entiers signés d'avr (int16_t) , ça va vous manger 512 octets au maximum dans un tableau (et un UNO a 2 koctets de RAM, IIRC: vous mangerez 25 % de la RAM, ce qui laisse une marge plus que confortable).
Oubliez l'idée de stocker en EEPROM: elle est plus petite, plus lente que la RAM... et à un nombre d'écritures limité (si vous avez à scanner tout plein de billets dodus, vous n'allez pas user l'EEPROM?)

Très bien je vais stocker dans la RAM ducoup.

Mais est-ce que je peux appeler les données stockées dans la RAM et les envoyer à Matlab sous forme d'une matrice ?

Et aussi, je viens d'y penser mais si je veux y stocker différents types de données (càd : la position, en x et y, et l'intensité), est ce que je peux tout faire rentrer dans la RAM (nous serions toujours autour des 300 données d'entier signés).

Cordialement.

Faites le calcul : x a telle taille et tel nombre....

Vous pouvez envoyer un tableau sous la forme que vous voulez vers le PC (j'utilise pyserial; je suppose que Matlab a une interface serie, ou que vous avez un moyen d'écrire un fichier sur le PC à partir de données série)
Capturing an analog signal with Arduino and python | Freedom Embedded donne un exemple (sur 30 lignes de part et d'autre) d'acquisition et d'envoi, par arduino, de reception et dessin, par python. Malgré sa concision, il est compliqué: envoye les données en binaire ; tous les calculs de débit de données sont explicites.

Je me suis mal exprimé.

Je demandais si on pouvait rentrer plusieurs types de données dans la RAM, ce qui est possible apparemment. Par contre, je ne sais pas comment stocker les données dans la RAM, existe-t-il une fonction pour cela ? (la question peut être bête, je ne suis pas connaisseur dutout).

Aussi, est ce que je peux appeler les données stockées dans la RAM dans une fonction, que je ferais passer à matlab ?

Désolé de déranger.
Cordialement.