» Elektronik » Metalldetektoren »Metalldetektor am Arduino Pro Mini. Bearbeitung der Tiefen des Kolokolov-Shchedrin nach dem Prinzip der „Übertragung“

Metalldetektor auf Arduino Pro Mini. Bearbeitung der Tiefen des Kolokolov-Shchedrin nach dem Prinzip der „Übertragung“


Recycling des Kolokolov-Shchedrin-Tiefwassersystems Unterschiede zum ursprünglichen Schema:
1. Auf dem k561 .. Chip befindet sich KEIN Quarzoszillator und 32 kHz Quarz. Das 32-kHz-Signal gibt dem Arduino Pro Mini.
2. Tonbenachrichtigungsschaltungen auf mehreren Mikroschaltungen der Serie 561 sind ebenfalls nicht vorhanden. Arduino spricht auch das Ziel an (und ich muss sagen, es ist im Vergleich zum Schema des Autors eine ausgezeichnete Stimme).
3. Angetrieben durch unipolare Spannung 12 V (Blei-Säure-Batterie).
4. Stellen Sie die Empfindlichkeit mit den Tasten ein. Mit der ADC-Skala von 0 bis 1023 ist die Antwortschwelle von 1 bis 38 einstellbar (der Wert kann in der Skizze leicht geändert werden).


Metalldetektor auf Arduino Pro Mini. Bearbeitung der Tiefen des Kolokolov-Shchedrin nach dem Prinzip der „Übertragung“


Am wichtigsten war, dass ich in diesem Artikel zeigen wollte, dass es möglich ist, MDs auf Arduino zusammenzusetzen, deren Empfindlichkeit dem Original nicht unterlegen ist (dies hat funktioniert, da die Originale der Originalschaltung in der Größenordnung von 10 Stück gesammelt wurden, sodass Vergleichsmaterial vorhanden ist). Originalschaltung:


Als ich anfing, mit Arduino zu arbeiten, war ich so begeistert, dass ich dachte, ich könnte alle Metalldetektor-Schaltkreise aus dem Internet auf Arduino finden und zusammenbauen, die ich leicht in der riesigen Müllkippe finden könnte. Im Prinzip stellte sich heraus, dass dies so war, aber die Schaltungen basierten auf einem Frequenzzähler, der es nicht ermöglichte, einen wirklich guten Bereich zu erreichen. Einige Kinderspielzeuge und ein Test des Stifts + versuchen, mit Anfängern Geld zu verdienen. Das Original dieser MD ist ein echtes Arbeitstier, mit dem Sie große Objekte in einer Entfernung von 2 m finden können (siehe das Kolokolov-Shchedrin-Buch in Google). Es gibt keine Statistiken zum transformierten md. Ich hoffe, sie erscheint mit der Unterstützung von Fans von MD und Arduino. Das Schema funktionierte mit Arduino Uno und Arduino Pro Mini.

Weiter auf dem Link wird der Geburtsprozess dieses MD auf der Website des Lötkolbens beschrieben, der mehr als ein Jahr dauerte und den Autor dazu veranlasste, Programmierduin zu studieren. Vielleicht erscheint die Skizze jemandem elend - ich akzeptiere gerne Ihre FIXES.




Im Moment gibt es eine Skizze, mit der Sie die Empfindlichkeitsbarriere einstellen können (Pin 7 verdoppelt sich +1 zur Barriere, Pin 8 -1 zur Barriere). .
Arduino über Mini 5V, 16MHz, ATmega168 und das Display verwendet diese. Neben der Waage befindet sich der Mini SD-Adapter


Wie bereits gesagt, kostet 1602 86 Rubel, ProMini - 82 Rubel. Wenn Sie möchten, können Sie sogar einen nackten ATmega168 nehmen, ein Board dafür entwickeln und die Skizze direkt hineinfüllen.Und so habe ich zum Beispiel Mama-Papa über den Stecker auf der MD-Platine installiert. Das Foto zeigt den 6-poligen Stecker von Arduino, durch den Skizzen direkt auf die Tafel gegossen wurden.

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

