En este tutorial aprenderás a usar el sensor de efecto Hall A3144 y un Arduino para construir un tacómetro. Un tacómetro es un dispositivo para medir la velocidad de un objeto giratorio. Por ejemplo, es común en aplicaciones automotrices para monitorear las RPM (revoluciones por minuto) de un motor.
El sensor de efecto Hall detecta la presencia de un campo magnético. Al colocar un pequeño imán en un objeto giratorio, podemos usarlo para contar revoluciones. Con un Arduino podemos medir el tiempo que tarda un número dado de revoluciones y calcular las RPM.
En las siguientes secciones, listaré las piezas necesarias para este proyecto, explicaré los conceptos básicos de los sensores de efecto Hall e introduciré el sensor A3144, que usaremos para nuestro tacómetro. También proporcionaré ejemplos de diferentes implementaciones de tacómetros usando el sensor A3144, incluyendo uno simple y otro más avanzado usando interrupciones.
¡Así que empecemos!
Piezas necesarias
A continuación encontrarás las piezas necesarias para este proyecto. Si solo quieres explorar y aprender sobre sensores de efecto Hall, compra el módulo sensor. Será un poco más fácil de usar pero es demasiado grande para aplicaciones prácticas. Para esas, compra el sensor de efecto Hall solo, que es mucho más pequeño y también más barato.

Arduino Uno

Cable USB para Arduino UNO

Juego de cables Dupont

Kit de resistencias y LED

Módulo sensor de efecto Hall A3144

Sensor de efecto Hall A3144

Imanes
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.
Conceptos básicos de los sensores de efecto Hall
Los sensores de efecto Hall son dispositivos electrónicos que pueden detectar la presencia de un campo magnético. Funcionan basándose en el efecto Hall, que es la creación de una diferencia de voltaje a través de un conductor cuando se coloca en un campo magnético mientras circula corriente por él.
¿Cómo funcionan?
Los sensores de efecto Hall constan de tres componentes principales: una fuente de voltaje, un conductor por el que circula corriente y un campo magnético. Cuando se aplica un campo magnético perpendicular al flujo de corriente en el conductor, se crea una fuerza de Lorentz que empuja los electrones hacia un lado del conductor. Esto genera una diferencia de voltaje que puede medirse.

Aplicaciones típicas
Las aplicaciones típicas para sensores de efecto Hall son:
- Detección de proximidad : Los sensores de efecto Hall pueden detectar la presencia o ausencia de un campo magnético, haciéndolos adecuados para aplicaciones de detección de proximidad.
- Medición de velocidad : Al colocar un imán en un objeto giratorio y usar un sensor de efecto Hall para detectar los cambios en el campo magnético, se puede medir la velocidad del objeto.
- Detección de corriente : Los sensores de efecto Hall pueden medir la corriente que fluye por un conductor detectando el campo magnético generado por dicha corriente.
- Detección de posición : Colocando imanes en posiciones específicas y usando sensores de efecto Hall, se puede determinar la posición de un objeto.
Latching vs no latching
Los sensores de efecto Hall pueden ser categorizados como latching o no latching. Los sensores latching tienen un campo magnético incorporado que los mantiene en estado encendido o apagado hasta que se aplica otro campo magnético de polaridad opuesta. Los sensores no latching, en cambio, solo detectan la presencia de un campo magnético y no retienen su estado. Usaremos un sensor no latching.
Bipolar vs unipolar
Los sensores de efecto Hall también pueden clasificarse como bipolares o unipolares. Los sensores bipolares detectan campos magnéticos positivos y negativos, mientras que los unipolares solo responden a una polaridad. El sensor A3144 es un sensor unipolar y reaccionará solo a un polo del imán.
Conmutación vs lineal
Los sensores de efecto Hall pueden operar en modo conmutación o lineal. Los sensores de conmutación proporcionan una salida digital, alternando entre estados encendido y apagado según la presencia o ausencia de un campo magnético. Los sensores lineales, en cambio, ofrecen una salida analógica que varía linealmente con la intensidad del campo magnético. Usaremos el sensor A3144, que es del tipo conmutación.
Sensores de efecto Hall vs relés Reed
Además del sensor de efecto Hall, otro tipo común de interruptor magnético es el relé Reed. Veamos rápidamente las diferencias entre ellos.
Los sensores de efecto Hall ofrecen ventajas como detección sin contacto, tecnología de estado sólido, tiempo de respuesta rápido, amplio rango de temperatura de operación y salida digital. Sin embargo, tienen un rango de detección limitado, mayor costo y son sensibles a campos magnéticos parásitos.
Los relés Reed, por otro lado, tienen un amplio rango de detección, menor costo y son insensibles a campos magnéticos parásitos. Sin embargo, sufren desgaste mecánico, tiempo de respuesta más lento y rango de temperatura de operación limitado. Para más información detallada, consulta nuestro tutorial sobre Interfacing Magnetic Switch To The Arduino .
En la siguiente sección, veremos el sensor de efecto Hall A3144 y sus características.
Presentando el sensor de efecto Hall A3144
El sensor de efecto Hall A3144 es un sensor magnético fantástico, muy pequeño y con electrónica integrada.
Puede operar con voltajes no regulados desde 4.5 hasta 24 voltios gracias a un regulador de voltaje incorporado. Además, tiene protección contra polaridad inversa, lo que significa que si lo conectas mal, no se dañará. El consumo de energía es mínimo, con 3.5mA (a 5V), lo que lo hace adecuado para aplicaciones con batería.
La imagen a continuación muestra el pinout. Si miras el sensor desde el frente donde se puede leer la etiqueta, el pin positivo (+) estará a la izquierda. Tierra (-) está en el medio y la salida de señal (s) es el pin derecho.

