Apprenez à construire un détecteur de métaux en utilisant un oscillateur Colpitts et un Arduino.

Comment fonctionnent les détecteurs de métaux ?

Le circuit réservoir

Dans le circuit ci-dessus, le condensateur et l’inducteur en série forment un circuit réservoir. Dans un circuit réservoir, l’énergie est transférée de manière répétée entre un condensateur et une inductance, ce qui entraîne une oscillation. Le courant déchargé du condensateur traverse l’inducteur ; lorsque le condensateur est complètement déchargé, le champ magnétique décroissant de l’inducteur maintient le flux de courant. Le condensateur se charge alors avec la polarité opposée, et lorsque le champ magnétique s’est complètement effondré, le condensateur se décharge, ce qui entraîne la circulation du courant dans le sens opposé à celui du courant initial. Ce cycle continue.

L’inducteur du circuit du réservoir ci-dessus forme le détecteur du détecteur de métaux (une grande bobine de fil). Lorsqu’un matériau métallique s’approche du centre de l’inducteur (la bobine du détecteur), il entre dans le champ magnétique créé par l’inducteur. Cela modifie la perméabilité magnétique du noyau de l’inducteur, entraînant une modification de l’inductance. Le changement d’inductance, à son tour, modifie la fréquence d’oscillation du circuit du réservoir.

Si les composants étaient idéaux, le circuit du réservoir oscillerait indéfiniment sans source d’énergie externe. Mais, en pratique, les composants ne sont pas idéaux. La résistance indésirable des composants introduira une perte d’énergie, provoquant l’arrêt du courant oscillant. Pour contrer cela, un amplificateur inverseur BJT à un étage est utilisé pour ajouter continuellement du gain dans le circuit réservoir.

L’oscillateur de Colpitts

Puisque l’oscillation aux nœuds avant et après l’inducteur sont déphasés de 180° l’un par rapport à l’autre, un des nœuds fournira l’oscillation à la base du transistor, amplifiera et inversera le signal au collecteur, puis le renverra en phase à l’autre nœud du circuit réservoir. Tout ce circuit est appelé l’oscillateur de Colpitts.

L’oscillateur de Colpitts ci-dessus fournit une oscillation régulière avec une fréquence dans la gamme des 100kHz. Les métaux des articles ménagers qui modifient la perméabilité du noyau de l’inducteur font fluctuer cette fréquence autour de 10kHz. Comme cette gamme de fréquences est en dehors du spectre audio humain (20Hz à 20kHz), nous devrons traduire l’oscillation en une tonalité audible.

Les détecteurs de métaux BFO (beat-frequency oscillator) traditionnels surmontent ce problème en incorporant un autre circuit de réservoir avec une fréquence fixe égale à la fréquence du circuit de réservoir du détecteur sans l’influence d’aucun métal. Ensuite, en prenant la différence entre les deux fréquences, on isolera les fréquences fluctuantes du circuit du détecteur et on les ramènera à une gamme audible.

Pour ce projet de détecteur de métaux, nous utiliserons un Arduino pour traiter le signal d’oscillation au lieu de décaler l’oscillation avec un deuxième circuit réservoir. L’Arduino stockera la fréquence fixe et comparera en permanence la fréquence entrante du circuit de détection avec la fréquence stockée (plus d’informations sur le programme Arduino ci-dessous).

Matériaux pour votre détecteur de métaux DIY

Pour ce projet, un coupe-herbe jouet a été choisi pour loger tous les composants. Il comprend les caractéristiques suivantes :

  • un bouton déclencheur, que nous réutiliserons pour déclencher le haut-parleur
  • un bouton latéral, que nous utiliserons pour régler la fréquence fixe
  • un compartiment à piles (3xAA) avec un interrupteur marche/arrêt
  • un haut-parleur, à travers lequel nous jouerons la tonalité
  • un moteur avec des LED attachées qui seront activées lorsque la différence de fréquence dépasse un certain seuil
  • une tête circulaire dans laquelle nous adapterons une bobine de fil pour l’inducteur du circuit du réservoir

Nous ajouterons également un potentiomètre (argent) pour rendre réglable la sensibilité des changements de tonalité.

La bobine de l’inducteur est faite d’environ 50 enroulements de fil 26 AWG autour d’une bobine de 5,5 pouces de diamètre.

À l’intérieur du boîtier, nous remplacerons la carte de circuit imprimé d’origine par notre propre circuit et nous fixerons tous les périphériques au circuit avec des têtes de broche.

Schémas du circuit de détection de métaux

J’ai utilisé un Arduino UNO pour programmer un DIP ATMega328. J’ai ensuite retiré l’ATMega328 de la carte de développement et l’ai encastré dans une perfboard avec le reste du circuit.

L’oscillateur Colpitts, en bas à gauche sur le schéma, alimente l’oscillation dans le compteur 1 (broche T1) de la puce (marquée comme broche numérique 5 sur l’Arduino UNO), où il compte constamment la fréquence de l’oscillation.

Au niveau supérieur du schéma, une alimentation de 4.5V (piles 3xAA, avec des condensateurs de dérivation) est utilisée pour alimenter l’ATmega328, l’oscillateur, le haut-parleur et le moteur (avec des LED).

Pour maintenir l’appel de courant des broches numériques du microcontrôleur à un niveau sûr (40 mA par broche maximum pour l’ATmega328), un transistor NPN (C2878) est utilisé pour piloter le haut-parleur, et un MOSFET à canal N (SUB45N03) pour piloter le moteur.

