Índice:
- Etapa 1: ideia de indução de pulso do Arduino - bobina giratória
- Etapa 2: Construindo o Detector (placa de ensaio)
- Etapa 3: Indo para PCB
- Etapa 4: Configuração e uso do detector
- Etapa 5: Update1: Usando um LCD 16x2
Vídeo: Detector de indução de pulso baseado em Arduino - bobina giratória: 5 etapas (com imagens)
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:38
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
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)
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
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
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
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:
Controle de volume do PC com discagem giratória vintage: 7 etapas (com imagens)
Controle de volume do PC com discagem rotativa vintage: Se você for como eu, você mudará o volume do computador com frequência. Alguns vídeos são mais altos do que outros, às vezes você quer que o volume do seu computador seja silenciado enquanto ouve podcasts ou música, e pode ser necessário qui
Controle remoto IR baseado em Arduino automático baseado em temperatura: 7 etapas
Controle remoto IR baseado em Arduino automático baseado em temperatura: Ei, e aí, pessoal! Akarsh aqui da CETech. Cansado de acordar no meio de um sono profundo só porque a temperatura ambiente está muito baixa ou muito alta por causa do seu AC mudo. Então este projeto é para você. Neste projeto, vamos fazer o nosso
Termômetro infravermelho sem contato baseado em Arduino - Termômetro baseado em IR usando Arduino: 4 etapas
Termômetro infravermelho sem contato baseado em Arduino | Termômetro baseado em IR usando Arduino: Olá pessoal, neste instructables faremos um termômetro sem contato usando arduino. Já que às vezes a temperatura do líquido / sólido é muito alta ou muito baixa e então é difícil fazer contato com ele e ler sua temperatura então naquele cenário
Detector de metal por indução de pulso baseado em DIY Arduino: 5 etapas
Detector de metal por indução de pulso baseado em DIY Arduino: este é um detector de metal relativamente simples com excelentes desempenhos
Detector de indução de pulso baseado em Arduino - LC-Trap: 3 etapas
Detector de indução de pulso baseado em Arduino - LC-Trap: Enquanto procurava por mais ideias para um detector de metal de indução de pulso Ardino simples com apenas uma tensão de alimentação, me deparei com a página inicial de Teemo: http: //www.digiwood.ee/8-electronic- projetos / 2-circuito detector de metais; ele criou um indutor de pulso simples