Posted by lex232 on

Датчики наклона KY-020 и SW-520D для Arduino

Датчики наклона KY-020 и SW-520D для Arduino

Иногда в проекте возникает необходимость отслеживать наклон, смещение, поворот или вибрацию. Методов сделать это — очень много, от сложных, используя акселерометр, до самых простых датчиков. Совсем недавно у меня появилась задача зафиксировать изменение положение объекта в пространстве, и для теста я заказал два простых датчика, о которых почему-то почти нет информации. Первым оказался датчик наклона KY-020 (имеет и другие разновидности в индексе)

Датчики наклона KY-020 и SW-520D для Arduino

В качестве второго датчика выбор пал на SW-520D, он меня привлёк обвязкой в виде микросхемы, и регулировкой, хотя до теста разницы я не понимал

Датчики наклона KY-020 и SW-520D для Arduino

У второго варианта всё ясно с распиновкой, контакты строго подписаны D0 — сигнал, GND и VCC — соответственно питание. У первого же не всё так понятно, но можно догадаться, что S — сигнал, «-» — земля, а оставшийся центральный пин — VCC.

Датчики наклона KY-020 и SW-520D для Arduino

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

Смотрите также:  led cube
Датчики наклона KY-020 и SW-520D для Arduino

Схема датчика наклона KY-20 исключительно простая, хотя на алиэкспресс я встречал просто датчик впаянный в плату. Здесь же присутствует сопротивление, которое подтягивает сигнальный выход к питанию, а сам датчик при срабатывании замыкается на землю.

Датчики наклона KY-020 и SW-520D для Arduino

Так что, можно, не включать программную подтяжку и работать так. Попробуем посмотреть, как вообще ведёт себя сигнальная линия, перед тем как писать код. Я сначала переворачивал датчик медленно туда-сюда, а потом потряс его быстро. Вот что получилось

Датчики наклона KY-020 и SW-520D для Arduino

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

Датчики наклона KY-020 и SW-520D для Arduino

В принципе этот минус легко побороть программно, особенно если нам нужно зафиксировать просто факт наклона. А вот у второго датчика, благодаря дополнительной обработке этого недостатка нет. Посмотрим общие состояния

Датчики наклона KY-020 и SW-520D для Arduino

Всё тоже самое — медленно переворачивал, а затем потряс датчик. Посмотрим в увеличенном виде процесс перехода из одного состояния в другое

Смотрите также:  Голова для робота waybot
Датчики наклона KY-020 и SW-520D для Arduino

Выглядит намного лучше, чем в первом случае. Должно быть понятно — что мы работаем с этими датчиками, как с обычными кнопками, поэтому код «как зажечь светодиод» таким датчиком мусолить не будем. У меня появилась задача по интереснее. Нужно запустить действие, при неоднократном срабатывании такого датчика — т.е. нужно его активно потрясти, чтобы произошло срабатывание. Выберем любой пин, куда мы подключим датчик

#define vibration 19

Также нам понадобится переменная текущего состояния датчика и переменная накопления количества трясок.

uint8_t readSensor = 0;
uint8_t valCrash = 0;

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

  if (digitalRead(vibration) == readSensor)          // Если состояние датчика равно переменной состояния
  {
    readSensor = !readSensor;                        // Меняем переменную состояния на противоположное значение
    valCrash++;                                      // Инкрементируем счётчик трясок
    if (valCrash > 20)                               // Если количество трясок более 20, то делаем действие
    {
      // Любое действие
      valCrash = 0;                                  // Обнуляем счётчик трясок 
    }
  }

Также можно вставить небольшую задержку, чтобы исключить дребезг (микроконтроллер может считывать состояние датчика слишком быстро), но у меня и так всё отлично заработало. Также спустя, например 10 секунд, счётчик трясок можно обнулять, но как это сделать без delay, мы уже рассматривали в статье, так-что без труда и сами допишете такой код. В следующей статье мы будем использовать этот датчик, чтобы сделать электронный кубик, который будет активироваться именно таким способом.

Смотрите также:  Динамическая индикация в Arduino, на примере led-матрицы 8х8 + uln2803