Skip to Content

Construa um Tacômetro Arduino Usando o Sensor de Efeito Hall A3144

Construa um Tacômetro Arduino Usando o Sensor de Efeito Hall A3144

Neste tutorial, vais aprender a usar o Sensor de Efeito Hall A3144 e um Arduino para construir um tacómetro. Um tacómetro é um dispositivo para medir a velocidade de um objeto em rotação. Por exemplo, é comum em aplicações automóveis monitorizar as RPM (rotações por minuto) de um motor.

O sensor de Efeito Hall deteta a presença de um campo magnético. Ao fixar um pequeno íman a um objeto em rotação, podemos usá-lo para contar as rotações. Com um Arduino, podemos então medir o tempo que demorou um determinado número de rotações e calcular as RPM.

Nas próximas secções, vou listar as peças necessárias para este projeto, explicar os fundamentos dos sensores de Efeito Hall e apresentar o sensor de Efeito Hall A3144, que vamos usar para o nosso tacómetro. Também vou fornecer exemplos de diferentes implementações de tacómetros usando o sensor A3144, incluindo um tacómetro simples e outro mais avançado usando interrupções.

Então, vamos começar!

Peças Necessárias

Abaixo encontras as peças necessárias para este projeto. Se só queres explorar e aprender sobre Sensores de Efeito Hall, compra o Módulo Sensor. É um pouco mais fácil de usar, mas é demasiado grande para aplicações práticas. Para essas, compra o Sensor de Efeito Hall propriamente dito, que é muito mais pequeno e também mais barato.

Arduino Uno

USB Data Sync cable Arduino

Cabo USB para Arduino UNO

Dupont wire set

Conjunto de fios Dupont

Kit de resistores & LED

Módulo Sensor de Efeito Hall A3144

Sensor de Efeito Hall A3144

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Fundamentos dos Sensores de Efeito Hall

Sensores de Efeito Hall são dispositivos eletrónicos que podem detetar a presença de um campo magnético. Funcionam com base no Efeito Hall, que é a criação de uma diferença de tensão num condutor quando este é colocado num campo magnético enquanto uma corrente passa por ele.

Como funcionam?

Sensores de Efeito Hall consistem em três componentes principais: uma fonte de tensão, um condutor por onde passa corrente, e um campo magnético. Quando um campo magnético é aplicado perpendicularmente ao fluxo de corrente no condutor, cria uma força de Lorentz que empurra os eletrões para um lado do condutor. Isto gera uma diferença de tensão no condutor, que pode ser medida.

Efeito Hall ( source )

Aplicações típicas

As aplicações típicas para sensores de Efeito Hall são:

  • Deteção de proximidade : Sensores de Efeito Hall podem detetar a presença ou ausência de um campo magnético, tornando-os adequados para aplicações de deteção de proximidade.
  • Medição de velocidade : Ao fixar um íman a um objeto em rotação e usar um sensor de Efeito Hall para detetar as mudanças no campo magnético, pode medir-se a velocidade do objeto.
  • Medição de corrente : Sensores de Efeito Hall podem medir a corrente que passa por um condutor ao detetar o campo magnético gerado pela corrente.
  • Deteção de posição : Ao colocar ímans em posições específicas e usar sensores de Efeito Hall, pode determinar-se a posição de um objeto.

Latching vs não latching

Sensores de Efeito Hall podem ser categorizados como latching ou não latching. Sensores latching têm um campo magnético incorporado que os mantém no estado ligado ou desligado até que outro campo magnético de polaridade oposta seja aplicado. Sensores não latching, por outro lado, apenas detetam a presença de um campo magnético e não mantêm o seu estado. Vamos usar um sensor não latching.

Bipolar vs unipolar

Sensores de Efeito Hall também podem ser classificados como bipolares ou unipolares. Sensores bipolares detetam campos magnéticos positivos e negativos, enquanto sensores unipolares respondem apenas a uma polaridade. O Sensor de Efeito Hall A3144 é unipolar e reage apenas a um polo do íman.

