التكامل مع Arduino
تقدم هذه الصفحة أمثلة Arduino جاهزة للاستخدام لدمج مستشعرات FG-3+ وFG-3C مع لوحات متوافقة مع Arduino (Arduino Uno، Arduino Mega، ESP32، وغيرها).
FG-3+ — قياس التردد / الدورة
يُخرج FG-3+ إشارة PWM بجهد 5 فولت تتناسب دورتها مع المجال المغناطيسي. يقيس المثال أدناه دورة النبضة باستخدام pulseIn()، وهو مناسب لتطبيقات معدل التحديث المنخفض. للحصول على دقة أعلى وأخذ عينات أسرع، استخدم التقاط مؤقت الأجهزة بدلاً من ذلك.
إخراج FG-3+ بمنطق 5 فولت. قم بالتوصيل إلى وحدة تحكم دقيقة بجهد 3.3 فولت (مثل ESP32) فقط من خلال مقسّم جهد أو محوّل مستوى. لا تقم بتوصيل إشارة 5 فولت مباشرة بدبوس GPIO بجهد 3.3 فولت.
// مثال قياس تردد FG-3+
// يقرأ دورة النبضة من مستشعر FG-3+ ويطبعها على المنفذ التسلسلي.
//
// التوصيل:
// FG-3+ VCC -> 5V
// FG-3+ GND -> GND
// FG-3+ OUT -> Pin 2 (عبر محوّل مستوى للوحات 3.3V)
//
// ملاحظة: pulseIn() يُعطّل التنفيذ أثناء القياس. استخدم المؤقتات الصلبة
// للتطبيقات الحساسة للوقت.
const int SENSOR_PIN = 2; // دبوس الإدخال الرقمي المتصل بـ FG-3+ OUT
void setup() {
Serial.begin(115200);
pinMode(SENSOR_PIN, INPUT);
Serial.println("FG-3+ Period Measurement");
Serial.println("Period_us");
}
void loop() {
// قياس دورة نبضة كاملة (مدة HIGH + LOW)
// pulseIn يعيد المدة بالميكروثانية؛ 0 عند انتهاء المهلة
unsigned long highTime = pulseIn(SENSOR_PIN, HIGH, 100000UL); // مهلة 100 مللي ثانية
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;
// طباعة الدورة بالميكروثانية
// لتحويلها إلى قيمة حقل (nT)، طبّق معامل المعايرة من شهادة معايرة المستشعر
Serial.println(periodUs);
delay(100); // معدل إخراج 10 هرتز
}
تعتمد العلاقة بين الدورة (µs) والمجال المغناطيسي (nT) على وحدة المستشعر المحددة. طبّق معاملات المعايرة من شهادة معايرة مستشعرك لتحويل الدورة إلى قيمة الحقل.
FG-3+ — دقة أعلى باستخدام المؤقت الصلب (ESP32)
للحصول على دقة أفضل على ESP32، استخدم التقاط مؤقت الأجهزة:
// قياس دورة FG-3+ عالي الدقة باستخدام ESP32 PCNT
// يستخدم محيط عداد النبضات لعدّ التردد بدقة.
//
// التوصيل:
// FG-3+ OUT -> GPIO 4 (عبر محوّل مستوى)
#include "driver/pcnt.h"
#define PCNT_UNIT PCNT_UNIT_0
#define PCNT_INPUT GPIO_NUM_4
#define COUNT_TIME_MS 1000 // عدّ النبضات لمدة ثانية واحدة
void setup() {
Serial.begin(115200);
// تهيئة PCNT لعدّ الحواف الصاعدة على دبوس الإدخال
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, // عدّ الحواف الصاعدة
.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 = نبضات في الثانية = التردد بالهرتز
Serial.println(count);
}
FG-3C — القراءة عبر UART
يرسل FG-3C في وضع UART قيم الحقل بصيغة ASCII بمعدل 115200 بود على الدبوس 4.
// مثال قراءة UART للـFG-3C
// يقرأ قيم المجال المغناطيسي من مستشعر FG-3C عبر UART الصلب.
//
// التوصيل (Arduino Mega أو ESP32):
// FG-3C Pin 1 (VCC) -> 5V
// FG-3C Pin 2 (GND) -> GND
// FG-3C Pin 4 (TX) -> Serial1 RX (عبر محوّل مستوى للوحات 3.3V)
//
// على Arduino Uno (بدون Serial1 صلب): استخدم SoftwareSerial على الدبوسين 10, 11.
// على ESP32: استخدم Serial2 أو أي UART متاح.
// لـESP32: Serial2 RX = GPIO16، TX = GPIO17
// لـArduino Mega: Serial1 RX = Pin 19
void setup() {
Serial.begin(115200); // المنفذ التسلسلي USB — للطباعة على الحاسوب
Serial1.begin(115200); // UART الصلب — متصل بـ FG-3C Pin 4
Serial.println("FG-3C UART Reader");
Serial.println("Field_nT");
}
void loop() {
// قراءة سطر واحد من FG-3C (منتهٍ بسطر جديد)
if (Serial1.available()) {
String line = Serial1.readStringUntil('\n');
line.trim();
if (line.length() > 0) {
float fieldNT = line.toFloat();
// الطباعة على المنفذ التسلسلي USB للمراقبة
Serial.println(fieldNT, 1); // منزلة عشرية واحدة
}
}
}
على Arduino Uno (UART صلب واحد)، استخدم مكتبة SoftwareSerial على دبوسين رقميين احتياطيين بدلاً من Serial1. SoftwareSerial محدود بمعدلات بود موثوقة أدنى؛ لمعدل 115200 على Uno، استخدم لوحة بـUART صلب (Mega، ESP32، Leonardo).
قراءة مستشعرات FG-3+ متعددة (ثلاثي المحاور أو مقياس التدرج)
لنظام ثلاثي المحاور أو مقياس تدرج، قِس كل مستشعر على دبوس منفصل:
// قياس دورة FG-3+ متعدد المستشعرات
// يقرأ 3 مستشعرات على الدبوسين 2, 3, 4 (مثلاً لتجميع مستشعر ثلاثي المحاور)
//
// التوصيل:
// Sensor X OUT -> Pin 2
// Sensor Y OUT -> Pin 3
// Sensor Z OUT -> Pin 4
// جميعها عبر محوّلات مستوى للوحات 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 هرتز لكل محور
}