Saiba como construir um detector de metais usando um oscilador Colpitts e um Arduino.
Como funcionam os detectores de metais?
O circuito do tanque
No circuito acima, o condensador e o indutor em série formam um circuito do tanque. Em um circuito de tanque, a energia é transferida repetidamente entre um condensador e um indutor, resultando em oscilação. A corrente descarregada do condensador flui através do indutor; quando o condensador é completamente descarregado, o campo magnético decrescente do indutor mantém o fluxo de corrente. O condensador irá então carregar com a polaridade oposta, e quando o campo magnético estiver completamente desintegrado, o condensador irá descarregar, resultando num fluxo de corrente na direcção oposta à da corrente original. Este ciclo continua.
O indutor do circuito do tanque acima forma o detector do detector de metais (uma grande bobina de fio). Quando o material metálico se aproxima do centro do indutor (a bobina do detector), ele entra no campo magnético criado pelo indutor. Isto altera a permeabilidade magnética do núcleo do indutor, provocando a alteração da indutância. A alteração da indutância, por sua vez, altera a frequência de oscilação do circuito do tanque.
Se os componentes fossem ideais, o circuito do tanque oscilaria indefinidamente sem uma fonte de energia externa. Mas, na prática, os componentes não são ideais. A resistência indesejada dos componentes introduzirá perda de energia, fazendo com que a corrente oscilante se cone até parar. Para contrariar isto, um amplificador inversor BJT de fase única é usado para adicionar continuamente ganho ao circuito do tanque.
O oscilador Colpitts
Desde que a oscilação nos nós antes e depois do indutor estejam 180° fora de fase uns com os outros, um dos nós fornecerá a oscilação à base do transistor, amplificará e inverterá o sinal no coletor, depois o retornará em fase ao outro nó do circuito do tanque. Todo este circuito é chamado de oscilador Colpitts.
O oscilador Colpitts acima fornece uma oscilação constante com uma freqüência na faixa de 100kHz. Metais de artigos domésticos alterando a permeabilidade do núcleo indutor irá flutuar esta frequência em torno de 10kHz. Como esta faixa de freqüência está fora do espectro de áudio humano (20Hz a 20kHz), precisaremos traduzir a oscilação em um tom audível.
Os detectores de metais BFO (oscilador de freqüência de batimento) tradicionais superam este problema incorporando outro circuito de tanque com uma freqüência fixa igual à freqüência do circuito do tanque do detector sem a influência de quaisquer metais. Então, tomando a diferença entre as duas frequências isolará as frequências flutuantes do circuito do detector e o levará a uma faixa audível.
Para este projeto de detector de metais, estaremos usando um Arduino para processar o sinal de oscilação em vez de compensar a oscilação com um segundo circuito de tanque. O Arduino irá armazenar a frequência fixa e comparar continuamente a frequência de entrada do circuito do detector com a frequência armazenada (mais no programa Arduino abaixo).
Materiais para o seu Detector de Metais de Bricolagem
Para este projecto, foi escolhido um brinquedo herbicida para alojar todos os componentes. Ele inclui as seguintes características:
- um botão de gatilho, que nós vamos usar novamente para acionar o alto-falante
- um botão lateral, que nós vamos usar para definir a freqüência fixa
- um compartimento de bateria (3xAA baterias) com um interruptor ON/OFF
- um alto-falante, que tocaremos o tom através de
- um motor com LEDs ligados, que será activado quando a diferença de frequência exceder um determinado limiar
- uma cabeça circular onde encaixaremos uma bobina de fio para o indutor do circuito do tanque
Também adicionaremos um potenciómetro (prata) para tornar a sensibilidade das mudanças de tom ajustável.
A bobina do indutor é feita de aproximadamente 50 envoltórios de fio de 26 AWG em torno de um carretel de 5,5 polegadas de diâmetro.
Dentro da caixa, vamos substituir a placa de circuito original pelo nosso próprio circuito e ligar todos os periféricos ao circuito com cabeçalhos de pinos.
Esquemas do circuito de detecção de metais
Utilizei um Arduino UNO para programar um DIP ATMega328. Retirei então o ATMega328 da placa de desenvolvimento e incorporei-o a uma placa de desenvolvimento juntamente com o resto do circuito.
O oscilador Colpitts, na parte inferior esquerda do diagrama, alimenta a oscilação no contador 1 (pino T1) do chip (marcado como pino digital 5 no Arduino UNO), onde conta constantemente a frequência de oscilação.
No nível superior do diagrama, uma fonte de alimentação de 4.5V (baterias 3xAA, com condensadores bypass) é utilizada para alimentar o ATmega328, oscilador, altifalante e motor (com LEDs).
Para manter a corrente dos pinos digitais do microcontrolador num nível seguro (40 mA por pino no máximo para o ATmega328), um transistor NPN (C2878) é utilizado para accionar o altifalante, e um MOSFET de canal N (SUB45N03) para accionar o motor.
Bambos os interruptores de disparo e rearme (define a frequência fixa) são ligados a pinos digitais usando a configuração interna de pull-up. Pequenos condensadores são adicionados em paralelo para debounce os interruptores.
O potenciômetro de sensibilidade é configurado como um divisor de tensão, e a divisão é lida usando um pino analógico.
Código Walkthrough
O código fonte completo para este projeto pode ser encontrado aqui:
- https://github.com/evankale/ArduinoMetalDetector
Below é um passo-a-passo detalhado do código.
Função de configuração
Para manter o controle da freqüência de oscilação do detector através do contador de temporizador 1, primeiro precisamos configurar os registros do temporizador/controlador (TCCR). Estes TCCRs são acessados através dos três números inteiros: TTCR1A, TTCR1B, e TTCR1C.
TCCR1A = 0b00000000;TCCR1B = 0b00000111;
Termos de ajustar a geração da forma de onda para o modo normal, ajustando as bandeiras WGM de TCCR1A e TCCR1B para 0, e ajustar o modo de seleção da velocidade do relógio para a fonte do relógio externo, ajustando as bandeiras CS de TCCR1B para o modo 3 (relógio externo na borda ascendente). Nesta configuração, o registro OCR1A irá diminuir em 1 cada vez que uma borda ascendente for detectada a partir da oscilação.
TIMSK1 |= (1 << OCIE1A);
Próximo precisamos habilitar a interrupção do temporizador/contador A, ajustando o flag OCIE1A no registro TIMSK1. Isto permitirá que a função de interrupção SINAL(TIMER1_COMPA_vect) seja chamada sempre que o registro OCR1A atingir 0.
OCR1A = 1;
Agora inicialize o OCR1A para 1 para que a função de interrupção seja chamada assim que a primeira borda ascendente for detectada.
Interrupt Function
Esta é a função SINAL(TIMER1_COMPA_vect). É chamada quando o registro OCR1A chega a 0. Nesta função, queremos manter o registro do número de microssegundos decorridos desde a última vez que a função foi chamada. Este delta de tempo é armazenado como signalTimeDelta.
storedTimeDelta é o delta de tempo de “frequência fixa” com que o signalTimeDelta é comparado no laço principal. storedTimeDelta é ajustado para signalTimeDelta quando storedTimeDelta é zerado (no bootup e quando o switch de reset é pressionado).
OCR1A += CYCLES_PER_SIGNAL;
Após realizar operações de interrupção, o OCR1A precisa ser zerado incrementando-o com nossa constante predefinida, CYCLES_PER_SIGNAL (número de ciclos antes de ocorrer a próxima interrupção).
Loop Function
Na função loop, verificamos se o gatilho está pressionado. Em caso afirmativo, então leia o valor analógico do potenciômetro de sensibilidade e interpole linearmente o valor analógico (0 a 1023) para uma escala mais fácil de usar (0,5 a 10,0).
int storedTimeDeltaDifference = (storedTimeDelta - signalTimeDelta) * sensitivity;
A diferença entre a freqüência fixa (armazenadaTimeDelta) e a freqüência medida (signalTimeDelta) é calculada e multiplicada pelo valor de sensibilidade.
tone(SPEAKER_PIN, BASE_TONE_FREQUENCY + storedTimeDeltaDifference);
Este valor é então somado com uma frequência de tons base audível, BASE_TONE_FREQUENCY, e reproduzido o altifalante utilizando a função Arduino tone().
Se a diferença exceder o limiar definido pelo SPINNER_THRESHOLD, então o motor é activado.
Se o disparo for liberado, então o tom do alto-falante é parado (chamando a função noTone()) e o motor é desativado.
Se o botão reset for pressionado, ele zeraráTimeDelta, permitindo que a próxima chamada de interrupção defina um novo valor.
Como Funciona o nosso Detector de Metais à base de Arduino-Based Metal Detector?
Com a configuração de sensibilidade mais baixa, o detector de metais pode pegar itens grandes como latas de refrigerante, telemóveis e ferramentas de ferro a poucos centímetros de distância da bobina. Na maior sensibilidade, itens menores, como anéis de aço, parafusos e moedas dentro da mesma proximidade também podem ser detectados. Veja o vídeo no topo do artigo para uma demonstração!
Para ampliar o alcance do detector, podemos aumentar a área do campo magnético criado pelo indutor. Isto pode ser conseguido aumentando o fluxo de corrente através do indutor (aumentando a entrada de tensão para o oscilador, permitindo um maior ganho no amplificador), ou aumentando o número de enrolamentos de fios na bobina do indutor.
Com um detector de metais à base de Arduino, podemos fazer outras coisas interessantes que não podem ser feitas com os detectores de metais BFO tradicionais. Fique atento a futuros projectos sobre como podemos tirar partido deste mecanismo de detecção de metais para outros fins!
ArduinoMetalDetector-master.zip
Experimente este projecto por si mesmo! Obtenha o BOM.