Inhaltsverzeichnis:

Arduino-basierter Pulsinduktionsdetektor - Flip Coil - Gunook
Arduino-basierter Pulsinduktionsdetektor - Flip Coil - Gunook

Video: Arduino-basierter Pulsinduktionsdetektor - Flip Coil - Gunook

Video: Arduino-basierter Pulsinduktionsdetektor - Flip Coil - Gunook
Video: обнаружение неисправности электрооборудования с помощью arduino 2024, Juli
Anonim
Arduino-basierter Puls-Induktions-Detektor - Flip Coil
Arduino-basierter Puls-Induktions-Detektor - Flip Coil
Arduino-basierter Puls-Induktions-Detektor - Flip Coil
Arduino-basierter Puls-Induktions-Detektor - Flip Coil

Die Idee

Nachdem ich in der Vergangenheit einige Metalldetektoren mit unterschiedlichen Ergebnissen gebaut hatte, wollte ich die Fähigkeiten des Arduino in dieser Richtung erkunden.

Es gibt einige gute Beispiele dafür, wie man Metalldetektoren mit dem Arduino baut, einige hier als instructables. Aber wenn man sie betrachtet, benötigen sie normalerweise entweder ziemlich viele externe Komponenten für die analoge Signalverarbeitung oder die Empfindlichkeit ist ziemlich gering.

Wenn man an Metalldetektoren denkt, ist das Hauptthema, wie man die leichten Spannungsänderungen in Signalen in Bezug auf die Suchspule erkennt. Diese Änderungen sind normalerweise sehr gering. Der naheliegendste Ansatz wäre die Verwendung der analogen Eingänge des ATmega328. Aber wenn man sich die Spezifikationen ansieht, gibt es zwei grundlegende Probleme: Sie sind (oft) zu langsam und die Auflösung ist (in den meisten Fällen) zu niedrig.

Auf der anderen Seite läuft der Arduino mit 16 MHz und hat einige Timing-Fähigkeiten, d. e. eine Auflösung von 0,0625µS bei Taktfrequenz. Anstatt den Analogeingang zum Erfassen zu verwenden, besteht die einfachste Möglichkeit zum Erfassen kleiner dynamischer Spannungsänderungen darin, die Änderung des Spannungsabfalls über die Zeit mit einer festen Referenzspannung zu vergleichen.

Zu diesem Zweck hat der ATmega328 die nette Eigenschaft eines internen Komparators zwischen D6 und D7. Dieser Komparator ist in der Lage, einen Interrupt auszulösen, was eine präzise Ereignisbehandlung ermöglicht. Abgesehen von den sauber codierten Timing-Routinen wie millis() und micos() und dem Einsteigen in den internen Timer des ATmega328 mit viel höherer Auflösung ist das Arduino eine großartige Grundlage für Metalldetektionsansätze.

Aus Sicht des Quellcodes wäre es daher ein guter Anfang, den internen Komparator auf „Änderung“der Polarität der Eingänge zu programmieren und einen internen Zähler mit der höchstmöglichen Geschwindigkeit für die Änderung des Timings der Änderungen zu verwenden.

Der allgemeine Code in Arduido, um dies zu erreichen, lautet:

// Definieren aller benötigten Pre-Variablen etc. und Einrichten der Register

