» Elektronica » Metaaldetectoren »Metaaldetector op de Arduino Pro Mini. Verwerking van de diepten van het Kolokolov-Shchedrin volgens het principe van "Transmissie"

Metaaldetector op Arduino Pro Mini. Verwerking van de diepten van het Kolokolov-Shchedrin volgens het principe van "Transmissie"


Recycling van het Kolokolov-Shchedrin-diepwatersysteem. Verschillen met het oorspronkelijke schema:
1. Er zit GEEN kristaloscillator op de k561 .. chip en 32 kHz quartz. Het 32 ​​kHz signaal geeft de Arduino Pro Mini.
2. Geluidsmeldingscircuits op verschillende microcircuits uit de 561-serie zijn ook niet aanwezig, Arduino spreekt ook het doel uit (en ik moet zeggen, het is een uitstekende stem, in vergelijking met het schema van de auteur).
3. Aangedreven door unipolaire spanning 12v (lood-zuur batterij).
4. Pas de gevoeligheid aan met de knoppen. Met de ADC-schaal van 0 tot 1023 is de responsdrempel instelbaar van 1 tot 38 (de waarde kan eenvoudig in de schets worden gewijzigd).


Metaaldetector op Arduino Pro Mini. Verwerking van de diepten van het Kolokolov-Shchedrin volgens het principe van


Het belangrijkste was dat ik in dit artikel wilde laten zien dat het mogelijk is om MD's op Arduino te monteren die qua gevoeligheid niet onderdoen voor het origineel (dit is gelukt, omdat de originelen van het originele circuit in de orde van 10 stuks zijn verzameld, dus er is materiaal voor vergelijking). Origineel circuit:


Toen ik voor het eerst met Arduino begon te werken, was ik zo enthousiast dat ik dacht dat ik alle metaaldetectorcircuits van internet op Arduino kon vinden en monteren die ik gemakkelijk kon vinden in de enorme vuilnisbelt. In principe is het zo gegaan, maar de circuits waren gebaseerd op een frequentieteller, waardoor een echt goed bereik niet kon worden bereikt. Wat kinderspeelgoed en een test van de pen + proberen geld te verdienen aan beginners. Het origineel van deze MD is een echt werkpaard waarmee je grote objecten kunt vinden op een afstand van 2 meter (zie het Kolokolov-Shchedrin boek in Google). Er zijn geen statistieken over de getransformeerde md. Ik hoop dat ze verschijnt met de steun van fans van MD en Arduino. Het schema werkte met Arduino Uno en Arduino Pro Mini.

Verder op de link staat het proces van de geboorte van deze MD op de website van de soldeerbout, die meer dan een jaar duurde en de auteur ertoe aanzette programmeertuin te studeren. Misschien lijkt de schets iemand ellendig - ik zal je FIXES graag accepteren.




Op dit moment is er een schets waarmee u de gevoeligheidsbarrière kunt aanpassen (pin 7 douins +1 op de barrière, pin 8 -1 op de barrière). .
Arduino over mini 5v, 16MHz, ATmega168 en het display gebruikte deze. Naast de weegschaal staat de Mini SD-adapter


Zoals gezegd kost 1602 86 roebel, ProMini - 82 roebel. Als je wilt, kun je over het algemeen een naakte ATmega168 nemen, er een bord voor ontwikkelen en de schets er direct in vullen.En dus installeerde ik bijvoorbeeld mama-papa op het MD-bord met behulp van de connector. De foto toont de 6-pins plug van Arduino, waardoor schetsen direct op het bord werden gegoten.

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

// A3 analoge ingang voor voltmeter
// A4 analoge ingang voor signaal
// 6- conclusie van de zook
// 9 - uitgangsfrequentie 31200 Hz
#include
LCD-scherm met vloeibare kristallen (12, 11, 5, 4, 3, 2);
                                       
  byte z1 [8] = {// batterijpictogram
  0b01100, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110};
 
 int geteld = 0; // variabele om de schaalniveauwaarde op te slaan
 int voltag = 0; // variabele om de spanningswaarde op te slaan
 int noll = 0; // variabele om de middelpuntwaarde op te slaan
   #define NUM_SAMPLES 10 // 10 analoge samples om in 1 seconde te lezen
   int sum = 0; // som van de genomen monsters
   int zon = 0; // hetzelfde, maar gedeeld door 10
   unsigned char sample_count = 0; // huidig ​​monsternummer met
   drijfspanning = 0,0; // berekende spanning
   const int button1 = 7; // barrière plus-knop
   const int button2 = 8; // barrière-min knop
   int i = 5; // barrière
   
