Inhoudsopgave:

Arduino-gebaseerde pulsinductiedetector - Flip Coil - Ajarnpa
Arduino-gebaseerde pulsinductiedetector - Flip Coil - Ajarnpa

Video: Arduino-gebaseerde pulsinductiedetector - Flip Coil - Ajarnpa

Video: Arduino-gebaseerde pulsinductiedetector - Flip Coil - Ajarnpa
Video: обнаружение неисправности электрооборудования с помощью arduino 2024, Juli-
Anonim
Arduino-gebaseerde pulsinductiedetector - Flip Coil
Arduino-gebaseerde pulsinductiedetector - Flip Coil
Arduino-gebaseerde pulsinductiedetector - Flip Coil
Arduino-gebaseerde pulsinductiedetector - Flip Coil

Het idee

Nadat ik in het verleden een aantal metaaldetectoren had gebouwd met wisselende resultaten, wilde ik de mogelijkheden van de Arduino in die richting verkennen.

Er zijn enkele goede voorbeelden van het bouwen van metaaldetectoren met de Arduino, sommige hier als instructables. Maar als je ernaar kijkt, hebben ze normaal gesproken behoorlijk wat externe componenten nodig voor de analoge signaalbehandeling of is de gevoeligheid vrij laag.

Als u aan metaaldetectoren denkt, is het belangrijkste onderwerp hoe u de kleine spanningsveranderingen kunt waarnemen in signalen die verband houden met de zoekspoel. Deze veranderingen zijn normaal gesproken erg klein. De meest voor de hand liggende benadering zou zijn om de analoge ingangen van de ATmega328 te gebruiken. Maar kijkend naar de specificaties zijn er twee fundamentele problemen: ze zijn (vaak) te traag en de resolutie is (in de meeste gevallen) te laag.

Aan de andere kant draait de Arduino op 16MHz en heeft hij behoorlijk wat timingmogelijkheden i. e. een resolutie van 0,0625 µS bij gebruik van kloksnelheid. Dus in plaats van de analoge ingang te gebruiken voor detectie, is de eenvoudigste manier om kleine dynamische spanningsveranderingen waar te nemen, het vergelijken van de verandering in spanningsdaling in de tijd bij een vaste referentiespanning.

Voor dit doel heeft de ATmega328 de handige eigenschap van een interne comparator tussen D6 en D7. Deze comparator kan een interrupt triggeren, waardoor een nauwkeurige gebeurtenisafhandeling mogelijk is. Afgezien van de netjes gecodeerde timingroutines zoals millis() en micos() en de interne timer van de ATmega328 met een veel hogere resolutie, is de Arduino een uitstekende basis voor metaaldetectiebenaderingen.

Dus vanuit een broncodeweergave zou een goed begin zijn om de interne comparator te programmeren voor "verandering" in polariteit van de ingangen en een interne teller te gebruiken met de hoogst mogelijke snelheid voor verandering in timing van de veranderingen.

De algemene code in Arduido om dit te bereiken is:

// Het definiëren van alle vereiste pre-variabelen etc. en het opzetten van de registers

niet-ondertekende char clockSelectBits = _BV(CS10); // geen prescale, volledige xtal void setup () { pinMode (6, INPUT); // + van de comparator - door ze in te stellen als INPUT, worden ze // ingesteld op pinMode met hoge impedantie (7, INPUT); // - van de comparator - door ze in te stellen als INPUT, worden ze // ingesteld op hoge impedantie cli(); // stop onderbrekingen TCCR1A = 0; // stel het hele TCCR1A-register in op 0 TCCR1B = 0; // hetzelfde voor TCCR1B -> normale modusTCNT1 = 0; // initialiseer de tellerwaarde op 0; TCCR1B |= klokSelectBits; // stelt prescaler in en start de klok TIMSK1 = _BV(TOIE1); // zet de timer overflow interrupt enable bit sei(); //onderbrekingen toestaan ACSR = (0 << ACD) | // Analoge vergelijker: ingeschakeld (0 << ACBG) | // Analog Comparator Bandgap Select: AIN0 wordt toegepast op de positieve ingang (0 << ACO) | // Analoge vergelijkingsuitgang: Uit (1 << ACI) | // Analoge Comparator Interrupt Flag: Clear In afwachting van Interrupt (1 << ACIE) | // Analoge Comparator Interrupt: Ingeschakeld (0 << ACIC) | // Analoge Comparator Input Capture: Uitgeschakeld (0 << ACIS1 | 0 << ACIS0 // Interrupt op output toggle // (0 << ACIS1 | 1 << ACIS0 // gereserveerd // (1 << ACIS1 | 0 << ACIS0 // onderbreking bij dalende uitgangsflank // (1 << ACIS1 | 1 << ACIS0 // onderbreking bij stijgende ingangsflank; }

