ماژول سنسور برخورد 2

Crash Sensor Module V2

رابط کاربردی با خروجی NO/NC و فیلتر نویز

🎯 ماژول سنسور برخورد V2: تشخیص ساده و قابل اعتماد با قابلیت‌های حرفه‌ای

ماژول سنسور برخورد V2 یک راه‌حل بهینه‌شده و کاربردی برای تشخیص تماس فیزیکی و محدودیت‌های حرکتی است. با طراحی مینیمال و کارآمد، این ماژول تمام امکانات ضروری برای یک سنسور برخورد قابل اعتماد را در قالبی جمع‌وجور ارائه می‌دهد.

✨ ویژگی‌های متمایز V2

🎛️ طراحی ساده و موثر:

  • نمایشگر LED دو حالته: وضعیت NO و NC به صورت بصری

  • خازن فیلتر نویز: حذف نوسانات و بایاس‌های الکتریکی

  • خروجی دوگانه: هر دو حالت Normally Open و Normally Closed

🔧 عملکرد قابل اطمینان:

  • پاسخ آنی: عکس‌العمل فوری به تماس فیزیکی

  • ایزولاسیون نوری: جداسازی مدار نمایشگر از سیگنال

  • مقاومت در برابر نویز: فیلترینگ فعال برای محیط‌های صنعتی

📊 مشخصات فنی دقیق

ویژگی‌های الکتریکی:

  • ولتاژ کاری: 5V DC (محدوده 3.3V-12V)

  • جریان مصرف: < 15mA (با LED روشن)

  • ولتاژ خروجی NO: 0V (باز) → Vcc (بسته)

  • ولتاژ خروجی NC: Vcc (باز) → 0V (بسته)

  • خازن فیلتر: 100nF سرامیکی X7R

ویژگی‌های مکانیکی:

  • نوع سوئیچ: میکروسوییچ استاندارد SPST

  • نیروی فعال‌سازی: 0.7N ± 0.2N

  • سفر سوئیچ: 0.5mm ± 0.1mm

  • طول عمر: 500,000 چرخه حداقل

نمایشگر LED:

  • NO LED: سبز (فعال در حالت بسته)

  • NC LED: قرمز (فعال در حالت باز)

  • نوع: SMD 0805

  • جریان: 5mA با مقاومت محدودکننده

🛠️ طراحی مدار بهینه‌شده

ساختار داخلی:

پیکربندی مدار V2:
          +5V
           │
        [10KΩ] ← مقاومت پایه
           │
    میکروسوییچ ← نقطه‌اشتراک
   ┌─────┴─────┐
   │           │
 NO خروجی   NC خروجی
   │           │
 [100nF]    [100nF] ← خازن‌های فیلتر
   │           │
  LED سبز    LED قرمز
   │           │
  GND        GND

مزایای طراحی V2:

  • فیلتر نویز: کاهش خطاهای کاذب

  • نمایشگر بصری: تشخیص سریع وضعیت

  • جدا بودن خروجی‌ها: امکان استفاده همزمان

🔌 پیکربندی پایه‌ها

پین‌های ماژول:

ماژول از چپ به راست:
پین 1: VCC  (+5V)
پین 2: GND  (زمین)
پین 3: NO   (Normally Open)
پین 4: NC   (Normally Closed)

جدول وضعیت LED:

وضعیت سوئیچLED سبز (NO)LED قرمز (NC)توضیح
بازخاموشروشنحالت عادی، تماسی وجود ندارد
بستهروشنخاموشبرخورد یا فشار تشخیص داده شد

💻 اتصال و برنامه‌نویسی

اتصال پایه به آردوینو:

// تعریف پایه‌های ماژول V2
#define SENSOR_VCC_PIN     // به 5V متصل شود
#define SENSOR_GND_PIN     // به GND متصل شود
#define SENSOR_NO_PIN   2  // خروجی Normally Open
#define SENSOR_NC_PIN   3  // خروجی Normally Closed

void setupSensorV2() {
  Serial.begin(9600);
  
  // تنظیم پایه‌های ورودی
  pinMode(SENSOR_NO_PIN, INPUT);
  pinMode(SENSOR_NC_PIN, INPUT);
  
  Serial.println("ماژول سنسور برخورد V2 راه‌اندازی شد");
  Serial.println("================================");
}

void loop() {
  // خواندن هر دو خروجی
  bool noState = digitalRead(SENSOR_NO_PIN);
  bool ncState = digitalRead(SENSOR_NC_PIN);
  
  // نمایش وضعیت
  Serial.print("NO: ");
  Serial.print(noState ? "بسته" : "باز");
  Serial.print(" | NC: ");
  Serial.print(ncState ? "بسته" : "باز");
  
  // تشخیص وضعیت
  if (!noState && ncState) {
    Serial.println(" - وضعیت: عادی (باز)");
  } else if (noState && !ncState) {
    Serial.println(" - وضعیت: فعال (بسته)");
  } else {
    Serial.println(" - خطا: وضعیت نامعتبر");
  }
  
  delay(200);
}