// A3 Analogeingang für Voltmeter
// A4 Analogeingang für Signal
// 6- Abschluss des Zooks
// 9 - Ausgangsfrequenz 31200 Hz
#include
Flüssigkristall-LCD (12, 11, 5, 4, 3, 2);
                                       
  Byte z1 [8] = {// Batteriesymbol
  0b01100, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110};
 
 int countleds = 0; // Variable zum Speichern des Skalierungsstufenwerts
 int voltag = 0; // Variable zum Speichern des Spannungswerts
 int noll = 0; // Variable zum Speichern des Mittelpunktwerts
   #define NUM_SAMPLES 10 // 10 analoge Samples zum Lesen in 1 Sekunde
   int sum = 0; // Summe der entnommenen Proben
   int sun = 0; // gleich, aber geteilt durch 10
   unsigned char sample_count = 0; // aktuelle Probennummer mit
   Erhaltungsspannung = 0,0; // berechnete Spannung
   const int button1 = 7; // Barriere plus Taste
   const int button2 = 8; // Barriere-Minus-Taste
   int i = 5; // Barriere
   
void setup () {
     lcd.begin (16, 2); // Initialisierung anzeigen
     lcd.setCursor (1, 0);
     lcd.setCursor (10, 1);
     lcd.print ("Rx-Tx");
     Verzögerung (3000);
     lcd.clear ();
     
     TCCR1A = TCCR1A & amp; 0xe0 | 2;
     TCCR1B = TCCR1B & amp; 0xe0 | 0x09;
     analogWrite (9, 126); // an Pin 10 PWM = 50% f = 31200Hz
     
     lcd.createChar (1, z1);
     }}
     
void loop () {
     int buttonState1 = HIGH; // Der Status der Schaltfläche ist eins
     int buttonState2 = HIGH; // Zwei-Tasten-Status
   sample_count = 0; // Kontur der Anzahl der Additionen zurücksetzen
   Summe = 0; // setze die Summe von 10 Additionen zurück
   while (sample_count & lt; NUM_SAMPLES) {
   sum + = analogRead (A4); // Die nächste Messung wird zur Summe addiert
   sample_count ++; // Die Einheit wird zur Messnummer hinzugefügt
   sun = sum / 10;} // finde den Durchschnittswert aus 10 Messungen
   
   noll = analogRead (A3) / 2; // Mittelpunktleistung
   Schwebespannung = Karte (analogRead (A3), 0,1023,0,1500) / 100,0;
                                        // Voltmeter am Eingang A3
   if (sun & gt; = noll + i) {countleds = map (sun, noll + i, noll * 2 - 250, 9, 14);
                                        // wenn sich das empfangene Ergebnis auf einem 9-15 Segment der Skala befindet
    Ton (6, gezählte * 100);}
   if (sun & lt; = noll - i) {countleds = map (sun, 116, noll - i, 0, 7);
                                        // wenn das resultierende Ergebnis 0-7 Segment der Skala ist
    Ton (6, Countleds * 50); }}
     if (Sonne & lt; noll & amp; & amp; Sonne & gt; = noll - (i-1)) {countleds = 7;
    noTone (6); } // Insel der virtuellen NULL (7 Segmente)
     if (Sonne & gt; noll & amp; & amp; Sonne & lt; = noll + (i-1)) {countleds = 8;
    noTone (6); } // Insel der virtuellen NULL-Skala (8 Segmente)

   
    {lcd.setCursor (countleds, 0); // setze den Cursor auf die Spalte countleds, Zeile 0
    lcd.print ("\ xff"); // gefülltes Symbol
    lcd.setCursor (0, 1); // gehe zu 2 Zeilen, Spalte-0
    lcd.print (char (1)); // Batteriesymbolanzeige
    lcd.setCursor (1, 1); // zur Spannungsanzeige wechseln
    lcd.print (Spannung); // Spannung
    lcd.setCursor (7, 0); // 8. Spalte 1. Zeile
    if (sun & lt; noll) {lcd.print ("{");} // print
    lcd.setCursor (8, 0); // 9. Spalte 1. Zeile
    if (sun & gt; noll) {lcd.print ("}");} // print
    lcd.setCursor (7, 1);
    lcd.print ("B =");
    lcd.setCursor (9, 1); // 11 Spalte 2. Zeile
    lcd.print (i); // Barriere
    lcd.setCursor (13, 1); // 13. Spalte 2. Zeile
    lcd.print (Sonne); // drucke den Durchschnittswert des ADC-Wertes
    Verzögerung (100); // warte
    
  buttonState1 = digitalRead (button1); // Status von Schaltfläche 1 lesen
  buttonState2 = digitalRead (button2); // Status von Schaltfläche 2 lesen
  if (buttonState1 == LOW) {i = i + 1; Verzögerung (50);}
                                        // Wenn die Taste gedrückt wird, wächst die Barriere um 1. Verzögerung 50
  if (buttonState2 == LOW) {i = i - 1; Verzögerung (50);}
                                        // Wenn die Taste gedrückt wird, verringert sich die Barriere um 1. Verzögerung 50
  if (i & lt; 1) {i = 1;} // Untere Grenze der Barriere
  if (i & gt; 38) {i = 38;} // Die obere Grenze der Barriere
 
 lcd.clear ();
    }}
}}