unsigned char clockSelectBits = _BV(CS10); // keine Vorskalierung, volles xtal void setup () { PinMode (6, INPUT); // + des Komparators - durch Einstellen als INPUT werden sie // auf hochohmige PinMode (7, INPUT) gesetzt; // - des Komparators - indem sie als INPUT gesetzt werden, werden sie // auf hohe Impedanz gesetzt cli(); // Unterbrechungen stoppen TCCR1A = 0; // setze das gesamte TCCR1A-Register auf 0 TCCR1B = 0; // dasselbe für TCCR1B -> normaler ModusTCNT1 = 0; // Zählerwert auf 0 initialisieren; TCCR1B |= ClockSelectBits; // setzt Prescaler und startet die Uhr TIMSK1 = _BV(TOIE1); // setzt das Timer-Überlauf-Interrupt-Aktivierungsbit sei (); // Interrupts zulassen ACSR = (0 << ACD) | // Analogkomparator: Aktiviert (0 << ACBG) | // Analog Comparator Bandgap Select: AIN0 wird an den positiven Eingang angelegt (0 << ACO) | // Analoger Komparatorausgang: Aus (1 << ACI) | // Analogkomparator-Interrupt-Flag: Anstehende Unterbrechung löschen (1 << ACIE) | // Analog-Komparator-Interrupt: Aktiviert (0 << ACIC) | // Analog Comparator Input Capture: Deaktiviert (0 << ACIS1 | 0 << ACIS0 // Unterbrechung beim Umschalten des Ausgangs // (0 << ACIS1 | 1 << ACIS0 // reserviert // (1 << ACIS1 | 0 <<.) ACIS0 // Interrupt bei fallender Ausgangsflanke // (1 << ACIS1 | 1 << ACIS0 // Interrupt bei steigender Eingangsflanke; }

// diese Routine wird jedes Mal aufgerufen, wenn der Komparator einen Interrupt erzeugt

ISR(ANALOG_COMP_vect) { oldSREG=SREG; cli(); Zeitstempel=TCNT1; SREG = altSREG; }

// diese Routine wird jedes Mal aufgerufen, wenn ein Überlauf im internen Zähler auftritt

ISR (TIMER1_OVF_vect) {timer1_overflow_count++; }

// diese Routine wird verwendet, um den Timer auf 0 zurückzusetzen