کلاس مدیریت پیشرفته:

class CrashSensorV2 {
private:
    int noPin;
    int ncPin;
    bool lastState;
    unsigned long debounceTime;
    
public:
    CrashSensorV2(int no, int nc) {
        noPin = no;
        ncPin = nc;
        lastState = false;
        debounceTime = 0;
        
        pinMode(noPin, INPUT);
        pinMode(ncPin, INPUT);
    }
    
    // خواندن وضعیت با debounce
    bool readDebounced() {
        bool noRead = digitalRead(noPin);
        bool ncRead = digitalRead(ncPin);
        
        // وضعیت معتبر: NO و NC باید مخالف هم باشند
        if (noRead == !ncRead) {
            unsigned long currentTime = millis();
            
            if (currentTime - debounceTime > 50) { // 50ms debounce
                bool currentState = noRead; // NO=1 یعنی بسته
                
                if (currentState != lastState) {
                    lastState = currentState;
                    debounceTime = currentTime;
                    
                    if (currentState) {
                        Serial.println("🟢 برخورد تشخیص داده شد (سوئیچ بسته)");
                    } else {
                        Serial.println("🔴 سوئیچ باز شد");
                    }
                }
                return currentState;
            }
        } else {
            Serial.println("⚠️ خطا: وضعیت نامعتبر NO/NC");
        }
        return lastState;
    }
    
    // بررسی سلامت سنسور
    bool sensorHealthy() {
        bool noState = digitalRead(noPin);
        bool ncState = digitalRead(ncPin);
        
        // در حالت سالم، NO و NC باید همیشه مخالف هم باشند
        return (noState != ncState);
    }
    
    // گرفتن وضعیت هر دو خروجی
    void getBothStates(bool &no, bool &nc) {
        no = digitalRead(noPin);
        nc = digitalRead(ncPin);
    }
};

// استفاده از کلاس
CrashSensorV2 sensor(2, 3);

void setup() {
    Serial.begin(9600);
    if (sensor.sensorHealthy()) {
        Serial.println("سنسور V2 سالم است");
    }
}

void loop() {
    bool isTriggered = sensor.readDebounced();
    
    if (isTriggered) {
        // اقدامات لازم هنگام برخورد
        emergencyProcedure();
    }
    
    delay(10);
}

🔧 نصب و راه‌اندازی

مرحله ۱: اتصال الکتریکی

اتصال به بردبورد:
1. VCC → ریل 5V
2. GND → ریل زمین
3. NO → به پایه دیجیتال میکروکنترلر
4. NC → به پایه دیگر (اختیاری)

مرحله ۲: تست اولیه

void quickTest() {
    Serial.println("=== تست سریع سنسور V2 ===");
    
    bool noState, ncState;
    sensor.getBothStates(noState, ncState);
    
    Serial.print("وضعیت NO: ");
    Serial.println(noState ? "HIGH (بسته)" : "LOW (باز)");
    
    Serial.print("وضعیت NC: ");
    Serial.println(ncState ? "HIGH (بسته)" : "LOW (باز)");
    
    // تست صحت عملکرد
    if (noState == !ncState) {
        Serial.println("✅ سنسور به درستی کار می‌کند");
    } else {
        Serial.println("❌ خطا در سنسور");
    }
    
    // تست LED
    Serial.println("پیش از فشار دادن: LED قرمز روشن");
    Serial.println("پس از فشار دادن: LED سبز روشن");
}

مرحله ۳: کالیبراسیون

void calibrateSensor() {
    Serial.println("کالیبراسیون سنسور برخورد V2");
    Serial.println("1. سنسور را در حالت آزاد رها کنید");
    delay(3000);
    
    bool noState, ncState;
    sensor.getBothStates(noState, ncState);
    
    if (!noState && ncState) {
        Serial.println("✅ حالت عادی کالیبره شد");
    } else {
        Serial.println("⚠️ حالت عادی تشخیص داده نشد");
    }
    
    Serial.println("2. سوئیچ را فشار دهید و نگه دارید");
    delay(5000);
    
    sensor.getBothStates(noState, ncState);
    
    if (noState && !ncState) {
        Serial.println("✅ حالت فعال کالیبره شد");
    } else {
        Serial.println("⚠️ حالت فعال تشخیص داده نشد");
    }
    
    Serial.println("کالیبراسیون کامل شد");
}

⚙️ کاربردهای عملی

۱. سیستم‌های ایمنی ساده:

