Aller au contenu principal

Intégration Arduino

Cette page fournit des exemples Arduino prêts à l'emploi pour intégrer les capteurs FG-3+ et FG-3C avec des cartes compatibles Arduino (Arduino Uno, Arduino Mega, ESP32, etc.).


FG-3+ — Mesure de fréquence / période

Le FG-3+ produit une impulsion rectangulaire 5 V dont la période est proportionnelle au champ magnétique. L'exemple ci-dessous mesure la période de l'impulsion avec pulseIn(), adapté aux applications à faible fréquence de mise à jour. Pour une meilleure précision et un échantillonnage plus rapide, utilisez plutôt la capture d'entrée du timer matériel.

Adaptation de niveau

La sortie du FG-3+ est en logique 5 V. Connectez-la à un MCU 3,3 V (comme l'ESP32) uniquement via un diviseur de tension ou un adaptateur de niveau. Ne connectez pas un signal 5 V directement à une broche GPIO 3,3 V.

// Exemple de mesure de fréquence FG-3+
// Lit la période d'impulsion d'un capteur FG-3+ et l'affiche sur Serial.
//
// Câblage :
// FG-3+ VCC -> 5V
// FG-3+ GND -> GND
// FG-3+ OUT -> Pin 2 (via adaptateur de niveau pour cartes 3.3V)
//
// Note : pulseIn() bloque pendant la mesure. Utilisez des timers matériels
// pour les applications critiques en temps.

const int SENSOR_PIN = 2; // Broche d'entrée numérique connectée à FG-3+ OUT

void setup() {
Serial.begin(115200);
pinMode(SENSOR_PIN, INPUT);
Serial.println("Mesure de période FG-3+");
Serial.println("Period_us");
}

void loop() {
// Mesurer la période d'une impulsion complète (durée HIGH + LOW)
// pulseIn retourne la durée en microsecondes ; 0 en cas de timeout
unsigned long highTime = pulseIn(SENSOR_PIN, HIGH, 100000UL); // timeout 100 ms
unsigned long lowTime = pulseIn(SENSOR_PIN, LOW, 100000UL);

if (highTime == 0 || lowTime == 0) {
Serial.println("Timeout - aucun signal détecté");
return;
}

unsigned long periodUs = highTime + lowTime;

// Afficher la période en microsecondes
// Pour convertir en valeur de champ (nT), appliquer le facteur de calibration du capteur
Serial.println(periodUs);

delay(100); // Taux de sortie 10 Hz
}
Calibration

La relation entre la période (µs) et le champ magnétique (nT) dépend de l'unité de capteur spécifique. Appliquez les coefficients de calibration du certificat de calibration de votre capteur pour convertir la période en valeur de champ.


FG-3+ — Précision accrue avec le timer matériel (ESP32)

Pour une meilleure précision sur un ESP32, utilisez la capture d'entrée du timer matériel :

// Mesure de période haute précision FG-3+ avec ESP32 PCNT
// Utilise le périphérique Pulse Counter pour un comptage de fréquence précis.
//
// Câblage :
// FG-3+ OUT -> GPIO 4 (via adaptateur de niveau)

#include "driver/pcnt.h"

#define PCNT_UNIT PCNT_UNIT_0
#define PCNT_INPUT GPIO_NUM_4
#define COUNT_TIME_MS 1000 // Compter les impulsions pendant 1 seconde

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

// Configurer PCNT pour compter les fronts montants sur la broche d'entrée
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, // Compter les fronts montants
.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 = impulsions par seconde = fréquence en Hz
Serial.println(count);
}

FG-3C — Lecture UART

Le FG-3C en mode UART transmet des valeurs de champ ASCII à 115200 bauds sur la broche 4.

// Exemple de lecture UART FG-3C
// Lit les valeurs de champ magnétique du capteur FG-3C via UART matériel.
//
// Câblage (Arduino Mega ou ESP32) :
// FG-3C Pin 1 (VCC) -> 5V
// FG-3C Pin 2 (GND) -> GND
// FG-3C Pin 4 (TX) -> Serial1 RX (via adaptateur de niveau pour cartes 3.3V)
//
// Sur Arduino Uno (pas de Serial1 matériel) : utiliser SoftwareSerial sur les broches 10, 11.
// Sur ESP32 : utiliser Serial2 ou tout UART disponible.

void setup() {
Serial.begin(115200); // Série USB — pour afficher sur PC
Serial1.begin(115200); // UART matériel — connecté à FG-3C Pin 4

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

void loop() {
// Lire une ligne du FG-3C (terminée par un saut de ligne)
if (Serial1.available()) {
String line = Serial1.readStringUntil('\n');
line.trim();

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

// Afficher sur la série USB pour la surveillance
Serial.println(fieldNT, 1); // 1 décimale
}
}
}
remarque

Sur Arduino Uno (UART matériel unique), utilisez la bibliothèque SoftwareSerial sur des broches numériques libres. SoftwareSerial est limité à des débits inférieurs ; pour 115200 sur Uno, utilisez une carte avec UART matériel (Mega, ESP32, Leonardo).


Lecture de plusieurs capteurs FG-3+ (3 axes ou gradiomètre)

Pour un système 3 axes ou gradiomètre, mesurez chaque capteur sur une broche séparée :

// Mesure de période multi-capteurs FG-3+
// Lit 3 capteurs sur les broches 2, 3, 4 (ex. pour un assemblage de capteurs 3 axes)
//
// Câblage :
// Capteur X OUT -> Broche 2
// Capteur Y OUT -> Broche 3
// Capteur Z OUT -> Broche 4
// Tous via adaptateurs de niveau pour cartes 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 par axe
}