Ich habe das Auto nicht benutzt. Die letzten beiden Elemente des TL074 blieben im Leerlauf. Aber auf der Rennstrecke und auf der Platine sind sie. Vielleicht möchten Sie sie etwas später in einen funktionsfähigen Zustand bringen. Ich glaube, dass ich mein Ziel erreicht habe. Die Anzeigeeinheit funktioniert wunderbar. Alles andere hängt von der MD ab.
9.8
10
10

Kommentar hinzufügen

    • lächelnlächeltxaxaokweiß nichtYahoonea
      ChefKratzerDummkopfjaja-jaaggressivGeheimnis
      Entschuldigungtanzendance2Tanz3VerzeihungHilfeGetränke
      hör aufFreundegutgut gutpfeifenOhnmachtZunge
      RauchklatschenCrayerklärenspöttischdon-t_mentionherunterladen
      Hitzeärgerlichlach1mdaTreffenMoskingnegativ
      not_iPopcornbestrafenlesenerschreckenAngstSuche
      verspottendankedasto_clueumnikakutstimme zu
      schlechtbeeeblack_eyeblum3errötenprahlenLangeweile
      zensiertAngenehmheitsecret2drohenSiegyusun_bespectacled
      shokrespektlolvorgezogenWillkommenKrutoyya_za
      ya_dobryiHelferne_huliganne_othodiFludVerbotschließen
