Компонент · Датчик

Рычажный микропереключатель

Рычажный микропереключатель — датчик за бампером робота. Как подключить его с безопасным отказом, почему одно нажатие даёт девять фронтов и зачем нужен рычаг.

Что это такое

Рычажный микропереключатель — миниатюрный переключатель с мгновенным переключением — представляет собой механический контакт в небольшом пластиковом корпусе с выступающим металлическим рычагом. Нажмите на рычаг, и внутренняя пружина мгновенно замкнёт контакт; отпустите — пружина вернёт его обратно. Это один из старейших компонентов в данной библиотеке и один из самых полезных на роботе.

Именно мгновенное переключение делает микропереключатель компонентом робототехники. При нажатии контакт замыкается не постепенно, а скачком, в повторяемой точке и с характерным щелчком. Механизм, на который воздействует движущийся робот, при этом даёт определённый ответ «да или нет» — именно в такой ситуации плавный аналоговый датчик выдаёт бессмысленные значения.

Два наложенных графика. На верхнем показан сигнал переключателя примерно за шесть миллисекунд: исходный вывод переходит в низкий уровень, затем девять раз чередует высокий и низкий уровни за 4.7 миллисекунды до стабилизации в низком уровне, тогда как сигнал после устранения дребезга остаётся высоким до истечения окна и затем чисто переходит в низкий. На нижнем графике показано число фронтов, которые подсчитало бы прерывание: при увеличении окна устранения дребезга от нуля до восьми миллисекунд ступенчато оно падает с девяти до одного, достигая одного при 4.7 миллисекунды.
Главное, что нужно знать об этой детали: одно нажатие вызывает девять переходов примерно за 4.7 ms. Окно устранения дребезга короче дребезга подсчитывает ложные фронты, а окно, достаточно длинное для стабилизации, добавляет задержку, равную собственной длине. Скачать SVG

Как это работает

Три вывода: COM (общий), NO (нормально разомкнутый) и NC (нормально замкнутый). Без нажатия COM соединён с NC. При нажатии контакт мгновенно переключается на NO. Используют два из трёх выводов, а третий оставляют неподключённым.

Для бампера робота подключите COM к земле, а NO ко входу, включив внутреннюю подтяжку вывода вверх:

pinMode(BUMP_L, INPUT_PULLUP);              // idle HIGH
bool pressed = digitalRead(BUMP_L) == LOW;  // LOW means the bumper moved

Такое подключение обеспечивает безопасный отказ: при обрыве провода бампера вывод считывает HIGH, то есть отсутствие нажатия. При обратном подключении обрыв убедит робот в постоянном столкновении. Для аварийной остановки используйте NC: в этом случае обрыв должен остановить машину.

Рычаг меняет силу на ход. Штоку без рычага нужно около 1 N на пути примерно 1 mm; рычаг увеличивает перемещение, поэтому оболочка бампера может переместиться на 3–5 mm и сработать при значительно меньшем усилии. Ролик на конце уменьшает трение, когда по нему скользят, а не нажимают перпендикулярно.

Когда его следует использовать

Используйте такой переключатель везде, где робот должен знать, что он уже вступил в контакт: бамперы, концевые упоры руки или каретки, датчики крышки или ящика, а также детектор стыковки. Это последний резервный способ обнаружения, и это его достоинство: он находит чёрную ножку стула, стеклянную панель и препятствие на неподходящей высоте, которые пропускают все оптические и акустические датчики.

Это также единственный датчик, необходимый роботу покрытия со случайными отскоками. Два таких переключателя и генератор случайных чисел позволят обойти всю комнату — удивительный объём поведения для двух подвижных деталей.

Выбирайте другое решение, если столкновение нужно предотвращать, а не обнаруживать: для этого предназначен ультразвуковой датчик или датчик времени пролёта. Используйте оба: дальномер обходит большинство препятствий, а переключатель ловит те, которых он не видит.