// deze routine wordt elke keer aangeroepen als de comparator een interrupt maakt

ISR(ANALOG_COMP_vect) { oldSREG=SREG; cli(); tijdstempel=TCNT1; SREG = oudeSREG; }

// deze routine wordt elke keer aangeroepen als er een overloop is in de interne teller

ISR(TIMER1_OVF_vect){ timer1_overflow_count++; }

// deze routine wordt gebruikt om de timer te resetten naar 0

void resetTimer (void) { oldSREG = SREG; cli(); // Onderbrekingen uitschakelen TCNT1 = 0; // initialiseer de tellerwaarde naar 0 SREG = oldSREG; // Herstel statusregister TCCR1B |= clockSelectBits; // stelt prescaler in en start de klok timer1_overflow_count = 0; // reset overloopteller}

Natuurlijk is dit idee niet helemaal nieuw. Het grootste deel van deze code is elders te vinden. Een goede implementatie van een dergelijke benadering voor een microcontroller die wordt gevonden op de startpagina van TPIMD - Tiny Pulse Induction Metal Detector.

www.miymd.com/index.php/projects/tpimd/ (helaas is deze pagina niet meer online, er is momenteel een back-up van de site op www.basic4mcu.com, zoek naar "TPIMD").

Stap 1: Arduino Pulse Inductie Idee - Flip Coil

Arduino Pulse Inductie Idee - Flip Coil
Arduino Pulse Inductie Idee - Flip Coil
Arduino Pulse Inductie Idee - Flip Coil
Arduino Pulse Inductie Idee - Flip Coil

Het idee is om de Arduino te gebruiken als een pulsinductiedetector, zoals in TPIMD, omdat het timingidee van de vervalcurve redelijk goed lijkt te werken. Het probleem met pulsinductiedetectoren is dat ze normaal gesproken verschillende spanningen nodig hebben om te werken. Eén spanning om de spoel van stroom te voorzien en een aparte spanning om de vervalcurve op te vangen. Deze twee spanningsbronnen maken pulsinductiedetectoren altijd een beetje ingewikkeld.

Kijkend naar de spanning van de spoel in een PI-detector, kan de resulterende curve in twee verschillende fasen worden verdeeld. De eerste fase is de puls zelf die de spoel aandrijft en het magnetische veld opbouwt (1). De tweede fase is de spanningsvervalcurve, beginnend met een spanningspiek, en vervolgens snel aangepast aan de "geen-vermogen" spanning van de spoel (2). Het probleem is dat de spoel na de puls van polariteit verandert. Is de puls positief (Var 1. in de bijgevoegde afbeelding) dan is de vervalcurve negatief. Is de puls negatief, dan is de vervalcurve positief (Var 2. in de bijgevoegde afbeelding)

Om dit basisprobleem op te lossen, moet de spoel na de puls elektronisch worden "omgedraaid". In dit geval kan de puls positief zijn en kan de vervalcurve ook positief zijn.

Om dit te bereiken, moet de spoel na de puls worden geïsoleerd van Vcc en GND. Op dit moment loopt er alleen een stroom door een dempingsweerstand. Dit geïsoleerde systeem van spoel en dempingsweerstand kan dan worden "gericht" op elke referentiespanning. Dit zal in theorie de gecombineerde positieve curve creëren (onderaan de tekening)

Deze positieve curve kan dan via de comparator worden gebruikt om het tijdstip te detecteren waarop de vervalspanning een referentiespanning "kruist". In het geval van schatten in de buurt van de spoel, verandert de vervalcurve en verandert het tijdstip waarop de referentiespanning wordt overschreden. Deze verandering kan dan worden gedetecteerd.

Na wat experimenteren bleek de volgende schakeling te werken.

De schakeling bestaat uit een Arduino Nano-module. Deze module stuurt twee MOSFET-transistoren aan die de spoel (bij SV3) via D10 van stroom voorzien. Wanneer de puls op D10 eindigt, isoleren beide MOSFET's de spoel van 12V en GND. De bespaarde energie in de spoel wordt afgevoerd via R2 (220 Ohm). Tegelijkertijd verbindt R1 (560 Ohm) de voormalige positieve kant van de spoel met GND. Dit verandert de negatieve vervalcurve bij R5 (330 Ohm) in een positieve curve. De diodes beschermen de ingangspin van de Arduino.

R7 is een spanningsdeler bij ongeveer 0,04V. Op het moment dat de vervalcurve bij D7 negatiever wordt dan de 0.04 bij D6 wordt een interrupt getriggerd en wordt de duur na het einde van de puls opgeslagen.

In het geval van metaal in de buurt van de spoel, duurt de vervalcurve langer en wordt de tijd tussen het einde van de puls en de onderbreking langer.

Stap 2: De detector bouwen (Breadboard)

De detector bouwen (Breadboard)
De detector bouwen (Breadboard)
De detector bouwen (Breadboard)
De detector bouwen (Breadboard)
De detector bouwen (Breadboard)
De detector bouwen (Breadboard)

Het bouwen van de detector is vrij eenvoudig. Dit kan op een breadboard (vasthouden aan de originele schakeling) of door de onderdelen op een printje te solderen.

De D13-LED op het Arduino Nano-bord wordt gebruikt als indicatie voor metaal

Een breadboard losmaken is de snelste weg naar de werkende detector. Er is nogal wat bedrading nodig, toch kan dit op een klein breadboard. In de afbeeldingen wordt dit in 3 stappen getoond, omdat de Arduino en de MOSFET's sommige draden verbergen. Bij het testen heb ik de diodes op de een of andere manier losgekoppeld zonder het eerst te merken. Dit had geen negatief effect op het gedrag van de detector. In de PCB-versie van de schakeling heb ik ze volledig weggelaten.

Niet weergegeven op de foto's zijn de aansluitingen op een 0,96 OLED-display. Dit beeldscherm is aangesloten:

Vcc - 5V (op de Arduino-pin, niet de voedingsspanning!!!)

GND – GND

SCL-A5

VIB – A4

Dit OLED-scherm is nodig om de detector in eerste instantie te kalibreren. Dit doe je door de juiste spanning in te stellen op PIN6 van de Arduino. Deze spanning moet rond de 0,04V zijn. Het display helpt bij het instellen van de juiste spanning.

De breadboard-versie werkt redelijk goed, hoewel waarschijnlijk niet geschikt om in het wild te gaan.

Stap 3: Op weg naar PCB's

Gaan PCB
Gaan PCB
Gaan PCB
Gaan PCB
Gaan PCB
Gaan PCB
Gaan PCB
Gaan PCB

Wat betreft solderen houd ik niet zo van dubbelzijdige hightech PCB's, dus heb ik de schakeling aangepast zodat deze op een on-sided PCB past.

De volgende wijzigingen zijn aangebracht:

1. de diodes werden weggelaten.

2. de poorten van de MOSFET's kregen een weerstand van 10 Ohm

3. de voedingsspanning voor de spanningsdeler op D6 wordt gegeven door een HIGH level-signaal op D8

4. driverpin voor de MOSFET's is gewijzigd.

Zo kon een enkelzijdige print ontstaan die op universele printplaten gesoldeerd kan worden. Met dit circuit heb je een werkende PI-detector met slechts 8-10 externe componenten (afhankelijk of het OLED-scherm en/of een luidspreker wordt gebruikt).

Stap 4: De detector instellen en gebruiken

De detector instellen en gebruiken
De detector instellen en gebruiken
De detector instellen en gebruiken
De detector instellen en gebruiken
De detector instellen en gebruiken
De detector instellen en gebruiken

Als de detector correct is gebouwd en het programma naar de Arduino is geschreven, is de eenvoudigste (zo niet de enige) manier om het apparaat in te stellen het gebruik van een OLED-display. Het display is aangesloten op 5V, GND, A4, A5. Het display moet "kalibreren" weergeven nadat het apparaat is ingeschakeld. Na enkele seconden zou er "kalibratie gereed" moeten zijn en zouden er drie cijfers op het display moeten verschijnen.

Het eerste cijfer is de "referentiewaarde" die tijdens de kalibratie is geïdentificeerd. De tweede waarde is de laatst gemeten waarde en de derde waarde is een gemiddelde van de laatste 32 metingen.

Deze drie waarden zouden min of meer hetzelfde moeten zijn (in mijn testgevallen onder de 1000). De middelste waarde moet min of meer stabiel zijn.

Om de eerste installatie te starten, mag er geen metaal in de buurt van de spoel zijn.

Nu moet de spanningsdeler (trimpotentiometer) worden getrimd zodat de onderste twee waarden op een maximum worden ingesteld terwijl nog steeds een stabiele aflezing wordt gegeven. Er is een kritische instelling, waarbij de middelste waarde vreemde waarden begint te geven. Draai de trimmer terug om weer stabiele waarden te verkrijgen.

Het kan gebeuren dat het display vastloopt. Druk gewoon op de resetknop en begin opnieuw.

Voor mijn setup (spoel: 18 windingen @ 20cm) ligt de stabiele waarde rond de 630-650. Eenmaal ingesteld, drukt u op de resetknop, het apparaat kalibreert opnieuw en alle boomwaarden moeten weer binnen hetzelfde bereik zijn. Als er nu metaal op spoel wordt gebracht, moet de LED op het Arduino-Board (D13) gaan branden. Een aangesloten luidspreker geeft wat klikgeluiden (er is wat ruimte voor verbetering in de programmering daar).

Om hoge verwachtingen te voorkomen:

De detector detecteert wel het een en ander, maar het blijft een heel eenvoudige en beperkte detector.

Om een indruk te geven van de mogelijkheden deed a enkele referentiedetecties met verschillende andere detectoren. Als we naar de resultaten kijken, is het nog steeds behoorlijk indrukwekkend voor een detector met slechts 8 externe onderdelen, maar niet overeenkomende met professionele detectoren.

Kijkend naar het circuit en het programma is er veel ruimte voor verbetering. De waarden van de weerstanden zijn door ervaring gevonden, de pulstijd van 250ms is willekeurig gekozen, ook de spoelparameters. Als u ideeën voor verbeteringen heeft, bespreek ik die graag met u.

Veel plezier!

Stap 5: Update1: Een 16x2 LCD gebruiken

Update1: Een 16x2 LCD gebruiken
Update1: Een 16x2 LCD gebruiken
Update1: Een 16x2 LCD gebruiken
Update1: Een 16x2 LCD gebruiken
Update1: Een 16x2 LCD gebruiken
Update1: Een 16x2 LCD gebruiken

Verbeteringen

Tijdens verder testen realiseerde ik me dat de bibliotheek voor het I2C OLED-scherm veel tijd in beslag nam. Dus besloot ik om in plaats daarvan een 16x2-scherm met een I2C-converter te gebruiken.

Dus nam ik het programma over op het LCD-scherm en voegde er een aantal handige functies aan toe. De eerste regel van het display toont nu de signaalsterkte van een mogelijke indicatie. De tweede regel toont nu twee waarden. De vuist gaf de huidige signaalafwijking aan ten opzichte van de kalibratiewaarde. Deze waarde moet "0" zijn. Als deze waarde constant negatief of positief is, moet de detector opnieuw worden gekalibreerd door op de resetknop te drukken. Positieve waarden duiden op metaal in de buurt van de spoel.

De tweede waarde toont de werkelijke vertragingswaarde van de vervalcurve. Deze waarde is normaal gesproken niet zo interessant, maar is nodig voor de initiële instelling van de detector.

Het programma staat nu meerdere pulsduren achter elkaar toe (middel om te experimenteren / de prestatie te verbeteren). Ik heb geen doorbraak bereikt. Dus standaard is ingesteld op één pulsduur.

Initiële instelling van de detector

Bij het instellen van de detector is de tweede waarde van de tweede regel relevant (de eerste kan worden genegeerd). Aanvankelijk kan de waarde "instabiel" zijn (zie afbeelding). Draai de trimweerstand totdat de waarde een stabiele waarde bereikt. Draai er vervolgens aan om de waarde te verhogen tot een maximale stabiele waarde. Druk op de resetknop om opnieuw te kalibreren en de detector is klaar voor gebruik.

Ik kreeg de indruk dat ik door de maximale stabiele waarde in te stellen, de gevoeligheid voor niet-ijzermetalen verloor. Het is dus misschien de moeite waard om wat te experimenteren met de instellingen om een goede gevoeligheid te hebben voor strijkvrije spullen.

Wikkelen

Ik bouw 3 spoelen voor verder testen

1 -> 18 slagen @ 200 mm

2 -> 25 slagen @ 100 mm

3 -> 48 slagen @ 100 mm

Interessant genoeg werkten alle spoelen redelijk goed, met bijna dezelfde prestaties (20ct munt op 40-50 mm in de lucht). Dit is misschien een vrij subjectieve observatie.

Aanbevolen: