Código de Pesquisa

Lição 7/31-2 : detectando campo magnético usando interruptor reed | Kit SunFounder

Lição 7/31-2 : detectando campo magnético usando interruptor reed | Kit SunFounder

Detetar um campo magnético é uma das formas mais simples e mais gratificantes de começar com entradas digitais num Arduino. Neste projeto vais construir um detetor de campo magnético usando um interruptor reed — um pequeno interruptor encapsulado em vidro que fecha os seus contactos sempre que um íman se aproxima dele. Como o interruptor reed se comporta exatamente como um botão (está aberto ou fechado), é uma introdução perfeita à função digitalRead(), e também te ensina porque é que uma resistência de pull-down é importante e como o pull-up interno de entrada do Arduino a pode substituir por completo.

reed_switch

Depois de isto funcionar, o mesmo circuito torna-se o coração de muitos projetos do mundo real. Aqui estão algumas ideias práticas que podes experimentar:

  • Alarme de porta e janela — monta o interruptor reed numa moldura e um pequeno íman na porta; o Arduino reporta "aberto" no momento em que o íman se afasta.
  • Taquímetro sem contacto — cola um íman a uma roda giratória e conta os pulsos para medir as RPM.
  • Leitor de contador de água ou gás — muitos contadores de serviços públicos têm uma saída de pulso magnético que um interruptor reed consegue captar e registar.
  • Sensor de tampa de portátil / invólucro — deteta quando uma tampa é fechada para acionar o modo de suspensão ou um LED de estado.
  • Velocímetro de bicicleta — um íman no raio e um interruptor reed na forqueta dão-te um pulso por cada rotação da roda.
  • Deteção de violação — esconde um par de íman e interruptor reed dentro de um invólucro para saberes se foi aberto.

Como Funciona um Interruptor Reed

lesson-7-reading-reed-with-magnet-multimeter

Um interruptor reed é uma pequena cápsula de vidro que contém duas lâminas ferromagnéticas finas (no vídeo aos 12:38). Na presença de um campo magnético as lâminas são atraídas uma para a outra e tocam-se, fechando o circuito. Remove o íman e as lâminas separam-se, abrindo novamente o circuito. Esse é todo o princípio — é um interruptor sem botão móvel, sem desgaste por pressões dos dedos e sem necessidade de contacto físico com o objeto que estás a detetar.

Podes verificar este comportamento com um multímetro no modo de continuidade (no vídeo aos 13:59): sem íman por perto o medidor mostra um circuito aberto, e assim que um íman se aproxima o buzzer soa e o medidor lê um circuito fechado. Como o interruptor é eletricamente idêntico a um botão, o código e a ligação do Arduino são iguais aos de qualquer outra entrada digital.

Entradas Digitais e Resistências de Pull Explicadas

O Arduino lê um pino digital como HIGH ou LOW. Numa placa de 5 V, qualquer valor acima de aproximadamente 2,2 V é tratado como HIGH e qualquer valor abaixo de cerca de 1,5 V como LOW (no vídeo aos 01:49). O problema é que um interruptor ligado diretamente entre um pino e 5 V deixa o pino flutuante quando o interruptor está aberto — não está ligado a nada, por isso capta ruído e reporta valores aleatórios.

why_use_resistor_switch-1
why_use_resistor_switch-2
why_use_resistor_switch-3
why_use_resistor_switch-4
why_use_resistor_switch-5
why_use_resistor_switch-6
why_use_resistor_switch-7
why_use_resistor_switch-8
botão com INPUT_PULLUP

É por isso que se usa uma resistência. Duas configurações funcionam igualmente bem:

  • Pull-down: um resistor de 10 kΩ do pino para o terra. O pino lê LOW quando o interruptor está aberto e HIGH quando o interruptor conecta o pino a 5 V.
  • Pull-up: um resistor de 10 kΩ do pino para 5 V. O pino lê HIGH quando o interruptor está aberto e LOW quando o interruptor conecta o pino ao terra.

O Arduino também possui um resistor de pull-up interno que pode ser habilitado via software com INPUT_PULLUP (no vídeo em 19:52). Isso elimina completamente a necessidade do resistor externo — o pino fica em HIGH em repouso, e fechar o interruptor para o terra o puxa para LOW. A desvantagem é que a lógica é invertida: pressionado (ou ímã presente) agora lê 0 em vez de 1.

Hardware e Componentes

  • Arduino Uno (ou qualquer placa compatível)
  • Módulo de interruptor reed ou interruptor reed simples
  • Resistor de 10 kΩ (necessário apenas para a versão pull-down)
  • Protoboard e fios jumper
  • Um pequeno ímã para testes
  • Cabo USB para programação e alimentação

Guia de Ligação

lesson-7-reading-reed-schematic
lesson-7-reading-reed-wiring

O interruptor reed é ligado exatamente como um botão de pressão. Um terminal do interruptor reed vai para 5 V, o outro terminal vai para o pino 2 do Arduino e para uma extremidade do resistor de 10 kΩ. A outra extremidade do resistor vai para o terra (no vídeo em 14:40). Esta é uma configuração pull-down, então o pino lê LOW sem ímã presente e HIGH quando um ímã fecha o interruptor.

Na protoboard, coloque o interruptor reed de modo que seus dois terminais fiquem em linhas diferentes, conecte o resistor da mesma linha de um terminal até o trilho de terra, passe um fio vermelho do outro terminal para o trilho de 5 V, e um fio verde da junção do interruptor reed e do resistor para o pino 2 (no vídeo em 15:53). Preto vai para o terra, vermelho vai para 5 V, verde vai para o pino 2 — a mesma convenção de cores usada em todo o kit SunFounder.

