Взаимодействие с ультразвуковым дальномером HC-SR04 по одной линии

Вторник , 4, Апрель 2017 Leave a comment
Ультразвуковой датчик дистанции HC-SR04
Для подключения к микроконтроллеру популярного ультразвукового дальномера HC-SR04 нужны две сигнальные линии:
— для короткого импулься запуска измерения (Trig);
— для ответного импульса (Echo), длительность которого пропорциональна расстоянию до объекта, отразившего ультразвуковой сигнал.
Организовать взаимодействие с ультразвуковым датчиком дистанции HC-SR04 по одной линии можно дополнив его простой схемой.

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

Ниже приведена схема, которая позволяет микроконтроллеру (в данном случае это микроконтроллер ATmega328P-PU, установленный на плате Arduino Uno) взаимодействовать с ультразвуковым датчиком HC-SR04 используя лишь один вывод какого-либо своего порта ввода/вывода:

Схема взаимодействия с ультразвуковым датчиком дистанции HC-SR04 по одной линии.
Схема работает следующим образом. Перед выдачей микроконтроллером короткого импульса запуска его управляющий вывод (на схеме это PB0/14) должен работать в качестве выхода и находиться в состоянии лог. «1», которому соответствует высокий уровень управляющего напряжения, подаваемого на затвор транзистора VT1. При этом транзистор VT1 открыт и на вход Trig датчика HC-SR04 подается соответственно низкий уровень напряжения, то есть лог. «0». Выход Echo датчика HC-SR04 находится пока в состоянии лог. «0» и соответственно низкий уровень напряжения на затворах транзисторов VT2 и VT3 удерживает их в закрытом состоянии, так что никакого влияния на состояние управляющих сигналов они не оказывают.

Когда микроконтроллер формирует импульс запуска измерения, он на короткое время (10-15 мкс) переводит свой управляющий вывод в состояние лог. «0», на это время из-за низкого напряжения на затворе транзистор VT1 закрывается и на вход Trig датчика HC-SR04 подается короткий импульс запуска с уровнем лог. «1». Сразу после этого микроконтроллер должен изменить режим работы своего управляющего вывода с выхода на вход. Высокий уровень на затворе транзистора VT1 будет при этом поддерживаться резистором R1, соответственно на входе Trig датчика HC-SR04 будет лог. «0».

Ответный импульс, сформированный датчиком HC-SR04 на выходе Echo, имеет уровень лог. «1», соответственно высоким уровнем напряжения на затворах транзисторов VT2 и VT3 эти транзисторы открываются на время действия этого импульса. При этом на тот же вывод микроконтроллера со стока транзистора VT3 поступает инвертированный (т.е. с уровнем лог. «0») ответный импульс датчика HC-SR04, а транзистор VT2 блокирует поступление ложного импульса повторного запуска датчика HC-SR04 на время действия его ответного импульса.

Чтобы использовать один и тот же вывод порта ввода/выводв как для запуска измерения, так и для измерения длительности формируемого датчиком HC-SR04 ответного импульса, этим управляющим выводом микроконтроллера надо программно управлять в следующем порядке:

1. Перевести управляющий вывод микроконтроллера в режим «ВЫХОД» («OUTPUT»);
2. Сбросить управляющий вывод в лог. «0»;
3. Удерживать управляющий вывод в состоянии лог. «0» 10-15 мкс;
4. Установить управляющий вывод в лог. «1»;
5. Перевести управляющий вывод в режим «ВХОД» («INPUT»);
6. Провести измерение длительности пришедшего в ответ импульса от спадающего фронта (перепада из состояния лог. «1» в состояние лог. «0») до нарастающего фронта (перепада из состояния лог. «0» в состояние лог. «1»);
7. Произвести расчет дистанции до отразившего ультразвуковой сигнал объекта по методике, изложенной в документации на датчик HC-SR04.

Ниже приведена осциллограмма, иллюстрирующая взаимодействие с ультразвуковым дальномером HC-SR04 по одной линии:

Осциллограммы, иллюстрирующие управление датчиком дистанции HC-SR04 по одной линии.

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

Ниже приведен пример программы для платы Arduino Uno, в которой в качестве управляющего вывода используется порт 8, результат измерения и расчета дистанции до отразившего ультразвуковой сигнал объекта выводится на терминал через последовательный порт:

#define SOUND_SPEED 340.0

void setup()
{
 digitalWrite( 8, HIGH );
 pinMode( 8, OUTPUT );
 Serial.begin(9600);
 delay(10);
}

unsigned long firstSampleTimer, secondSampleTimer;
float distance;

void loop()
{
 pinMode( 8, OUTPUT );
 digitalWrite( 8, LOW );
 delayMicroseconds(10);
 digitalWrite( 8, HIGH );
 pinMode( 8, INPUT );
 while( digitalRead(8) );
 firstSampleTimer = micros();
 while( !digitalRead(8) );
 secondSampleTimer = micros();
 distance = ( ( ((float)(secondSampleTimer - firstSampleTimer)) * SOUND_SPEED ) / 20000.0 );
 Serial.print( "Distance is " );
 Serial.print(distance);
 Serial.println( " cm" );
 delay( 500 );
}