Arduino

Датчики Холла (аналоговый и цифровой) и геркон: бесконтактное обнаружение

Введение

Набор включает сразу несколько разных модулей бесконтактного обнаружения магнитного поля — линейный (аналоговый) датчик Холла, цифровой датчик Холла, и геркон (магнитоуправляемый механический переключатель) в двух размерах. В статье разберём принципиальную разницу между ними и типичные применения каждого.

Концепция

Датчик Холла (эффект Холла) — твердотельный полупроводниковый датчик, генерирующий напряжение, пропорциональное (для линейного/аналогового варианта) или превышающее пороговое значение (для цифрового варианта) приложенного магнитного поля — в отличие от геркона, у датчика Холла нет механических, изнашиваемых частей, что даёт значительно больший срок службы при частых срабатываниях. Геркон — простой механический переключатель с герметично запаянными контактами, замыкающимися под воздействием магнитного поля — дешевле и проще датчика Холла, но подвержен механическому износу контактов при очень частых переключениях и в принципе не способен дать аналоговое, пропорциональное полю значение (только дискретное «замкнуто/разомкнуто»).

Пример кода

// Линейный (аналоговый) датчик Холла — пропорциональное измерение силы магнитного поля
const int HALL_ANALOG_PIN = A0;

void loopAnalogHall() {
    int rawValue = analogRead(HALL_ANALOG_PIN);

    // Большинство линейных датчиков Холла дают значение около середины диапазона (≈512 для 10-бит АЦП)
    // при ОТСУТСТВИИ магнитного поля, отклоняясь в одну или другую сторону в зависимости от полярности поля
    int deviation = rawValue - 512;

    Serial.print("HALL_DEVIATION:");
    Serial.println(deviation); // положительное/отрицательное значение — полярность поля
}
// Цифровой датчик Холла и геркон — оба дают простой дискретный сигнал
const int HALL_DIGITAL_PIN = 2;
const int REED_SWITCH_PIN = 3;

void setupDigitalDetectors() {
    pinMode(HALL_DIGITAL_PIN, INPUT);
    pinMode(REED_SWITCH_PIN, INPUT_PULLUP); // геркон обычно подключается с внутренней подтяжкой
}

void loopDigitalDetectors() {
    bool hallTriggered = !digitalRead(HALL_DIGITAL_PIN); // часто LOW при обнаружении поля
    bool reedClosed = !digitalRead(REED_SWITCH_PIN);       // LOW при замыкании геркона (с pullup)

    if (hallTriggered) Serial.println("EVENT:HALL_DIGITAL_TRIGGERED");
    if (reedClosed) Serial.println("EVENT:REED_SWITCH_CLOSED");
}
// Практическое применение: счётчик оборотов колеса с магнитом и датчиком Холла —
// аналогично типичному применению в велокомпьютерах
volatile unsigned long rotationCount = 0;

void hallInterruptHandler() {
    rotationCount++;
}

void setupRotationCounter() {
    pinMode(HALL_DIGITAL_PIN, INPUT);
    attachInterrupt(digitalPinToInterrupt(HALL_DIGITAL_PIN), hallInterruptHandler, FALLING);
}

float calculateSpeed(float wheelCircumferenceMeters, unsigned long elapsedMillis) {
    float rotations = rotationCount;
    float distanceMeters = rotations * wheelCircumferenceMeters;
    float speedMetersPerSecond = distanceMeters / (elapsedMillis / 1000.0);
    return speedMetersPerSecond * 3.6; // перевод в км/ч
}

Пояснения к коду

deviation = rawValue - 512 показывает типичную интерпретацию линейного датчика Холла — большинство таких датчиков спроектированы давать напряжение, соответствующее середине диапазона АЦП при полном отсутствии магнитного поля, и отклонение в большую или меньшую сторону одновременно показывает и силу поля (величина отклонения), и его полярность (знак отклонения, зависящий от того, какой полюс магнита обращён к датчику) — это качественное отличие от цифрового датчика Холла или геркона, дающих лишь простое «да/нет» срабатывание. Счётчик оборотов через прерывание (attachInterrupt) показывает классическое практическое применение цифрового датчика Холла — магнит, закреплённый на вращающемся колесе, проходит рядом с зафиксированным датчиком один раз за оборот, генерируя прерывание, что даёт точный подсчёт оборотов без механического контакта и связанного с ним износа, в отличие от альтернативного решения с механическим геркон-переключателем для той же задачи.

Подводные камни

  • Использование геркона там, где требуется очень частое, многократное срабатывание за короткий промежуток времени (быстро вращающееся колесо с высокой частотой оборотов) — механические контакты геркона имеют ограниченный ресурс по количеству циклов переключения и могут со временем выйти из строя при очень интенсивном использовании; цифровой датчик Холла, не имеющий механических частей, значительно более долговечен для таких высокочастотных применений, хотя и стоит обычно дороже простого геркона.
  • Игнорирование полярности магнита при использовании линейного датчика Холла, ожидая, что любой магнит «просто сработает» аналогично цифровому датчику или геркону — поскольку линейный датчик Холла чувствителен именно к полярности (а не только к самому наличию поля), неправильно ориентированный магнит может дать отклонение в неожиданном направлении или вовсе не дать значимого отклонения при граничной ориентации, и для предсказуемого результата важно явно учитывать ориентацию магнита относительно чувствительной стороны датчика.
  • Дребезг сигнала геркона при медленном, плавном прохождении магнита рядом с датчиком (в отличие от резкого, отчётливого щелчка переключения при быстром приближении) — аналогично дребезгу контактов обычной кнопки (основной Arduino-цикл), геркон при медленном изменении магнитного поля может несколько раз быстро переключиться вблизи порогового расстояния, прежде чем установится в стабильном положении, что может потребовать программной фильтрации дребезга, аналогичной обработке обычных кнопок.
  • Неучёт расстояния срабатывания, существенно различающегося между конкретными моделями и экземплярами модулей датчиков Холла/герконов — заявленное в общих описаниях «дальность обнаружения» часто относится к идеальным условиям с сильным магнитом конкретного типа, и реальное расстояние срабатывания для конкретного используемого магнита может быть значительно меньше ожидаемого; перед окончательной сборкой механической части проекта (определение точного расстояния между магнитом и датчиком) стоит явно протестировать реальное расстояние срабатывания с тем конкретным магнитом, который будет использоваться в финальной конструкции.