Indholdsfortegnelse:
- Trin 1: Arduino Pulse Induction Idea - Flip Coil
- Trin 2: Opbygning af detektoren (brødbræt)
- Trin 3: Går PCB
- Trin 4: Opsætning og brug af detektoren
- Trin 5: Opdatering1: Brug af en 16x2 LCD
Video: Arduino baseret pulsinduktionsdetektor - Flip Coil: 5 trin (med billeder)
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:29
Ideen
Efter at have bygget nogle metaldetektorer tidligere med varierende resultater, ville jeg undersøge Arduino's muligheder i den retning.
Der er nogle gode eksempler på, hvordan man bygger metaldetektorer med Arduino, nogle her som instruktioner. Men når man ser på dem, kræver de normalt enten ganske nogle eksterne komponenter til den analoge signalbehandling, eller følsomheden er ganske lav.
Når man tænker på metaldetektorer, er hovedemnet, hvordan man fornemmer de små ændringer i spændingen i signaler relateret til søgespolen. Disse ændringer er normalt meget små. Den mest oplagte metode ville være ved at bruge de analoge indgange på ATmega328. Men når man ser på specifikationerne, er der to grundlæggende problemer: de er (ofte) for langsomme, og opløsningen er (i de fleste tilfælde) for lav.
På den anden side kører Arduino ved 16MHz og har en del timingfunktioner i. e. en opløsning på 0,0625µS, hvis du bruger urhastighed. Så i stedet for at bruge den analoge indgang til sensing, er den enkleste måde at registrere små dynamiske ændringer i spænding at sammenligne ændringen i spændingsfald over tid ved en fast referencespænding.
Til dette formål har ATmega328 den pæne egenskab af en intern komparator mellem D6 og D7. Denne komparator er i stand til at udløse en afbrydelse, hvilket muliggør præcis hændelseshåndtering. Forlader ved siden af de pænt kodede timingsrutiner som millis () og micos () og går ind i den interne timer på ATmega328 med meget højere opløsning, er Arduino et godt grundlag for metaldetekteringsmetoder.
Så fra en kildekodevisning ville en god start være at programmere den interne komparator til "ændring" i polariteten af indgangene og bruge en intern tæller med den højest mulige hastighed til ændring i timingen af ændringerne.
Den generelle kode i Arduido for at opnå dette er:
// Definere alle nødvendige prævariabler osv. Og opsætning af registre
usigneret char clockSelectBits = _BV (CS10); // ingen forudskala, fuld xtal hulrumsopsætning () {pinMode (6, INPUT); // + af komparatoren - ved at indstille dem som INPUT, er de // indstillet til pinMode med høj impedans (7, INPUT); // - af komparatoren - ved at indstille dem som INPUT, er de // indstillet til høj impedans cli (); // stop afbryder TCCR1A = 0; // sæt hele TCCR1A -registeret til 0 TCCR1B = 0; // samme for TCCR1B -> normal modeTCNT1 = 0; // initialiser tællerværdi til 0; TCCR1B | = clockSelectBits; // indstiller prescaler og starter uret TIMSK1 = _BV (TOIE1); // indstiller timeroverløb afbryd aktiveringsbit sei (); // tillad afbrydelser ACSR = (0 << ACD) | // Analog komparator: Aktiveret (0 << ACBG) | // Analog Comparator Bandgap Select: AIN0 anvendes på den positive input (0 << ACO) | // Analog komparatoroutput: Fra (1 << ACI) | // Analog Comparator Interrupt Flag: Ryd afventende afbrydelse (1 << ACIE) | // Analog Comparator Interrupt: Aktiveret (0 << ACIC) | // Analog Comparator Input Capture: Deaktiveret (0 << ACIS1 | 0 << ACIS0 // afbrydelse på output -skifte // (0 << ACIS1 | 1 << ACIS0 // reserveret // (1 << ACIS1 | 0 << ACIS0 // afbrydelse på faldende outputkant // (1 << ACIS1 | 1 << ACIS0 // afbrydelse på stigende inputkant;}
// denne rutine kaldes hver gang komparatoren opretter en afbrydelse
ISR (ANALOG_COMP_vect) {oldSREG = SREG; cli (); timeStamp = TCNT1; SREG = oldSREG; }
// denne rutine kaldes hver gang der er et overløb i intern tæller
ISR (TIMER1_OVF_vect) {timer1_overflow_count ++; }
// denne rutine bruges til at nulstille timeren til 0
void resetTimer (void) {oldSREG = SREG; cli (); // Deaktiver afbrydelser TCNT1 = 0; // initialiser tællerværdi til 0 SREG = oldSREG; // Gendan statusregister TCCR1B | = clockSelectBits; // indstiller prescaler og starter uret timer1_overflow_count = 0; // nulstiller overløbstæller}
Selvfølgelig er denne idé ikke helt ny. Hoveddelen af denne kode findes andre steder. En god implementering sådan en fremgangsmåde for en mikrokontroller fundet til på TPIMD - Tiny Pulse Induction Metal Detector hjemmeside.
www.miymd.com/index.php/projects/tpimd/ (desværre er denne side ikke længere online, der er i øjeblikket en sikkerhedskopi af webstedet på www.basic4mcu.com, søg efter "TPIMD").
Trin 1: Arduino Pulse Induction Idea - Flip Coil
Ideen er at bruge Arduino som en pulsinduktionsdetektor, ligesom i TPIMD, da timing -ideen om forfaldskurven ser ud til at fungere ret godt. Problemet med pulsinduktionsdetektorer er, at de normalt har brug for forskellige spændinger for at fungere. En spænding til at drive spolen og en separat spænding til at håndtere henfaldskurven. Disse to spændingskilder gør pulsinduktionsdetektorer altid lidt komplicerede.
Ser man på spændingen af spolen i en PI -detektor, kan den resulterende kurve opdeles i to forskellige trin. Det første trin er selve pulsen, der driver spolen og opbygger magnetfeltet (1). Det andet trin er spændingsforfaldskurven, der starter med en spændingstop, og derefter justeres hurtigt til spolens (2) spændingsløse spænding. Problemet er, at spolen ændrer sin polaritet efter pulsen. Er pulsen positiv (Var 1. i det vedhæftede billede) er henfaldskurven negativ. Er pulsen negativ, vil henfaldskurven være positiv (Var 2. i det vedhæftede billede)
For at løse dette grundlæggende problem skal spolen "vendes" elektronisk efter pulsen. I dette tilfælde kan pulsen være positiv, og henfaldskurven kan også være positiv.
For at opnå dette skal spolen isoleres fra Vcc og GND efter pulsen. I øjeblikket strømmer der kun en strøm gennem en dæmpningsmodstand. Dette isolerede system med spole og dæmpningsmodstand kan end være "orienteret" til hvilken som helst referencespænding. Dette vil i teorien skabe den kombinerede positive kurve (bunden af tegningen)
Denne positive kurve kan derefter bruges via komparatoren til at detektere det tidspunkt, hvor henfaldsspændingen "krydser" en referencespænding. I tilfælde af skatte tæt på spolen ændres henfaldskurven, og tidspunktet for krydsning af referencespændingen ændres. Denne ændring kan end detekteres.
Efter nogle eksperimenter viste følgende kredsløb sig at fungere.
Kredsløbet består af et Arduino Nano -modul. Dette modul driver to MOSFET -transistorer, der driver spolen (ved SV3) via D10. Når pulsen ved D10 slutter, isolerer begge MOSFET'er spolen fra 12V og GND. Den sparede energi i spolen bløder ud gennem R2 (220 ohm). På samme tid forbinder R1 (560 Ohms) den tidligere positive side af spolen med GND. Dette ændrer den negative henfaldskurve ved R5 (330 Ohm) til en positiv kurve. Dioderne beskytter indgangsstiften på Arduino.
R7 er en spændingsdeler på omkring 0,04V. I øjeblikket bliver henfaldskurven ved D7 mere negativ end 0,04 ved D6, en afbrydelse udløses, og varigheden efter slutningen af pulsen gemmes.
I tilfælde af metal tæt på spolen varer henfaldskurven længere, og tiden mellem slutningen af pulsen og afbrydelsen bliver længere.
Trin 2: Opbygning af detektoren (brødbræt)
Det er ganske let at bygge detektoren. Dette kan enten gøres på et brødbræt (holder sig til det originale kredsløb) eller ved at lodde delene på et printkort.
D13 LED på Arduino Nano -pladen bruges som indikation for metal
Afmontering af et brødbræt er den hurtigste vej til arbejdsdetektoren. Der er brug for en del ledninger, men det kan stadig gøres på et lille brødbræt. På billederne vises dette i 3 trin, mens Arduino og MOSFET'erne gemmer nogle af ledningerne. Ved test afbrød jeg dioderne på en eller anden måde uden først at lægge mærke til det. Dette havde ingen negativ effekt på detektorens adfærd. I PCB -versionen af kredsløbet forlod jeg dem helt.
Forbindelserne til et 0,96 OLED -display vises ikke på billederne. Dette display er tilsluttet:
Vcc - 5V (ved Arduino -stiften, ikke forsyningsspændingen !!!)
GND - GND
SCL - A5
SDA - A4
Denne OLED -skærm er nødvendig for at kalibrere detektoren i første omgang. Dette gøres ved at indstille den rigtige spænding til PIN6 på Arduino. Denne spænding skal være omkring 0,04V. Displayet hjælper med at indstille den rigtige spænding.
Brødtavleversionen fungerer ret godt, selvom den sandsynligvis ikke er velegnet til at komme ud i naturen.
Trin 3: Går PCB
Med hensyn til lodning kan jeg ikke rigtig lide dobbeltsidet højteknologisk printkort, så jeg ændrede kredsløbet til at passe på et sidet printkort.
Følgende ændringer blev foretaget:
1. dioderne blev udeladt.
2. portene til MOSFET'erne fik en modstand på 10 Ohm
3. forsyningsspændingen for spændingsdeleren ved D6 er givet ved et HIGH-niveau signal ved D8
4. driver -pin til MOSFET'erne blev ændret.
På denne måde kunne der oprettes et enkeltsidet printkort, der kan loddes på universelle printkort. Ved brug af dette kredsløb har du en fungerende PI-detektor med kun 8-10 eksterne komponenter (afhængigt af om OLED-displayet og/eller en højttaler bruges).
Trin 4: Opsætning og brug af detektoren
Hvis detektoren er bygget korrekt, og programmet er skrevet til Arduino, er den nemmeste (hvis ikke den eneste) måde at konfigurere enheden på, at bruge et OLED -display. Displayet er tilsluttet 5V, GND, A4, A5. Displayet skal vise "kalibrering", når enheden er tændt. Efter nogle sekunder skal der stå "kalibrering udført", og tre tal skal vises på displayet.
Det første tal er "referenceværdien", der blev identificeret under kalibrering. Den anden værdi er den sidste målte værdi og den tredje værdi er en middelværdi af de sidste 32 målinger.
Disse tre værdier bør være mere eller mindre de samme (i mine test-tilfælde under 1000). Den midterste værdi skal være mere eller mindre stabil.
For at starte den første opsætning bør der ikke være metal i nærheden af spolen.
Nu skal spændingsdeleren (trimpotentiometer) trimmes, så de to nederste værdier skal indstilles til et maksimum, mens de stadig giver stabil aflæsning. Der er en kritisk indstilling, hvor den midterste værdi begynder at give underlige aflæsninger. Drej trimmeren tilbage for at opnå stabile værdier igen.
Det kan ske, at displayet fryser. Bare tryk på reset -knappen og start forfra.
For mit setup (spole: 18 omgange @ 20cm) er den stabile værdi omkring 630-650. Når den er indstillet, skal du trykke på nulstillingsknappen, enheden kalibrerer igen, og alle træværdier skal være i samme område igen. Hvis metal nu bringes til spole, skal LED'en på Arduino-kortet (D13) lyse. En vedhæftet højttaler giver nogle kliklyde (der er plads til forbedringer i programmeringen der).
For at forhindre høje forventninger:
Detektoren registrerer nogle ting, men det forbliver en meget enkel og begrænset detektor.
For at give et indtryk af mulighederne foretog jeg nogle referencedetektioner med forskellige andre detektorer. Ser man på resultaterne, er det stadig ganske imponerende for en detektor med kun 8 eksterne dele, men ikke matchende professionelle detektorer.
Når man ser på kredsløbet og programmet, er der meget plads til forbedringer. Modstandens værdier blev fundet ved erfaring, pulstiden på 250 ms blev valgt tilfældigt, spoleparametrene også. Hvis du har ideer til forbedringer, vil jeg mere end gerne diskutere dem.
Hav det sjovt!
Trin 5: Opdatering1: Brug af en 16x2 LCD
Forbedringer
Under yderligere test indså jeg, at biblioteket til I2C OLED -skærmen brugte lang tid. Så jeg besluttede at bruge en 16x2 skærm med en I2C -konverter i stedet.
Så jeg vedtog programmet til LCD -skærmen og tilføjede nogle nyttige funktioner. Den første linje i displayet viser nu signalstyrken for en mulig indikation. Den anden linje viser nu to værdier. Næven angav den aktuelle signalafvigelse i forhold til kalibreringsværdien. Denne værdi skal være "0". Hvis denne værdi konstant er negativ eller positiv, skal detektoren kalibreres igen ved at trykke på reset -knappen. Positive værdier angiver metal tæt på spolen.
Den anden værdi viser den faktiske forsinkelsesværdi for henfaldskurven. Denne værdi er normalt ikke så interessant, men er nødvendig for den første opsætning af detektoren.
Programmet giver nu mulighed for flere pulsvarigheder i en sekvens (midler til at eksperimentere / forbedre ydeevnen). Jeg nåede ikke noget gennembrud. Så standard er sat til en pulsvarighed.
Første opsætning af detektoren
Ved opsætning af detektoren er den anden værdi af den anden linje relevant (den første kan ignoreres). I første omgang kan værdien være "ustabil" (se billede). Drej trimmodstanden, indtil værdien når en stabil aflæsning. Drej derefter for at øge værdien til en maksimal stabil værdi. Tryk på reset -knappen for at kalibrere igen, og detektoren er klar til brug.
Jeg fik indtryk af, at jeg ved at indstille den maksimale stabile værdi mistede følsomheden for ikke-jernmetaller. Så det kan være værd at eksperimentere med indstillingerne for at have en god følsomhed for ikke-jern-ting.
Spoler
Jeg bygger 3 spoler til yderligere test
1 -> 18 omdrejninger @ 200 mm
2 -> 25 omdrejninger @ 100 mm
3 -> 48 omdrejninger @ 100 mm
Interessant nok fungerede alle spoler ret godt med næsten samme ydelse (20ct mønt ved 40-50 mm i luften). Dette kan være en ganske subjektiv observation.
Anbefalede:
Automatiseret modelbanelayout med to tog (V2.0) - Arduino baseret: 15 trin (med billeder)
Automatiseret modelbanelayout med to tog (V2.0) | Arduino baseret: Automatisering af modeljernbanelayouter ved hjælp af Arduino mikrokontroller er en fantastisk måde at flette mikrokontrollere, programmering og modeljernbaner til en hobby. Der er en masse projekter til rådighed om at køre et tog autonomt på en model railroa
GPS -bilsporing med SMS -underretning og upload af Thingspeak -data, Arduino -baseret, hjemmeautomatisering: 5 trin (med billeder)
GPS -bilsporing med SMS -besked og upload af Thingspeak -data, Arduino -baseret, hjemmeautomatisering: Jeg lavede denne GPS -tracker sidste år, og da den fungerer godt, offentliggør jeg den nu på Instructable. Den er tilsluttet tilbehørsstikket i min bagagerum. GPS -trackeren uploader bilens position, hastighed, retning og den målte temperatur via en mobildata
Arduino -baseret ikke -kontakt infrarødt termometer - IR -baseret termometer ved hjælp af Arduino: 4 trin
Arduino -baseret ikke -kontakt infrarødt termometer | IR -baseret termometer ved hjælp af Arduino: Hej fyre i denne instruktion vil vi lave et kontaktfrit termometer ved hjælp af arduino. Da nogle gange temperaturen på væsken/faststoffet er alt for høj eller for lav, og så er det svært at komme i kontakt med det og læse dets temperaturen derefter i den scene
Arduino baseret pulsinduktionsdetektor - LC -Trap: 3 trin
Arduino baseret pulsinduktionsdetektor-LC-Trap: Mens jeg ledte efter yderligere ideer til en simpel Ardino Pulse induktionsmetaldetektor med kun en forsyningsspænding, stødte jeg på Teemos hjemmeside: http: //www.digiwood.ee/8-electronic- projekter/2-metaldetektor-kredsløbHan skabte en simpel pulsindukt
En overkommelig vision -løsning med robotarm baseret på Arduino: 19 trin (med billeder)
En overkommelig vision -løsning med robotarm baseret på Arduino: Når vi taler om maskinsyn, føles det altid så utilgængeligt for os. Mens vi lavede en open-source vision demo, som ville være super let at lave for alle. I denne video, med OpenMV -kameraet, er robotten ligegyldig, hvor den røde terning er