Подключение шарикового датчика наклона к Arduino
Если вы хотите обнаруживать перемещение, наклон или тряску чего-либо без сложностей `акселерометра `_, шариковый датчик наклона может стать самым бюджетным вариантом.
Обзор
Шариковый датчик наклона — это, по сути, переключатель, который может обнаруживать базовое движение, ориентацию или наклон. Эти переключатели спроектированы так, что при достаточном наклоне электрическое соединение замыкается или размыкается. Такой сигнал может использоваться как индикатор или для включения и выключения чего-либо.
Они компактные, дешёвые, простые в использовании и никогда не изнашиваются. Их простота делает их популярными для применения в игрушках, гаджетах, роботах и других устройствах, работа которых зависит от наклона. Поэтому их иногда называют «акселерометр для бедных».
Хотя все датчики наклона работают практически одинаково, их размеры и характеристики могут незначительно отличаться.
Размеры |
5.5mm (0.22») диаметр и 13.5mm (0.53») длина |
|---|---|
Максимальное рабочее напряжение (VCC) |
До 20V |
Максимальный рабочий ток (Imax) |
30mA |
Диапазон чувствительности |
Движения от 5 до 10 градусов |
Срок службы |
50 000+ циклов (переключений) |
Датчик наклона и акселерометр
Хотя датчик наклона не так точен и гибок, как акселерометр, он вполне способен обнаруживать движение или ориентацию. Ещё одно преимущество использования датчика наклона в том, что он может работать как самостоятельный датчик. Акселерометр же выдаёт цифровой или аналоговый сигнал, который должен анализироваться дополнительной схемой.
Как работают шариковые датчики наклона?
Шариковый датчик наклона обычно состоит из металлической трубки с небольшим металлическим шариком внутри. На одном конце полости расположены два проводящих элемента (контакта). Датчик спроектирован так, что при достаточном наклоне шарик перекатывается, замыкая или размыкая электрическое соединение.
Когда датчик расположен вертикально, шарик касается контактов и замыкает электрическую цепь. При наклоне датчика шарик откатывается от контактов и цепь размыкается.
Тестирование шарикового датчика наклона
Протестировать шариковый датчик наклона очень просто. Переведите мультиметр в режим «прозвонки» и прикоснитесь щупами к двум выводам. Затем наклоняйте датчик, чтобы определить угол, при котором переключатель открывается и закрывается.
В вертикальном положении переключатель замкнут (полная проводимость).
В перевёрнутом положении переключатель разомкнут (нет проводимости).
Схема подключения шарикового датчика наклона к Arduino
Подключить датчик наклона к Arduino довольно просто. Всё, что вам нужно — подключить один вывод к любому цифровому выводу Arduino, а другой — к GND.
При таком подключении вам потребуется активировать встроенный подтягивающий резистор Arduino для входного вывода. В противном случае необходимо использовать внешний подтягивающий резистор 10 кОм в вашей схеме.
На следующей иллюстрации показана схема подключения.
Код Arduino — считывание шарикового датчика наклона
Ниже представлен очень простой скетч Arduino, который включает встроенный светодиод (подключённый к выводу 13) при наклоне датчика в одну сторону и выключает при наклоне в другую.
const int tiltPin = 2; // tilt sensor pin is connected to pin 2
const int ledPin = 13; // built-in LED is connected to pin 13
void setup() {
pinMode(tiltPin, INPUT); // set sensor pin as an INPUT pin
digitalWrite(tiltPin, HIGH); // turn on the built in pull-up resistor
pinMode(ledPin, OUTPUT); // set LED pin as an OUTPUT pin
}
void loop() {
if (digitalRead(tiltPin)) { // check if the pin is high
digitalWrite(ledPin, HIGH); // turn on the LED
}
else { // if it isn't
digitalWrite(ledPin, LOW); // do the opposite
}
}
Код довольно понятен. Сначала определяются две константы, указывающие выводы Arduino, к которым подключены датчик наклона и встроенный светодиод. В setup вывод датчика настраивается как вход, а вывод светодиода — как выход. Также включается внутренний подтягивающий резистор для вывода датчика. В loop встроенный светодиод включается, если вывод датчика в состоянии HIGH, иначе выключается.
Это довольно короткий скетч, работает отлично, но есть проблема. Если вы наблюдали за светодиодом при наклоне датчика, вы могли заметить мерцание. Это связано с явлением, называемым «дребезг контактов».
Что такое дребезг контактов и как с ним бороться?
Когда датчик направлен вверх, шарик перекатывается на контакты и замыкает их, действуя как переключатель. В идеальном мире, если подключить это к анализатору сигналов, мы должны увидеть сигнал, который выглядит так:
Так должен работать шариковый датчик наклона, и именно так думает большинство людей. Однако в реальности это выглядит скорее так:
В идеале контакт должен быть мгновенным. Вместо этого шарик немного подпрыгивает, делая контакт то замкнутым, то разомкнутым и т.д. Это чисто механическое явление, известное как «дребезг контактов», похожее на падение мяча — он подпрыгивает, прежде чем окончательно приземлиться на поверхность.
Поэтому сигнал несколько раз поднимается и опускается, прежде чем окончательно стабилизируется. Это происходит за период времени (t). Хотя этот период очень короткий и кажется нам почти мгновенным, для Arduino это огромный промежуток времени. За это время он может выполнить множество инструкций.
Процесс устранения дребезга контактов называется «антидребезг» (Debouncing) и может быть реализован программно. Обычно дребезг контактов происходит в пределах окна 50 мс. Поэтому задержки в 50 мс после обнаружения переключения достаточно для его устранения.
Код Arduino — считывание шарикового датчика наклона (более надёжно)
Вот новый скетч, демонстрирующий антидребезг входного сигнала. В этом скетче мы считываем датчик наклона дважды за короткий промежуток времени, чтобы убедиться, что он действительно наклонён.
Загрузите его на Arduino. Теперь вы увидите, что светодиод больше не мерцает при наклоне датчика (если проблема сохраняется, попробуйте увеличить время антидребезга).
const int tiltPin = 2; // tilt sensor pin is connected to pin 2
const int ledPin = 13; // built-in LED is connected to pin 13
int ledState = HIGH; // the current state of the LED
int tiltState; // the current reading from the sensor
int lastTiltState = LOW; // the previous reading from the sensor
unsigned long time = 0; // the last time the output pin was toggled
unsigned long debounceDelay = 50; // the debounce time, increase if the output flickers
void setup() {
pinMode(tiltPin, INPUT); // Set sensor pin as an INPUT pin
digitalWrite(tiltPin, HIGH); // turn on the built in pull-up resistor
pinMode(ledPin, OUTPUT); // Set LED pin as an OUTPUT pin
}
void loop() {
// read the state of the tilt sensor
tiltState = digitalRead(tiltPin);
// If the sensor really tilted?
if (tiltState != lastTiltState) {
// reset the debouncing timer
time = millis();
}
if ((millis() - time) > debounceDelay) {
// whatever the switch is at, its been there for a long time
// so lets settle on it!
ledState = tiltState;
}
digitalWrite(ledPin, ledState);
// Save the last tiltState so we keep a running tally
lastTiltState = tiltState;
}
Объяснение кода:
Скетч начинается с объявления выводов Arduino, к которым подключены датчик наклона и встроенный светодиод.
const int tiltPin = 2;
const int ledPin = 13;
Три целочисленные переменные ledState, tiltState и lastTiltState определены для хранения текущего состояния светодиода, текущего показания датчика и предыдущего показания датчика соответственно.
int ledState = HIGH;
int tiltState;
int lastTiltState = LOW;
В той же глобальной области определены две переменные для хранения времени последнего события наклона и времени антидребезга. Обратите внимание, что эти переменные являются unsigned long, так как время (измеряемое в миллисекундах) быстро становится большим числом и переполняет целочисленную переменную.
unsigned long time = 0;
unsigned long debounceDelay = 50;
Раздел setup аналогичен предыдущему: мы настраиваем вывод датчика как вход, а вывод светодиода как выход; также включаем внутренний подтягивающий резистор для вывода датчика.
void setup() {
pinMode(tiltPin, INPUT);
digitalWrite(tiltPin, HIGH);
pinMode(ledPin, OUTPUT);
}
В loop мы сначала считываем состояние датчика наклона и проверяем, отличается ли оно от предыдущего состояния (из-за наклона или помех). Если оно отличается, мы фиксируем это событие, сохраняя текущее время. Для этого используется функция `millis() `_, которая отслеживает время, прошедшее с момента запуска текущей программы на плате Arduino.
tiltState = digitalRead(tiltPin);
if (tiltState != lastTiltState) {
time = millis();
}
Далее мы проверяем, изменилось ли состояние датчика в течение окна 50 мс (debounceDelay). Если нет, значит датчик действительно наклонён (а не из-за дребезга). Затем мы переключаем светодиод и сохраняем последнее состояние наклона для отслеживания.
if ((millis() - time) > debounceDelay) {
ledState = tiltState;
}
digitalWrite(ledPin, ledState);
lastTiltState = tiltState;