События‎ > ‎

Тест ультразвукового датчика расстояния HC-SR04

Отправлено 28 июл. 2012 г., 12:22 пользователем Олег Евсегнеев
Некоторое время назад мной был испытан ультразвуковой дальномер HC-SR04. Данное устройство было приобретено на ebay.com примерно за $3. Позднее я заказал еще 4 таких же, по бросовой цене $2.3 :)

Китайцы любезно предоставили мне архив с инструкциями по применению модуля, правда на своем языке и для модуля HC-SRF05. Благо HC-SR04 является достаточно распространенным дальномером и найти для него даташит не составило особого труда.

Модуль имеет 4 вывода: 
  1. Vcc - 5В;
  2. Trig - вход инциализации измерения;
  3. Echo - выход результатов измерения;
  4. GND - земля.
Принцип действия УЗ дальномера рассмотрен в нашей статье про сенсоры. Что касается общения датчика с контроллером то оно происходит следующим образом. Для того чтобы датчик начал измерение, необходимо подать 20мкс импульс на вход Trig. После этого сигнала, модуль делает 8 замеров в подряд и выдает на выход Echo импульс, длина которого пропорциональна измеренному расстоянию.

Как и всегда, для испытаний использовался контроллер mbed. Вывод результатов измерения осуществлялся на двухстрочный дисплей 1602. Схема собранного стенда весьма проста:



При составлении программы не было необходимости использовать какие-либо дополнительные библиотеки для работы с датчиком. Все кодируется достаточно просто, через обычный таймер и прерывания с цифровых входов. Мои впечатления от работы модуля только положительные. Расстояние измеряется с точностью до 0.5 см для расстояния 30см (длина линейки). При этом следует учитывать, что расстояние рассчитывается от края излучателя, а не от платы. Учитывая цену подобных устройств, сложно представить что-то более подходящее для использования в малобюджетных проектах. В итоге, как я уже отмечал, мной были заказаны еще 4 таких же модуля.

Что касается применения, то я планирую использовать дальномер для оценки расстояния от квадрокоптера до земли. Что касается остальных, то как правило дальномеры используются во всякого рода колесных роботах для измерения расстояния до препятствия, либо до противника.

Usonic lcd ranger

#include "mbed.h"
#include "TextLCD.h"

PwmOut led (LED1);
DigitalOut trig (p30);
InterruptIn echo (p29);

TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2); // rs, e, d4-d7
Timer tmr;
int delay = 0;
float range = 0.0;

// Clear and start the timer at the begining of the echo pulse
void rising(void) {
    tmr.reset();
    tmr.start();
}

// Stop and read the timer at the end of the pulse
void falling(void) {
    tmr.stop();
    delay=tmr.read_us();
}

float getRange(){
    // send a trigger pulse, 20uS long
    trig = 1;
    wait (0.000002);
    trig = 0;

    // Timer starts on rising edge of echo
    // Timer stopped and read on falling edge
    // wait 50ms as a time out (there might be no echos)
    wait(0.050);

    return delay/58.0;
}

int main() {
    echo.rise(&rising);
    echo.fall(&falling);
    
    lcd.cls();
    lcd.printf("Range:\n");
    
    while (1) {
        range = getRange();
        led = range/100.0; 
        lcd.locate(0,1);
        lcd.printf("%5.2f cm", range);
        wait(.1);
    }
}

Ну и итоговое видео.


Comments