Raspberry Metal Detector - Home of Manuel Magninch

Direkt zum Seiteninhalt

Hauptmenü:

Raspberry Metal Detector

Controller
Metall Detektor: Dieses Projekt ist nicht für den effektiven Einsatz ausgelegt, dafür müsste noch einiges optimiert werden. Es können massive Getallgegenstände grösser 50mm mit einem Abstand von 100mm erkannt werden. Geldstücke lassen sich bis zu einem Abstand von 50mm noch erkennen.
Funktion: Ein Metalldetektor basiert darauf, dass sich bei einer Elektrischen Spule die Werte ändern, wenn ein metallischer Gegenstand in der Nähe ist. Üblicherweise wird ein Schwingkreis mit der Spule und einem Kondensator gebaut und dieser ändert die Frequenz wenn ein metallischer Gegenstand in der Nähe ist.
In diesem Projekt ist ein anderer Ansatz gewählt worden, es ist kein Schwingkreis vorhanden, der Kontroller misst direkt die Induktivität. Die Messung der Spulen Induktivität wird mit einem  Puls auf die Detektor Spule ausgelöst. Der Stom der Spule wird verzögert ansteigen, die Verzögerung wird als Ladung im Kondensator C1 gespeichert. Die Aufsummierte Spannung im Kondensator C1, wird mit dem Microcontroller gemessen und ausgewertet.

Grund für die Einschränkungen: Die Spannung am Ausgang GP22 ist mit einem Rippelversehen, ein Puffer-Verstärker (z.B. FET) und eine Anhebung der Spannung von 3.3V auf z.B. 9V würde helfen. Weiter ist der Analoge Messeingang (ADC des Paspberry Pico) nicht sehr präzise, auch dieser hat eine grosse Eigenschwingung. Da würde ein externer 16Bit ADC helfen.
Python Programm Code zum testen:

from machine import Pin, ADC, PWM

# Metal Detector Pins (Demo-Programm):
# Pico Pin-29 GP22 <-> CoilTriger
# Pico Pin-31 ADC0 <-> Read ADC Cap Level
# Pico Pin-38 GND <-> GND

OnBoardLED = machine.Pin(25, machine.Pin.OUT) # GP25 (PICO-Pin-internal-LED)
CoilTrig = machine.Pin(22, machine.Pin.OUT)
CAP_ADC = machine.ADC(26) # =ADC(0)
SPKPWM = pwm = PWM(Pin(21))

CoilLoadCount = 2
CoilValCount = 5000
CoilValMid = 2048

while True:
    CoilVal = 0
    for i in range(CoilValCount): # Zanzahl MessZyklen
        for ii in range(CoilLoadCount): # Ladezyklen
            CoilTrig.high()
            CoilTrig.low()
        CoilVal = CoilVal + (CAP_ADC.read_u16() >> 4) # Messwert holen
        CAPClear = machine.Pin(26, machine.Pin.OUT) # Entladen
        CAPClear.low()
        CAP_ADC = machine.ADC(26)
    CoilValMid = (CoilValMid*19+CoilVal/CoilValCount)/20
    freq = 440 + abs( int(( CoilValMid - CoilVal/CoilValCount )*16) )
    print(" Mess:",int(CoilVal/CoilValCount*16)," Mittel:",int(CoilValMid*16)," Diff:",int(CoilVal/CoilValCount*16 - CoilValMid*16))
    SPKPWM.duty_u16(32500) # Tongenerator PWM Puls Pause 1:1
    SPKPWM.freq(freq)
    OnBoardLED.toggle() # OnBoard LED Toggle



Berechnung der Spule L1

Spule 100mm Duchmesser, 0.25mm Cu-Lackdraht (0.2-0.4mm),
26 Windungen, Induktivität gemessen: 130uH

L = (u0 * N*N * A) / (l + 0.9 * r)       (Masse im mm L in mH)
u0 = 4 * Pi * 10e-7 = 1.26*10E-6 H/m (permeabilität)
N = 26 (Windungen)
r = 50mm (Radius der Spule)
A = r * r * Pi = 50 * 50 * 3.14159 = 7854mm2 (innenfläche im mm2)
l = 26*0.25mm= 6.5mm (Spulenlänge = Windungen * Draht Dicke)

L = (1.26*10E-6 * 26 * 26 * 7854) / (6.5 + 0.9 * 50) = 0.130mH
L1 = 130uH

 
Zurück zum Seiteninhalt | Zurück zum Hauptmenü