Void resetTimer (void) {oldSREG = SREG; cli(); // Interrupts deaktivieren TCNT1 = 0; // Zählerwert auf 0 initialisieren SREG = oldSREG; // Statusregister TCCR1B wiederherstellen |= clockSelectBits; // setzt Prescaler und startet die Uhr timer1_overflow_count=0; // setzt den Überlaufzähler zurück }

Natürlich ist diese Idee nicht ganz neu. Der Hauptteil dieses Codes ist an anderer Stelle zu finden. Eine gute Implementierung eines solchen Ansatzes für einen Mikrocontroller finden Sie auf der Homepage von TPIMD - Tiny Pulse Induction Metal Detector.

www.miymd.com/index.php/projects/tpimd/ (leider ist diese Seite nicht mehr online, derzeit gibt es ein Backup der Seite auf www.basic4mcu.com, suche nach "TPIMD").

Schritt 1: Arduino-Pulsinduktionsidee - Flip Coil

Arduino Impulsinduktionsidee - Flip Coil
Arduino Impulsinduktionsidee - Flip Coil
Arduino Impulsinduktionsidee - Flip Coil
Arduino Impulsinduktionsidee - Flip Coil

Die Idee ist, den Arduino wie in TPIMD als Impulsinduktionsdetektor zu verwenden, da die Timing-Idee der Abklingkurve ziemlich gut zu funktionieren scheint. Das Problem bei Puls-Induktions-Detektoren ist, dass sie normalerweise unterschiedliche Spannungen benötigen, um zu funktionieren. Eine Spannung, um die Spule zu versorgen, und eine separate Spannung, um die Abklingkurve zu behandeln. Diese beiden Spannungsquellen machen Pulsinduktionsdetektoren immer etwas kompliziert.

Betrachtet man die Spannung der Spule in einem PI-Detektor, kann die resultierende Kurve in zwei verschiedene Stufen unterteilt werden. Die erste Stufe ist der Impuls selbst, der die Spule speist und das Magnetfeld aufbaut (1). Die zweite Stufe ist die Spannungsabfallkurve, die mit einer Spannungsspitze beginnt und sich dann schnell auf die "No-Power"-Spannung der Spule (2) einstellt. Das Problem ist, dass die Spule nach dem Puls ihre Polarität ändert. Ist der Puls positiv (Var 1. im angehängten Bild) ist die Abklingkurve negativ. Ist der Puls negativ, ist die Abklingkurve positiv (Var 2. im beigefügten Bild)

Um dieses Grundproblem zu lösen, muss die Spule nach dem Impuls elektronisch „umgedreht“werden. In diesem Fall kann der Puls positiv sein und die Abklingkurve kann ebenfalls positiv sein.

Um dies zu erreichen, muss die Spule nach dem Impuls von Vcc und GND getrennt werden. In diesem Moment fließt nur ein Strom durch einen Dämpfungswiderstand. Dieses isolierte System aus Spule und Dämpfungswiderstand kann dann auf jede beliebige Referenzspannung „ausgerichtet“werden. Dies erzeugt theoretisch die kombinierte positive Kurve (unten in der Zeichnung).

Diese positive Kurve kann dann über den Komparator verwendet werden, um den Zeitpunkt zu erkennen, an dem die Abklingspannung eine Referenzspannung „kreuzt“. Bei Schätzen in der Nähe der Spule ändert sich die Abklingkurve und der Zeitpunkt des Überschreitens der Referenzspannung ändert sich. Diese Veränderung kann dann erkannt werden.

Nach einigem Experimentieren erwies sich die folgende Schaltung als funktionierend.

Die Schaltung besteht aus einem Arduino Nano Modul. Dieses Modul steuert zwei MOSFET-Transistoren an, die die Spule (bei SV3) über D10 mit Strom versorgen. Wenn der Impuls an D10 endet, isolieren beide MOSFETs die Spule von 12V und GND. Die in der Spule gespeicherte Energie entweicht über R2 (220 Ohm). Gleichzeitig verbindet R1 (560 Ohm) die ehemalige positive Seite der Spule mit GND. Dadurch ändert sich die negative Decay-Kurve bei R5 (330 Ohm) in eine positive Kurve. Die Dioden schützen den Eingangspin des Arduino.

R7 ist ein Spannungsteiler bei etwa 0,04 V. In dem Moment, in dem die Decay-Kurve bei D7 negativer wird als die 0,04 bei D6, wird ein Interrupt ausgelöst und die Dauer nach dem Ende des Impulses gespeichert.

Bei Metall in Spulennähe dauert die Abklingkurve länger und die Zeit zwischen Pulsende und Interrupt wird länger.

Schritt 2: Aufbau des Detektors (Breadboard)

Aufbau des Detektors (Breadboard)
Aufbau des Detektors (Breadboard)
Aufbau des Detektors (Breadboard)
Aufbau des Detektors (Breadboard)
Aufbau des Detektors (Breadboard)
Aufbau des Detektors (Breadboard)

Der Aufbau des Detektors ist recht einfach. Dies kann entweder auf einem Steckbrett (an der Originalschaltung kleben) oder durch Löten der Teile auf einer Platine erfolgen.

Die D13 LED auf dem Arduino Nano Board dient als Anzeige für Metall

Das Abnehmen eines Steckbretts ist der schnellste Weg zum funktionierenden Detektor. Es ist ziemlich viel Verkabelung erforderlich, dies kann jedoch mit einem kleinen Steckbrett erfolgen. In den Bildern wird dies in 3 Schritten gezeigt, da das Arduino und die MOSFETs einige der Drähte verstecken. Beim Testen habe ich die Dioden irgendwie abgeklemmt, ohne es zuerst zu bemerken. Dies hatte keinen negativen Einfluss auf das Verhalten des Detektors. In der PCB-Version der Schaltung habe ich sie komplett weggelassen.

Auf den Bildern nicht zu sehen sind die Anschlüsse zu einem 0,96 OLED Display. Dieses Display ist angeschlossen:

Vcc – 5V (am Arduino-Pin, nicht die Versorgungsspannung!!!)

GND – GND

SCL – A5

SDA – A4

Dieses OLED-Display wird benötigt, um den Detektor zunächst zu kalibrieren. Dies geschieht durch Einstellen der richtigen Spannung an PIN6 des Arduino. Diese Spannung sollte etwa 0,04 V betragen. Das Display hilft beim Einstellen der richtigen Spannung.

Die Breadboard-Version funktioniert ziemlich gut, obwohl sie wahrscheinlich nicht dafür geeignet ist, in die Wildnis zu gehen.

Schritt 3: Leiterplatte gehen

Going PCB
Going PCB
Going PCB
Going PCB
Going PCB
Going PCB
Going PCB
Going PCB

Was das Löten angeht, mag ich doppelseitige High-Tech-Platinen nicht wirklich, also habe ich die Schaltung so modifiziert, dass sie auf eine einseitige Platine passt.

Folgende Modifikationen wurden vorgenommen:

1. Die Dioden wurden weggelassen.

2. die Gates der MOSFETs haben einen Widerstand von 10 Ohm

3. die Versorgungsspannung für den Spannungsteiler an D6 wird durch ein HIGH-Pegel-Signal an D8 gegeben

4. Treiberpin für die MOSFETs wurde geändert.

Auf diese Weise konnte eine einseitige Leiterplatte erstellt werden, die auf Universalleiterplatten gelötet werden kann. Mit dieser Schaltung haben Sie einen funktionierenden PI-Detektor mit nur 8-10 externen Komponenten (je nachdem, ob das OLED-Display und / oder ein Lautsprecher verwendet wird).

Schritt 4: Einrichten und Verwenden des Detektors

Einrichten und Verwenden des Detektors
Einrichten und Verwenden des Detektors
Einrichten und Verwenden des Detektors
Einrichten und Verwenden des Detektors
Einrichten und Verwenden des Detektors
Einrichten und Verwenden des Detektors

Wenn der Detektor richtig gebaut und das Programm auf den Arduino geschrieben wurde, ist die einfachste (wenn nicht die einzige) Möglichkeit, das Gerät einzurichten, ein OLED-Display zu verwenden. Das Display ist an 5V, GND, A4, A5 angeschlossen. Nach dem Einschalten sollte das Display „Kalibrieren“anzeigen. Nach einigen Sekunden sollte „Kalibrierung fertig“angezeigt werden und auf dem Display sollten drei Zahlen angezeigt werden.

Die erste Zahl ist der bei der Kalibrierung ermittelte „Referenzwert“. Der zweite Wert ist der letzte Messwert und der dritte Wert ein Mittelwert der letzten 32 Messungen.

Diese drei Werte sollten mehr oder weniger gleich sein (in meinen Testfällen unter 1000). Der Mittelwert sollte mehr oder weniger stabil sein.

Um mit der Ersteinrichtung zu beginnen, sollte sich kein Metall in der Nähe der Spule befinden.

Nun sollte der Spannungsteiler (Trimmpotentiometer) so getrimmt werden, dass die unteren beiden Werte maximal eingestellt werden und dennoch ein stabiler Messwert angezeigt wird. Es gibt eine kritische Einstellung, bei der der mittlere Wert seltsame Werte liefert. Drehen Sie den Trimmer zurück, um wieder stabile Werte zu erhalten.

Es kann vorkommen, dass die Anzeige einfriert. Drücken Sie einfach die Reset-Taste und beginnen Sie von vorne.

Für mein Setup (Spule: 18 Umdrehungen @ 20cm) liegt der stabile Wert bei 630-650. Drücken Sie nach der Einstellung die Reset-Taste, das Gerät kalibriert sich neu und alle Baumwerte sollten wieder im gleichen Bereich liegen. Wird nun Metall zum Coil gebracht, sollte die LED auf dem Arduino-Board (D13) aufleuchten. Ein angeschlossener Lautsprecher gibt einige Klickgeräusche ab (da gibt es noch Verbesserungspotential in der Programmierung).

Um hohe Erwartungen zu vermeiden:

Der Detektor erkennt zwar einiges, bleibt aber ein sehr einfacher und begrenzter Detektor.

Um einen Eindruck von den Fähigkeiten zu vermitteln, habe ich einige Referenzerkennungen mit verschiedenen anderen Detektoren durchgeführt. Wenn man sich die Ergebnisse ansieht, ist es immer noch ziemlich beeindruckend für einen Detektor mit nur 8 externen Teilen, die jedoch nicht zu professionellen Detektoren passen.

Wenn man sich die Strecke und das Programm ansieht, gibt es viel Raum für Verbesserungen. Die Werte der Widerstände wurden durch Erfahrung ermittelt, die Pulszeit von 250ms wurde zufällig gewählt, die Spulenparameter ebenso. Wenn Sie Verbesserungsvorschläge haben, bespreche ich diese gerne mit Ihnen.

Spaß haben!

Schritt 5: Update1: Verwenden eines 16x2 LCD

Update1: Verwendung eines 16x2 LCD
Update1: Verwendung eines 16x2 LCD
Update1: Verwendung eines 16x2 LCD
Update1: Verwendung eines 16x2 LCD
Update1: Verwendung eines 16x2 LCD
Update1: Verwendung eines 16x2 LCD

Verbesserungen

Bei weiteren Tests stellte ich fest, dass die Bibliothek für das I2C-OLED-Display viel Zeit verbraucht. Also entschied ich mich stattdessen für ein 16x2-Display mit einem I2C-Konverter.

Also habe ich das Programm an das LCD-Display angepasst und einige nützliche Funktionen hinzugefügt. In der ersten Zeile des Displays wird nun die Signalstärke einer möglichen Indikation angezeigt. In der zweiten Zeile werden nun zwei Werte angezeigt. Die Faust zeigt die aktuelle Signalabweichung gegenüber dem Kalibrierwert an. Dieser Wert sollte "0" sein. Ist dieser Wert konstant negativ oder positiv, sollte der Detektor durch Drücken der Reset-Taste neu kalibriert werden. Positive Werte zeigen Metall in der Nähe der Spule an.

Der zweite Wert zeigt den tatsächlichen Delay-Wert der Decay-Kurve. Dieser Wert ist normalerweise nicht so interessant, wird aber für die Ersteinrichtung des Detektors benötigt.

Das Programm erlaubt nun mehrere Pulsdauern in einer Sequenz (Mittel zum Experimentieren/Verbessern der Leistung). Ich habe keinen Durchbruch geschafft. Standardmäßig ist also eine Impulsdauer eingestellt.

Ersteinrichtung des Detektors

Beim Einrichten des Melders ist der zweite Wert der zweiten Zeile relevant (der erste kann ignoriert werden). Anfangs kann der Wert "instabil" sein (siehe Bild). Drehen Sie den Trimmwiderstand, bis der Wert einen stabilen Messwert erreicht. Drehen Sie ihn dann, um den Wert auf einen maximalen stabilen Wert zu erhöhen. Drücken Sie die Reset-Taste, um eine Neukalibrierung durchzuführen, und der Detektor ist einsatzbereit.

Ich hatte den Eindruck, dass ich durch die Einstellung des maximalen stabilen Wertes die Empfindlichkeit für Nichteisenmetalle verloren habe. Es könnte sich also lohnen, mit den Einstellungen zu experimentieren, um eine gute Empfindlichkeit für bügelfreie Sachen zu haben.

Spulen

Ich baue 3 Spulen für weitere Tests

1 -> 18 Umdrehungen @ 200mm

2 -> 25 Umdrehungen @ 100mm

3 -> 48 Umdrehungen @ 100mm

Interessanterweise funktionierten alle Spulen ziemlich gut, mit fast der gleichen Leistung (20 ct Münze bei 40-50 mm in Luft). Dies mag eine recht subjektive Beobachtung sein.

Empfohlen: