» Électronique » Détecteurs de métaux »Détecteur de métaux sur l'Arduino Pro Mini. Traitement des profondeurs du Kolokolov-Shchedrin selon le principe de «Transmission»

Détecteur de métaux sur Arduino Pro Mini. Traitement des profondeurs du Kolokolov-Shchedrin selon le principe de «Transmission»


Recyclage du plan d'eau profonde de Kolokolov-Shchedrin. Différences par rapport au schéma d'origine:
1. Il n'y a PAS d'oscillateur à cristal sur la puce k561 .. et le quartz 32 kHz. Le signal de 32 kHz donne l'Arduino Pro Mini.
2. Les circuits de notification sonore sur plusieurs microcircuits de la série 561 ne sont également pas présents, Arduino exprime également la cible (et je dois dire que c'est une excellente expression, par rapport au schéma de l'auteur).
3. Alimenté par une tension unipolaire 12v (batterie plomb-acide).
4. Réglez la sensibilité avec les boutons. Avec l'échelle ADC de 0 à 1023, le seuil de réponse est réglable de 1 à 38 (la valeur peut facilement être modifiée dans l'esquisse).


Détecteur de métaux sur Arduino Pro Mini. Traitement des profondeurs du Kolokolov-Shchedrin selon le principe de «Transmission»


Plus important encore, je voulais montrer dans cet article qu'il est possible d'assembler des MD sur Arduino non inférieurs à l'original en sensibilité (cela a fonctionné, car les originaux du circuit d'origine ont été collectés de l'ordre de 10 pièces, donc il y a du matériel à comparer). Circuit d'origine:


Lorsque j'ai commencé à travailler avec Arduino, j'étais tellement enthousiaste que j'ai pensé que je pouvais trouver et assembler tous les circuits de détection de métaux sur Internet sur Arduino que je pouvais facilement trouver dans le vaste dépotoir. En principe, cela s'est avéré ainsi, mais les circuits étaient basés sur un compteur de fréquence, ce qui ne permettait pas d'atteindre une très bonne gamme. Quelques jouets pour enfants et un test du stylo + tente de gagner de l'argent sur les débutants. L'original de ce MD est un véritable cheval de bataille qui vous permet de trouver de gros objets à une distance de 2m (voir le livre Kolokolov-Shchedrin dans Google). Il n'y a pas de statistiques sur le md transformé. J'espère qu'elle apparaîtra avec le soutien des fans de MD et Arduino. Le schéma a fonctionné avec Arduino Uno et Arduino Pro Mini.

Plus loin sur le lien est exposé le processus de naissance de ce MD sur le site Web du Fer à souder, qui a duré plus d'un an et a poussé l'auteur à étudier la programmation duin. Peut-être que le croquis semblera misérable à quelqu'un - j'accepterai volontiers vos CORRECTIONS.




À l'heure actuelle, il existe un croquis qui vous permet d'ajuster la barrière de sensibilité (broche 7 douins +1 à la barrière, broche 8 -1 à la barrière). .
Arduino sur mini 5v, 16MHz, ATmega168 et l'écran les a utilisés. À côté de la balance se trouve l'adaptateur Mini SD


Comme déjà dit 1602 coûte 86 roubles, ProMini - 82 roubles. Si vous le souhaitez, vous pouvez généralement prendre un ATmega168 nu, développer un tableau pour celui-ci et y remplir le croquis directement.Et donc, par exemple, j'ai installé maman-papa sur la carte MD en utilisant le connecteur. La photo montre la fiche à 6 broches d'Arduino, à travers laquelle des croquis ont été coulés directement sur la carte.

Sketch-MD.Rx-Tx.ProMini.SrednjajaTochkaRegBar.ino

// Entrée analogique A3 pour voltmètre
// Entrée analogique A4 pour signal
// 6 - conclusion
// 9 - fréquence de sortie 31200 Hz
#include
LCD à cristaux liquides (12, 11, 5, 4, 3, 2);
                                       
  octet z1 [8] = {// icône de batterie
  0b01100, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110};
 
 int countleds = 0; // variable pour stocker la valeur du niveau d'échelle
 int voltag = 0; // variable pour stocker la valeur de tension
 int noll = 0; // variable pour stocker la valeur médiane
   #define NUM_SAMPLES 10 // 10 échantillons analogiques à lire en 1 seconde
   int sum = 0; // somme des échantillons prélevés
   soleil int = 0; // identique, mais divisé par 10
   unsigned char sample_count = 0; // numéro d'échantillon actuel avec
   tension flottante = 0,0; // tension calculée
   const int button1 = 7; // bouton barrière plus
   const int button2 = 8; // bouton barrière moins
   int i = 5; // barrière
   
void setup () {
     lcd.begin (16, 2); // affiche l'initialisation
     lcd.setCursor (1, 0);
     lcd.setCursor (10, 1);
     lcd.print ("Rx-Tx");
     retard (3000);
     lcd.clear ();
     
     TCCR1A = TCCR1A & amp; 0xe0 | 2;
     TCCR1B = TCCR1B & amp; 0xe0 | 0x09;
     analogWrite (9, 126); // à la broche 10 PWM = 50% f = 31200Hz
     
     lcd.createChar (1, z1);
     }
     
boucle vide () {
     int buttonState1 = HIGH; // L'état du bouton est un
     int buttonState2 = HIGH; // État à deux boutons
   sample_count = 0; // réinitialise le contour du nombre d'additions
   somme = 0; // réinitialise la somme de 10 ajouts
   while (sample_count & lt; NUM_SAMPLES) {
   sum + = analogRead (A4); // la mesure suivante est ajoutée à la somme
   sample_count ++; // l'unité est ajoutée au numéro de mesure
   sun = sum / 10;} // trouve la valeur moyenne de 10 mesures
   
   noll = analogRead (A3) / 2; // puissance médiane
   tension flottante = carte (lecture analogique (A3), 0,1023,0,1500) /100,0;
                                        // Voltmètre construit à l'entrée A3
   if (soleil & gt; = noll + i) {countleds = carte (soleil, noll + i, noll * 2 - 250, 9, 14);
                                        // si le résultat reçu est sur le 9-15ème segment de l'échelle
    ton (6, countleds * 100);}
   if (soleil & lt; = noll - i) {countleds = carte (soleil, 116, noll - i, 0, 7);
                                        // si le résultat obtenu est un segment de 0 à 7 de l'échelle
    ton (6, countleds * 50); }
     if (soleil & lt; noll & amp; & amp; soleil & gt; = noll - (i-1)) {countleds = 7;
    noTone (6); } // îlot de ZERO virtuel (7 segments)
     if (soleil & gt; noll & amp; & amp; soleil & lt; = noll + (i-1)) {countleds = 8;
    noTone (6); } // îlot d'échelle virtuelle ZERO (8 segments)

   
    {lcd.setCursor (countleds, 0); // place le curseur sur la colonne countleds, ligne 0
    lcd.print ("\ xff"); // icône remplie
    lcd.setCursor (0, 1); // passe à 2 lignes, colonne-0
    lcd.print (char (1)); // Indication de l'icône de la batterie
    lcd.setCursor (1, 1); // passe à l'indication de tension
    lcd.print (tension); // tension
    lcd.setCursor (7, 0); // 8ème colonne 1ère ligne
    if (sun & lt; noll) {lcd.print ("{");} // print
    lcd.setCursor (8, 0); // 9ème colonne 1ère ligne
    if (sun & gt; noll) {lcd.print ("}");} // print
    lcd.setCursor (7, 1);
    lcd.print ("B =");
    lcd.setCursor (9, 1); // 11 colonne 2e ligne
    lcd.print (i); // barrière
    lcd.setCursor (13, 1); // 13e colonne 2e rangée
    lcd.print (soleil); // affiche la valeur moyenne de la valeur ADC
    retard (100); // attend
    
  buttonState1 = digitalRead (bouton1); // État du bouton de lecture 1
  buttonState2 = digitalRead (bouton2); // Lire l'état du bouton 2
  if (buttonState1 == LOW) {i = i + 1; retard (50);}
                                        // Lorsque le bouton est enfoncé, la barrière augmente de 1. Délai 50
  if (buttonState2 == LOW) {i = i - 1; retard (50);}
                                        // Lorsque le bouton est enfoncé, la barrière diminue de 1. Délai 50
  if (i & lt; 1) {i = 1;} // Limite inférieure de la barrière
  if (i & gt; 38) {i = 38;} // La limite supérieure de la barrière
 
 lcd.clear ();
    }
}