ongeldige setup () {
     lcd.begin (16, 2); // initialisatie weergeven
     lcd.setCursor (1, 0);
     lcd.setCursor (10, 1);
     lcd.print ("Rx-Tx");
     vertraging (3000);
     lcd.clear ();
     
     TCCR1A = TCCR1A & amp; 0xe0 | 2;
     TCCR1B = TCCR1B & amp; 0xe0 | 0x09;
     analogWrite (9, 126); // op pin 10 PWM = 50% f = 31200Hz
     
     lcd.createChar (1, z1);
     }
     
leegte lus () {
     int buttonState1 = HOOG; // De status van de knop is één
     int buttonState2 = HOOG; // Twee knopstatus
   sample_count = 0; // reset de contour van het aantal toevoegingen
   som = 0; // reset de som van 10 toevoegingen
   while (sample_count & lt; NUM_SAMPLES) {
   som + = analogRead (A4); // de volgende meting wordt bij de som opgeteld
   sample_count ++; // de eenheid wordt toegevoegd aan het meetnummer
   sun = sum / 10;} // vind de gemiddelde waarde van 10 metingen
   
   noll = analogRead (A3) / 2; // middelpunt
   floatspanning = kaart (analogRead (A3), 0,1023,0,1500) / 100,0;
                                        // Voltmeter gebouwd op ingang A3
   if (sun & gt; = noll + i) {countleds = map (zon, noll + i, noll * 2 - 250, 9, 14);
                                        // als het ontvangen resultaat op het 9-15e segment van de schaal ligt
    toon (6, telt * 100);}
   if (sun & lt; = noll - i) {countleds = map (zon, 116, noll - i, 0, 7);
                                        // als het resulterende resultaat 0-7 segment van de schaal is
    toon (6, geteld * 50); }
     if (sun & lt; noll & amp; sun & gt; = noll - (i-1)) {countleds = 7;
    noTone (6); } // eilandje van virtuele ZERO (7 segment)
     if (sun & gt; noll & amp; & sun & lt; = noll + (i-1)) {countleds = 8;
    noTone (6); } // eiland van virtuele nulschaal (8 segment)

   
    {lcd.setCursor (countleds, 0); // zet de cursor op de kolom met getallen, regel 0
    lcd.print ("\ xff"); // gevuld pictogram
    lcd.setCursor (0, 1); // ga naar 2 rijen, kolom-0
    lcd.print (char (1)); // Indicatie batterijpictogram
    lcd.setCursor (1, 1); // ga naar spanningsindicatie
    lcd.print (spanning); // spanning
    lcd.setCursor (7, 0); // 8e kolom 1e rij
    if (sun & lt; noll) {lcd.print ("{");} // print
    lcd.setCursor (8, 0); // 9e kolom 1e rij
    if (sun & gt; noll) {lcd.print ("}");} // print
    lcd.setCursor (7, 1);
    lcd.print ("B =");
    lcd.setCursor (9, 1); // 11 kolom 2e rij
    lcd.print (i); // barrière
    lcd.setCursor (13, 1); // 13e kolom 2e rij
    lcd.print (zon); // print de gemiddelde waarde van de ADC-waarde
    vertraging (100); // wacht
    
  buttonState1 = digitalRead (knop1); // Lees knop 1 Status
  buttonState2 = digitalRead (button2); // Lees knop 2 staat
  if (buttonState1 == LOW) {i = i + 1; vertraging (50);}
                                        // Als de knop wordt ingedrukt, groeit de barrière met 1. Vertraging 50
  if (buttonState2 == LOW) {i = i - 1; vertraging (50);}
                                        // Als de knop wordt ingedrukt, neemt de barrière met 1 af. Vertraging 50
  if (i & lt; 1) {i = 1;} // Ondergrens van de barrière
  if (i & gt; 38) {i = 38;} // De bovengrens van de barrière
 
 lcd.clear ();
    }
}

Ik heb de auto niet gebruikt. De laatste twee elementen van de TL074 bleven inactief. Maar op het circuit en het bord zijn ze. Misschien wilt u ze iets later in werkende staat brengen. Ik denk dat ik mijn doel heb bereikt. De display-unit werkt wonderwel. Al het andere hangt af van de MD.
9.8
10
10

Voeg een opmerking toe

    • lachglimlachtxaxaokweet het nietyahoonea
      baaskrabbendwaasjaja-jaagressiefgeheim
      sorrydansdance2dance3pardonhulpdrankjes
      stopvriendengoedgoedfluitjebezwijmdtong
      rookklappencrayverklarenbeledigenddon-t_mentiondownloaden
      hittebooslach1mdavergaderingmoskingnegatief
      not_ipopcornstraffenlezenschrikschriktzoeken
      bespottendankjewelditto_clueUmnikacuutmee eens
      slechtbeeeblack_eyeblum3: oopscheppenverveling
      gecensureerdbeleefdheidgeheim2bedreigenoverwinningyusun_bespectacled
      shokrespektlolvoorgekomenwelkomkrutoyya_za
      ya_dobryihelperne_huliganne_othodifludverbodsluiten
24 commentaar
De auteur
Bedankt puteec FU! Ik heb er de tweede keer om gevraagd. Ik heb Arduino uno genaaid. Het probleem is verdwenen na het updaten van de bootloader. Interesseert nu hoe u verder kunt configureren.
puteec fu
Elke Arduino is geschikt voor atmega168, atmega328. Over nano dit met een usb-connector als het niet verkeerd is. Naai de Arduino-ide uit de voorbeelden van de Blink-schets (knipperende LED's op pin 13, de LED is op het bord geïnstalleerd). Zorg ervoor dat u de juiste poort gebruikt, het bord is correct geselecteerd, de processor op het bord is correct geselecteerd, de kwartsfrequentie op het bord is correct geselecteerd, de firmwaremethode (μ2) is correct geselecteerd.
Fout niet aangetroffen.
Maak een nieuw bestand in Arduino, kopieer de schets vanaf hier naar een nieuwe en schone schets en het zal werken.Maar laat eerst de LED op het Arduino-bord knipperen met een standaard knipperend voorbeeld. Ga dan verder.
Ik kocht Arduino p nano alleen op de Atmega328-processor. Ik heb een aantal video's en forums bekeken ... ze zeiden dat het zou moeten komen ... maar dan knippert de spelbreker NIET .... het geeft #include verwacht "FILENAME" of . Is iemand dit tegengekomen?
De auteur
Met dit bord werkt een schets. Wat is precies de plug gevormd?
Als u de laatste schets giet, kunnen alle details met betrekking tot D3.3 en D3.4, evenals ze zelf, niet worden geïnstalleerd. Op de soldeerbout wordt dit onderwerp opnieuw getekend
Anjey888
Hallo. Dit onderwerp is erg geïnteresseerd. Ik wil het apparaat monteren. Ik maakte onderweg een soldeerboutplank ... en kwam toen vast te zitten. Omdat er veel onenigheid is tussen het bestuur en het circuit. Begonnen met het vergelijken van je board ... dat is een groot verschil. Maar verward met het harnas bij Arduino.
Ik vraag de hulp van deskundige mensen.
De auteur
Hetzelfde als voor andere metalen. De detectiediepte hangt af van het gebied van het doel. Hoe meer, hoe dieper.
Gast Eugene
Wat zijn de limieten voor het detecteren van objecten? Goud, aluminium, koper.
Gast Alexander
Wat nu te doen, omdat er nog steeds een Schottky-barrière is?
De auteur
Nou hier! Van zelfs de kleinste waarde is geen sprake! Bedankt voor de verduidelijking.
Citaat: puteec_80
En mensen zullen sneller en intuïtiever begrijpen waar ik het over heb.
U kunt in deze fout blijven zitten. ((Technisch geletterde mensen zullen een klein verlies lijden.
BARRIER, echtgenoot.
1. Een obstakel (een soort muur, een dwarsbalk) staat in de weg.
2. Hekwerk, hekwerk.

DREMPEL, drempel, echtgenoot.
1. In wetenschap en technologie wordt de drempel de kleinste waarde genoemd, de mate van manifestatie van iets.
De gevoeligheidsdrempel van het apparaat. | Gehoordrempel. | Drempel van pijn. | De sensor wordt geactiveerd wanneer de ingestelde temperatuurdrempel wordt overschreden.
lach
De auteur
Laten we bij onszelf blijven. Ik zal schrijven "de barrière met één eenheid verhogen" en "de gevoeligheid van de ontvanger was 5 μV". En je schrijft "De drempel voor bediening met één eenheid verhogen" en "Gevoeligheidsdrempel voor de ontvanger ..." Bovendien zullen mensen sneller en intuïtiever begrijpen waar ik het over heb.
En ik leg het uit in dit voorbeeld. Strikt genomen is er geen drempel, omdat er geen duidelijke referentieschaal is. Er is een soort uitgesneden zwevende band van een zwevend signaal. Het lijkt mij dus dat de definitie van een barrière veel geschikter is voor deze "zwevende" strook dan voor een drempel.
Over het algemeen zinloos en dom argument. Heeft u nog vragen?
Citaat: puteec_80
Wat zijn hun onder- en bovendrempels?
Misschien komen de betekenissen van de vertaalde woorden niet overeen of komen ze enigszins niet overeen. Maar ze beschrijven het proces perfect en gaan geleidelijk in jargon.
Precies wat de drempel is. De reactiedrempel is in jouw geval. Leg uit hoe de "barrière" het proces beschrijft.
Wat betreft het aansluiten bij jargon - nu zijn er veel allerlei misverstanden. ((
De auteur
In dit geval gebruik ik nog steeds het woord "barrière", omdat het is de barrière die in de programmatekst wordt gezet, maar zonder binnen zijn bereik te komen, wordt het signaal door de microcontroller als nuttig ervaren. En het is de barrière omdat Het heeft twee waarden: de boven- en ondergrenzen van de inloop, d.w.z. de operatie vindt plaats boven de "bovenste" en onder de "onderste" grens van de barrière op de ADC-schaal. Je weet echter beter. Wat zijn hun onder- en bovendrempels?
Misschien komen de betekenissen van de vertaalde woorden niet overeen of komen ze enigszins niet overeen. Maar ze beschrijven het proces perfect en gaan geleidelijk in jargon.
Trouwens. Gevoeligheid en de barrière zijn totaal verschillende dingen.
JaZe kruisen elkaar. Maar niet meer.
Citaat: puteec_80
In buitenlandse MD zegt het menu "Barier".

Ik zal je misschien verrassen, maar veel Engelse woorden die op de onze lijken, hebben een andere betekenis, soms dichtbij, soms niet. Zoek naar de woorden 'valse vertaler-vrienden'.
Nu in wezen. In het Russisch technisch documentatie nee er bestaat gewoon niet zoiets als "barrière van gevoeligheid" - en dat is alles! Er is een 'gevoeligheidsdrempel', in sommige gevallen kan men een 'gevoeligheidsgrens' zeggen, maar geen 'gevoeligheidsbarrière'. Wellicht wordt het in andere kennisgebieden wel gebruikt, maar niet in de elektronica.
De auteur
Nou, het betekent dat alle buitenlandse ingenieurs op de weg over een stok springen. In de buitenlandse MD staat er op het menu "Barier". Kameraad Ivan, je valt in mijn ogen met zulke bekrompen muggenziften! Waar zijn uw opmerkingen over de verdiensten? Waarna je handen plat op het voorhoofd moeten klappen? Je verwende me vaak straffen
Het verschil is aanzienlijk: de drempel is een technische term, de barrière is een 'stok over de weg'.
De auteur
Misschien. Maar ik zie het verschil niet.
Misschien geen 'barrière', maar een drempel? ;)
De auteur
Het diagram toont de knoppen voor het aanpassen van de slagboom niet. Ze zijn aangesloten op pinnen 7 en 8 van de Arduino. Elk trekt met een weerstand van 10k naar de plus, sluit wanneer je op de massa drukt.
De auteur
leegte lus () {
int buttonState1 = HOOG; // De status van de knop is één
int buttonState2 = HOOG; // Twee knopstatus

int pot = analogRead (A4); // filter voor snelle signaalwisseling
teken = teken * (1-K) + pot * K;

noll = noll * (1-L) + teken * L; // signaalfilter op lange termijn
// Voltmeter gebouwd op ingang A3
floatspanning = kaart (analogRead (A3), 0,1023,0,1500) / 100,0;

if (sign> = noll + i) {countleds = map (sign, noll + i, 1023, 9, 14);
// als het ontvangen resultaat op het 9-15e segment van de schaal ligt
toon (6, telt * 100);}
if (sign <= noll - i) {countleds = map (sign, 0, noll - i, 0, 7);
// als het resulterende resultaat 0-7 segment van de schaal is
toon (6, geteld * 50); }
if (sign = noll - (i-1)) {countleds = 7;
noTone (6); } // eilandje van virtuele ZERO (7 segment)
if (sign> noll && sign <= noll + (i-1)) {countleds = 8;
noTone (6); } // eiland van virtuele nulschaal (8 segment)


{lcd.setCursor (countleds, 0); // zet de cursor op de kolom met getallen, regel 0
lcd.print ("\ xff"); // gevuld pictogram
lcd.setCursor (0, 1); // ga naar 2 rijen, kolom-0
lcd.print (char (1)); // Indicatie batterijpictogram
lcd.setCursor (1, 1); // ga naar spanningsindicatie
lcd.print (spanning); // spanning
lcd.setCursor (7, 0); // 8e kolom 1e rij
if (sign lcd.setCursor (8, 0); // 9e kolom 1e rij
if (sign> noll) {lcd.print ("}");} // print
lcd.setCursor (7, 1);
lcd.print ("B =");
lcd.setCursor (9, 1); // 11 kolom 2e rij
lcd.print (i); // barrière
lcd.setCursor (13, 1); // 13e kolom 2e rij
lcd.print (teken); // print de gemiddelde waarde van de ADC-waarde
vertraging (10); // wacht

buttonState1 = digitalRead (knop1); // Lees knop 1 Status
buttonState2 = digitalRead (button2); // Lees knop 2 staat
if (buttonState1 == LOW) {i = i + 1; vertraging (50);}
// Als de knop wordt ingedrukt, groeit de barrière met 1. Vertraging 50
if (buttonState2 == LOW) {i = i - 1; vertraging (50);}
// Als de knop wordt ingedrukt, neemt de barrière met 1 af. Vertraging 50
if (i <1) {i = 1;} // Ondergrens van de barrière
if (i> 38) {i = 38;} // De bovengrens van de barrière

lcd.clear ();
}
}
De auteur
Nieuwe schets. Het algoritme voor het detecteren van het nuttige signaal is gewijzigd. Het schema is vereenvoudigd, er zijn geen elementen D3.4 en D3.3 met al hun bindingen. Als u uw eigen zegel meeneemt, kunnen al deze gegevens gewoon niet worden geïnstalleerd. Meer gevoeligheid. Geen false positives.
Schets:

// A3 analoge ingang voor een voltmeter Instelbaar met potentiometer R32.
// A4 analoge ingang voor het signaal Stel in met het minimum signaal op D3.2
// weerstand R40 voor de ADC-metingen van ongeveer 510.
// 6- conclusie van de zook
// 9 - uitgangsfrequentie 31200 Hz
#include
LCD-scherm met vloeibare kristallen (12, 11, 5, 4, 3, 2);

byte z1 [8] = {// batterijpictogram
0b01100, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110};
int geteld = 0; // variabele om de schaalniveauwaarde op te slaan

drijfspanning = 0,0; // berekende spanning
const int button1 = 7; // barrière plus-knop
const int button2 = 8; // barrière-min knop
int i = 5; // barrière
const float K = 0,1; // filter volgt snelle veranderingen (coëfficiënt. hoe kleiner hoe sterker)
const float L = 0,07; // filter tracking veranderingen over een lange tijd
zwevend teken = 0; // filter
zweven noll = 0;

ongeldige setup () {
lcd.begin (16, 2); // initialisatie weergeven
lcd.createChar (1, z1);
pinMode (9, OUTPUT);
pinMode (6, OUTPUT);
TCCR1A = TCCR1A & 0xe0 | 2;
TCCR1B = TCCR1B & 0xe0 | 0x09;
analogWrite (9, 126); // op pin 10 PWM = 50% f = 31200Hz
// in feite, voor PWM = 50% moet je minstens 220 vulling instellen, volgens de oscilloscoop
// de duin kan het niet aan. Dit is niet kritisch.
}
De auteur
Degenen die de schets zullen bekijken. De tekens> = en <= zijn vervangen door vreemde combinaties van & gt en & lt. Waarom ik het niet weet. Bij foutopsporing was normaal.

We raden je aan om te lezen:

Geef het voor de smartphone ...