Table des matières:

Détecteur à induction d'impulsions basé sur Arduino - Bobine à bascule : 5 étapes (avec photos)
Détecteur à induction d'impulsions basé sur Arduino - Bobine à bascule : 5 étapes (avec photos)

Vidéo: Détecteur à induction d'impulsions basé sur Arduino - Bobine à bascule : 5 étapes (avec photos)

Vidéo: Détecteur à induction d'impulsions basé sur Arduino - Bobine à bascule : 5 étapes (avec photos)
Vidéo: Tutoriel du contrôleur de vitesse de moteur 2024, Juillet
Anonim
Détecteur à induction d'impulsions basé sur Arduino - Bobine à bascule
Détecteur à induction d'impulsions basé sur Arduino - Bobine à bascule
Détecteur à induction d'impulsions basé sur Arduino - Bobine à bascule
Détecteur à induction d'impulsions basé sur Arduino - Bobine à bascule

L'idée

Ayant construit des détecteurs de métaux dans le passé avec des résultats variables, je voulais explorer les capacités de l'Arduino dans cette direction.

Il y a quelques bons exemples de comment construire des détecteurs de métaux avec l'Arduino, certains ici comme instructables. Mais quand on les regarde, ils nécessitent normalement soit pas mal de composants externes pour le traitement du signal analogique, soit la sensibilité est assez faible.

Lorsque l'on pense aux détecteurs de métaux, le sujet principal est de savoir comment détecter les légers changements de tension dans les signaux liés à la bobine de recherche. Ces changements sont normalement très faibles. L'approche la plus évidente consisterait à utiliser les entrées analogiques de l'ATmega328. Mais en regardant les spécifications, il y a deux problèmes de base: ils sont (souvent) trop lents et la résolution est (dans la plupart des cas) trop faible.

D'un autre côté, l'Arduino fonctionne à 16 MHz et possède de nombreuses capacités de synchronisation i. e. une résolution de 0,0625 µS si vous utilisez la vitesse d'horloge. Ainsi, au lieu d'utiliser l'entrée analogique pour la détection, le moyen le plus simple de détecter de petits changements dynamiques de tension est de comparer le changement de chute de tension au fil du temps à une tension de référence fixe.

A cet effet, l'ATmega328 a la caractéristique intéressante d'un comparateur interne entre D6 et D7. Ce comparateur est capable de déclencher une interruption, permettant une gestion précise des événements. Laissant à côté des routines de synchronisation soigneusement codées comme millis () et micos () et entrant dans la minuterie interne de l'ATmega328 avec une résolution beaucoup plus élevée, l'Arduino est une excellente base pour les approches de détection de métaux.

Ainsi, du point de vue du code source, un bon début serait de programmer le comparateur interne pour le "changement" de polarité des entrées et d'utiliser un compteur interne avec la vitesse la plus élevée possible pour le changement de synchronisation des changements.

Le code général dans Arduido pour y parvenir est:

// Définition de toutes les pré-variables requises, etc. et configuration des registres

car non signé clockSelectBits = _BV(CS10); // pas de pré-échelle, configuration complète du vide xtal () { pinMode (6, INPUT); // + du comparateur - en les définissant comme INPUT, ils // sont réglés sur pinMode haute impédance (7, INPUT); // - du comparateur - en les définissant comme INPUT, ils // sont réglés sur la haute impédance cli(); // arrête les interruptions TCCR1A = 0; // mettre tout le registre TCCR1A à 0 TCCR1B = 0; // idem pour TCCR1B -> mode normalTCNT1 = 0; //initialise la valeur du compteur à 0; TCCR1B |= clockSelectBits; // définit le prescaler et démarre l'horloge TIMSK1 = _BV(TOIE1); // définit le bit d'activation de l'interruption de débordement du temporisateur sei(); //autoriser les interruptions ACSR = (0 << ACD) | // Comparateur analogique: Activé (0 << ACBG) | // Analog Comparator Bandgap Select: AIN0 est appliqué à l'entrée positive (0 << ACO) | // Sortie du comparateur analogique: Off (1 << ACI) | // Indicateur d'interruption du comparateur analogique: Effacer l'interruption en attente (1 << ACIE) | // Interruption du comparateur analogique: Activé (0 << ACIC) | // Capture d'entrée du comparateur analogique: désactivé (0 << ACIS1 | 0 << ACIS0 // interruption sur basculement de sortie // (0 << ACIS1 | 1 << ACIS0 // réservé // (1 << ACIS1 | 0 << ACIS0 // interruption sur front descendant de sortie // (1 << ACIS1 | 1 << ACIS0 // interruption sur front montant d'entrée; }