void safetyMonitor() {
    static bool lastSafeState = true;
    
    bool isSafe = !sensor.readDebounced(); // false = خطر
    
    if (isSafe != lastSafeState) {
        lastSafeState = isSafe;
        
        if (isSafe) {
            Serial.println("✅ منطقه امن");
            enableMachine();
        } else {
            Serial.println("🚨 خطر: منطقه محافظت شده!");
            disableMachine();
            soundAlarm();
        }
    }
}

۲. شمارنده رویدادها:

class EventCounter {
private:
    int count;
    bool lastState;
    
public:
    EventCounter() : count(0), lastState(false) {}
    
    void update(bool currentState) {
        if (currentState && !lastState) { // لبه بالارونده
            count++;
            Serial.print("رویداد شماره: ");
            Serial.println(count);
        }
        lastState = currentState;
    }
    
    int getCount() { return count; }
    void reset() { count = 0; }
};

EventCounter counter;

void loop() {
    bool triggered = sensor.readDebounced();
    counter.update(triggered);
    
    if (counter.getCount() >= 100) {
        Serial.println("⚠️ به حد مجاز رویداد رسید");
        counter.reset();
    }
    
    delay(1);
}

۳. سیستم ضدگیرکردن:

void antiJamSystem() {
    static unsigned long triggerStart = 0;
    
    bool isTriggered = sensor.readDebounced();
    
    if (isTriggered) {
        if (triggerStart == 0) {
            triggerStart = millis();
        } else {
            unsigned long duration = millis() - triggerStart;
            
            if (duration > 5000) { // 5 ثانیه گیرکردن
                Serial.println("🚨 گیرکردن تشخیص داده شد!");
                emergencyReverse();
                triggerStart = 0;
            }
        }
    } else {
        triggerStart = 0;
    }
}

🛡️ مزایای خازن فیلتر

حذف نویزهای رایج:

  • نویز تماس: جرقه هنگام اتصال/قطع

  • نویز محیطی: القای الکترومغناطیسی

  • نویز منبع تغذیه: ریپل آداپتور

بهبود پایداری:

// مقایسه با و بدون فیلتر
void compareWithWithoutFilter() {
    // بدون فیلتر (ماژول معمولی)
    int unstableCount = 0;
    for (int i = 0; i < 1000; i++) {
        if (digitalRead(SENSOR_PIN) != digitalRead(SENSOR_PIN)) {
            unstableCount++;
        }
        delayMicroseconds(10);
    }
    
    // با فیلتر (ماژول V2)
    int stableCount = 0;
    for (int i = 0; i < 1000; i++) {
        if (digitalRead(SENSOR_NO_PIN) == digitalRead(SENSOR_NO_PIN)) {
            stableCount++;
        }
        delayMicroseconds(10);
    }
    
    Serial.print("تعداد نوسان بدون فیلتر: ");
    Serial.println(unstableCount);
    Serial.print("تعداد نوسان با فیلتر: ");
    Serial.println(1000 - stableCount);
}

🔍 نمایشگر LED هوشمند

کدهای وضعیت:

void interpretLEDPattern() {
    bool ledGreen = digitalRead(LED_GREEN_PIN);
    bool ledRed = digitalRead(LED_RED_PIN);
    
    Serial.print("نمایشگر LED: ");
    
    if (!ledGreen && ledRed) {
        Serial.println("🟢 آماده (سوئیچ باز)");
    } else if (ledGreen && !ledRed) {
        Serial.println("🔴 فعال (سوئیچ بسته)");
    } else if (ledGreen && ledRed) {
        Serial.println("🟡 خطا: هر دو LED روشن");
    } else {
        Serial.println("⚫ خاموش: برق قطع یا خرابی");
    }
}

کنترل روشنایی LED:

void controlLEDBrightness(int brightness) {
    // محدود کردن روشنایی برای افزایش عمر LED
    brightness = constrain(brightness, 0, 80); // حداکثر 80%
    
    // در صورت نیاز می‌توان PWM اعمال کرد
    analogWrite(LED_GREEN_PIN, brightness * 255 / 100);
    analogWrite(LED_RED_PIN, brightness * 255 / 100);
}

⚡ نکات نصب مکانیکی

موقعیت‌دهی بهینه:

  1. زاویه تماس: اهرم عمود بر سطح تماس باشد

  2. فاصله پیش‌تماس: 1-2mm قبل از نقطه تماس اصلی

  3. نیروی فعال‌سازی: تنظیم برای حداقل نیروی مورد نیاز

  4. محل نصب: دور از ارتعاشات و ضربه‌های مستقیم

پیچ‌های نصب:

  • سایز: M3 یا #4-40

  • گشتاور: 0.3-0.5 Nm

  • فاصله: مطابق سوراخ‌های PCB

  • واشر: استفاده از واشر فنری برای جذب لرزش

🚀 پروژه‌های نمونه

پروژه ۱: دزدگیر ساده:

class SimpleBurglarAlarm {
private:
    CrashSensorV2* sensor;
    bool armed;
    bool triggered;
    
public:
    SimpleBurglarAlarm(CrashSensorV2* s) : sensor(s), armed(false), triggered(false) {}
    
    void arm() {
        armed = true;
        triggered = false;
        Serial.println("دزدگیر فعال شد");
    }
    
    void disarm() {
        armed = false;
        Serial.println("دزدگیر غیرفعال شد");
    }
    
    void check() {
        if (armed) {
            if (sensor->readDebounced()) {
                if (!triggered) {
                    triggered = true;
                    triggerAlarm();
                }
            }
        }
    }
    
    void triggerAlarm() {
        Serial.println("🚨 🚨 🚨 هشدار نفوذ! 🚨 🚨 🚨");
        // فعال کردن آژیر
        // روشن کردن چراغ
        // ارسال پیام
    }
};

پروژه ۲: کنترل درب اتوماتیک:

void automaticDoorControl() {
    static enum { OPEN, CLOSING, CLOSED, OPENING } state = CLOSED;
    static CrashSensorV2 safetySensor(2, 3); // سنسور ایمنی
    
    switch (state) {
        case CLOSING:
            if (safetySensor.readDebounced()) {
                Serial.println("مانع تشخیص داده شد! درب باز می‌شود");
                state = OPENING;
                reverseMotor();
            } else if (doorFullyClosed()) {
                state = CLOSED;
                stopMotor();
            }
            break;
            
        // سایر حالات...
    }
}

🔧 نگهداری و عیب‌یابی

برنامه نگهداری پیشگیرانه:

void preventiveMaintenance() {
    Serial.println("=== نگهداری دوره‌ای سنسور V2 ===");
    
    // تست الکتریکی
    testElectrical();
    
    // تست مکانیکی
    testMechanical();
    
    // تمیزکاری
    cleaningProcedure();
    
    // ثبت گزارش
    logMaintenance();
    
    Serial.println("نگهداری تکمیل شد");
}

void testElectrical() {
    Serial.println("تست الکتریکی:");
    
    // تست اتصال کوتاه
    if (checkShortCircuit()) {
        Serial.println("❌ اتصال کوتاه وجود دارد");
    } else {
        Serial.println("✅ بدون اتصال کوتاه");
    }
    
    // تست مقاومت عایق
    if (checkInsulation()) {
        Serial.println("✅ عایق‌بندی سالم");
    } else {
        Serial.println("❌ مشکل در عایق‌بندی");
    }
}

علائم خرابی و راه‌حل:

مشکلعلت احتمالیراه‌حل
هر دو LED روشناتصال کوتاه داخلیتعویض ماژول
هیچ LED روشن نمی‌شودقطعی برقچک کردن اتصالات
LEDها نامناسب تغییر می‌کنندنویز محیطیافزودن شیلد
وضعیت NO/NC همزمانخرابی سوئیچتعویض میکروسوییچ

📦 مشخصات بسته‌بندی

محتویات استاندارد:

  • 1 عدد ماژول سنسور برخورد V2

  • 1 عدد میکروسوییچ با کیفیت

  • 4 عدد پایه هدر نر (قابل لحیم)

  • 2 عدد خازن 100nF اضافی

  • برگه راهنمای فشرده

ویژگی‌های بسته‌بندی:

  • ضد الکتریسیته ساکن: کیسه ESD

  • ضد رطوبت: سیلندر خشک‌کن

  • ضد ضربه: فوم محافظ

  • برچسب: مشخصات کامل محصول

⚠️ ملاحظات ایمنی

حدود کاری:

  • حداکثر ولتاژ: 12V DC

  • حداکثر جریان: 100mA (هر خروجی)

  • حداکثر دما: 85°C محیط

  • حداقل دما: -25°C محیط

هشدارها:

  1. از اتصال به ولتاژ AC خودداری کنید

  2. در محیط‌های انفجاری استفاده نکنید

  3. از تماس با مواد خورنده جلوگیری کنید

  4. دور از دسترس کودکان نگهداری شود

🌟 نتیجه‌گیری

ماژول سنسور برخورد V2 با طراحی ساده اما موثر، راه‌حلی ایده‌آل برای کاربردهایی است که به قابلیت اطمینان بالا و نگهداری آسان نیاز دارند. وجود هر دو خروجی NO و NC به همراه نمایشگر بصری و فیلتر نویز، آن را به انتخابی منطقی برای پروژه‌های صنعتی و آموزشی تبدیل می‌کند.

سادگی در استفاده، قابلیت اطمینان در عملکرد