НАЗАД

Ультразвуковой датчик HC-SR04

Для определения расстояния используется ультразвуковой датчик определения расстояния HC-SR04. Для использования ультразвукового датчика необходимо использовать библиотеку. Существует несколько библиотек, предлагаю использовать библиотеку NewPing.h. Данную библиотеку можно скачать с сайта https://code.google.com/p/arduino-new-ping/.
Краткое описание HC-SR04:


Для тестов используется плата Arduino UNO.
Датчик расстояния подключается к аналоговым входам: выход сенсора Trig подключается к аналоговому входу 0, выход сенсора Echo подключается к аналоговому входу 1.
На рисунке ниже представлена схема подключения датчика ультразвукового измерения дальности к Arduino.

Ниже приведен листинг программы.

#include
#define TRIGGER_PIN 14
#define ECHO_PIN 15
#define MAX_DISTANCE 200
NewPing DistanceSensor(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
void setup()
{
Serial.begin(9600);
}
void loop()
{
unsigned int cm = DistanceSensor.ping_cm();
Serial.print("Distance: ");
Serial.print(cm);
Serial.println("cm");
delay(1000);
}

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


В данном примере применяется LCD дисплей 16 символов и 2 строки, а также ультразвуковой дальномер HC-SR04. Модуль LCD 1602 имеет 16 контактов и подключен в 4 битном режиме. В данном примере не используется библиотека NewPing.h.
В листинге ниже приведен код, демонстрирующий данную возможность.

#include
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int pingPin = 7; //выход, подача импульса
int inPin = 6; //измерение ширины вернувшегося импульса из этого контакта
long duration, inches, cm;
int indec, cmdec;
int inchconv = 147; // отношение между шириной импульса и дюймами
int cmconv = 59; // отношение между шириной импульса и сантиметрами
String s1, s2;
// инициализация LCD библиотеки и контактами
void setup()
{
lcd.begin(16, 2);
pinMode(pingPin, OUTPUT);
pinMode(inPin, INPUT);
}
void loop()
{
// отправка короткого сигнала низкого напряжения следующим за импульсом
//высокого напряжения, чтоб переключить на вход
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(10);
digitalWrite(pingPin, LOW);
// прочитать длинну возвращаемого импульса на порту Echo
duration = pulseIn(inPin, HIGH);
// преобразовать время в дистанцию
inches = microsecondsToInches(duration);
indec = (duration - inches * inchconv) * 10 / inchconv;
cm = microsecondsToCentimeters(duration);
cmdec = (duration - cm * cmconv) * 10 / cmconv;
s1 = String(inches) + "." + String(indec) + "in" + " ";
s2 = String(cm) + "." + String(cmdec) + "cm" + " ";
lcd.setCursor(0, 0); // на первой строке LCD напечатать длину в дюймах
lcd.print(s1);
lcd.setCursor(0,1); // на второй строке LCD напечатать длину в сантиметрах
lcd.print(s2);
delay(100);
}
long microsecondsToInches(long microseconds)
{
return microseconds / inchconv;
}
long microsecondsToCentimeters(long microseconds)
{
return microseconds / cmconv;
}