Je n'ai pas utilisé la voiture. Les deux derniers éléments du TL074 sont restés inactifs. Mais ils sont sur le circuit et la carte. Vous voudrez peut-être les remettre en état de marche un peu plus tard. Je crois que j'ai atteint mon objectif. L'unité d'affichage fonctionne à merveille. Tout le reste dépend du MD.
9.8
10
10

Ajoutez un commentaire

    • souriresouritxaxaokne sais pasYahoonea
      patronse gratterfououioui-ouiagressifsecret
      désolédansedanse2danse3pardonaiderles boissons
      arrêteramisbonbonsifflerévanouirla langue
      fumerapplaudircraydéclarermoqueurdon-t_mentiontélécharger
      chaleurirritérire1mdaréunionmasquagenégatif
      not_ipop-cornpunirlireeffrayerfait peurrecherche
      railleriemerci_vousçato_clueumnikaigud'accord
      mauvaisabeilleblack_eyeblum3rougirse vanterennui
      censuréplaisanteriesecret2menacervictoireyusun_bespectacled
      shokrespektlolprévalubienvenuekrutoyya_za
      ya_dobryiaidene_huliganne_othodifludinterdirefermer
24 commentaire
L'auteur
Merci puteec FU! Je l'ai demandé dès la deuxième fois. J'ai cousu à travers Arduino uno. Le problème a disparu après la mise à jour du chargeur de démarrage. Intéresse maintenant comment configurer davantage.
puteec fu
Tout Arduino convient à atmega168, atmega328. À propos de nano avec un connecteur USB si ce n'est pas une erreur. Cousez l'idé Arduino à partir des exemples de l'esquisse Blink (LED clignotantes sur la broche 13, la LED est installée sur la carte). Assurez-vous que vous utilisez le bon port, la carte est sélectionnée correctement, le processeur sur la carte est sélectionné correctement, la fréquence de quartz sur la carte est sélectionnée correctement, la méthode du micrologiciel (μ2) est sélectionnée correctement.
Erreur non rencontrée.
Créez un nouveau fichier dans Arduino, copiez l'esquisse d'ici dans une nouvelle esquisse propre et cela fonctionnera.Mais d'abord, faites clignoter la LED de la carte Arduino avec un exemple de clignotement standard. Continuez ensuite.
J'ai acheté Arduino p nano uniquement sur le processeur Atmega328. J'ai passé en revue un tas de vidéos et de forums ... ils ont dit que cela devrait arriver .... mais alors le bummer ne clignote PAS .... donne #include attend "FILENAME" ou . Quelqu'un l'a-t-il rencontré?
L'auteur
Un croquis fonctionne avec cette planche. Quelle est exactement la fiche formée?
Si vous versez le dernier croquis, tous les détails relatifs à D3.3 et D3.4 ainsi qu’eux-mêmes ne peuvent pas être installés. Sur le fer à souder il y a une refonte sur ce sujet
Anjey888
Bonjour Ce sujet est très intéressé. Je veux assembler l'appareil. J'ai fait une planche à souder dès le départ ... puis je suis resté coincé. Puisqu'il y a beaucoup de désaccord entre la carte et le circuit. J'ai commencé à comparer votre planche ... c'est une grande différence. Mais confondu avec le harnais chez Arduino.
Je demande l'aide de personnes bien informées.
L'auteur
Identique aux autres métaux. La profondeur de détection dépend de la zone de la cible. Le plus, le plus profond.
Eugene invité
Quelles sont les limites de détection d'objets? Or, aluminium, cuivre.
Alexander invité
Que faire maintenant, car il y a encore une barrière Schottky?
L'auteur
Eh bien ici! Même la plus petite valeur est hors de question! Merci pour la clarification.
Citation: puteec_80
Et les gens comprendront plus rapidement et intuitivement de quoi je parle.
Vous pouvez continuer à rester dans cette erreur. ((Les personnes techniquement alphabétisées seront légèrement perdues.)
BARRIÈRE, mari.
1. Un obstacle (une sorte de mur, une traverse) s'immisce sur le chemin.
2. Clôture, clôture.

SEUIL, seuil, mari.
1. En science et technologie, le seuil est appelé la plus petite valeur, le degré de manifestation de quelque chose.
Le seuil de sensibilité de l'appareil. | Seuil d'audition. | Seuil de douleur. | Le capteur se déclenche lorsque le seuil de température réglé est dépassé.
sourire
L'auteur
Restons avec le nôtre. J'écrirai "l'augmentation de la barrière d'une unité" et "la sensibilité du récepteur était de 5 μV". Et vous écrivez "Augmenter le seuil de fonctionnement d'une unité" et "seuil de sensibilité du récepteur .." De plus, les gens comprendront plus rapidement et intuitivement de quoi je parle.
Et j'explique dans cet exemple. Il n'y a pas de seuil à proprement parler, car il n'y a pas d'échelle de référence claire. Il existe une sorte de bande flottante de coupure à partir d'un signal flottant. Il me semble donc que la définition d'une barrière est beaucoup plus adaptée à cette bande «flottante» qu'à un seuil.
Argument généralement inutile et stupide. Avez-vous des questions?
Citation: puteec_80
Quels sont leurs seuils inférieur et supérieur?
Peut-être que la signification des mots traduits ne correspond pas ou ne correspond pas légèrement. Mais ils décrivent parfaitement le processus et entrent progressivement dans l'argot.
Quel est exactement le seuil. Le seuil de réponse est dans votre cas. Veuillez expliquer comment la «barrière» décrit le processus.
Quant à rejoindre l'argot - il y a maintenant beaucoup de malentendus de toutes sortes (
L'auteur
Dans ce cas, j'ai toujours tendance à utiliser le mot «barrière», car c'est la barrière qui est posée dans le texte du programme, ne tombant tout simplement pas dans sa plage, le signal est perçu par le microcontrôleur comme utile. Et c'est la barrière parce que Il a deux valeurs - les limites supérieure et inférieure du rodage, c'est-à-dire l'opération se produit au-dessus de la limite "supérieure" et en dessous de la limite "inférieure" de la barrière sur l'échelle ADC. Mais vous savez mieux. Quels sont leurs seuils inférieur et supérieur?
Peut-être que la signification des mots traduits ne correspond pas ou ne correspond pas légèrement. Mais ils décrivent parfaitement le processus et entrent progressivement dans l'argot.
Au fait. La sensibilité et la barrière sont des choses complètement différentes.
OuiIls se croisent. Mais pas plus.
Citation: puteec_80
En MD étranger, le menu dit "Barier".

Je peux vous surprendre, mais de nombreux mots anglais qui ressemblent aux nôtres ont une signification différente, parfois proche, parfois non. Recherchez les mots «faux amis traducteurs».
Maintenant essentiellement. En russe technique documentation non il n'y a tout simplement pas une telle phrase «barrière de sensibilité» - et c'est tout! Il existe un «seuil de sensibilité», dans certains cas on peut dire une «limite de sensibilité», mais pas une «barrière de sensibilité». Peut-être qu'il est utilisé dans d'autres branches de la connaissance, mais pas en électronique.
L'auteur
Eh bien, cela signifie que tous les ingénieurs étrangers sautent par-dessus un bâton sur la route. Dans le MD étranger, le menu dit "Barier". Camarade Ivan, vous me tombez dans les yeux avec une telle petite piqûre! Où sont vos commentaires sur le fond? Après quoi vous devez frapper vos mains à plat sur le front? Tu me gâtais souvent punir
La différence est importante: le seuil est un terme technique, la barrière est un «bâton de l'autre côté de la route».
L'auteur
Peut-être. Mais je ne vois pas la différence.
Peut-être pas une "barrière", mais un seuil? ;)
L'auteur
Le diagramme ne montre pas les boutons de réglage de la barrière. Ils sont connectés aux broches 7 et 8 de l'Arduino. Chacun tiré avec une résistance de 10k au plus, se ferme lorsque vous appuyez sur la masse.
L'auteur
boucle vide () {
int buttonState1 = HIGH; // L'état du bouton est un
int buttonState2 = HIGH; // État à deux boutons

int pot = analogRead (A4); // filtre pour un changement de signal rapide
signe = signe * (1-K) + pot * K;

noll = noll * (1-L) + signe * L; // filtre de signal à long terme
// Voltmètre construit à l'entrée A3
tension flottante = carte (lecture analogique (A3), 0,1023,0,1500) /100,0;

if (signe> = noll + i) {countleds = carte (signe, noll + i, 1023, 9, 14);
// si le résultat reçu est sur le 9-15ème segment de l'échelle
ton (6, countleds * 100);}
if (signe <= noll - i) {countleds = map (signe, 0, noll - i, 0, 7);
// si le résultat obtenu est un segment de 0 à 7 de l'échelle
ton (6, countleds * 50); }
if (signe = noll - (i-1)) {countleds = 7;
noTone (6); } // îlot de ZERO virtuel (7 segments)
if (signe> noll && signe <= noll + (i-1)) {countleds = 8;
noTone (6); } // îlot d'échelle virtuelle ZERO (8 segments)


{lcd.setCursor (countleds, 0); // place le curseur sur la colonne countleds, ligne 0
lcd.print ("\ xff"); // icône remplie
lcd.setCursor (0, 1); // passe à 2 lignes, colonne-0
lcd.print (char (1)); // Indication de l'icône de la batterie
lcd.setCursor (1, 1); // passe à l'indication de tension
lcd.print (tension); // tension
lcd.setCursor (7, 0); // 8ème colonne 1ère ligne
if (sign lcd.setCursor (8, 0); // 9ème colonne 1ère ligne
if (sign> noll) {lcd.print ("}");} // print
lcd.setCursor (7, 1);
lcd.print ("B =");
lcd.setCursor (9, 1); // 11 colonne 2e ligne
lcd.print (i); // barrière
lcd.setCursor (13, 1); // 13e colonne 2e rangée
lcd.print (signe); // affiche la valeur moyenne de la valeur ADC
retard (10); // attend

buttonState1 = digitalRead (bouton1); // État du bouton de lecture 1
buttonState2 = digitalRead (bouton2); // Lire l'état du bouton 2
if (buttonState1 == LOW) {i = i + 1; retard (50);}
// Lorsque le bouton est enfoncé, la barrière augmente de 1. Délai 50
if (buttonState2 == LOW) {i = i - 1; retard (50);}
// Lorsque le bouton est enfoncé, la barrière diminue de 1. Délai 50
if (i <1) {i = 1;} // Limite inférieure de la barrière
if (i> 38) {i = 38;} // La limite supérieure de la barrière

lcd.clear ();
}
}
L'auteur
Nouveau croquis. L'algorithme de détection du signal utile a été modifié. Le schéma est simplifié, il n'y a pas d'éléments D3.4 et D3.3 avec toutes leurs liaisons. Si vous prenez votre propre chevalière, tous ces détails ne peuvent tout simplement pas être installés. Plus de sensibilité. Pas de faux positifs.
Esquisse:

// Entrée analogique A3 pour un voltmètre, réglable par potentiomètre R32.
// Entrée analogique A4 pour le signal, réglée avec le signal minimum sur D3.2
// résistance R40 pour les lectures ADC d'environ 510.
// 6 - conclusion
// 9 - fréquence de sortie 31200 Hz
#include
LCD à cristaux liquides (12, 11, 5, 4, 3, 2);

octet z1 [8] = {// icône de batterie
0b01100, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110};
int countleds = 0; // variable pour stocker la valeur du niveau d'échelle

tension flottante = 0,0; // tension calculée
const int button1 = 7; // bouton barrière plus
const int button2 = 8; // bouton barrière moins
int i = 5; // barrière
const float K = 0,1; // filtre suivant les changements rapides (coefficient. plus le plus petit est le plus fort)
const float L = 0,07; // filtre les changements de suivi sur une longue période
signe flottant = 0; // filtre
float noll = 0;

void setup () {
lcd.begin (16, 2); // affiche l'initialisation
lcd.createChar (1, z1);
pinMode (9, SORTIE);
pinMode (6, SORTIE);
TCCR1A = TCCR1A & 0xe0 | 2;
TCCR1B = TCCR1B & 0xe0 | 0x09;
analogWrite (9, 126); // à la broche 10 PWM = 50% f = 31200Hz
// en fait, pour PWM = 50% il faut régler au moins 220 de remplissage, selon l'oscilloscope
// le duin ne peut pas le gérer. Ce n'est pas critique.
}
L'auteur
Ceux qui regarderont le croquis. Les signes> = et <= ont été remplacés par d'étranges combinaisons de & gt et & lt. Pourquoi je ne sais pas. Quand le débogage était normal.

Nous vous conseillons de lire:

Donnez-le au smartphone ...