Ten en cuenta que el A3144 es unipolar. Por lo tanto, reaccionará solo a un polo del imán y no al otro. Recuerda esto al probarlo.
El sensor tiene una salida de colector abierto, lo que significa que puede conectarse directamente a microcontroladores y puede manejar hasta 25mA. Aprovecharemos esto para conectar directamente un LED y probar su funcionamiento.
Finalmente, el sensor A3144 tiene una alta sensibilidad (2.5mV/Gauss), una alta frecuencia de operación de 2kHz y un amplio rango de temperatura de operación de -40°C a +150°C. En resumen, es un gran sensor para casi cualquier aplicación que requiera conmutación frecuente, sin contacto y rápida.
Probando el sensor de efecto Hall A3144
Como se mencionó en las piezas necesarias, puedes comprar el sensor como módulo o solo el sensor. El módulo tiene un LED integrado y una resistencia pullup (R1), por lo que es muy fácil de probar. Solo conecta 5V (hasta 24V) al módulo y acerca el imán al sensor. El LED debería encenderse. Pero recuerda que el sensor es unipolar. Prueba ambos polos del imán. Un lado funcionará y el otro no.

Si quieres probar el sensor solo, necesitarás conectar un LED y una resistencia pullup tú mismo. El esquema a continuación muestra cómo hacerlo.

Ten en cuenta que la lógica está invertida. El LED brillará muy débilmente (debido a la resistencia de 10 KΩ) y se apagará cuando el imán se acerque al sensor. Recuerda este comportamiento para más adelante. En resumen, la salida del A3144 será baja cuando se detecte un campo magnético y alta en caso contrario.
Por cierto: si quieres probar esto en una protoboard usando la alimentación del Arduino, aquí está el cableado. No olvides la resistencia pullup de 10 KΩ.

En la siguiente sección, te mostraré cómo conectar correctamente el sensor A3144 al Arduino.
Conectando el sensor de efecto Hall A3144
La mayoría del cableado necesario ya lo has visto arriba. La única diferencia será que conectaremos la salida del sensor A3144 al pin 2 del Arduino.