Comutação vs linear

Sensores de Efeito Hall podem operar em modo de comutação ou linear. Sensores de comutação fornecem uma saída digital, alternando entre estados ligado e desligado com base na presença ou ausência de um campo magnético. Sensores lineares fornecem uma saída analógica que varia linearmente com a intensidade do campo magnético. Vamos usar o Sensor de Efeito Hall A3144, que é do tipo comutação.

Sensores de Efeito Hall vs Relés Reed

Além do Sensor de Efeito Hall, outro tipo comum de interruptor magnético é o Relé Reed. Vamos discutir rapidamente as diferenças entre eles.

Sensores de Efeito Hall oferecem vantagens como deteção sem contacto, tecnologia de estado sólido, tempo de resposta rápido, ampla faixa de temperatura de operação e saída digital. No entanto, têm alcance de deteção limitado, custo mais elevado e são sensíveis a campos magnéticos parasitas.

Relés Reed, por outro lado, têm um amplo alcance de deteção, custo mais baixo e são insensíveis a campos magnéticos parasitas. Contudo, sofrem desgaste mecânico, têm tempo de resposta mais lento e faixa de temperatura de operação limitada. Para mais informações detalhadas, consulta o nosso tutorial sobre Interfacing Magnetic Switch To The Arduino .

Na próxima secção, vamos analisar o sensor de Efeito Hall A3144 e as suas características.

Apresentando o Sensor de Efeito Hall A3144

O Sensor de Efeito Hall A3144 é um sensor magnético fantástico, muito pequeno e com eletrónica integrada.

Pode operar com tensões não reguladas de 4,5 até 24 Volts graças a um regulador de tensão incorporado. Além disso, tem proteção contra inversão de polaridade, o que significa que se o ligares mal, ele sobrevive. O consumo de energia é mínimo, com 3,5mA (a 5V), tornando-o adequado para aplicações alimentadas por bateria.

A imagem abaixo mostra o pinout. Se olhares para o sensor de frente, onde podes ler a etiqueta, o pino positivo (+) fica à esquerda. O terra (-) está no meio e a saída de sinal (s) é o pino da direita.

Pinout of the A3144 Hall Effect Sensor
Pinout do Sensor A3144

Note que o A3144 é unipolar. Portanto, reage apenas a um polo do íman, mas não ao outro. Lembra-te disso ao testá-lo!

O sensor tem uma saída de coletor aberto, o que significa que pode ser ligado diretamente a microcontroladores e pode conduzir até 25mA. Vamos aproveitar isso e ligar diretamente um LED para testar a sua função.

Finalmente, o sensor A3144 tem alta sensibilidade (2,5mV/Gauss), alta frequência de operação de 2kHz e ampla faixa de temperatura de operação de -40°C a +150°C. Em resumo, é um ótimo sensor para quase qualquer aplicação que exija comutação frequente, sem contacto e rápida.

Testando o Sensor de Efeito Hall A3144

Como mencionado nas peças necessárias, podes comprar o sensor como módulo ou o sensor simples. O módulo tem um LED integrado e um resistor pullup (R1), sendo muito fácil de testar. Basta ligar 5V (até 24V) ao módulo e aproximar o íman do sensor. O LED deve acender. Mas lembra-te que o sensor é unipolar. Experimenta ambos os polos do íman. Um lado funciona, o outro não.

Testing the A3144 Module
Testando o Módulo A3144

Se quiseres testar o sensor simples, terás de ligar um LED e um resistor pullup por ti próprio. O esquema abaixo mostra como fazer isso.

esting the A3144 Hall Effect Sensor
Testando o Sensor de Efeito Hall A3144

Note que a lógica está invertida. O LED brilhará muito fracamente (devido ao resistor de 10 KΩ) e apagará quando o íman se aproximar do sensor. Lembra-te deste comportamento para mais tarde. Em resumo, a saída do A3144 fica baixa quando um campo magnético é detetado e alta caso contrário.

A propósito: Se quiseres testar isto numa breadboard usando a alimentação do Arduino; aqui está a ligação. Não te esqueças do resistor pullup de 10 KΩ.

Testing the A3144 on a breadboard
Testando o A3144 numa breadboard

Na próxima secção, mostro-te como ligar corretamente o Sensor A3144 ao Arduino.

Ligando o Sensor de Efeito Hall A3144

A maior parte das ligações necessárias já viste acima. A única diferença será que vamos ligar a saída do Sensor A3144 ao Pino 2 do Arduino.

Connecting the A3144 Sensor to the Arduino
Ligando o Sensor A3144 ao Arduino

Para resumir, ligamos a alimentação do Arduino à breadboard e daí ao Sensor A3144. Depois adicionamos o resistor pullup de 10 KΩ e ligamos a saída do A3144 ao Pino 2 do Arduino. Se tiveres algum problema, abaixo está a tabela completa de ligações.

De Pino Cor do fio Para Pino
Arduino 5V Vermelho Breadboard Trilho positivo
Arduino GND Azul Breadboard Trilho negativo
A3144 GND Azul Breadboard Trilho negativo
A3144 VCC Vermelho Breadboard Trilho positivo
A3144 Out/Sinal Amarelo Arduino 2
A3144 Out/Sinal Resistor 1
Resistor 2 Vermelho Breadboard Trilho positivo

Na próxima secção, vou mostrar-te como usar o A3144 como um simples interruptor magnético.

Exemplo 1: Um Interruptor Magnético

Dá uma vista rápida ao código muito simples abaixo. A cada 10ms lemos o valor do sensor e se o seu valor for LOW ligamos o LED incorporado do Arduino. Se aproximares um íman do sensor, o LED deve acender.

const int hallPin = 2;
const int ledPin = 13;  // built-in

void setup() {
  pinMode(hallPin, INPUT);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  int val = digitalRead(hallPin);
  digitalWrite(ledPin, val ? LOW : HIGH);
  delay(10);
}

Aqui está uma explicação detalhada do código.

Constantes e Variáveis

O código começa por definir duas constantes: hallPin e ledPin . A constante hallPin especifica o pino ao qual o sensor de Efeito Hall está ligado, e a constante ledPin o pino do LED incorporado na placa Arduino.

const int hallPin = 2;
const int ledPin = 13;  // built-in

Função setup

Na função setup() , definimos o modo de hallPin para INPUT e o modo de ledPin para OUTPUT . Isto é feito usando a função pinMode() .

void setup() {
  pinMode(hallPin, INPUT);
  pinMode(ledPin, OUTPUT);
}

Função loop

Dentro da função loop() , primeiro lemos o valor do hallPin usando a função digitalRead() . O valor lido do pino será LOW quando um campo magnético for detetado e HIGH caso contrário. Atenção a esta lógica invertida.

int val = digitalRead(hallPin);

De seguida, usamos a função digitalWrite() para controlar o estado do ledPin com base no valor lido do sensor de Efeito Hall. Se o valor for HIGH , significa que não há campo magnético detetado e definimos o ledPin para LOW , desligando o LED. Caso contrário, definimos o ledPin para HIGH , que liga o LED.

digitalWrite(ledPin, val ? LOW : HIGH);

Finalmente, introduzimos um pequeno atraso de 10 milissegundos usando a função delay() . Este atraso permite leituras estáveis e evita flutuações rápidas no estado do LED.

delay(10);

E é tudo. Agora tens um interruptor magnético simples que deteta campos magnéticos de forma fiável e rápida.

Podes usar o código acima para construir um interruptor de início ou fim para um motor DC ou motor de passo. Por exemplo, queres rodar um motor até uma certa posição — por exemplo, uma posição inicial definida de um motor de passo que move um relógio após uma falha de energia. Ou a posição final de um motor de passo para uma impressora 3D.

Para isso, simplesmente fixas um íman no motor para marcar a posição desejada e colocas o sensor de Efeito Hall perto. Se o sensor detetar o íman, para o motor. Para implementar isto, terás de comutar um relé em vez de um LED, pois motores geralmente não podem ser controlados diretamente a partir de uma saída do Arduino. Consulta o nosso tutorial sobre How To Use A Relay With Arduino , se quiseres fazer isso.

Na próxima secção, usamos o mesmo princípio para medir a velocidade de rotação de um motor.

Exemplo 2: Um Tacómetro Simples

No primeiro exemplo, escrevemos o código para detetar quando o íman está perto do sensor. Se contarmos quantas vezes isso acontece num determinado intervalo de tempo, podemos medir a velocidade de um objeto em rotação. Construímos este tacómetro fixando o íman em algum lugar do objeto em rotação e sempre que ele passa pelo sensor de Efeito Hall, contamos como uma rotação.

const int hallPin = 2;
const int maxCnt = 100;

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

void loop() {
  unsigned long start = micros();
  int old = 1;
  int cnt = 0;
  while (cnt < maxCnt) {
    int val = digitalRead(hallPin);
    if (!val && val != old) cnt++;
    old = val;
  }
  float seconds = (micros() - start) / 1000000.0;
  float rpm = cnt / seconds * 60.0;
  Serial.print("rpm: ");
  Serial.println(rpm);
}

Isto é o que o código acima faz. Vamos analisar mais de perto e entender como funciona em detalhe.

Constantes e Variáveis

O código começa por definir duas constantes: hallPin e maxCnt . A constante hallPin especifica o pino ao qual o sensor de Efeito Hall está ligado, e a constante maxCnt define o valor máximo de contagem. Vamos contar até ao máximo e depois medir o tempo decorrido para calcular a velocidade.

const int hallPin = 2;
const int maxCnt = 100;

Função setup

Na função setup() , inicializamos a comunicação serial com uma taxa de 9600 baud usando Serial.begin(9600) . Também definimos o hallPin como pino de entrada usando pinMode(hallPin, INPUT) .

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

Função loop

A função loop() é onde a funcionalidade principal do tacómetro é implementada. Começamos por obter o tempo atual usando micros() e armazená-lo na variável start . Também inicializamos a variável de leitura do sensor old a 1 e a variável cnt a 0.

void loop() {
  unsigned long start = micros();
  int old = 1;
  int cnt = 0;

Dentro do ciclo while, o código lê o valor do hallPin usando digitalRead(hallPin) e armazena-o na variável val . Se o valor for 0 (campo magnético detetado) e diferente do valor anterior ( val != old ), incrementa a variável cnt .

  while (cnt < maxCnt) {
    int val = digitalRead(hallPin);
    if (!val && val != old) cnt++;
    old = val;
  }

Isto é importante. Não podemos simplesmente contar cada vez que detetamos um 0 (ímã detetado) porque contaríamos várias vezes enquanto o íman está perto. Devemos contar apenas quando há uma mudança de estado. Ou de 1 para 0 (borda descendente) ou de 0 para 1 (borda ascendente). Vê a imagem abaixo que mostra a saída do Serial Plotter com duas deteções do íman com durações diferentes.

Falling and raising flanks in detection signal
Bordas descendentes e ascendentes no sinal de deteção

No código acima, contamos apenas quando o sensor transita de 0 ( !val ) para 1 ( val !=old ). Em resumo, detetamos a borda ascendente do sinal.

Após o ciclo while, calculamos o tempo decorrido em segundos subtraindo o tempo start do tempo atual usando micros() e dividindo por 1000000.0. A partir disso, calculamos as RPM (rotações por minuto) dividindo cnt pelo tempo decorrido em segundos e multiplicando por 60 (um minuto).

  float seconds = (micros() - start) / 1000000.0;
  float rpm = cnt / seconds * 60.0;

Finalmente, o código imprime o valor calculado das RPM no monitor serial usando Serial.print() e Serial.println() .

  Serial.print("rpm: ");
  Serial.println(rpm);
}

Para testar o código, fixa um íman na orientação correta num objeto em rotação, por exemplo, um ventilador. Depois aproxima o sensor o suficiente e garante que o íman passa pelo sensor a cada rotação. Se agora executares o código, deverás conseguir medir as RPM do ventilador.

Measuring the speed of a fan using the A3144 sensor
Medindo a velocidade de um ventilador usando o sensor A3144

O código acima deve funcionar bem. Mas para objetos a rodar mais rápido e medições mais precisas, podemos fazer ainda melhor usando interrupções. Como isso funciona, vou mostrar na próxima secção.

Exemplo 3: Um Tacómetro mais Rápido usando Interrupções

O exemplo de código acima usa um ciclo para verificar o estado do sensor de Efeito Hall e, se detetarmos uma mudança de estado de 0 para 1, contamos isso como uma rotação. No entanto, a velocidade do Arduino é limitada. Se o objeto rodar mais rápido do que conseguimos verificar, vamos perder mudanças de estado e subcontar.

As interrupções oferecem uma solução para este problema. Em vez de verificar continuamente e procurar mudanças de estado, ligamos uma interrupção ao pino do sensor e sempre que o estado muda, é chamada uma rotina de serviço de interrupção (ISR). Isto é muito mais rápido e o código é ainda mais simples. Vê:

const int hallPin = 2;
const int maxCnt = 100;

volatile int cnt = 0;

void count() {
  cnt++;
}

void setup() {
  Serial.begin(9600);
  pinMode(hallPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(hallPin), count, FALLING);
}

void loop() {
  unsigned long start = micros();
  while (cnt < maxCnt) ;
  float seconds = (micros() - start) / 1000000.0;
  float rpm = cnt / seconds * 60.0;
  Serial.print("rpm: ");
  Serial.println(rpm);
  cnt = 0;
}

Vamos aprofundar e entender como isto funciona em detalhe.

Constantes e Variáveis

O código começa por definir as constantes e variáveis.

const int hallPin = 2;
const int maxCnt = 100;

volatile int cnt = 0;

Como antes, a constante hallPin especifica o pino ao qual o sensor de Efeito Hall está ligado e a constante maxCnt define a contagem máxima. A variável cnt é usada para contar o número de rotações. Note que é declarada como ” volatile “. Isso é necessário porque vamos usá-la dentro de uma rotina de serviço de interrupção. Mais sobre isto na próxima secção.

Função de Contagem

A função count() é a rotina de serviço de interrupção ( ISR ) que é chamada sempre que o sensor de Efeito Hall deteta uma borda descendente no hallPin. As ISRs devem ser o mais curtas possível. No nosso caso, a função apenas incrementa a variável cnt em um, o que é ótimo para uma ISR.

void count() {
  cnt++;
}

Função Setup

Na função setup() , inicializamos a comunicação serial e definimos o hallPin como entrada. O mais importante é que ligamos interrupt ao hallPin que dispara a função count() numa borda descendente.

Note que nem todos os pinos podem ser usados para interrupções! Depende do microcontrolador. No caso do Arduino Uno, apenas os pinos 2 e 3 podem ser usados para interrupções.

void setup() {
  Serial.begin(9600);
  pinMode(hallPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(hallPin), count, FALLING);
}

Função Loop

Na função loop() , obtemos o tempo atual usando a função micros() . Depois, entramos num ciclo while que simplesmente espera até que a variável cnt atinja o valor maxCnt . Isto garante que contamos rotações suficientes para calcular a velocidade com precisão. Note que o contador é incrementado fora do ciclo, dentro da rotina de serviço de interrupção count() . Em resumo, o Arduino espera no ciclo while enquanto, em paralelo, reage às interrupções chamando a função count() .

Se tivermos recebido contagens suficientes, o ciclo while termina. Calculamos então as RPM como antes e, após reiniciar a variável cnt para zero, o ciclo principal começa novamente.

void loop() {
  unsigned long start = micros();
  while (cnt < maxCnt) ;
  float seconds = (micros() - start) / 1000000.0;
  float rpm = cnt / seconds * 60.0;
  Serial.print("rpm: ");
  Serial.println(rpm);
  cnt = 0;
}

