Índice:

Detector de indução de pulso baseado em Arduino - bobina giratória: 5 etapas (com imagens)
Detector de indução de pulso baseado em Arduino - bobina giratória: 5 etapas (com imagens)

Vídeo: Detector de indução de pulso baseado em Arduino - bobina giratória: 5 etapas (com imagens)

Vídeo: Detector de indução de pulso baseado em Arduino - bobina giratória: 5 etapas (com imagens)
Vídeo: Arduino wireless metal detector DIY / Spirit PI 2024, Novembro
Anonim
Detector de indução de pulso baseado em Arduino - bobina giratória
Detector de indução de pulso baseado em Arduino - bobina giratória
Detector de indução de pulso baseado em Arduino - bobina giratória
Detector de indução de pulso baseado em Arduino - bobina giratória

A ideia

Tendo construído alguns detectores de metal no passado com resultados variados, eu queria explorar os recursos do Arduino nessa direção.

Existem alguns bons exemplos de como construir detectores de metal com o Arduino, alguns aqui como instrutíveis. Mas quando olhamos para eles, eles normalmente requerem alguns componentes externos para o tratamento do sinal analógico ou a sensibilidade é muito baixa.

Ao pensar em detectores de metal, o tópico principal é como sentir as pequenas mudanças de voltagem nos sinais relacionados à bobina sensora. Essas mudanças normalmente são muito pequenas. A abordagem mais óbvia seria usar as entradas analógicas do ATmega328. Mas olhando para as especificações, existem dois problemas básicos: eles são (frequentemente) muito lentos e a resolução é (na maioria dos casos) muito baixa.

Por outro lado, o Arduino está rodando a 16 MHz e tem alguns recursos de temporização i. e. uma resolução de 0,0625 µS se estiver usando a velocidade do clock. Portanto, em vez de usar a entrada analógica para detecção, a maneira mais simples de detectar pequenas mudanças dinâmicas na tensão é comparar a mudança na queda de tensão ao longo do tempo em uma tensão de referência fixa.

Para este propósito, o ATmega328 tem a característica interessante de um comparador interno entre D6 e D7. Este comparador é capaz de disparar uma interrupção, permitindo o tratamento preciso de eventos. Deixando de lado as rotinas de temporização perfeitamente codificadas como millis () e micos () e indo para o temporizador interno do ATmega328 com resolução muito maior, o Arduino é uma ótima base para abordagens de detecção de metal.

Portanto, do ponto de vista do código-fonte, um bom começo seria programar o comparador interno para “mudança” na polaridade das entradas e usar um contador interno com a maior velocidade possível para mudança no tempo das mudanças.

O código geral em Arduido para conseguir isso é:

// Definindo todas as pré-variáveis necessárias, etc. e configurando os registros

caracteres não assinados clockSelectBits = _BV (CS10); // sem pré-escala, full xtal void setup () {pinMode (6, INPUT); // + do comparador - configurando-os como INPUT, eles são // configurados para alta impedância pinMode (7, INPUT); // - do comparador - configurando-os como INPUT, eles são // configurados para alta impedância cli (); // parar interrupções TCCR1A = 0; // define todo o registro TCCR1A para 0 TCCR1B = 0; // mesmo para TCCR1B -> modo normalTCNT1 = 0; // inicializa o valor do contador para 0; TCCR1B | = clockSelectBits; // define o prescaler e inicia o relógio TIMSK1 = _BV (TOIE1); // define o bit de habilitação de interrupção de estouro do temporizador sei (); // permitir interrupções ACSR = (0 << ACD) | // Comparador analógico: Ativado (0 << ACBG) | // Seleção de intervalo de banda do comparador analógico: AIN0 é aplicado à entrada positiva (0 << ACO) | // Saída de comparação analógica: Desligado (1 << ACI) | // Sinalizador de interrupção do comparador analógico: Interrupção pendente desobstruída (1 << ACIE) | // Interrupção do comparador analógico: Ativado (0 << ACIC) | // Captura de entrada do comparador analógico: Desativado (0 << ACIS1 | 0 << ACIS0 // interrupção na alternância de saída // (0 << ACIS1 | 1 << ACIS0 // reservado // (1 << ACIS1 | 0 << ACIS0 // interrupção na borda descendente da saída // (1 << ACIS1 | 1 << ACIS0 // interrupção na borda ascendente da entrada;}