Para resumir, conectamos la alimentación del Arduino a la protoboard y de ahí al sensor A3144. Luego añadimos la resistencia pullup de 10 KΩ y conectamos la salida del A3144 al pin 2 del Arduino. Si tienes problemas, abajo está la tabla completa de conexiones.
| Desde | Pin | Color del cable | Hacia | Pin |
| Arduino | 5V | Rojo | Protoboard | Riel positivo |
| Arduino | GND | Azul | Protoboard | Riel negativo |
| A3144 | GND | Azul | Protoboard | Riel negativo |
| A3144 | VCC | Rojo | Protoboard | Riel positivo |
| A3144 | Salida/Señal | Amarillo | Arduino | 2 |
| A3144 | Salida/Señal | – | Resistencia | 1 |
| Resistencia | 2 | Rojo | Protoboard | Riel positivo |
En la siguiente sección te mostraré cómo usar el A3144 como un interruptor magnético simple.
Ejemplo 1: Un interruptor magnético
Echa un vistazo rápido al código muy simple a continuación. Cada 10 ms leemos el valor del sensor y si su valor es LOW encendemos el LED incorporado del Arduino. Si acercas un imán al sensor, el LED debería encenderse.
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);
}
Aquí una explicación detallada del código.
Constantes y variables
El código comienza definiendo dos constantes: hallPin y ledPin . La constante hallPin especifica el pin al que está conectado el sensor de efecto Hall, y la constante ledPin el pin del LED incorporado en la placa Arduino.
const int hallPin = 2; const int ledPin = 13; // built-in
Función setup
En la función setup() , configuramos el modo de hallPin como INPUT y el modo de ledPin como OUTPUT . Esto se hace usando la función pinMode() .
void setup() {
pinMode(hallPin, INPUT);
pinMode(ledPin, OUTPUT);
}
Función loop
Dentro de la función loop() , primero leemos el valor de hallPin usando la función digitalRead() . El valor leído del pin será LOW cuando se detecte un campo magnético y HIGH en caso contrario. Ten en cuenta esta lógica invertida.
int val = digitalRead(hallPin);
Luego, usamos la función digitalWrite() para controlar el estado del ledPin basado en el valor leído del sensor de efecto Hall. Si el valor es HIGH , significa que no se detecta campo magnético y configuramos el ledPin a LOW , apagando el LED. De lo contrario, configuramos el ledPin a HIGH , lo que enciende el LED.
digitalWrite(ledPin, val ? LOW : HIGH);
Finalmente, introducimos un pequeño retardo de 10 milisegundos usando la función delay() . Este retardo permite lecturas estables y evita fluctuaciones rápidas en el estado del LED.
delay(10);
Y eso es todo. Ahora tienes un interruptor magnético simple que detecta campos magnéticos de forma rápida y fiable.
Podrías usar el código anterior para construir un interruptor de inicio o fin para un motor DC o paso a paso. Por ejemplo, quieres girar un motor a una posición determinada, como una posición inicial definida de un motor paso a paso que mueve un reloj tras un corte de energía, o la posición final de un motor paso a paso para una impresora 3D.
Para esto simplemente colocas un imán en el motor para marcar la posición deseada y colocas el sensor Hall cerca. Si el sensor detecta el imán, detiene el motor. Para implementarlo realmente necesitarías conmutar un relé en lugar de un LED, ya que los motores generalmente no pueden controlarse directamente desde una salida Arduino. Consulta nuestro tutorial sobre How To Use A Relay With Arduino si quieres hacer esto.
En la siguiente sección, usaremos el mismo principio para medir la velocidad de rotación de un motor.
Ejemplo 2: Un tacómetro simple
En el primer ejemplo escribimos el código para detectar cuando el imán está cerca del sensor. Si contamos cuántas veces sucede eso en un periodo de tiempo, podemos medir la velocidad de un objeto giratorio. Construimos este tacómetro colocando el imán en algún lugar del objeto giratorio y cada vez que pasa por el sensor de efecto Hall lo contamos como una rotación.
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);
}
Esto es lo que hace el código anterior. Veamos más de cerca y entendamos cómo funciona en detalle.
Constantes y variables
El código comienza definiendo dos constantes: hallPin y maxCnt . La constante hallPin especifica el pin al que está conectado el sensor de efecto Hall, y la constante maxCnt establece el valor máximo de conteo. Contaremos hasta ese máximo y luego mediremos el tiempo transcurrido para calcular la velocidad.
const int hallPin = 2; const int maxCnt = 100;
Función setup
En la función setup() , inicializamos la comunicación serial con una velocidad de 9600 baudios usando Serial.begin(9600) . También configuramos el pin hallPin como entrada usando pinMode(hallPin, INPUT) .
void setup() {
Serial.begin(9600);
pinMode(hallPin, INPUT);
}
Función loop
La función loop() es donde se implementa la funcionalidad principal del tacómetro. Comenzamos obteniendo el tiempo actual con micros() y almacenándolo en la variable start . También inicializamos la variable de lectura del sensor old en 1 y la variable de conteo cnt en 0.
void loop() {
unsigned long start = micros();
int old = 1;
int cnt = 0;
Dentro del bucle while, el código lee el valor de hallPin usando digitalRead(hallPin) y lo almacena en la variable val . Si el valor es 0 (campo magnético detectado) y diferente del valor anterior ( val != old ), incrementa la variable cnt .
while (cnt < maxCnt) {
int val = digitalRead(hallPin);
if (!val && val != old) cnt++;
old = val;
}
Esto es importante. No podemos contar cada vez que detectamos un 0 (imán detectado) porque contaríamos varias veces mientras el imán está cerca. Solo debemos contar cuando hay un cambio de estado. Ya sea de 1 a 0 (flanco descendente) o de 0 a 1 (flanco ascendente). Mira la imagen abajo que muestra la salida del Serial Plotter con dos detecciones del imán con duraciones diferentes.

En el código anterior solo contamos cuando el sensor pasa de 0 ( !val ) a 1 ( val !=old ). En resumen, detectamos el flanco ascendente de la señal.
Después del bucle while, calculamos el tiempo transcurrido en segundos restando el tiempo start del tiempo actual usando micros() y dividiéndolo por 1000000.0. A partir de eso calculamos las RPM (revoluciones por minuto) dividiendo cnt por el tiempo transcurrido en segundos y multiplicando por 60 (un minuto).
float seconds = (micros() - start) / 1000000.0; float rpm = cnt / seconds * 60.0;
Finalmente, el código imprime el valor calculado de RPM en el monitor serial usando Serial.print() y Serial.println() .
Serial.print("rpm: ");
Serial.println(rpm);
}
Para probar el código, coloca un imán en la orientación correcta en un objeto giratorio, por ejemplo un ventilador. Luego acerca el sensor lo suficiente y asegúrate de que el imán pase por el sensor en cada rotación. Si ahora ejecutas el código, deberías poder medir las RPM del ventilador.