Распространённые ошибки

  • Одно нажатие — девять фронтов. Устраните дребезг и никогда не подключайте прерывание, которое подсчитывает события: допустимо лишь прерывание, устанавливающее флаг или сохраняющее метку времени.
  • Корпус переключателя не является несущей деталью. Установите на оболочке бампера жёсткий упор, принимающий удар. Корпуса трескаются, и именно это убивает их намного раньше износа контактов.
  • Собственная пружина не вернёт бампер. Микропереключатель возвращает усилие 50–100 g. Для возврата используйте резиновые кольца или лёгкие пружины сжатия, оставив переключателю только функцию датчика.
  • Плоский бампер пропускает скользящие удары. Оберните оболочку хотя бы на 45° с каждой стороны и установите переключатель за каждой половиной, чтобы код знал, в какую сторону поворачивать.
  • Длинные провода собирают шум двигателя. Прокладывайте короткую трассу, скручивайте пару и полагайтесь на низкоомный путь через подтягивающий резистор при замыкании.
  • Номинальные контактные параметры рассчитаны на сеть, а не на логику. От переключателя с параметрами 5 A при 125 V AC здесь требуется пропустить микроамперы; номинал ничего полезного не говорит о ресурсе в этой задаче. Полезны предварительный ход и усилие срабатывания.

Подключение

Используются два из трёх выводов, и выбор между ними определяет поведение робота при неисправности.

Применение COM подключён к Сигнал с Состояние покоя Обрыв провода считывается как
Бампер GND NO, вывод INPUT_PULLUP HIGH Не нажат — безопасно
Аварийная остановка GND NC, вывод INPUT_PULLUP LOW Нажат — безопасно
Любое из них с внешней подтяжкой GND NO или NC, 10 kΩ на VCC — Как указано выше

Различие важно. Бампер, подключённый к NO, безопасно считывает «столкновения нет», и это правильно: робот с повреждённым проводом бампера должен продолжать движение, а не замирать. Аварийная остановка, подключённая к NC, безопасно считывает «остановлено», что по противоположной причине также правильно.

Используйте внутреннюю подтяжку. Она ничего не стоит, не требует компонентов и задаёт определённое состояние покоя. Вывод, оставленный как INPUT с подключённым переключателем, при разомкнутом контакте находится в плавающем состоянии и считывает любой посторонний электрический шум, которого на роботе с двигателями очень много.

Устранение дребезга

Одно нажатие вызывает примерно девять переходов за около 4.7 ms, пока контакты замыкаются и отскакивают. Наивное чтение вывода в программном обеспечении воспринимает девять нажатий.

const int BUMP_L = 2, BUMP_R = 3;
const unsigned long DEBOUNCE_MS = 8;      // longer than the ~5 ms bounce

struct Bumper {
  uint8_t pin;
  bool stable;            // the debounced state
  bool lastRead;
  unsigned long changedAt;
};

Bumper left  = {BUMP_L, true, true, 0};
Bumper right = {BUMP_R, true, true, 0};

// Returns true on the frame the bumper newly closes.
bool update(Bumper &b) {
  bool now = digitalRead(b.pin);          // HIGH = open, with INPUT_PULLUP
  if (now != b.lastRead) {
    b.lastRead = now;
    b.changedAt = millis();               // restart the timer on any edge
    return false;
  }
  if (millis() - b.changedAt >= DEBOUNCE_MS && b.stable != now) {
    b.stable = now;
    return (now == LOW);                  // newly pressed
  }
  return false;
}

void setup() {
  pinMode(BUMP_L, INPUT_PULLUP);
  pinMode(BUMP_R, INPUT_PULLUP);
}

void loop() {
  if (update(left))  { backUp(); turnRight(); }
  if (update(right)) { backUp(); turnLeft(); }
}

Важная структурная особенность — таймер перезапускается на каждом фронте, а не выполняет одно чтение и ожидание. Фиксированный подход «прочитать и подождать» может попасть внутрь дребезга и зафиксировать неверное значение; перезапуск окна принимает состояние только после того, как вывод оставался неизменным в течение всего интервала.

Почему не прерывание

Прерывания от бамперного переключателя — ловушка, причём вполне определённая:

  • Никогда не подключайте прерывание, которое подсчитывает события. Девять фронтов превращаются в девять отсчётов, а устранение дребезга внутри ISR требует millis(), которые на AVR внутри ISR не увеличиваются.
  • Прерывание, устанавливающее флаг, допустимо, если дребезг устраняется в главном цикле. Но опрос переключателя с частотой 100 Hz ничего не стоит, а цикл робота уже выполняется.
  • Оставьте D2 и D3 для энкодеров на Uno. Это единственные два вывода внешних прерываний, и энкодерам они действительно нужны. Бамперу — нет.

Единственный случай, оправдывающий прерывание, — жёсткая аварийная остановка, которая должна отключить двигатели даже при зависании главного цикла. Лучше подключить переключатель к разрешающему выводу драйвера двигателя, чтобы остановка работала вообще без программного обеспечения.

Крепление: именно оно определяет работоспособность

Всё описанное выше — решённые задачи. Механическая конструкция определяет, будут ли бамперы работать.

Удар принимает оболочка, а не переключатель. Корпус микропереключателя тонкий пластиковый и трескается при прямом ударе. Создайте поворачивающуюся или сдвижную оболочку бампера, установите жёсткий упор, принимающий усилие, и поручите переключателю фиксировать небольшое перемещение в конце хода.

Оберните оболочку. Плоский передний бампер пропускает всё, что ударяется под углом, а робот, навигирующий по дальномерам, чаще всего сталкивается именно под углом: препятствия прямо перед ним уже обнаружены. Оберните оболочку хотя бы на 45° с каждой стороны.

Два переключателя, а не один. Слева и справа, за двумя половинами оболочки. Один переключатель сообщает, что произошло столкновение; два — в какую сторону поворачивать. Разница в поведении огромна, а дополнительная стоимость составляет около двадцати центов.

Переключатели Что узнаёт робот Возможное поведение
1, по центру Произошло столкновение Отъехать, повернуть в случайном направлении
2, слева и справа Какая сторона задела препятствие Отъехать, повернуть от точки контакта
3, добавить задний Также что робот въехал задним ходом Выбраться из застревания

Возвращайте бампер собственной пружиной. Внутренняя пружина микропереключателя создаёт лишь усилие 50–100 g, недостаточное для надёжного возврата оболочки с трением в оси. Используйте резиновые кольца или лёгкие пружины сжатия, оставив переключателю только датчик.

Установите предварительный ход так, чтобы оболочка двигалась до конечного положения переключателя. Переключатель срабатывает после 1–3 mm и имеет небольшой дополнительный ход сверх этого. Жёсткий упор оболочки должен наступать в пределах этого дополнительного хода, иначе удар примет внутренний механизм переключателя.

Как выбрать

Тип рычага Усилие срабатывания Лучшее применение
Без рычага (шток) ~1 N на пути ~1 mm Концевые упоры с точным механизмом
Короткий прямой рычаг 0.5–0.8 N Универсальные бамперы
Длинный прямой рычаг 0.2–0.5 N Лёгкие оболочки бамперов, хрупкие контакты
Роликовый рычаг 0.5–1 N Всё, по чему скользят, а не нажимают перпендикулярно
Имитация ролика (изогнутый рычаг) 0.5–1 N Более дешёвая альтернатива ролику

Номинальные контактные параметры здесь несущественны. От переключателя с параметрами 5 A при 125 V AC требуется пропустить несколько микроамперов в подтягивающий резистор. Важна механическая спецификация: усилие срабатывания, предварительный ход и номинальный механический ресурс (10⁵–10⁷ переключений). Робот, совершающий по сто бамперных ударов за заезд, достигает 10⁵ переключений после тысячи заездов, поэтому механический ресурс фактически неограничен: переключатель раньше погибнет от треснувшего корпуса.

Диагностика

Симптом Вероятная причина Исправление
Одно нажатие вызывает несколько срабатываний Дребезг не устранён Использовать приведённый выше алгоритм с окном 8 ms
Постоянно считывается нажатие Подключён NC вместо NO Переключиться на вывод NO
Случайные показания при отсутствии касания Вывод находится в плавающем состоянии INPUT_PULLUP или внешний 10 kΩ
Ложные срабатывания при работе двигателей Длинные неэкранированные провода собирают шум Укоротить и скрутить пару; добавить конденсатор 100 nF параллельно выводу
Бампер не возвращается Используется собственная пружина переключателя Добавить резиновые кольца или возвратную пружину
Переключатель треснул после нескольких столкновений Удар проходит через корпус Установить жёсткий упор, на который оболочка ударяется первой
Пропускает столкновения под углом Плоский бампер Обернуть оболочку на 45° с каждой стороны
Робот отступает и снова задевает то же препятствие Один переключатель, нет данных о направлении Использовать два переключателя и отворачивать от сработавшего
Работает на стенде, но не на роботе Проблема геометрии бампера, а не электроники Толкать оболочку вручную под разными углами и наблюдать за выводом

Почему эта дешёвая деталь заслуживает места

У любого другого датчика робота есть поверхности, которых он не видит. Ультразвуковой датчик не замечает шторы и стены под крутым углом. VL53L0X не видит чёрные матовые поверхности, зеркала и другие предметы при ярком солнечном свете. Камере нужен свет.

У микропереключателя такого списка нет. Если что-то касается бампера, контакт замыкается. Это делает его последним резервным способом обнаружения, а на роботе, который должен долго работать без присмотра, — самой дешёвой доступной мерой надёжности: два переключателя, два вывода и около сорока центов.

Удивительно, но его также достаточно самостоятельно. Робот с двумя бамперными переключателями и случайным поворотом при контакте за достаточное время обойдёт всю комнату — именно так работали первые поколения роботов-пылесосов, и это стоит понять до перехода к чему-либо более сложному.

Исследуйте граф

Используется в этих сборках

Проекты, учебные пути и симуляторы, в которых используется Рычажный микропереключатель.

Вопросы

Рычажный микропереключатель: частые вопросы

Для чего на роботе используется рычажный микропереключатель?

Это датчик за бампером. Упругая оболочка поперёк передней части робота нажимает переключатель при столкновении и передаёт коду однозначный бит — «я столкнулся» — который ни оптический, ни акустический датчик не обеспечивают столь надёжно. Он позволяет обнаружить чёрную ножку стула, стеклянную панель или препятствие на неподходящей для дальномера высоте.

Как следует подключить переключатель: нормально разомкнутым или нормально замкнутым?

Для бампера — нормально разомкнутым на землю, с подтянутым вверх выводом. Тогда обрыв провода считывается как отсутствие нажатия, и повреждённый провод не может убедить робот в постоянном столкновении. Для аварийной остановки используйте нормально замкнутый контакт: там безопасный отказ противоположен — обрыв должен остановить машину.

Почему одно нажатие регистрируется несколько раз?

Из-за дребезга контактов. Металлический контакт приходит, отклоняется, размыкается и снова приходит несколько раз в первые миллисекунды, а микроконтроллер с частотой дискретизации в несколько мегагерц воспринимает каждый фронт как реальный. Модельный рычажный переключатель даёт девять переходов примерно за 4.7 ms. Выполняйте устранение дребезга программно, игнорируя сигнал в течение заданного после принятия интервала, и никогда не подключайте прерывание, которое подсчитывает события.

Для чего на самом деле нужен рычаг?

Он меняет силу на ход. Для штока без рычага требуется 1–1.5 N на пути примерно 1 mm; рычаг увеличивает перемещение, поэтому оболочка бампера может переместиться на 3–5 mm и сработать при значительно меньшем усилии. Это важно: оболочка бампера должна перемещаться достаточно для надёжного срабатывания и достаточно легко, чтобы не сдвигать небольшие препятствия до срабатывания.

Нужен ли подтягивающий резистор?

Нет — используйте внутреннюю подтяжку микроконтроллера с INPUT_PULLUP. Она бесплатна, не требует дополнительной детали в наиболее подверженном ошибкам месте робота, а низкоомный путь к земле при замыкании переключателя не позволяет длинному проводу бампера собирать шум от расположенного рядом драйвера двигателя.

Дополнительные материалы

Источники