Les commutateurs de déclenchement et de réinitialisation (définit la fréquence fixe) sont câblés aux broches numériques en utilisant une configuration pull-up interne. De petits condensateurs sont ajoutés en parallèle pour déborder les commutateurs.

Le potentiomètre de sensibilité est configuré comme un diviseur de tension, et la division est lue en utilisant une broche analogique.

Démarche du code

Le code source complet de ce projet peut être trouvé ici:

  • https://github.com/evankale/ArduinoMetalDetector

Vous trouverez ci-dessous une marche détaillée du code.

Fonction de configuration

Pour suivre la fréquence d’oscillation du détecteur à travers le compteur de timer 1, nous devons d’abord configurer les registres de contrôleur de timer/compteur (TCCR). Ces TCCR sont accessibles par les trois entiers : TTCR1A, TTCR1B, et TTCR1C.

TCCR1A = 0b00000000;TCCR1B = 0b00000111;

Nous devrons configurer la génération de forme d’onde en mode normal en mettant les drapeaux WGM de TCCR1A et TCCR1B à 0, et configurer le mode de sélection de la vitesse d’horloge à la source d’horloge externe en mettant les drapeaux CS de TCCR1B au mode 3 (horloge externe sur le front montant). Dans cette configuration, le registre OCR1A se décrémentera de 1 à chaque fois qu’un front montant sera détecté à partir de l’oscillation.

TIMSK1 |= (1 << OCIE1A);

Puis nous devrons activer l’interruption A de la minuterie/comptage en mettant le drapeau OCIE1A dans le registre TIMSK1. Cela permettra à la fonction d’interruption SIGNAL(TIMER1_COMPA_vect) d’être appelée chaque fois que le registre OCR1A atteint 0.

OCR1A = 1;

Initialise maintenant OCR1A à 1 afin que la fonction d’interruption soit appelée dès que le premier front montant est détecté.

Fonction d’interruption

C’est la fonction SIGNAL(TIMER1_COMPA_vect). Elle est appelée lorsque le registre OCR1A atteint 0. Dans cette fonction, nous voulons garder la trace du nombre de microsecondes écoulées depuis le dernier appel de la fonction. Ce delta de temps est stocké comme signalTimeDelta.

storedTimeDelta est le delta de temps à « fréquence fixe » auquel signalTimeDelta est comparé dans la boucle principale. storedTimeDelta est réglé sur signalTimeDelta lorsque storedTimeDelta est mis à zéro (au démarrage et lorsque l’interrupteur de réinitialisation est pressé).

OCR1A += CYCLES_PER_SIGNAL;

Après avoir effectué des opérations d’interruption, OCR1A doit être réinitialisé en l’incrémentant avec notre constante prédéfinie, CYCLES_PER_SIGNAL (nombre de cycles avant la prochaine interruption).

Fonction de boucle

Dans la fonction de boucle, nous vérifions si le déclencheur est pressé. Si c’est le cas, on lit alors la valeur analogique du potentiomètre de sensibilité et on interpole linéairement la valeur analogique (0 à 1023) à une échelle plus facile à utiliser (0,5 à 10,0).

int storedTimeDeltaDifference = (storedTimeDelta - signalTimeDelta) * sensitivity;

La différence entre la fréquence fixe (storedTimeDelta) et la fréquence mesurée (signalTimeDelta) est calculée et multipliée par la valeur de sensibilité.

tone(SPEAKER_PIN, BASE_TONE_FREQUENCY + storedTimeDeltaDifference);

Cette valeur est ensuite additionnée à une fréquence de tonalité de base audible, BASE_TONE_FREQUENCY, et diffusée par le haut-parleur en utilisant la fonction Arduino tone().

Si la différence dépasse le seuil défini par SPINNER_THRESHOLD, alors le moteur est activé.

Si le déclencheur est relâché, alors la tonalité du haut-parleur est arrêtée (en appelant la fonction noTone()) et le moteur est désactivé.

Si le bouton de réinitialisation a été pressé, il remettra à zéro storedTimeDelta, permettant au prochain appel d’interruption de définir une nouvelle valeur.

Quelle est la fonctionnalité de notre détecteur de métaux basé sur Arduino ?

Avec le réglage de sensibilité le plus bas, le détecteur de métaux peut repérer de gros objets comme des canettes de soda, des téléphones portables et des outils en fer à quelques pouces de la bobine. Avec le réglage de sensibilité le plus élevé, des objets plus petits comme des anneaux d’acier, des vis et des pièces de monnaie à la même proximité peuvent également être détectés. Voir la vidéo en haut de l’article pour une démonstration !

Pour étendre la portée du détecteur, nous pouvons augmenter la surface du champ magnétique créé par l’inducteur. Cela peut être réalisé en augmentant le flux de courant à travers l’inducteur (en augmentant l’entrée de tension à l’oscillateur, permettant un plus grand gain dans l’amplificateur), ou en augmentant le nombre d’enroulements de fils dans la bobine de l’inducteur.

Avec un détecteur de métaux basé sur Arduino, nous pouvons faire d’autres choses intéressantes qui ne peuvent pas être faites avec les détecteurs de métaux BFO traditionnels. Restez à l’écoute pour de futurs projets sur la façon dont nous pouvons tirer parti de ce mécanisme de détection de métaux à d’autres fins !

ArduinoMetalDetector-master.zip

Donnez à ce projet un essai pour vous-même ! Obtenez la nomenclature.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.