El código anterior funcionará bien. Pero para objetos que giran más rápido y mediciones más precisas podemos hacerlo mejor usando interrupciones. Cómo funciona eso te lo mostraré en la siguiente sección.
Ejemplo 3: Un tacómetro más rápido usando interrupciones
El ejemplo de código anterior usa un bucle para consultar el estado del sensor de efecto Hall y si detectamos un cambio de estado de 0 a 1 lo contamos como una rotación. Sin embargo, la velocidad del Arduino es limitada. Si el objeto gira más rápido de lo que podemos consultar, perderemos cambios de estado y contaremos menos.
Las interrupciones ofrecen una solución a este problema. En lugar de consultar y buscar cambios de estado, conectamos una interrupción al pin del sensor y cada vez que cambia el estado se llama a una ISR (rutina de servicio de interrupción). Esto es mucho más rápido y el código es incluso más simple. Mira:
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 a profundizar y entender cómo funciona esto en detalle.
Constantes y variables
El código comienza definiendo las constantes y variables.
const int hallPin = 2; const int maxCnt = 100; volatile int cnt = 0;
Como antes, la constante hallPin especifica el pin al que está conectado el sensor de efecto Hall y la constante maxCnt establece el conteo máximo. La variable cnt se usa para llevar la cuenta de las rotaciones. Nota que está declarada como » volatile «. Esto es necesario porque la usaremos dentro de una rutina de servicio de interrupción. Más sobre esto en la siguiente sección.
Función de conteo
La función count() es la rutina de servicio de interrupción ( ISR ) que se llama cada vez que el sensor de efecto Hall detecta un flanco descendente en hallPin. Las ISR deben ser lo más cortas posible. En nuestro caso, la función solo incrementa la variable cnt en uno, lo cual es ideal para una ISR.
void count() {
cnt++;
}
Función setup
En la función setup() , inicializamos la comunicación serial y configuramos hallPin como entrada. Lo más importante es que adjuntamos interrupt al hallPin que dispara la función count() en un flanco descendente.
Ten en cuenta que no todos los pines pueden usarse para interrupciones. Dependerá del microcontrolador. En el caso del Arduino Uno, solo los pines 2 y 3 pueden usarse para interrupciones.
void setup() {
Serial.begin(9600);
pinMode(hallPin, INPUT);
attachInterrupt(digitalPinToInterrupt(hallPin), count, FALLING);
}
Función loop
En la función loop() obtenemos el tiempo actual usando la función micros() . Luego entramos en un bucle while que simplemente espera hasta que la variable cnt alcance el valor maxCnt . Esto asegura que hayamos contado suficientes rotaciones para calcular la velocidad con precisión. Nota que el contador se incrementa fuera del bucle dentro de la rutina de servicio de interrupción count() . En resumen, el Arduino espera en el bucle while mientras en paralelo responde a interrupciones llamando a la función count() .
Si hemos recibido suficientes conteos, el bucle while termina. Calculamos las RPM como antes y después de reiniciar la variable cnt a cero, el bucle principal comienza de nuevo.
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 mediciones más precisas pero más lentas de la velocidad de rotación, aumenta el valor de la constante maxCnt . Promediarás sobre más rotaciones, lo que dará lecturas más estables pero tomará más tiempo. Un valor menor de maxCnt te dará lecturas de RPM más rápidas pero con más fluctuaciones.
¡Eso es todo! Con este código puedes construir un tacómetro usando un Arduino y un sensor de efecto Hall para medir la velocidad de un objeto giratorio.
Conclusión
En este tutorial, hemos aprendido a construir un tacómetro usando un sensor de efecto Hall y un Arduino. Comenzamos entendiendo los conceptos básicos de los sensores de efecto Hall y luego presentamos el sensor A3144, que se usa comúnmente en aplicaciones de medición de velocidad.
Luego probamos el sensor A3144 para asegurar su funcionamiento y procedimos a conectarlo al Arduino. Exploramos tres ejemplos diferentes para demostrar la versatilidad del sensor.
En el ejemplo 1, usamos el sensor A3144 como un interruptor magnético, detectando la presencia o ausencia de un campo magnético. Esto puede ser útil en varias aplicaciones como sensores de puertas/ventanas o detección de proximidad.
En el ejemplo 2, construimos un tacómetro simple usando el sensor A3144. Al colocar el sensor en un objeto giratorio, pudimos medir su velocidad en revoluciones por minuto (RPM). Esto es útil en aplicaciones como monitorear la velocidad de un motor o un ventilador.
En el ejemplo 3, mejoramos el tacómetro simple utilizando interrupciones. Al configurar el Arduino para que dispare una interrupción cada vez que el sensor A3144 detecta un imán, logramos mediciones de RPM más precisas y fiables.
Siguiendo este tutorial, ahora deberías tener un buen entendimiento de cómo usar el sensor de efecto Hall A3144 con un Arduino para construir un tacómetro. Si tienes preguntas o necesitas más ayuda, no dudes en consultar la sección de preguntas frecuentes.
¡Feliz bricolaje!
Preguntas frecuentes
Aquí tienes algunas preguntas comunes sobre cómo construir un tacómetro usando un sensor de efecto Hall con un Arduino:
P: ¿Qué es un tacómetro?
R: Un tacómetro es un dispositivo usado para medir la velocidad de un objeto giratorio. Proporciona información sobre la velocidad de rotación en revoluciones por minuto (RPM).
P: ¿Qué es un sensor de efecto Hall?
R: Un sensor de efecto Hall es un transductor que detecta la presencia de un campo magnético. Funciona bajo el principio del efecto Hall, que establece que cuando un conductor con corriente que lo atraviesa se coloca en un campo magnético, se genera un voltaje perpendicular tanto a la corriente como al campo magnético.
P: ¿Cuáles son las ventajas de los sensores de efecto Hall?
Los sensores de efecto Hall son generalmente inmunes al ruido, la luz o la temperatura. Al no tener partes mecánicas, reaccionan rápido y duran prácticamente para siempre. Además, son muy pequeños y por tanto pueden caber en espacios reducidos.
P: ¿Por qué usar un sensor de efecto Hall para un tacómetro?
R: Los sensores de efecto Hall se usan comúnmente en tacómetros porque pueden medir con precisión la velocidad de objetos giratorios sin contacto físico. Esto los hace ideales para aplicaciones donde se requiere medición de velocidad no intrusiva.
P: ¿Por qué el sensor de efecto Hall no reacciona?
R: Asegúrate de que todo esté correctamente cableado. El A3144 es un sensor de efecto Hall unipolar y reaccionará solo a un polo del imán. Verifica que tu imán sea lo suficientemente fuerte.
P: ¿Puedo usar el A3144 para medir la intensidad de un campo magnético?
El A3144 es un sensor de efecto Hall de conmutación y no es adecuado para eso. Necesitarías un sensor de efecto Hall lineal.
P: ¿Puedo usar el A3144 con un ESP32?
No directamente. El A3144 opera a 5V mientras que el ESP32 opera a 3.3V. Necesitarías un convertidor de nivel de voltaje.