Para medições mais precisas mas mais lentas da velocidade de rotação, aumenta o valor da constante maxCnt . Vais fazer uma média sobre mais rotações, o que dará leituras mais estáveis, mas demorará mais tempo. Um valor mais baixo de maxCnt dará leituras de RPM mais rápidas, mas com mais flutuações.
É isso! Com este código, podes construir um tacómetro usando um Arduino e um sensor de Efeito Hall para medir a velocidade de um objeto em rotação.

Conclusão

Neste tutorial, aprendemos a construir um tacómetro usando um sensor de Efeito Hall e um Arduino. Começámos por entender os fundamentos dos sensores de Efeito Hall e depois apresentámos o sensor A3144, que é comum em aplicações de medição de velocidade.

Depois testámos o sensor A3144 para garantir a sua funcionalidade e procedemos à sua ligação ao Arduino. Explorámos três exemplos diferentes para demonstrar a versatilidade do sensor.

No exemplo 1, usamos o sensor A3144 como um interruptor magnético, detetando a presença ou ausência de um campo magnético. Isto pode ser útil em várias aplicações, como sensores de porta/janela ou deteção de proximidade.

No exemplo 2, construímos um tacómetro simples usando o sensor A3144. Ao fixar o sensor a um objeto em rotação, conseguimos medir a sua velocidade em rotações por minuto (RPM). Isto é útil em aplicações como monitorizar a velocidade de um motor ou ventilador.

No exemplo 3, melhorámos o tacómetro simples utilizando interrupções. Ao configurar o Arduino para disparar uma interrupção sempre que o sensor A3144 deteta um íman, conseguimos medições de RPM mais precisas e fiáveis.

Seguindo este tutorial, deves agora ter uma boa compreensão de como usar o sensor de Efeito Hall A3144 com um Arduino para construir um tacómetro. Se tiveres dúvidas ou precisares de mais ajuda, consulta a secção de perguntas frequentes.

Boa bricolage!

Perguntas Frequentes

Aqui estão algumas perguntas comuns sobre construir um tacómetro usando um sensor de Efeito Hall com um Arduino:

P: O que é um tacómetro?

R: Um tacómetro é um dispositivo usado para medir a velocidade de um objeto em rotação. Fornece informação sobre a velocidade de rotação em rotações por minuto (RPM).

P: O que é um sensor de Efeito Hall?

R: Um sensor de Efeito Hall é um transdutor que deteta a presença de um campo magnético. Funciona com base no princípio do Efeito Hall, que afirma que quando um condutor com corrente a passar é colocado num campo magnético, é gerada uma tensão perpendicular tanto à corrente como ao campo magnético.

P: Quais são as vantagens dos sensores de Efeito Hall?

Sensores de Efeito Hall são geralmente imunes a ruído, luz ou temperatura. Como não têm partes mecânicas, reagem rapidamente e duram praticamente para sempre. Além disso, são muito pequenos e podem encaixar em espaços apertados.

P: Por que usar um sensor de Efeito Hall para um tacómetro?

R: Sensores de Efeito Hall são usados frequentemente em tacómetros porque podem medir com precisão a velocidade de objetos em rotação sem contacto físico. Isto torna-os ideais para aplicações onde é necessária medição de velocidade não intrusiva.

P: Por que o sensor de Efeito Hall não está a reagir?

R: Certifica-te de que tudo está corretamente ligado. O A3144 é um sensor de Efeito Hall unipolar e reage apenas a um polo do íman. Verifica se o teu íman é suficientemente forte.

P: Posso usar o A3144 para medir a intensidade de um campo magnético?

O A3144 é um sensor de Efeito Hall de comutação e não é adequado para isso. Precisarias de um sensor de Efeito Hall linear.

P: Posso usar o A3144 com um ESP32?

Não diretamente. O A3144 opera a 5V enquanto o ESP opera a 3,3V. Precisarias de um conversor de nível de tensão.