Уроки технологии
Технология Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Arduino Pulsein

Поначалу может быть довольно сложно понять функцию Arduino pulseIn(). Однако эта функция может быть очень полезна для считывания данных с определенных датчиков. В этом уроке я объясню, что такое импульс, как работает функция pulseIn() и как использовать ее в ваших собственных программах.

Что такое пульс?

Сначала будет измерен импульс цифрового сигнала. Цифровой сигнал может иметь только два состояния: ВЫСОКИЙ или НИЗКИЙ. ВЫСОКИЙ означает, что напряжение близко к источнику питания, например 5 В на Arduino Uno или 3,3 В на Arduino Due. НИЗКИЙ означает, что сигнал близок к 0 В. Вы учитесь использовать Arduino для создания собственных проектов? Ознакомьтесь с Arduino для начинающих и учитесь шаг за шагом. Итак, импульс может иметь 2 представления: Либо сигнал, который переходит от LOW к HIGH, а затем от HIGH к LOW (см. изображение ниже). В этом случае импульс представляет собой ВЫСОКИЙ сигнал, и я буду называть его импульсом ВЫСОКОГО режима. Или сигнал, который переходит от ВЫСОКОГО к НИЗКОМу, а затем от НИЗКОГО к ВЫСОКЕМУ (см. изображение ниже). В этом случае импульс является сигналом LOW, и я назову его импульсом с режимом LOW. Итак, по сути, импульс — это изменение сигнала в течение (обычно) короткого периода времени. И теперь, когда вы понимаете, что такое пульс, что же вы можете делать, когда у вас есть пульс? Одна из возможностей — измерить длительность этого импульса. Импульс может быть пропорционален значению, которое вы хотите считать. Например, при использовании ультразвукового датчика с Arduino ультразвуковой датчик вернет расстояние до ближайшего препятствия. Это расстояние фактически будет представлено импульсом, длина которого пропорциональна расстоянию. Затем вам нужно прочитать этот импульс и измерить его длительность, чтобы вычислить расстояние.

Объяснение функции Arduino pulseIn()

Давайте продолжим наш пример импульса, чтобы понять функцию Arduino pulseIn(). А затем напишем код Arduino. Вот иллюстрация, чтобы лучше понять следующие пояснения (импульс в режиме ВЫСОКИЙ). Итак, функция pulseIn() просто вернет длительность импульса. Вот что происходит с ```pulseIn()`` — в режиме HIGH (как на изображении выше):

  • Вы вызываете ```pulseIn()`` в своем коде в режиме HIGH. При этом напряжение должно быть НИЗКИМ.
  • pulseIn() будет ждать изменения сигнала с LOW на HIGH с тайм-аутом. Все это время выполнение программы блокируется.
  • Когда сигнал изменится с НИЗКОГО на ВЫСОКИЙ, pulseIn() начнет измерять длительность импульса.
  • Когда сигнал возвращается из HIGH в LOW, pulseIn() вычисляет длительность импульса и возвращает ее, чтобы вы могли использовать ее в своем коде. Для pulseIn() в режиме LOW:
  • Вы вызываете ```pulseIn()`` в режиме LOW. В это время напряжение должно быть ВЫСОКИМ.
  • pulseIn() заблокирует программу и будет ждать изменения сигнала с ВЫСОКОГО на НИЗКИЙ с тайм-аутом.
  • Он начнет измерять длительность импульса, когда сигнал изменится с ВЫСОКОГО на НИЗКИЙ.
  • И когда сигнал возвращается к HIGH, pulseIn()`` возвращает длительность импульса. В обоих сценариях, если импульс не произошел по истечении указанного таймаута, ``pulseIn() просто вернет 0.

Схема, которую мы будем использовать для проверки pulseIn()

Чтобы провести очень простой тест, мы создадим схему Arduino с кнопкой. В этой схеме мы имеем:

  • Кнопка, которую вы подключаете посередине макета.
  • Резистор 10кОм подключен между одной ножкой кнопки и массой (GND). Этот резистор будет действовать как понижающий резистор и обеспечивать низкий уровень сигнала кнопки, когда она не нажата.
  • Провод между ножкой кнопки (важно: с той стороны, куда вы подключили резистор) и цифровым выводом, например 4.
  • Провод между другой ножкой кнопки (стороной, отличной от резистора и цифрового контакта) и 5В. [отметьте это, если хотите получить дополнительную информацию о выводах Arduino] (/arduino-uno-pins-a-complete-practical-guide/) Кнопка поможет нам создать пульс. При использовании понижающего резистора сигнал по умолчанию будет НИЗКИМ. Когда вы нажмете кнопку, сигнал изменится с НИЗКОГО на ВЫСОКИЙ, а когда вы отпустите кнопку, сигнал изменится с ВЫСОКОГО на НИЗКИЙ. Это пульс. Чем дольше мы будем нажимать кнопку, тем дольше будет пульс. И этот импульс будет в ВЫСОКОМ режиме. Примечание: если вам нужен импульс в режиме LOW, вам придется заставить резистор действовать как подтягивающий резистор – подключенный к 5 В, а не к GND, а также переместить провод, подключенный к цифровому контакту 4, на другую сторону кнопки. . Таким образом, сигнал будет ВЫСОКИМ по умолчанию и НИЗКИМ при нажатии кнопки. В этом варианте вместо использования внешнего подтягивающего резистора вы также можете использовать Режим INPUT_PULLUP.

В дальнейшем мы сохраним конфигурацию с понижающим резистором и будем использовать pulseIn() с режимом HIGH.

Код с Arduino pulseIn()

Использовать в вашем коде pulseIn() на самом деле очень просто. Самое сложное — понять, что он делает.

The code

#define BUTTON_PIN 4 

void setup()                                          
    {                                                       
        Serial.begin(9600);                                 
        pinMode(BUTTON_PIN, INPUT);                         
    }                                                       
    void loop()                                             
    {                                                       
        unsigned long duration = pulseIn(BUTTON_PIN, HIGH); 
        Serial.println(duration);                           
    }

Here’s what we do in the code:

Setup

#define BUTTON_PIN 4 

void setup() 
{ 
    Serial.begin(9600); 
    pinMode(BUTTON_PIN, INPUT); 
}

Здесь нет ничего особенного, мы просто устанавливаем цифровой вывод кнопки на INPUT в функции setup(). Это обязательный шаг: если вы хотите использовать ```pulseIn()``, вам необходимо установить режим вывода как INPUT. Мы также инициализируем последовательную связь, чтобы позже можно было распечатать длительность импульса.

