Датчики

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

HC-SR04Ультразвуковой дальномер HC-SR04 представляет собой простое и дешевое решение задачи измерения расстояния, не превышающего 4 м. Несложный принцип работы и небольшие габариты сделали датчик популярным среди любителей электроники и робототехники.

Принцип действия HC-SR04 основан на хорошо известном явлении эхолокации. При его использовании излучатель формирует акустический сигнал, который отразившись от преграды, возвращается к датчику и регистрируется приемником. Зная скорость распространения ультразвука в воздухе (примерно 340м/с) и время запаздывания между излученным и принятым сигналом, легко рассчитать расстояние до акустической преграды.

Внешний вид HC-SR04
Внешний вид HC-SR04

Характеристики HC-SR04.

  • Напряжение питания:+5В
  • Ток ожидания: <2mA
  • Ток, потребляемый в рабочем режиме: 15mA
  • Измеряемое расстояние: 2см – 400см
  • Частота импульсов: 40кГц
  • Разрешение: 0.3см
  • Угол измерения: 30°
  • Импульс запуска измерения: 10uS
  • Габаритные размеры: 45мм x 20мм x 15мм

Для подключения к схеме измерения датчик оснащен 4 выводами. Два из них служат для подключения питания. На вход Trig подается запускающий импульс, а с выхода Echo снимается сигнал, длительность которого пропорциональна измеренному расстоянию.

Алгоритм работы с датчиком следующий:

- для старта измерения, на вход Trig подается запускающий импульс длительностью 10 микросекунд.

- после обнаружения запускающего импульса, датчик излучает пачку из 8 импульсов с частотой 40кГц.

- обнаружив отраженный сигнал, HC-SR04 устанавливает высокий уровень на выходе Echo. Длительность данного состояния в микросекундах будет пропорциональна измеренному расстоянию в метрах.

- запускающие импульсы рекомендуется формировать 1 раз в 50мс.

Диаграмма работы HC-SR04
Диаграмма работы HC-SR04

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

Для получения точного значения расстояния в приемлемых единицах необходим дополнительный расчет. Он должен учитывать, что измеренное значение включает прямой и обратный путь распространения сигнала. Соответственно, для расчета дистанции время надо поделить на 2. Также следует учесть скорость ультразвука в воздухе. В итоге общая формула будет иметь следующий вид:

   HC-SR04 formula

Здесь: L – расстояние в метрах, t – время эхо-импульса в секундах, V =340м/с – скорость ультразвука. Для упрощения расчетов, гораздо выгоднее применить формулу вида: 

HC-SR04 formula

где, l – дистанция в сантиметрах, tus – время в микросекундах.

В качестве примера использования ниже приведена схема и программа, обеспечивающие работу ультразвукового модуля HC-SR04. Программа написана на языке mikroPascal определяет время эхо-импульса путем прямого запуска и останова 16-разрядного счетчика. Такой подход очень прост, но далек от идеала. Для реального использования алгоритм лучше переработать. Тем не менее, в качестве демонстрационного, проект вполне жизнеспособен.

Схема использования HC-SR04
Схема использования HC-SR04
program HC-SR04_Demo;var i,dig:byte;
    dig1,dig2,dig3,dig4:byte;
    dist:byte;
    d1,j,j1:word;
function mask(num: byte): byte;           // Подпрограмма преобразования чисел в код индикатора

begin case num of //afbgcpde 0 : result:= %11101011; 1 : result:= %00101000; 2 : result:= %10110011; 3 : result:= %10111010; 4 : result:= %01111000; 5 : result:= %11011010; 6 : result:= %11011011; 7 : result:= %10101000; 8 : result:= %11111011; 9 : result:= %11111010; 10: result:= %00010000; end; //case endend;//~ procedure Digit_Reg(digit:byte); // Подпрограмма записи в регистр индикатора

begin for i:=1 to 8 do begin clearbit(PortC,4); if testbit(digit,0) then setbit(PortC,4); Setbit(portc,3); Clearbit(portc,3); digit:=digit shr 1; end;end; procedure interrupt; // Подпрограмма обработки прерываний. В ней переключаются цифры

begin dig:=dig+1; if dig>4 then dig:=1; case dig of 1: begin {Переключение цифры на индикаторе} clearbit(portc,0); Digit_Reg(dig2); setbit(portc,1); end; 2: begin clearbit(portc,1); Digit_Reg(dig3); setbit(portc,2); end; 3: begin clearbit(portc,2);Digit_Reg(dig1);setbit(porta,2); end; 4: begin clearbit(porta,2);Digit_Reg(dig4);setbit(portc,0); end; end; INTCON := %10100000; // Сброс флага прерывания T0IF

end;

begin //Первоначальная настройка ansel :=0; cmcon :=7; INTCON := $A0; TRISA := %00000000; TRISC := %00101000; PORTA := 0; PORTC := 0; OPTION_REG:=%01000000; Setbit(portc,0); dig:=0; dig1:=0; dig2:=0; dig3:=0; dig4:=2; t1con:=%00000100; while 1 do //Бесконечный цикл begin intcon.gie:=0; //Останов прерываний tmr1l:=0; //Сброс счетчиков tmr1h:=0; j:=25000;j1:=25000; // Задание защитных интервалов //Запускающий импульс porta.0:=1; delay_us(10); porta.0:=0; //Ожидание ответа while (portc.5=0) and (j>0) do begin j:=j-1; end; t1con.tmr1on:=1; //Старт таймера //Ожидание окончания импульса ответа while (portc.5=1) and (J1>0) do begin j1:=j1-1; end; t1con.tmr1on:=0; //Останов таймера intcon.gie:=1; //Запуск прерываний // Установка кода ошибки в случае ее наличия if (j=0) or (j1=0) then begin dig1:=2; dig2:=2; dig3:=2; end //Вычисление расстояния else begin // Чтение 2 байт из таймера d1:=tmr1h; d1:=d1 shl 8; d1:=d1+tmr1l; //Вычисление dist:=d1/58; //Запись дистанции в индикатор dig3:=mask(dist/100); dig2:=mask((dist/10) mod 10); dig1:=mask(dist mod 10); end; delay_ms(1000); //Задержка между измерениями end;

end.