Ana içeriğe geç

Arduino Entegrasyonu

Bu sayfa, FG-3+ ve FG-3C sensörlerini Arduino uyumlu kartlarla (Arduino Uno, Arduino Mega, ESP32 vb.) entegre etmek için kullanıma hazır Arduino örnekleri sunmaktadır.


FG-3+ — Frekans / Periyot Ölçümü

FG-3+, periyodu manyetik alanla orantılı olan 5 V PWM sinyali çıkarır. Aşağıdaki örnek, pulseIn() kullanarak nabız periyodunu ölçer; bu yöntem düşük güncelleme hızlı uygulamalar için uygundur. Daha yüksek doğruluk ve daha hızlı örnekleme için donanım zamanlayıcı giriş-yakalama kullanın.

Seviye Kaydırma

FG-3+ çıkışı 5 V mantık seviyesindedir. 3,3 V MCU'ya (ESP32 gibi) yalnızca gerilim bölücü veya seviye kaydırıcı üzerinden bağlayın. 5 V sinyali doğrudan 3,3 V GPIO pinine bağlamayın.

// FG-3+ Frekans Ölçüm Örneği
// FG-3+ sensöründen nabız periyodunu okur ve Seri'ye yazdırır.
//
// Bağlantı:
// FG-3+ VCC -> 5V
// FG-3+ GND -> GND
// FG-3+ OUT -> Pin 2 (3.3V kartlar için seviye kaydırıcı üzerinden)
//
// Not: pulseIn() ölçüm sırasında bloklar. Zamana duyarlı
// uygulamalar için donanım zamanlayıcıları kullanın.

const int SENSOR_PIN = 2; // FG-3+ OUT'a bağlı dijital giriş pini

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

void loop() {
// Tam bir nabzın periyodunu ölç (HIGH + LOW süresi)
// pulseIn mikrosaniye cinsinden süre döndürür; zaman aşımında 0
unsigned long highTime = pulseIn(SENSOR_PIN, HIGH, 100000UL); // 100 ms zaman aşımı
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;

// Periyodu mikrosaniye cinsinden yazdır
// Alan değerine (nT) dönüştürmek için sensörünüzün kalibrasyon faktörünü uygulayın
Serial.println(periodUs);

delay(100); // 10 Hz çıkış hızı
}
Kalibrasyon

Periyot (µs) ile manyetik alan (nT) arasındaki ilişki, belirli sensör birimine bağlıdır. Periyodu alan değerine dönüştürmek için sensörünüzün kalibrasyon sertifikasındaki kalibrasyon katsayılarını uygulayın.


FG-3+ — Donanım Zamanlayıcı ile Daha Yüksek Doğruluk (ESP32)

ESP32'de daha iyi doğruluk için donanım zamanlayıcı giriş yakalamayı kullanın:

// ESP32 PCNT kullanan FG-3+ Yüksek Doğruluklu Periyot Ölçümü
// Hassas frekans sayımı için Nabız Sayacı çevresini kullanır.
//
// Bağlantı:
// FG-3+ OUT -> GPIO 4 (seviye kaydırıcı üzerinden)

#include "driver/pcnt.h"

#define PCNT_UNIT PCNT_UNIT_0
#define PCNT_INPUT GPIO_NUM_4
#define COUNT_TIME_MS 1000 // 1 saniye boyunca nabız say

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

// Giriş pinindeki yükselen kenarları saymak için PCNT'yi yapılandır
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, // Yükselen kenarları say
.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 = saniyedeki nabız = Hz cinsinden frekans
Serial.println(count);
}

FG-3C — UART Okuma

UART modundaki FG-3C, Pin 4 üzerinden 115200 baud hızında ASCII alan değerleri iletir.

// FG-3C UART Okuma Örneği
// Donanım UART üzerinden FG-3C sensöründen manyetik alan değerlerini okur.
//
// Bağlantı (Arduino Mega veya ESP32):
// FG-3C Pin 1 (VCC) -> 5V
// FG-3C Pin 2 (GND) -> GND
// FG-3C Pin 4 (TX) -> Serial1 RX (3.3V kartlar için seviye kaydırıcı üzerinden)
//
// Arduino Uno'da (donanım Serial1 yok): 10, 11 pinlerinde SoftwareSerial kullanın.
// ESP32'de: Serial2 veya mevcut herhangi bir UART kullanın.

void setup() {
Serial.begin(115200); // USB seri — PC'ye yazdırmak için
Serial1.begin(115200); // Donanım UART — FG-3C Pin 4'e bağlı

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

void loop() {
// FG-3C'den bir satır oku (yeni satırla sonlanır)
if (Serial1.available()) {
String line = Serial1.readStringUntil('\n');
line.trim();

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

// İzleme için USB seri'ye yazdır
Serial.println(fieldNT, 1); // 1 ondalık basamak
}
}
}
not

Arduino Uno'da (tek donanım UART), Serial1 yerine yedek dijital pinlerde SoftwareSerial kütüphanesini kullanın. SoftwareSerial daha düşük güvenilir baud hızlarıyla sınırlıdır; Uno'da 115200 için donanım UART'lı bir kart kullanın (Mega, ESP32, Leonardo).


Birden Fazla FG-3+ Sensörü Okuma (3 Eksenli veya Gradiometre)

3 eksenli sistem veya gradiometre için her sensörü ayrı bir pin üzerinden ölçün:

// Çok Sensörlü FG-3+ Periyot Ölçümü
// 2, 3, 4 pinlerindeki 3 sensörü okur (örn. 3 eksenli sensör düzeneği için)
//
// Bağlantı:
// Sensor X OUT -> Pin 2
// Sensor Y OUT -> Pin 3
// Sensor Z OUT -> Pin 4
// Tümü 3.3V kartlar için seviye kaydırıcılar üzerinden

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); // Eksen başına ~5 Hz
}