Se você preferir pular o resistor, ligue um terminal do interruptor reed ao pino 2 e o outro terminal diretamente ao terra, depois habilite INPUT_PULLUP no código conforme descrito abaixo.

Explicação do Código

O sketch é intencionalmente minúsculo. Tudo o que você vai querer alterar está em dois lugares no topo do arquivo.

int reedPin = 2;//the pin reed switch is connected to 

void setup() {
  Serial.begin(9600);
  pinMode(reedPin, INPUT);
}

reedPin — mude este número se você ligou o interruptor reed a um pino digital diferente. Qualquer pino digital no Uno funciona; o pino 2 é usado aqui simplesmente porque é conveniente na protoboard.

Serial.begin(9600) — define a velocidade do monitor serial. Se você mudar este valor, também deve mudar o dropdown de baud rate na janela do Monitor Serial, caso contrário você verá caracteres sem sentido (no vídeo em 11:25).

pinMode(reedPin, INPUT) — configura o pino como entrada de alta impedância para que ele possa detectar a tensão definida pelo interruptor reed e pelo resistor. Se você estiver usando o pull-up interno, mude esta linha para pinMode(reedPin, INPUT_PULLUP); e lembre-se de que as leituras serão invertidas.

O loop simplesmente lê o pino e imprime o resultado:

void loop() {
  Serial.println(digitalRead(reedPin));
  delay(10);       
}

digitalRead(reedPin) retorna 1 quando o pino está HIGH e 0 quando está LOW. Como o valor é passado diretamente para Serial.println(), não há necessidade de uma variável intermediária — a leitura é impressa diretamente. Com a ligação pull-down, 0 significa "sem campo magnético" e 1 significa "ímã detectado" (no vídeo em 18:31).

delay(10) controla com que frequência uma leitura é impressa. Dez milissegundos é rápido o suficiente para que você veja o valor mudar no instante em que um ímã se aproxima. Se você preferir uma exibição mais calma, pode aumentar para 200 ms, mas note que isso também torna a detecção mais lenta (no vídeo em 12:01).

Demonstração do Projeto ao Vivo

Depois de carregar o sketch, abra o Monitor Serial e defina o baud rate para 9600. Sem ímã por perto, a janela se enche de zeros. Aproxime um pequeno ímã da cápsula de vidro e a saída imediatamente muda para uns; afaste o ímã e ela volta a zero (no vídeo em 17:04). A resposta é instantânea e funciona mesmo quando o ímã é mantido a um ou dois centímetros do interruptor.

lesson-7-reading-reed-wiring-on-breadboard

Se você construiu a versão pull-up, a lógica é invertida: o monitor mostra 1 em repouso e 0 quando o ímã está presente (no vídeo em 22:13). De qualquer forma, você agora tem um detector de campo magnético sem contato confiável que custa quase nada e pode ser incluído em qualquer uma das ideias de projeto listadas no topo deste artigo.

A versão com botão de pressão desta mesma lição de leitura digital é abordada separadamente na Lição 7/31: Leitura Digital Botão de Pressão, detectando campo magnético SunFounder Kit | Robojax.

Projetos relacionados deste vídeo

Capítulos

  • [00:00] Introdução: dois exemplos de leitura digital
  • [01:33] O que significa leitura digital e HIGH/LOW
  • [02:46] Como funciona um interruptor de botão de pressão
  • [03:25] Teoria do resistor pull-up e pull-down
  • [05:18] Ligação do botão de pressão na protoboard
  • [08:21] Abrindo e explicando o sketch do botão
  • [10:55] Carregando e testando o exemplo do botão
  • [12:38] Apresentando o interruptor reed e testando-o com um multímetro
  • [14:40] Ligação do interruptor reed ao pino 2
  • [16:46] Testando o interruptor reed com um ímã
  • [17:19] Explicando o sketch do interruptor reed
  • [19:45] Usando INPUT_PULLUP sem um resistor externo

Imagens

reed_switch
reed_switch
push button with INPUT_PULLUP
push button with INPUT_PULLUP
why_use_resistor_switch-1
why_use_resistor_switch-1
why_use_resistor_switch-2
why_use_resistor_switch-2
why_use_resistor_switch-3
why_use_resistor_switch-3
why_use_resistor_switch-4
why_use_resistor_switch-4
why_use_resistor_switch-5
why_use_resistor_switch-5
why_use_resistor_switch-6
why_use_resistor_switch-6
why_use_resistor_switch-7
why_use_resistor_switch-7
why_use_resistor_switch-8
why_use_resistor_switch-8
lesson-7-reading-reed-with-magnet-multimeter
lesson-7-reading-reed-with-magnet-multimeter
lesson-7-reading-push-button-schematic
lesson-7-reading-push-button-schematic
lesson-7-reading-push-button-wiring
lesson-7-reading-push-button-wiring
lesson-7-reading-reed-schematic
lesson-7-reading-reed-schematic
lesson-7-reading-reed-wiring
lesson-7-reading-reed-wiring
lesson-7-reading-reed-wiring-on-breadboard
lesson-7-reading-reed-wiring-on-breadboard
932-Lesson 7/31-2: Digital read, working with reed switch
Idioma: C++
/*
 * Lesson 7/31-2: Digital read, working with reed switch
Download and resource page https://robojax.com/RJT590
watch video tutorial https://www.youtube.com/watch?v=yyJrqFKn-X4
 * written/updated by Ahmad Shamshiri www.Robojax.com
 * Dec 12, 2022
 * 

*/

int reedPin = 2;//the pin reed switch is connected to 

void setup() {
  Serial.begin(9600);
  pinMode(reedPin, INPUT);
}

void loop() {
  Serial.println(digitalRead(reedPin));
  delay(10);       
}

Arquivos📁

Bibliotecas do Arduino (zip)

Manual do Usuário