24 Kommentar
Der Autor
Danke puteec FU! Ich habe es ab dem zweiten Mal angefordert. Ich habe Arduino uno durchgenäht. Das Problem verschwand nach dem Aktualisieren des Bootloaders. Interessiert sich nun, wie man weiter konfiguriert.
puteec fu
Jedes Arduino ist für atmega168, atmega328 geeignet. Über Nano es mit USB-Anschluss, wenn nicht falsch. Nähen Sie die Arduino-Idee aus den Beispielen der Blink-Skizze ein (blinkende LEDs an Pin 13, die LED ist auf der Platine installiert). Stellen Sie sicher, dass Sie den richtigen Port verwenden, die Karte richtig ausgewählt ist, der Prozessor auf der Karte richtig ausgewählt ist, die Quarzfrequenz auf der Karte richtig ausgewählt ist und die Firmware-Methode (μ2) richtig ausgewählt ist.
Fehler nicht aufgetreten.
Erstellen Sie eine neue Datei in Arduino, kopieren Sie die Skizze von hier in eine neue und saubere Skizze und es wird funktionieren.Lassen Sie jedoch zuerst die LED auf der Arduino-Platine mit einem Standard-Blinkbeispiel blinken. Dann mach weiter.
Ich habe Arduino p nano nur auf dem Atmega328-Prozessor gekauft. Ich habe eine Reihe von Videos und Foren durchgesehen ... sie sagten, dass es auftauchen sollte ... aber dann blinkt der Mist NICHT ... gibt #include erwartet "FILENAME" oder . Hat jemand dies angetroffen?
Der Autor
Mit dieser Tafel funktioniert eine Skizze. Was genau ist der Stecker gebildet?
Wenn Sie die letzte Skizze einfügen, können nicht alle Details zu D3.3 und D3.4 sowie diese selbst installiert werden. Auf dem Lötkolben gibt es eine Neuzeichnung zu diesem Thema
Anjey888
Guten Tag. Dieses Thema ist sehr interessiert. Ich möchte das Gerät zusammenbauen. Ich habe von Anfang an eine Lötplatte gemacht ... und bin dann stecken geblieben. Da gibt es viele Meinungsverschiedenheiten zwischen der Platine und der Schaltung. Ich habe angefangen, dein Board zu vergleichen ... das ist ein großer Unterschied. Aber verwirrt mit dem Geschirr bei Arduino.
Ich bitte um die Hilfe von sachkundigen Leuten.
Der Autor
Das gleiche wie für andere Metalle. Die Detektionstiefe hängt vom Bereich des Ziels ab. Je mehr, desto tiefer.
Gast Eugene
Was sind die Grenzen für die Erkennung von Objekten? Gold, Aluminium, Kupfer.
Gast Alexander
Was tun jetzt, weil es noch eine Schottky-Barriere gibt?
Der Autor
Bitte schön! Selbst der kleinste Wert kommt nicht in Frage! Danke für die Klarstellung.
Quote: puteec_80
Und die Leute werden schneller und intuitiver verstehen, wovon ich spreche.
Sie können weiterhin in diesem Fehler bleiben. ((Technisch versierte Personen sind ratlos.
BARRIER, Ehemann.
1. Ein Hindernis (eine Art Mauer, ein Querträger) im Weg.
2. Zaun, Fechten.

SCHWELLE, Schwelle, Ehemann.
1. In Wissenschaft und Technologie wird die Schwelle als kleinster Wert bezeichnet, als Grad der Manifestation von etwas.
Die Empfindlichkeitsschwelle des Geräts. | Hörschwelle. | Schmerzschwelle. | Der Sensor wird ausgelöst, wenn die eingestellte Temperaturschwelle überschritten wird.
lächeln
Der Autor
Bleiben wir bei uns. Ich werde schreiben "Erhöhung der Barriere um eine Einheit" und "Die Empfindlichkeit des Empfängers betrug 5 μV." Und Sie schreiben "Erhöhen der Betriebsschwelle um eine Einheit" und "Empfindlichkeitsschwelle des Empfängers". Außerdem werden die Leute schneller und intuitiver verstehen, wovon ich spreche.
Und ich erkläre in diesem Beispiel. Genau genommen gibt es keine Schwelle, da es keine eindeutige Referenzskala gibt. Es gibt eine Art Cutout-Floating-Band aus einem Floating-Signal. Daher scheint mir die Definition einer Barriere für diesen „schwebenden“ Streifen viel besser geeignet zu sein als für eine Schwelle.
Im Allgemeinen sinnloses und dummes Argument. Haben Sie Fragen?
Quote: puteec_80
Was sind ihre unteren und oberen Schwellenwerte?
Möglicherweise stimmen die Bedeutungen der übersetzten Wörter nicht oder nur geringfügig überein. Aber sie beschreiben den Prozess perfekt und gehen allmählich in den Slang über.
Genau das ist die Schwelle. Die Antwortschwelle ist in Ihrem Fall. Bitte erläutern Sie, wie die „Barriere“ den Prozess beschreibt.
Was den Slang angeht - jetzt gibt es dort viele Missverständnisse aller Art. ((
Der Autor
In diesem Fall neige ich immer noch dazu, das Wort "Barriere" zu verwenden, weil Es ist die Barriere, die im Programmtext festgelegt ist, aber ohne in seinen Bereich zu gelangen, wird das Signal vom Mikrocontroller als nützlich empfunden. Und es ist die Barriere, weil Es hat zwei Werte - die obere und untere Grenze des Einlaufs, d.h. Der Betrieb erfolgt oberhalb der "oberen" und unterhalb der "unteren" Grenze der Barriere auf der ADC-Skala. Sie wissen es jedoch besser. Was sind ihre unteren und oberen Schwellenwerte?
Möglicherweise stimmen die Bedeutungen der übersetzten Wörter nicht oder nur geringfügig überein. Aber sie beschreiben den Prozess perfekt und gehen allmählich in den Slang über.
Übrigens. Empfindlichkeit und Barriere sind völlig verschiedene Dinge.
JaSie kreuzen sich. Aber nicht mehr.
Quote: puteec_80
Im ausländischen MD steht auf dem Menü "Barier".

Ich mag Sie überraschen, aber viele englische Wörter, die unseren ähnlich sehen, haben eine andere Bedeutung, manchmal nahe, manchmal nicht. Suchen Sie nach den Wörtern "falsche Übersetzerfreunde".
Nun im Wesentlichen. Auf Russisch technisch Dokumentation Nein Es gibt einfach keinen solchen Ausdruck "Barriere der Sensibilität" - und das war's! Es gibt eine "Empfindlichkeitsschwelle", in einigen Fällen können wir "Empfindlichkeitsgrenze" sagen, aber nicht "Empfindlichkeitsbarriere". Vielleicht wird es in einigen anderen Wissensgebieten verwendet, aber nicht in der Elektronik.
Der Autor
Nun, es bedeutet, dass alle ausländischen Ingenieure über einen Stock auf der Straße springen. In ausländischer MD steht auf der Speisekarte "Barier". Genosse Ivan, Sie fallen mir mit so kleinen Streitereien in die Augen! Wo sind Ihre Kommentare zu den Verdiensten? Danach müssen Sie Ihre Hände flach auf die Stirn klatschen? Du hast mich oft verwöhnt bestrafen
Der Unterschied ist signifikant: Die Schwelle ist ein Fachbegriff, die Barriere ist ein "Stock über die Straße".
Der Autor
Vielleicht. Aber ich sehe keinen Unterschied.
Vielleicht keine "Barriere", sondern eine Schwelle? ;)
Der Autor
Das Diagramm zeigt nicht die Schaltflächen zur Einstellung der Barriere. Sie sind mit den Pins 7 und 8 des Arduino verbunden. Jeder wird mit einem Widerstand von 10k zum Plus hochgezogen und schließt, wenn Sie auf die Masse drücken.
Der Autor
void loop () {
int buttonState1 = HIGH; // Der Status der Schaltfläche ist eins
int buttonState2 = HIGH; // Zwei-Tasten-Status

int pot = analogRead (A4); // Filter für schnellen Signalwechsel
Vorzeichen = Vorzeichen * (1-K) + Topf * K;

noll = noll * (1-L) + Vorzeichen * L; // Langzeitsignalfilter
// Voltmeter am Eingang A3
Schwebespannung = Karte (analogRead (A3), 0,1023,0,1500) / 100,0;

if (Zeichen> = noll + i) {countleds = map (Zeichen, noll + i, 1023, 9, 14);
// wenn sich das empfangene Ergebnis auf einem 9-15 Segment der Skala befindet
Ton (6, gezählte * 100);}
if (Zeichen <= noll - i) {countleds = map (Zeichen, 0, noll - i, 0, 7);
// wenn das resultierende Ergebnis 0-7 Segment der Skala ist
Ton (6, Countleds * 50); }}
if (sign = noll - (i-1)) {countleds = 7;
noTone (6); } // Insel der virtuellen NULL (7 Segmente)
if (sign> noll && sign <= noll + (i-1)) {countleds = 8;
noTone (6); } // Insel der virtuellen NULL-Skala (8 Segmente)


{lcd.setCursor (countleds, 0); // setze den Cursor auf die Spalte countleds, Zeile 0
lcd.print ("\ xff"); // gefülltes Symbol
lcd.setCursor (0, 1); // gehe zu 2 Zeilen, Spalte-0
lcd.print (char (1)); // Batteriesymbolanzeige
lcd.setCursor (1, 1); // zur Spannungsanzeige wechseln
lcd.print (Spannung); // Spannung
lcd.setCursor (7, 0); // 8. Spalte 1. Zeile
if (sign lcd.setCursor (8, 0); // 9. Spalte 1. Zeile
if (sign> noll) {lcd.print ("}");} // print
lcd.setCursor (7, 1);
lcd.print ("B =");
lcd.setCursor (9, 1); // 11 Spalte 2. Zeile
lcd.print (i); // Barriere
lcd.setCursor (13, 1); // 13. Spalte 2. Zeile
lcd.print (Zeichen); // drucke den Durchschnittswert des ADC-Wertes
Verzögerung (10); // warte

buttonState1 = digitalRead (button1); // Status von Schaltfläche 1 lesen
buttonState2 = digitalRead (button2); // Status von Schaltfläche 2 lesen
if (buttonState1 == LOW) {i = i + 1; Verzögerung (50);}
// Wenn die Taste gedrückt wird, wächst die Barriere um 1. Verzögerung 50
if (buttonState2 == LOW) {i = i - 1; Verzögerung (50);}
// Wenn die Taste gedrückt wird, verringert sich die Barriere um 1. Verzögerung 50
if (i <1) {i = 1;} // Untere Grenze der Barriere
if (i> 38) {i = 38;} // Die obere Grenze der Barriere

lcd.clear ();
}
}
Der Autor
Neue Skizze. Der Algorithmus zum Erfassen des Nutzsignals wurde geändert. Das Schema ist vereinfacht, es gibt keine Elemente D3.4 und D3.3 mit all ihren Bindungen. Wenn Sie Ihr eigenes Siegel mitnehmen, können all diese Details einfach nicht installiert werden. Mehr Empfindlichkeit. Keine Fehlalarme.
Skizze:

// A3-Analogeingang für ein Voltmeter. Einstellbar mit dem Potentiometer R32.
// A4-Analogeingang für das Signal. Mit dem Minimalsignal auf D3.2 einstellen
// Widerstand R40 für die ADC-Messwerte von ca. 510.
// 6- Abschluss des Zooks
// 9 - Ausgangsfrequenz 31200 Hz
#include
Flüssigkristall-LCD (12, 11, 5, 4, 3, 2);

Byte z1 [8] = {// Batteriesymbol
0b01100, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110, 0b11110};
int countleds = 0; // Variable zum Speichern des Skalierungsstufenwerts

Erhaltungsspannung = 0,0; // berechnete Spannung
const int button1 = 7; // Barriere plus Taste
const int button2 = 8; // Barriere-Minus-Taste
int i = 5; // Barriere
const float K = 0,1; // Filter Tracking schnelle Änderungen (Koeffizient. Je kleiner desto stärker)
const float L = 0,07; // Filter-Tracking-Änderungen über einen langen Zeitraum
Float-Zeichen = 0; // filtern
float noll = 0;

void setup () {
lcd.begin (16, 2); // Initialisierung anzeigen
lcd.createChar (1, z1);
PinMode (9, OUTPUT);
PinMode (6, OUTPUT);
TCCR1A = TCCR1A & 0xe0 | 2;
TCCR1B = TCCR1B & 0xe0 | 0x09;
analogWrite (9, 126); // an Pin 10 PWM = 50% f = 31200Hz
// Tatsächlich müssen Sie für PWM = 50% gemäß dem Oszilloskop mindestens 220 Füllungen einstellen
// Das Duin kann damit nicht umgehen. Dies ist nicht kritisch.
}
Der Autor
Diejenigen, die die Skizze sehen werden. Die Zeichen> = und <= wurden durch seltsame Kombinationen von & gt und & lt ersetzt. Warum ich es nicht weiß Beim Debuggen war normal.

Wir empfehlen Ihnen zu lesen:

Gib es für das Smartphone ...