Введение
Набор включает сразу несколько разных модулей бесконтактного обнаружения магнитного поля — линейный (аналоговый) датчик Холла, цифровой датчик Холла, и геркон (магнитоуправляемый механический переключатель) в двух размерах. В статье разберём принципиальную разницу между ними и типичные применения каждого.
Концепция
Датчик Холла (эффект Холла) — твердотельный полупроводниковый датчик, генерирующий напряжение, пропорциональное (для линейного/аналогового варианта) или превышающее пороговое значение (для цифрового варианта) приложенного магнитного поля — в отличие от геркона, у датчика Холла нет механических, изнашиваемых частей, что даёт значительно больший срок службы при частых срабатываниях. Геркон — простой механический переключатель с герметично запаянными контактами, замыкающимися под воздействием магнитного поля — дешевле и проще датчика Холла, но подвержен механическому износу контактов при очень частых переключениях и в принципе не способен дать аналоговое, пропорциональное полю значение (только дискретное «замкнуто/разомкнуто»).
Пример кода
// Линейный (аналоговый) датчик Холла — пропорциональное измерение силы магнитного поля
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-цикл), геркон при медленном изменении магнитного поля может несколько раз быстро переключиться вблизи порогового расстояния, прежде чем установится в стабильном положении, что может потребовать программной фильтрации дребезга, аналогичной обработке обычных кнопок.
- Неучёт расстояния срабатывания, существенно различающегося между конкретными моделями и экземплярами модулей датчиков Холла/герконов — заявленное в общих описаниях «дальность обнаружения» часто относится к идеальным условиям с сильным магнитом конкретного типа, и реальное расстояние срабатывания для конкретного используемого магнита может быть значительно меньше ожидаемого; перед окончательной сборкой механической части проекта (определение точного расстояния между магнитом и датчиком) стоит явно протестировать реальное расстояние срабатывания с тем конкретным магнитом, который будет использоваться в финальной конструкции.