// esta rotina é chamada toda vez que o comparador cria uma interrupção

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

// esta rotina é chamada toda vez que houver um estouro no contador interno

ISR (TIMER1_OVF_vect) {timer1_overflow_count ++; }

// esta rotina é usada para redefinir o cronômetro para 0

void resetTimer (void) {oldSREG = SREG; cli (); // Desabilita interrupções TCNT1 = 0; // inicializa o valor do contador para 0 SREG = oldSREG; // Restaura o registro de status TCCR1B | = clockSelectBits; // define o prescaler e inicia o relógio timer1_overflow_count = 0; // redefine o contador de estouro}

É claro que essa ideia não é inteiramente nova. A parte principal deste código pode ser encontrada em outro lugar. Uma boa implementação dessa abordagem para um microcontrolador encontrada na página inicial do TPIMD - Tiny Pulse Induction Metal Detector.

www.miymd.com/index.php/projects/tpimd/ (infelizmente esta página não está mais online, atualmente existe um backup do site em www.basic4mcu.com, procure por "TPIMD").

Etapa 1: ideia de indução de pulso do Arduino - bobina giratória

Ideia de indução de pulso do Arduino - bobina giratória
Ideia de indução de pulso do Arduino - bobina giratória
Ideia de indução de pulso do Arduino - bobina giratória
Ideia de indução de pulso do Arduino - bobina giratória

A ideia é usar o Arduino como um detector de indução de pulso, como no TPIMD, já que a ideia de tempo da curva de decaimento parece funcionar muito bem. O problema com os detectores de indução de pulso é que eles normalmente precisam de voltagem diferente para funcionar. Uma tensão para alimentar a bobina e uma tensão separada para lidar com a curva de decaimento. Essas duas fontes de tensão tornam os detectores de indução de pulso sempre um pouco complicados.

Olhando para a tensão da bobina em um detector de PI, a curva resultante pode ser dividida em dois estágios diferentes. O primeiro estágio é o próprio pulso alimentando a bobina e construindo o campo magnético (1). O segundo estágio é a curva de queda de tensão, começando com um pico de tensão, depois ajustando rapidamente para a tensão "sem energia" da bobina (2). O problema é que a bobina muda sua polaridade após o pulso. O pulso é positivo (Var 1. na imagem anexada) e a curva de decaimento é negativa. Se o pulso for negativo, a curva de decaimento será positiva (Var 2. na imagem anexa)

Para resolver este problema básico, a bobina precisa ser “invertida” eletronicamente após o pulso. Nesse caso, o pulso pode ser positivo e a curva de queda também pode ser positiva.

Para conseguir isso, a bobina deve ser isolada de Vcc e GND após o pulso. Neste momento, há apenas uma corrente fluindo através de um resistor de amortecimento. Este sistema isolado de bobina e resistor de amortecimento pode então ser „orientado“para qualquer tensão de referência. Isso, em teoria, criará a curva positiva combinada (parte inferior do desenho)

Esta curva positiva pode então ser usada por meio do comparador para detectar o ponto de tempo onde a tensão de decaimento „cruza“uma tensão de referência. No caso de tesouros próximos à bobina, a curva de decaimento muda e o ponto de tempo que cruza a tensão de referência muda. Essa mudança pode então ser detectada.

Depois de algumas experiências, o seguinte circuito provou funcionar.

O circuito consiste em um módulo Arduino Nano. Este módulo aciona dois transistores MOSFET alimentando a bobina (em SV3) via D10. Quando o pulso em D10 termina, ambos os MOSFETs isolam a bobina de 12 V e GND. A energia economizada na bobina é drenada por R2 (220 Ohms). Ao mesmo tempo, R1 (560 Ohms) conecta o antigo lado positivo da bobina ao GND. Isso muda a curva de queda negativa em R5 (330 Ohms) para uma curva positiva. Os diodos protegem o pino de entrada do Arduino.

R7 é um devedor de tensão em cerca de 0,04V. No momento em que a curva de decaimento em D7 fica mais negativa do que 0,04 em D6, uma interrupção é acionada e a duração após o final do pulso é salva.

No caso de metal próximo à bobina, a curva de decaimento dura mais, e o tempo entre o final do pulso e a interrupção é maior.

Etapa 2: Construindo o Detector (placa de ensaio)

Construindo o Detector (placa de ensaio)
Construindo o Detector (placa de ensaio)
Construindo o Detector (placa de ensaio)
Construindo o Detector (placa de ensaio)
Construindo o Detector (placa de ensaio)
Construindo o Detector (placa de ensaio)

Construir o detector é muito fácil. Isso pode ser feito em uma placa de ensaio (aderindo ao circuito original) ou soldando as peças em um PCB.

O LED D13 na placa Arduino Nano é usado como uma indicação de metal

Desfazer o breadboard é o caminho mais rápido para o detector em funcionamento. É necessária bastante fiação, mas isso pode ser feito em uma pequena placa de ensaio. Nas fotos, isso é mostrado em 3 etapas, já que o Arduino e os MOSFETs estão escondendo alguns dos fios. Ao testar eu desconectei os diodos de alguma forma sem perceber a princípio. Isso não teve efeito negativo no comportamento do detector. Na versão PCB do circuito, eu os deixei de fora completamente.

Não mostrado nas fotos são as conexões para um display OLED de 0,96. Este monitor está conectado:

Vcc - 5V (no pino do Arduino, não na tensão de alimentação !!!)

GND - GND

SCL - A5

SDA - A4

Este display OLED é necessário para calibrar o detector inicialmente. Isso é feito definindo a tensão correta no PIN6 do Arduino. Essa tensão deve ser em torno de 0,04V. O display ajuda a definir a tensão correta.

A versão breadboard funciona muito bem, embora provavelmente não seja adequada para ir para o mundo selvagem.

Etapa 3: Indo para PCB

Indo PCB
Indo PCB
Indo PCB
Indo PCB
Indo PCB
Indo PCB
Indo PCB
Indo PCB

Quanto à soldagem, eu realmente não gosto de placas de circuito impresso de dupla face de alta tecnologia, então modifiquei o circuito para caber em uma placa de circuito impresso de lado único.

As seguintes modificações foram feitas:

1. os diodos foram deixados de fora.

2. as portas dos MOSFETs têm um resistor de 10 Ohm

3. a tensão de alimentação para o divisor de tensão em D6 é dada por um sinal de nível ALTO em D8

4. O pino do driver para os MOSFETs foi alterado.

Desta forma, um PCB de lado único pode ser criado, o qual pode ser soldado em PCBs universais. Usando este circuito, você terá um detector de PI funcionando com apenas 8 a 10 componentes externos (dependendo se o display OLED e / ou um alto-falante for usado).

Etapa 4: Configuração e uso do detector

Configurando e Usando o Detector
Configurando e Usando o Detector
Configurando e Usando o Detector
Configurando e Usando o Detector
Configurando e Usando o Detector
Configurando e Usando o Detector

Se o detector for construído corretamente e o programa for escrito no Arduino, a maneira mais fácil (senão a única) de configurar a unidade é usar um display OLED. O display está conectado a 5V, GND, A4, A5. O display deve mostrar „calibrando“após a unidade ser ligada. Após alguns segundos, deve aparecer “calibração concluída” e três números devem ser exibidos no display.

O primeiro número é o “valor de referência” identificado durante a calibração. O segundo valor é o último valor medido e o terceiro valor é um valor médio das últimas 32 medições.

Esses três valores devem ser mais ou menos iguais (em meus casos de teste abaixo de 1000). O valor médio deve ser mais ou menos estável.

Para iniciar a configuração inicial, não deve haver nenhum metal próximo à bobina.

Agora, o divisor de tensão (potenciômetro de compensação) deve ser ajustado de forma que os dois valores mais baixos sejam ajustados para o máximo, ao mesmo tempo em que fornece uma leitura estável. Existe uma configuração crítica, onde o valor do meio começa a dar leituras estranhas. Volte o aparador para obter novamente valores estáveis.

Pode acontecer que a tela congele. Basta pressionar o botão de reset e começar de novo.

Para minha configuração (bobina: 18 voltas @ 20 cm), o valor estável é cerca de 630-650. Uma vez definido, pressione o botão de reset, a unidade recalibra e todos os valores da árvore devem estar na mesma faixa novamente. Se o metal for trazido para a bobina, o LED na Arduino-Board (D13) deve acender. Um alto-falante conectado emite alguns cliques (há espaço para melhorias na programação lá).

Para evitar altas expectativas:

O detector detecta algumas coisas, mas continua sendo um detector muito simples e limitado.

Para dar uma impressão das capacidades, fiz algumas detecções de referência com diferentes outros detectores. Olhando para os resultados, ainda é bastante impressionante para um detector com apenas 8 partes externas, mas não combinando com detectores profissionais.

Olhando para o circuito e o programa, há muito espaço para melhorias. Os valores dos resistores foram encontrados por experiência, o tempo de pulso de 250ms foi escolhido aleatoriamente, os parâmetros da bobina também. Se você tiver ideias para melhorias, ficarei mais do que feliz em discuti-las.

Divirta-se!

Etapa 5: Update1: Usando um LCD 16x2

Update1: Usando um LCD 16x2
Update1: Usando um LCD 16x2
Update1: Usando um LCD 16x2
Update1: Usando um LCD 16x2
Update1: Usando um LCD 16x2
Update1: Usando um LCD 16x2

Melhorias

Durante outros testes, percebi que a biblioteca do display I2C OLED estava usando um tempo considerável. Portanto, decidi usar uma tela 16x2 com um conversor I2C.

Então eu adotei o programa para o display LCD adicionando alguns recursos úteis. A primeira linha do display agora mostra a força do sinal de uma possível indicação. A segunda linha agora mostra dois valores. O punho indicava o desvio do sinal atual em comparação com o valor de calibração. Este valor deve ser "0". Se este valor for constantemente negativo ou positivo, o detector deve ser recalibrado pressionando o botão de reset. Os valores positivos indicam metal próximo à bobina.

O segundo valor mostra o valor real do atraso da curva de decaimento. Este valor normalmente não é tão interessante, mas é necessário para a configuração inicial do detector.

O programa agora permite várias durações de pulso em uma sequência (meio de experimentar / melhorar o desempenho). Não consegui nenhum avanço. Portanto, o padrão é definido para a duração de um pulso.

Configuração inicial do detector

Ao configurar o detector, o segundo valor da segunda linha é relevante (o primeiro pode ser ignorado). Inicialmente, o valor pode ser "instável" (veja a imagem). Gire o resistor de ajuste até que o valor chegue a uma leitura estável. Em seguida, gire para aumentar o valor até um valor estável máximo. Pressione o botão de reset para recalibrar e o detector está pronto para uso.

Tive a impressão de que, ao definir o valor estável máximo, perdi a sensibilidade para metais não ferrosos. Portanto, pode valer a pena experimentar as configurações para ter uma boa sensibilidade para coisas que não sejam de ferro.

Bobinas

Eu construo 3 bobinas para mais testes

1 -> 18 voltas @ 200 mm

2 -> 25 voltas @ 100 mm

3 -> 48 voltas @ 100 mm

Curiosamente, todas as bobinas funcionaram muito bem, com quase o mesmo desempenho (moeda de 20 ct a 40-50 mm no ar). Esta pode ser uma observação bastante subjetiva.

Recomendado: