вторник, 23 августа 2016 г.

Ультразвуковой дальномер

Небольшая статья о HC-SR04. Подключение к ардуино, скетч, описание особенностей работы дальномера.


Для начала покажу сам ультразвуковой модуль


Модуль пяти вольтовый. Для запуска процесса измерения расстояния необходимо на ножке Trig установить логическую единицу на 10 микросекунд. Тогда ультразвуковой модуль установит логическую единицу на ножке Echo. Логическая единица будет на этой ножке столько, сколько потребуется звуку на прохождение пути до препятствия и обратно, но не более 38 миллисекунд.

К ардуино модуль подключается просто

Arduino --- HC-SR04
GND --- GND
5V --- VCC
D4 --- Trig
D5 --- Echo

Скетч

////////////////////////
//
// Arduino UNO
//
////////////////////////
//
// Sketch: HC-SR04
//

#include <util/delay.h>

const unsigned char TRIG = 4;
const unsigned char ECHO = 5;

unsigned int data = 0;

unsigned long int time1 = 0;
unsigned long int time2 = 0;

void setup()
{
    pinMode(TRIG, OUTPUT);
    digitalWrite(TRIG, LOW);

    pinMode(ECHO, INPUT);

    Serial.begin(9600);
}

void loop()
{
    _delay_ms(1000);

    digitalWrite(TRIG, HIGH);
    _delay_us(10);
    digitalWrite(TRIG, LOW);
    while( digitalRead(ECHO) == LOW ) ;
    time1 = micros();
    while( digitalRead(ECHO) == HIGH ) ;
    time2 = micros();

//    data = ((((time2 - time1) / 2.0) / 1000000.0) * 350.0) * 100.0;
    data = (time2 - time1) * 0.0175;

    Serial.println(data);
}

//
// End
//
////////////////////////

Скетч с интервалом в секунду передает измеренное расстояние через UART. Посмотреть результаты измерений можно в стандартном мониторе порта Arduino IDE (Сервис - Монитор порта).

Скажу несколько слов об особенностях программы на которые стоит обратить внимание. Конструкции типа while( digitalRead(ECHO) == LOW ) ; и while( digitalRead(ECHO) == HIGH ) ; не стоит применять в ответственных проектах. Это связано с тем, что в этих конструкциях программа может зациклится навсегда. В серьёзных проектах необходимо предусматривать альтернативную возможность завершения работы таких циклов. Можно использовать сторожевой таймер.

Расстояние с этой программой измеряется не очень точно. Причина в непостоянстве скорости звука. Она зависит от состава воздуха, температуры, давления и пр. В моем скетче скорость звука установлена в 350 м/с. Эта цифра получена опытным путем. Так как высокая точность в данном проекте не требуется, то калибровка прибора в программе не предусмотрена.

Очень полезно поиграть с этим дальномером перед использованием его в своих проектах. Стоит померить расстояние до предметов различной формы, с различным типом поверхности, под разными углами.

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

Расстояние к плоскому и гладкому предмету под острым углом замерить также непросто. Угол отражения равен углу падения. Отраженный предметом звук не попадает в приемник.