Измерьте и распечатайте пульс

void loop() 
{ 
    unsigned long duration = pulseIn(BUTTON_PIN, HIGH); 
    Serial.println(duration); 
}

Наш тест прост: в функции цикла() мы вызываем pulseIn(), которая будет выполняться снова и снова, пока мы не отключим плату Arduino. При использовании pulseIn()`` вы должны указать как минимум два аргумента: сначала вывод, с которым вы хотите работать, а затем режим импульса – ВЫСОКИЙ или НИЗКИЙ. Здесь, поскольку мы хотим измерить длительность, когда импульс ВЫСОКИЙ (с состоянием по умолчанию НИЗКИЙ), мы используем режим ВЫСОКИЙ. pulseIn()``` вернет длительность импульса в микросекундах, а тип данных для этого — unsigned long. Затем мы печатаем продолжительность на последовательном мониторе.

Запускаем код

Если вы запустите этот код на своем Arduino с помощью схемы кнопки, вы сначала увидите, что каждую секунду печатается 0. Это связано с тем, что функция Arduino pulseIn()`` имеет тайм-аут по умолчанию, равный 1 секунде. При вызовеpulseIn()будет ждать перехода сигнала от LOW к HIGH. Если этого не произойдет по истечении 1-секундного таймаута (по сути, импульс не начался),pulseIn()`` просто вернет 0, поэтому программа не блокируется слишком долго просто так. Если нажать на кнопку, таймаут уже не играет никакой роли. Итак, если вы нажмете + отпустите кнопку, то сразу после отпускания вы увидите число, соответствующее длительности импульса в микросекундах. Это значение здесь, с этой схемой кнопки, покажет вам, как долго вы нажимали кнопку. Для других датчиков это значение может означать что-то другое, и вам придется выполнить некоторые вычисления в своем коде.

Измените тайм-аут ```pulseIn()``

Если вы хотите установить собственный тайм-аут для pulseIn()``, вы можете сделать это, добавив третий (необязательный) аргумент в функцию. Например: беззнаковая длинная длительность = PulseIn(BUTTON_PIN, HIGH, 5000000); Два первых аргумента по-прежнему представляют собой вывод и режим импульса. Третий аргумент — таймаут в микросекундах. Здесь я использовал 5 000 000, что соответствует 5 секундам. Это означает, что при вызовеpulseIn()будет ждать максимум 5 секунд до начала импульса. Если импульс не начался по истечении 5 секунд,pulseIn()`` возвращает 0.

Рекомендации по использованию функции Arduino pulseIn()

В этой статье вы узнали, что такое импульс, как работает функция «pulseIn()» и как использовать ее в своем коде. Как вы видели, функция полностью блокирует программу. Если длина вашего пульса составляет 10 секунд, то функция «pulseIn()» заблокирует вашу программу на 10 секунд. А если импульс не будет обнаружен, программа заблокируется на время таймаута — по умолчанию одна секунда. Поэтому лучше всего использовать pulseIn()`` только тогда, когда вам это понадобится. Например, при использовании ультразвукового датчика сначала нужно вызвать датчик, а затем дождаться ответа. В этом случае вы будете использоватьpulseIn()сразу после срабатывания датчика, а не каждый раз при входе в цикл void(). Кроме того, не используйте слишком большой тайм-аут, если в этом нет необходимости. В некоторых ситуациях может возникнуть соблазн значительно увеличить тайм-аут, чтобы не пропустить импульс, но, поступая так, вы задержите все остальное в вашей программе. И, наконец, скорее в качестве улучшения, вы могли бы [повторите поведение ```pulseIn()```, просто используя прерывания на выводе](/arduino-pulsein-with-interrupts/). Это немного сложнее сделать, но оно того стоит. Вам придется подключить прерывание к выводу и отслеживать время начала импульса (например, сигнал меняется с НИЗКОГО на ВЫСОКИЙ). Тогда вы также сохраните время окончания импульса и [вычислите разницу](/arduino-compute-duration-code-example/) между этими двумя значениями времени. Эта разница даст вам длительность импульса, и весь процесс ничего не заблокирует в вашей программе. Это может быть полезно, когда у вас очень длинные импульсы или если вам нужно часто вызывать ```pulseIn().