Saltar al contenido principal

Integración con Arduino

Esta página proporciona ejemplos listos para usar en Arduino para integrar los sensores FG-3+ y FG-3C con placas compatibles con Arduino (Arduino Uno, Arduino Mega, ESP32, etc.).


FG-3+ — Medición de frecuencia / período

El FG-3+ emite un pulso rectangular de 5 V cuyo período es proporcional al campo magnético. El ejemplo a continuación mide el período del pulso usando pulseIn(), que es adecuado para aplicaciones de baja tasa de actualización. Para mayor precisión y muestreo más rápido, use la captura de entrada del temporizador de hardware.

Adaptación de nivel

La salida del FG-3+ es lógica de 5 V. Conéctela a un MCU de 3,3 V (como el ESP32) solo a través de un divisor de voltaje o adaptador de nivel. No conecte una señal de 5 V directamente a un pin GPIO de 3,3 V.

// Ejemplo de medición de frecuencia del FG-3+
// Lee el período de pulso de un sensor FG-3+ y lo imprime en Serial.
//
// Cableado:
// FG-3+ VCC -> 5V
// FG-3+ GND -> GND
// FG-3+ OUT -> Pin 2 (a través de adaptador de nivel para placas de 3.3V)
//
// Nota: pulseIn() bloquea durante la medición. Use temporizadores de hardware
// para aplicaciones críticas en tiempo.

const int SENSOR_PIN = 2; // Pin de entrada digital conectado a FG-3+ OUT

void setup() {
Serial.begin(115200);
pinMode(SENSOR_PIN, INPUT);
Serial.println("FG-3+ Period Measurement");
Serial.println("Period_us");
}

void loop() {
// Mide el período de un pulso completo (duración HIGH + LOW)
// pulseIn devuelve la duración en microsegundos; 0 si se agota el tiempo
unsigned long highTime = pulseIn(SENSOR_PIN, HIGH, 100000UL); // Tiempo de espera 100 ms
unsigned long lowTime = pulseIn(SENSOR_PIN, LOW, 100000UL);

if (highTime == 0 || lowTime == 0) {
Serial.println("Timeout - no signal detected");
return;
}

unsigned long periodUs = highTime + lowTime;

// Imprime el período en microsegundos
// Para convertir al valor del campo (nT), aplique el factor de calibración de su sensor
Serial.println(periodUs);

delay(100); // Tasa de salida de 10 Hz
}
Calibración

La relación entre el período (µs) y el campo magnético (nT) depende de la unidad de sensor específica. Aplique los coeficientes de calibración del certificado de calibración de su sensor para convertir período a valor de campo.


FG-3+ — Mayor precisión con temporizador de hardware (ESP32)

Para mayor precisión en un ESP32, use la captura de entrada del temporizador de hardware:

// FG-3+ Medición de período de alta precisión usando ESP32 PCNT
// Usa el periférico Pulse Counter para conteo de frecuencia preciso.
//
// Cableado:
// FG-3+ OUT -> GPIO 4 (a través de adaptador de nivel)

#include "driver/pcnt.h"

#define PCNT_UNIT PCNT_UNIT_0
#define PCNT_INPUT GPIO_NUM_4
#define COUNT_TIME_MS 1000 // Cuenta pulsos durante 1 segundo

void setup() {
Serial.begin(115200);

// Configura PCNT para contar flancos de subida en el pin de entrada
pcnt_config_t pcnt_config = {
.pulse_gpio_num = PCNT_INPUT,
.ctrl_gpio_num = PCNT_PIN_NOT_USED,
.lctrl_mode = PCNT_MODE_KEEP,
.hctrl_mode = PCNT_MODE_KEEP,
.pos_mode = PCNT_COUNT_INC, // Cuenta flancos de subida
.neg_mode = PCNT_COUNT_DIS,
.counter_h_lim = 30000,
.counter_l_lim = 0,
.unit = PCNT_UNIT,
.channel = PCNT_CHANNEL_0,
};

pcnt_unit_config(&pcnt_config);
pcnt_counter_pause(PCNT_UNIT);
pcnt_counter_clear(PCNT_UNIT);
pcnt_counter_resume(PCNT_UNIT);

Serial.println("Frequency_Hz");
}

void loop() {
int16_t count = 0;
pcnt_counter_clear(PCNT_UNIT);
delay(COUNT_TIME_MS);
pcnt_get_counter_value(PCNT_UNIT, &count);

// count = pulsos por segundo = frecuencia en Hz
Serial.println(count);
}

FG-3C — Lectura UART

El FG-3C en modo UART transmite valores de campo ASCII a 115200 baudios en el Pin 4.

// Ejemplo de lectura UART del FG-3C
// Lee valores del campo magnético del sensor FG-3C a través de UART de hardware.
//
// Cableado (Arduino Mega o ESP32):
// FG-3C Pin 1 (VCC) -> 5V
// FG-3C Pin 2 (GND) -> GND
// FG-3C Pin 4 (TX) -> Serial1 RX (a través de adaptador de nivel para placas de 3.3V)
//
// En Arduino Uno (sin Serial1 de hardware): use SoftwareSerial en los pines 10, 11.
// En ESP32: use Serial2 o cualquier UART disponible.

// Para ESP32: Serial2 RX = GPIO16, TX = GPIO17
// Para Arduino Mega: Serial1 RX = Pin 19

void setup() {
Serial.begin(115200); // Serial USB — para imprimir en PC
Serial1.begin(115200); // UART de hardware — conectado al Pin 4 del FG-3C

Serial.println("FG-3C UART Reader");
Serial.println("Field_nT");
}

void loop() {
// Lee una línea del FG-3C (terminada con nueva línea)
if (Serial1.available()) {
String line = Serial1.readStringUntil('\n');
line.trim();

if (line.length() > 0) {
float fieldNT = line.toFloat();

// Imprime en el serial USB para monitoreo
Serial.println(fieldNT, 1); // 1 decimal
}
}
}
nota

En Arduino Uno (UART de hardware único), use la biblioteca SoftwareSerial en pines digitales libres en lugar de Serial1. SoftwareSerial está limitada a velocidades en baudios menores; para 115200 en Uno, use una placa con UART de hardware (Mega, ESP32, Leonardo).


Lectura de múltiples sensores FG-3+ (3 ejes o gradiometría)

Para un sistema de 3 ejes o gradiometría, mida cada sensor en un pin separado:

// Medición de período multi-sensor FG-3+
// Lee 3 sensores en los pines 2, 3, 4 (p. ej., para un ensamblaje de sensores de 3 ejes)
//
// Cableado:
// Sensor X OUT -> Pin 2
// Sensor Y OUT -> Pin 3
// Sensor Z OUT -> Pin 4
// Todos a través de adaptadores de nivel para placas de 3.3V

const int PINS[3] = {2, 3, 4};
const char* AXIS[3] = {"X", "Y", "Z"};

void setup() {
Serial.begin(115200);
for (int i = 0; i < 3; i++) {
pinMode(PINS[i], INPUT);
}
Serial.println("Axis,Period_us");
}

void loop() {
for (int i = 0; i < 3; i++) {
unsigned long highTime = pulseIn(PINS[i], HIGH, 100000UL);
unsigned long lowTime = pulseIn(PINS[i], LOW, 100000UL);

if (highTime > 0 && lowTime > 0) {
unsigned long period = highTime + lowTime;
Serial.print(AXIS[i]);
Serial.print(",");
Serial.println(period);
}
}

delay(200); // ~5 Hz por eje
}