// cette routine est appelée à chaque fois que le comparateur crée une interruption

ISR(ANALOG_COMP_vect) { ancienSREG=SREG; cli(); horodatage=TCNT1; SREG = ancienSREG; }

// cette routine est appelée à chaque fois qu'il y a un débordement dans le compteur interne

ISR(TIMER1_OVF_vect){ timer1_overflow_count++; }

// cette routine est utilisée pour remettre le timer à 0

void resetTimer(void){ oldSREG = SREG; cli(); // Désactiver les interruptions TCNT1 = 0; //initialise la valeur du compteur à 0 SREG = oldSREG; // Restaurer le registre d'état TCCR1B |= clockSelectBits; // définit le prescaler et démarre l'horloge timer1_overflow_count=0; // réinitialise le compteur de débordement }

Bien sûr, cette idée n'est pas entièrement nouvelle. La partie principale de ce code se trouve ailleurs. Une bonne implémentation telle qu'une approche pour un microcontrôleur trouvée sur la page d'accueil de TPIMD - Tiny Pulse Induction Metal Detector.

www.miymd.com/index.php/projects/tpimd/ (malheureusement cette page n'est plus en ligne, il existe actuellement une sauvegarde du site sur www.basic4mcu.com, recherchez "TPIMD").

Étape 1: Idée d'induction d'impulsions Arduino - Bobine à bascule

Idée d'induction d'impulsions Arduino - Bobine à bascule
Idée d'induction d'impulsions Arduino - Bobine à bascule
Idée d'induction d'impulsions Arduino - Bobine à bascule
Idée d'induction d'impulsions Arduino - Bobine à bascule

L'idée est d'utiliser l'Arduino comme détecteur d'induction d'impulsions, comme dans TPIMD, car l'idée de synchronisation de la courbe de décroissance semble plutôt bien fonctionner. Le problème avec les détecteurs à induction d'impulsions est qu'ils ont normalement besoin d'une tension différente pour fonctionner. Une tension pour alimenter la bobine et une tension séparée pour traiter la courbe de décroissance. Ces deux sources de tension rendent les détecteurs à induction pulsée toujours un peu compliqués.

En regardant la tension de la bobine dans un détecteur PI, la courbe résultante peut être divisée en deux étapes différentes. La première étape est l'impulsion elle-même alimentant la bobine et créant le champ magnétique (1). La deuxième étape est la courbe de décroissance de la tension, commençant par un pic de tension, puis s'ajustant rapidement à la tension "sans alimentation" de la bobine (2). Le problème est que la bobine change de polarité après l'impulsion. Si l'impulsion est positive (Var 1. dans l'image ci-jointe), la courbe de décroissance est négative. L'impulsion est-elle négative, la courbe de décroissance sera positive (Var 2. dans l'image ci-jointe)

Pour résoudre ce problème de base, la bobine doit être "basculée" électroniquement après l'impulsion. Dans ce cas, l'impulsion peut être positive et la courbe de décroissance peut également être positive.

Pour ce faire, la bobine doit être isolée de Vcc et GND après l'impulsion. A ce moment, il n'y a qu'un courant circulant à travers une résistance d'amortissement. Ce système isolé de bobine et de résistance d'amortissement peut alors être "orienté" vers n'importe quelle tension de référence. Ceci, en théorie, créera la courbe positive combinée (en bas du dessin)

Cette courbe positive peut ensuite être utilisée via le comparateur pour détecter le moment où la tension de décroissance "croise" une tension de référence. En cas de trésors à proximité de la bobine, la courbe de décroissance change et le moment de croisement de la tension de référence change. Ce changement peut alors être détecté.

Après quelques essais, le circuit suivant s'est avéré efficace.

Le circuit se compose d'un module Arduino Nano. Ce module pilote deux transistors MOSFET alimentant la bobine (en SV3) via D10. Lorsque l'impulsion à D10 se termine, les deux MOSFET isolent la bobine de 12 V et de GND. L'énergie économisée dans la bobine s'écoule via R2 (220 Ohms). En même temps, R1 (560 Ohms) connecte l'ancien côté positif de la bobine à GND. Cela change la courbe de décroissance négative à R5 (330 Ohms) en une courbe positive. Les diodes protègent la broche d'entrée de l'Arduino.

R7 est un diviseur de tension à environ 0,04V. Au moment où la courbe de décroissance à D7 devient plus négative que 0,04 à D6, une interruption est déclenchée et la durée après la fin de l'impulsion est enregistrée.

En cas de métal près de la bobine, la courbe de décroissance dure plus longtemps et le temps entre la fin de l'impulsion et l'interruption s'allonge.

Étape 2: Construire le détecteur (planche à pain)

Construire le détecteur (planche à pain)
Construire le détecteur (planche à pain)
Construire le détecteur (planche à pain)
Construire le détecteur (planche à pain)
Construire le détecteur (planche à pain)
Construire le détecteur (planche à pain)

Construire le détecteur est assez facile. Cela peut se faire soit sur une maquette (coller au circuit d'origine) soit en soudant les pièces sur un PCB.

La LED D13 sur la carte Arduino Nano est utilisée comme indication pour le métal

Unsing une planche à pain est le moyen le plus rapide pour le détecteur de travail. Un certain câblage est nécessaire, mais cela peut toujours être fait avec une petite planche à pain. Dans les images, cela est montré en 3 étapes car l'Arduino et les MOSFET cachent certains des fils. Lors des tests, j'ai déconnecté les diodes d'une manière ou d'une autre sans m'en rendre compte au début. Cela n'a eu aucun effet négatif sur le comportement du détecteur. Dans la version PCB du circuit, je les ai complètement laissés de côté.

Les connexions à un écran OLED 0.96 ne sont pas montrées sur les images. Cet écran est connecté:

Vcc – 5V (à la broche Arduino, pas la tension d'alimentation !!!)

GND – GND

SCL – A5

SDA – A4

Cet écran OLED est nécessaire pour calibrer le détecteur initialement. Cela se fait en réglant la bonne tension sur PIN6 de l'Arduino. Cette tension devrait être d'environ 0,04V. L'affichage aide à régler la bonne tension.

La version planche à pain fonctionne plutôt bien, bien que probablement pas adaptée pour aller dans la nature.

Étape 3: Passer au PCB

Aller PCB
Aller PCB
Aller PCB
Aller PCB
Aller PCB
Aller PCB
Aller PCB
Aller PCB

En ce qui concerne la soudure, je n'aime pas vraiment les PCB high-tech double face, j'ai donc modifié le circuit pour qu'il s'adapte sur un PCB sur une face.

Les modifications suivantes ont été apportées:

1. les diodes ont été omises.

2. les grilles des MOSFET ont une résistance de 10 Ohm

3. la tension d'alimentation du diviseur de tension en D6 est donnée par un signal de niveau HAUT en D8

4. La broche du pilote pour les MOSFET a été modifiée.

De cette façon, un PCB simple face pourrait être créé qui peut être soudé sur des PCB universels. En utilisant ce circuit, vous aurez un détecteur PI fonctionnel avec seulement 8 à 10 composants externes (selon si l'écran OLED et/ou un haut-parleur est utilisé).

Étape 4: Configuration et utilisation du détecteur

Configuration et utilisation du détecteur
Configuration et utilisation du détecteur
Configuration et utilisation du détecteur
Configuration et utilisation du détecteur
Configuration et utilisation du détecteur
Configuration et utilisation du détecteur

Si le détecteur est correctement construit et que le programme est écrit sur l'Arduino, le moyen le plus simple (sinon le seul) de configurer l'unité consiste à utiliser un écran OLED. L'écran est connecté à 5V, GND, A4, A5. L'écran doit afficher « calibration » après la mise sous tension de l'appareil. Après quelques secondes, il devrait dire "calibration effectuée" et trois chiffres devraient être affichés sur l'écran.

Le premier chiffre est la « valeur de référence » identifiée lors de l'étalonnage. La deuxième valeur est la dernière valeur mesurée et la troisième valeur est une valeur moyenne des 32 dernières mesures.

Ces trois valeurs devraient être plus ou moins les mêmes (dans mes cas de test inférieurs à 1000). La valeur médiane doit être plus ou moins stable.

Pour démarrer la configuration initiale, il ne devrait y avoir aucun métal près de la bobine.

Maintenant, le diviseur de tension (potentiomètre d'ajustement) doit être ajusté de manière à ce que les deux valeurs inférieures soient réglées au maximum tout en donnant une lecture stable. Il existe un paramètre critique, où la valeur médiane commence à donner des lectures étranges. Retournez le trimmer pour obtenir à nouveau des valeurs stables.

Il peut arriver que l'affichage se fige. Appuyez simplement sur le bouton de réinitialisation et recommencez.

Pour ma configuration (bobine: 18 tours @ 20cm) la valeur stable est d'environ 630-650. Une fois défini, appuyez sur le bouton de réinitialisation, l'unité se re-calibre et toutes les valeurs de l'arbre doivent à nouveau se trouver dans la même plage. Si le métal est maintenant amené à s'enrouler, la LED de la carte Arduino (D13) devrait s'allumer. Un haut-parleur attaché émet des bruits de cliquetis (il y a là une marge d'amélioration dans la programmation).

Pour éviter les attentes élevées:

Le détecteur détecte certaines choses, mais il reste un détecteur très simple et limité.

Pour donner une idée des capacités, un a fait quelques détections de référence avec différents autres détecteurs. En regardant les résultats, c'est quand même assez impressionnant pour un détecteur avec seulement 8 pièces externes mais ne correspondant pas aux détecteurs professionnels.

En regardant le circuit et le programme, il y a beaucoup de place pour l'amélioration. Les valeurs des résistances ont été trouvées par expérience, le temps d'impulsion de 250 ms a été choisi au hasard, les paramètres de la bobine également. Si vous avez des idées d'améliorations, je serais plus qu'heureux d'en discuter.

S'amuser!

Étape 5: Mise à jour 1: Utilisation d'un écran LCD 16x2

Mise à jour1: Utilisation d'un écran LCD 16x2
Mise à jour1: Utilisation d'un écran LCD 16x2
Mise à jour1: Utilisation d'un écran LCD 16x2
Mise à jour1: Utilisation d'un écran LCD 16x2
Mise à jour1: Utilisation d'un écran LCD 16x2
Mise à jour1: Utilisation d'un écran LCD 16x2

Améliorations

Au cours de tests supplémentaires, j'ai réalisé que la bibliothèque de l'écran I2C OLED prenait un temps considérable. J'ai donc décidé d'utiliser un écran 16x2 avec un convertisseur I2C à la place.

J'ai donc adopté le programme pour l'écran LCD en ajoutant quelques fonctionnalités utiles. La première ligne de l'écran affiche maintenant la force du signal d'une indication possible. La deuxième ligne affiche maintenant deux valeurs. Le poing indiquait l'écart du signal actuel par rapport à la valeur d'étalonnage. Cette valeur doit être "0". Si cette valeur est constamment négative ou positive, le détecteur doit être recalibré en appuyant sur le bouton de réinitialisation. Les valeurs positives indiquent le métal près de la bobine.

La deuxième valeur indique la valeur de retard réelle de la courbe de décroissance. Cette valeur n'est normalement pas très intéressante, mais est nécessaire à la configuration initiale du détecteur.

Le programme permet désormais plusieurs durées d'impulsions dans une séquence (moyen d'expérimenter/améliorer les performances). Je n'ai pas réussi à percer. La valeur par défaut est donc définie sur une durée d'impulsion.

Configuration initiale du détecteur

Lors de la configuration du détecteur, la deuxième valeur de la deuxième ligne est pertinente (la première peut être ignorée). Initialement la valeur peut être "instable" (voir photo). Tournez la résistance d'ajustement jusqu'à ce que la valeur atteigne une lecture stable. Tournez-le ensuite pour augmenter la valeur jusqu'à une valeur stable maximale. Appuyez sur le bouton de réinitialisation pour recalibrer et le détecteur est prêt à être utilisé.

J'ai eu l'impression qu'en fixant la valeur stable maximale, je perdais de la sensibilité pour les métaux non ferreux. Il peut donc valoir la peine d'expérimenter les réglages pour avoir une bonne sensibilité pour les trucs sans fer.

Bobines

Je construis 3 bobines pour des tests supplémentaires

1 -> 18 tours @ 200mm

2 -> 25 tours @ 100mm

3 -> 48 tours @ 100mm

Fait intéressant, toutes les bobines ont plutôt bien fonctionné, avec presque les mêmes performances (pièce de 20 carats à 40-50 mm dans l'air). C'est peut-être une observation assez subjective.

Conseillé: