Компонент · Датчик
Рычажный микропереключатель
Рычажный микропереключатель — датчик за бампером робота. Как подключить его с безопасным отказом, почему одно нажатие даёт девять фронтов и зачем нужен рычаг.
Что это такое
Рычажный микропереключатель — миниатюрный переключатель с мгновенным переключением — представляет собой механический контакт в небольшом пластиковом корпусе с выступающим металлическим рычагом. Нажмите на рычаг, и внутренняя пружина мгновенно замкнёт контакт; отпустите — пружина вернёт его обратно. Это один из старейших компонентов в данной библиотеке и один из самых полезных на роботе.
Именно мгновенное переключение делает микропереключатель компонентом робототехники. При нажатии контакт замыкается не постепенно, а скачком, в повторяемой точке и с характерным щелчком. Механизм, на который воздействует движущийся робот, при этом даёт определённый ответ «да или нет» — именно в такой ситуации плавный аналоговый датчик выдаёт бессмысленные значения.
Как это работает
Три вывода: 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. Она бесплатна, не требует дополнительной детали в наиболее подверженном ошибкам месте робота, а низкоомный путь к земле при замыкании переключателя не позволяет длинному проводу бампера собирать шум от расположенного рядом драйвера двигателя.
Дополнительные материалы