Example code JSN-SR04T with Arduino and NewPing library
The NewPing library written by Tim Eckel can be used with many ultrasonic distance sensors. The latest version of this library can be downloaded here on bitbucket.org. You might notice that the code below, which uses the NewPing library, is a lot shorter than the code we used before.
NewPing_v1.9.1.zip
You can install the library by going to Sketch > Include Library > Add .ZIP Library in the Arduino IDE.
The library does include some examples that you can use, but you will have to modify them to match your hardware setup. I have included a modified example code below that can be used with the same wiring setup as before.
/*Arduino example sketch to control a JSN-SR04T ultrasonic distance sensor with NewPing libary and Arduino. More info: https://www.makerguides.com */ // Include the library: #include <NewPing.h> // Define Trig and Echo pin: #define trigPin 2 #define echoPin 3 // Define maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500 cm: #define MAX_DISTANCE 400 // NewPing setup of pins and maximum distance. NewPing sonar = NewPing(trigPin, echoPin, MAX_DISTANCE); void setup() { // Open the Serial Monitor at 9600 baudrate to see ping results: Serial.begin(9600); } void loop() { // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings: delay(50); // Measure distance and print to the Serial Monitor: Serial.print("Distance = "); // Send ping, get distance in cm and print result (0 = outside set distance range): Serial.print(sonar.ping_cm()); Serial.println(" cm"); }
Исходный код программы
В коде программы автоматического индикатора уровня воды нам первым делом необходимо инициализировать все контакты Arduino, которые мы будем использовать для подключения внешних устройств: реле, ЖК дисплей, буззер (звонок) и т.д.
Затем мы инициализируем все устройства, задействованные в проекте.
После этого инициализируем модуль ультразвукового датчика и считаем время между передачей и приемом ультразвуковой волны с помощью функции pulseIn(pin). Затем произведем вычисления и покажем результат на экране ЖК дисплея.
Потом запишем условия, позволяющие проверить полна или пуста цистерна с водой и в зависимости от результатов проверки этих условий произведем соответствующие действия.
Далее представлен полный текст программы.
Arduino
#include <LiquidCrystal.h>
#define trigger 10
#define echo 11
#define motor 8
#define buzzer 12
LiquidCrystal lcd(7,6,5,4,3,2);
float time=0,distance=0;
int temp=0;
void setup()
{
lcd.begin(16,2);
pinMode(trigger,OUTPUT);
pinMode(echo,INPUT);
pinMode(motor, OUTPUT);
pinMode(buzzer, OUTPUT);
lcd.print(» Water Level «);
lcd.setCursor(0,1);
lcd.print(» Indicator «);
delay(2000);
}
void loop()
{
lcd.clear();
digitalWrite(trigger,LOW);
delayMicroseconds(2);
digitalWrite(trigger,HIGH);
delayMicroseconds(10);
digitalWrite(trigger,LOW);
delayMicroseconds(2);
time=pulseIn(echo,HIGH);
distance=time*340/20000;
lcd.clear();
lcd.print(«Water Space In «);
lcd.setCursor(0,1);
lcd.print(«Tank is: «);
lcd.print(distance);
lcd.print(«Cm»);
delay(2000);
if(distance<12 && temp==0)
{
digitalWrite(motor, LOW);
digitalWrite(buzzer, HIGH);
lcd.clear();
lcd.print(«Water Tank Full «);
lcd.setCursor(0,1);
lcd.print(«Motor Turned OFF»);
delay(2000);
digitalWrite(buzzer, LOW);
delay(3000);
temp=1;
}
else if(distance<12 && temp==1)
{
digitalWrite(motor, LOW);
lcd.clear();
lcd.print(«Water Tank Full «);
lcd.setCursor(0,1);
lcd.print(«Motor Turned OFF»);
delay(5000);
}
else if(distance>30)
{
digitalWrite(motor, HIGH);
lcd.clear();
lcd.print(«LOW Water Level»);
lcd.setCursor(0,1);
lcd.print(«Motor Turned ON»);
delay(5000);
temp=0;
}
}
1 |
#include <LiquidCrystal.h> #define trigger 10 LiquidCrystallcd(7,6,5,4,3,2); floattime=,distance=; inttemp=; voidsetup() { lcd.begin(16,2); pinMode(trigger,OUTPUT); pinMode(echo,INPUT); pinMode(motor,OUTPUT); pinMode(buzzer,OUTPUT); lcd.print(» Water Level «); lcd.setCursor(,1); lcd.print(» Indicator «); delay(2000); } voidloop() { lcd.clear(); digitalWrite(trigger,LOW); delayMicroseconds(2); digitalWrite(trigger,HIGH); delayMicroseconds(10); digitalWrite(trigger,LOW); delayMicroseconds(2); time=pulseIn(echo,HIGH); distance=time*34020000; lcd.clear(); lcd.print(«Water Space In «); lcd.setCursor(,1); lcd.print(«Tank is: «); lcd.print(distance); lcd.print(«Cm»); delay(2000); if(distance<12&&temp==) { digitalWrite(motor,LOW); digitalWrite(buzzer,HIGH); lcd.clear(); lcd.print(«Water Tank Full «); lcd.setCursor(,1); lcd.print(«Motor Turned OFF»); delay(2000); digitalWrite(buzzer,LOW); delay(3000); temp=1; } elseif(distance<12&&temp==1) { digitalWrite(motor,LOW); lcd.clear(); lcd.print(«Water Tank Full «); lcd.setCursor(,1); lcd.print(«Motor Turned OFF»); delay(5000); } elseif(distance>30) { digitalWrite(motor,HIGH); lcd.clear(); lcd.print(«LOW Water Level»); lcd.setCursor(,1); lcd.print(«Motor Turned ON»); delay(5000); temp=; } } |
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Код программы достаточно прост – в нем мы с помощью таймера и прерываний изменяем состояние (0 / 1) контактов A0 и A1 платы Arduino и формируем таким образом сигнал с частотой 40 кГц.
В начале кода программы объявим массив сдвига фраз.
Arduino
byte TP = 0b10101010;
1 | byteTP=0b10101010; |
Затем каждую секунду порт будет принимать противоположные сигналы. Поэтому в функции void setup мы зададим режим работы для всех контактов этого порта на вывод данных.
Arduino
DDRC = 0b11111111;
1 | DDRC=0b11111111; |
После этого мы инициализируем timer 1 и отключим все прерывания.
Arduino
noInterrupts();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
1 |
noInterrupts(); TCCR1A=; TCCR1B=; TCNT1=; |
Затем timer 1 конфигурируется для формирования сигнала прерывания с частотой 80 кГц. Плата Arduino работает на частоте 16 МГц, итого получаем 16000000 HZ ÷ 200 = 80,000 кГц для формируемых прямоугольных импульсов. Это обеспечивается с помощью следующих команд:
Arduino
OCR1A = 200;TCCR1B |=
(1 << WGM12);
TCCR1B |= (1 << CS10);
1 |
OCR1A=200;TCCR1B|= (1<<WGM12); TCCR1B|=(1<<CS10); |
После этого включаем прерывание сравнения для таймера.
Arduino
TIMSK1 |= (1 << OCIE1A);
1 | TIMSK1|=(1<<OCIE1A); |
И, наконец, разрешаем прерывания в программе.
Arduino
interrupts();
1 | interrupts(); |
Каждое прерывание будет изменять состояние аналогового порта с частотой 80 кГц, следовательно, мы получим прямоугольную волну с частотой 40 кГц. Это изменяющееся с каждым прерыванием значение мы будем передавать на контакты A0 и A1 платы Arduino.
Arduino
ISR(TIMER1_COMPA_vect)
{
PORTC = TP;
TP = ~TP; // Invert TP for the next run
}
1 |
ISR(TIMER1_COMPA_vect) { PORTC=TP; TP=~TP;// Invert TP for the next run } |
А в основном цикле loop нам ничего не нужно будет делать.
How does an ultrasonic distance sensor work?
Ultrasonic sensors work by emitting sound waves with a frequency that is too high for a human to hear. These sound waves travel through the air with the speed of sound, roughly 343 m/s. If there is an object in front of the sensor, the sound waves get reflected back and the receiver of the ultrasonic sensor detects them. By measuring how much time passed between sending and receiving the sound waves, the distance between the sensor and the object can be calculated.
Ultrasonic distance sensors working principle. Source: https://www.maxbotix.com/
At 20°C, the speed of sound is roughly 343 m/s or 0.034 cm/µs. Let’s say that the time between sending and receiving the sound waves is 2000 microseconds. If you multiply the speed of sound by the time the sound waves traveled, you get the distance that the sound waves traveled.
Distance = Speed x Time
But that is not the result we are looking for. The distance between the sensor and the object is actually only half this distance because the sound waves traveled from the sensor to the object and back from the object to the sensor. So you need to divide the result by two.
Distance (cm) = Speed of sound (cm/µs) × Time (µs) / 2
And so for the example this becomes:
Distance (cm) = 0.0343 (cm/µs) × 2000 (µs) / 2 = 34.3 cm
Temperature dependence of the speed of sound
The speed of sound actually depends strongly on temperature and to a far lesser degree on the humidity of the air. Wikipedia states that the speed of sound increases with roughly 0.6 m/s per degree Celsius. For most cases at 20°C you can just use 343 m/s but if you want to get more accurate readings, you can calculate the speed of sound with the following formula:
V (m/s) = 331.3 + (0.606 × T)
V = Speed of sound (m/s)T = Air Temperature (°C)
This formula doesn’t include the humidity since its effect on the speed of sound is only very small.
Below you can find a tutorial on how to use a DHT11 temperature and humidity sensor to calibrate the speed of sound and get a more accurate distance reading with the HC-SR04.
How the HC-SR04 works
At the front of the HC-SR04 sensor, you can find two silver cylinders (ultrasonic transducers), one is the transmitter of the sound waves and the other is the receiver. To let the sensor generate a sonic burst, you need to set the Trig pin high for at least 10 µs. The sensor then creates an 8 cycle burst of ultrasound at 40 kHz.
This sonic burst travels at the speed of sound and bounces back and gets received by the receiver of the sensor. The Echo pin then outputs the time that the sound waves traveled in microseconds.
You can use the function in the Arduino code to read the length of the pulse from the Echo pin. After that, you can use the formula mentioned above to calculate the distance between the sensor and the object.
HC-SR04 Specifications
Operating voltage | 5 V |
Operating current | 15 mA |
Frequency | 40 kHz |
Measuring range | 2 – 400 cm |
Resolution | 3 mm |
Measuring angle | 15 degrees |
Trigger input signal | 10 µs high pulse |
Cost | Check price |
For more information you can check out the datasheet below:
HC-SR04 Datasheet
Датчик расстояния в проектах Arduino
Способность ультразвукового датчика определять расстояние до объекта основано на принципе сонара – посылая пучок ультразвука, и получая его отражение с задержкой, устройство определяет наличие объектов и расстояние до них. Ультразвуковые сигналы, генерируемые приемником, отражаясь от препятствия, возвращаются к нему через определенный промежуток времени. Именно этот временной интервал становится характеристикой помогающей определить расстояние до объекта.
Описание датчика HC SR04
Датчик расстояния Ардуино является прибором бесконтактного типа, и обеспечивает высокоточное измерение и стабильность. Диапазон дальности его измерения составляет от 2 до 400 см. На его работу не оказывает существенного воздействия электромагнитные излучения и солнечная энергия. В комплект модуля с HC SR04 arduino также входят ресивер и трансмиттер.
Ультразвуковой дальномер HC SR04 имеет такие технические параметры:
- Питающее напряжение 5В;
- Рабочий параметр силы т ока – 15 мА;
- Сила тока в пассивном состоянии -6 с.
Датчик оснащен четырьмя выводами (стандарт 2, 54 мм):
- Контакт питания положительного типа – +5В;
- Trig (Т) – выход сигнала входа;
- Echo (R) – вывод сигнала выхода;
- GND – вывод «Земля».
Схема взаимодействия с Arduino
Для получения данных, необходимо выполнить такую последовательность действий:
- Подать на выход Trig импульс длительностью 10 микросек;
- В ультразвуковом дальномере hc sr04 подключенном к arduino произойдет преобразование сигнала в 8 импульсов с частотой 40 кГц, которые через излучатель будут посланы вперед;
- Когда импульсы дойдут до препятствия, они отразятся от него и будут приняты приемником R, что обеспечит наличие входного сигнала на выходе Echo;
- На стороне контроллера полученный сигнал при помощи формул следует перевести в расстояние.
При делении ширины импульса на 58.2, получим данные в сантиметрах, при делении на 148 – в дюймах.
Подключение HC SR04 к Arduino
Выполнить подключение ультразвукового датчика расстояния к плате Arduino достаточно просто. Схема подключения показана на рисунке.
Контакт земли подключаем к выводу GND на плате Arduino, выход питания соединяем с 5V. Выходы Trig и Echo подсоединяем к arduino на цифровые пины. Вариант подключения с помощью макетной платы:
Библиотека для работы с HC SR04
Для облегчения работы с датчиком расстояния HC SR04 на arduino можно использовать библиотеку NewPing. Она не имеет проблем с пинговыми доступами и добавляет некоторые новые функции.
К особенностям библиотеки можно отнести:
- Возможность работы с различными ультразвуковыми датчиками;
- Может работать с датчиком расстояния всего через один пин;
- Отсутствие отставания на 1 секунду при отсутствии пинга эха;
- Для простой коррекции ошибок есть встроенный цифровой фильтр;
- Максимально точный расчет расстояния.
Скачать бибилотеку NewPing можно здесь
Точность измерения расстояния датчиком HC SR04
Точность датчика зависит от нескольких факторов:
- температуры и влажности воздуха;
- расстояния до объекта;
- расположения относительно датчика (согласно диаграммы излучения);
- качества исполнения элементов модуля датчика.
В основу принципа действия любого ультразвукового датчика заложено явление отражения акустических волн, распространяющихся в воздухе. Но как известно из курса физики, скорость распространения звука в воздухе зависит от свойств этого самого воздуха (в первую очередь от температуры). Датчик же, испуская волны и замеряя время до их возврата, не догадывается, в какой именно среде они будут распространяться и берет для расчетов некоторую среднюю величину. В реальных условиях из-за фактора температуры воздуха HC-SR04 может ошибаться от 1 до 3-5 см.
Фактор расстояния до объекта важен, т.к. растет вероятность отражения от соседних предметов, к тому же и сам сигнал затухает с расстоянием.
Также для повышения точности надо правильно направить датчик: сделать так, чтобы предмет был в рамках конуса диаграммы направленности. Проще говоря, “глазки” HC-SR04 должны смотреть прямо на предмет.
Для уменьшения ошибок и погрешности измерений обычно выполняются следующие действия:
- усредняются значения (несколько раз замеряем, убираем всплески, потом находим среднее);
- с помощью датчиков (например, DHT11 или DHT22) определяется температура и вносятся поправочные коэффициенты;
- датчик устанавливается на серводвигатель, с помощью которого мы “поворачиваем голову”, перемещая диаграмму направленности влево или вправо.
Работа схемы
Схема робота на основе Arduino и датчика скорости LM393 представлена на следующем рисунке.
Вычислительные и управляющие задачи в схеме возложены на плату of Arduino Nano. Колеса робота приводятся в движение двумя электродвигателями постоянного тока при помощи драйвера двигателя на основе H-моста L298N. Джойстик используется для управления скоростью и направлением движения робота, а два датчика скорости H206 используются для измерения скорости, пройденной дистанции и угла поворота робота. Измеренные значения этих параметров отображаются на экране ЖК дисплея 16×2. Потенциометр, подключенный к ЖК дисплею, можно использовать для управления его контрастностью, а резистор служит для ограничения тока для управления яркостью подсветки дисплея.
Схема запитывается от литиевого элемента на 7.4V. Эти 7.4V подаются на контакт 12V драйвера двигателя, а регулятор напряжения драйвера двигателя преобразует их в стабилизированное напряжение +5V, которое используется для питания платы Arduino, ЖК дисплея, датчиков и джойстика.
Двигатели управляются с помощью цифровых контактов 8, 9, 10 и 11 платы Arduino. Поскольку нам необходимо управлять еще и скоростью вращения двигателей мы используем сигналы ШИМ (широтно-импульсной модуляции), подаваемые на положительные контакты двигателей. Для этой цели мы используем контакты 9 и 10 платы Arduino, на которых возможно использование ШИМ сигналов. Значения положения осей X и Y джойстика подаются на аналоговые контакты A2 и A3 соответственно.
Поскольку, как мы уже знаем, датчик H206 формирует управляющее воздействие (триггер) каждый раз когда обнаруживается отверстие в пластине с делениями. Для повышения точности определения скорости мы эти управляющие воздействия будем подавать на входы внешних прерываний на контактах 2 и 3 платы Arduino. После сборки робота у нас получилась конструкция показанная на следующем рисунке. Более подробно вы ее можете рассмотреть на видео, приведенном в конце статьи.
3Скетч Arduino для ультразвукового дальномера
Напишем скетч для нашего дальномера:
const int trigPin = 6; // вывод триггера датчика HC-SR04 const int echoPin = 5; // вывод приёмника датчика HC-SR04 #include <LiquidCrystal.h> // подключаем стандартную библиотеку LiquidCrystal lcd(12, 11, 10, 9, 8, 7); //инициализация ЖКИ void setup() { pinMode(trigPin, OUTPUT); // триггер - выходной пин pinMode(echoPin, INPUT); // эхо - входной digitalWrite(trigPin, LOW); lcd.begin(16, 2); //задаём кол-во строк и символов в строке lcd.setCursor(10, 0); // выравниваем надпись по правому краю lcd.print("Dist:"); lcd.setCursor(14, 1); lcd.print("cm"); } void loop() { long distance = getDistance(); // получаем дистанцию с датчика lcd.setCursor(10, 1); lcd.print(" "); // очищаем ЖКИ от предыдущего значения lcd.setCursor(10, 1); lcd.print((String)distance); // выводим новую дистанцию delay(100); } // Определение дистанции до объекта в см long getDistance() { long distacne_cm = getEchoTiming() * 1.7 * 0.01; return distacne_cm; } // Определение времени задержки long getEchoTiming() { digitalWrite(trigPin, HIGH); // генерируем импульс запуска delayMicroseconds(10); digitalWrite(trigPin, LOW); // определение на пине echoPin длительности уровня HIGH, мкс: long duration = pulseIn(echoPin, HIGH); return duration; }
Тут всё просто. Сначала инициализируем ЖКИ на выводах 12, 11, 10, 9, 8 и 7 с помощью библиотеки LiquidCrystal из состава Arduino IDE. Далее привяжем выводы «триггер» и «эхо» дальномера к выводам 6 и 5 платы Arduino. Каждые 100 мс будем запрашивать с детектора расстояние с помощью функции getDistance() и выводить на ЖК-дисплей.
У меня на LCD дисплее имеется дефект, и его левая половина почти не работает. Поэтому я вывожу надписи выровненными по правому краю.
После того как записали скетч в память Arduino, можем собирать прибор. Предлагаемая мной компоновка внутренностей показана на рисунке. Дисплей и датчик я закрепил с помощью термоклея. Он держит достаточно прочно, но при этом даёт возможность снять соединённые детали, если понадобится. Желательно всё разместить так, чтобы можно было подключиться к USB порту Arduino и поправить «прошивку» при необходимости. Например, изменить выводимый текст или поправить коэффициенты для расчёта дистанции. Может понадобиться менять контрастность ЖК дисплея, так что также желательно иметь в доступности регулятор потенциометра.
Вариант готового прибора показан на фотографии. Он достаточно компактен и удобен в использовании.
Вариант компоновки ультразвукового дальномера | Внешний вид готового ультразвукового дальномера |
Но следует иметь в виду несколько важных замечаний при его использовании:
- Ультразвук лучше отражается от гладких поверхностей, чем от поглощающих (например, мягкого ковра). Поэтому следует выбирать место расположения дальномера при измерении так, чтобы напротив дальномера располагалась гладкая отражающая поверхность (например, стена).
- Показания прибора могут существенно отличаться в зависимости от угла направления на цель. Поэтому лучше всего провести несколько измерений, немного изменяя угол направления на цель, и взять среднее значение от всех измерений.
Печать корпуса и сборка
Возьмите скользящие контакты и поместите его в верхнюю часть корпуса. Убедитесь, что вращающаяся часть кольца находится на верхней стороне корпуса, чтобы она вращалась одновременно с диском. Теперь установите шаговый мотор, который фиксируется к корпусу двумя 3M винтами и гайкам. Крышка готова:
Вплавьте две резьбовые вставки в корпус вращающегося диска, на котором будет закрепляется датчик нужно вплавить вставные гайки. Для этого можно использовать паяльник:
Теперь пропускаем провода от скользящих контактов через отверстие вращающегося диска:
После чего берём датчик и припаиваем к нему 4 провода (+5V, GND, SCL и SDA) от скользящих контактов:
С помощью двух болтов М3 закрепляем модуль дальномера на корпусе вращающегося диска:
Если у вас модуль с другим расстоянием между крепёжными отверстиями, модуль можно закрепить только одним болтом. Если крепёжных отверстий совсем нет, модуль можно приклеить (двустороння липкая лента, термоклеем с помощью клеевого пистолета и т.д.).
Когда датчик будет закреплён, вращающийся диск надевается на подшипник:
На вращающуюся крышку приклеивается неодимовый магнит, а в верхнюю крышку вставляется датчик холла:
Магнит служит для того, чтобы на него на него срабатывал датчик Холла и в этот момент в коде происходит установка переменной «угол» в некоторое значение. Если магнит по размерам позволяет наклеить его по центру под датчиком, это будет самый лучший вариант, т.к. при срабатывании переменной «угол» нужно будет присвоить значение 0. Если нет, магнит можно наклеить возле датчика. Тогда переменной «угол» нужно будет присвоить не 0, а соответствующее значение (на какой угол относительно магнита повёрнут датчик). Если магнит находится с противоположной стороны, нужно присвоить 180. Если угол составляет 20 градусам (на фото выше угол немного больше):
Тогда переменной «угол» нужно присвоить 20 и т.д.
На макетную плату по схеме, приведенной ранее, запаиваем конденсатор, драйвер мотора, 10K резистор, датчик Холла, провода от Arduino и стабилизатора питания:
Всё припаяно, теперь закрепляем (двусторонней липкой лентой, клеем, термоклеем и т.д.) Arduino Nano внутри корпуса и наш лидар почти готов:
Осталось вплавить в нижнюю крышку корпуса три вставные гайки, затем прикрутить крышку корпуса, надеть на шкив пасик и можно переходить к программированию и экспериментам.
Водонепроницаемый ультразвуковой датчик JSN SR-04T
JSN SR-04T представляет собой модуль водонепроницаемого ультразвукового датчика, который способен измерять расстояние на дистанциях 25-450 см с точностью 2 мм. Модуль датчика состоит из двух раздельных частей. Одна часть – это датчик, который непосредственно производит передачу и прием ультразвуковых волн, а вторая часть – это плата управления. По принципу действия JSN SR-04T очень похож на датчики парковки, которые устанавливаются в бамперах автомобилей.
Модуль датчика JSN SR-04T имеет водозащищенное исполнение датчика, отличается устойчивым функционированием в сложных условиях эксплуатации и высокой точностью измерения расстояния. Он может использоваться в системах дальнометрии, предотвращения столкновения с препятствиями, автоматизированного контроля, мониторинга движения объектов, контроля трафика, системах безопасности и искусственного интеллекта и многих других применениях.
Назначение контактов (распиновка) датчика JSN SR-04T представлены на следующих рисунке и таблице.
№ контакта | Название контакта | Назначение контакта |
1 | 5V | Напряжение питания |
2 | Trig | Входной контакт датчика. На него необходимо подать импульс длительностью 10 мкс чтобы запустить датчик в работу (чтобы он начал излучение ультразвуковой волны). |
3 | Echo | Выходной контакт датчика. После приема отраженной от препятствия ультразвуковой волны на этом контакте формируется импульс высокого уровня (high), длительность которого равна времени распространения ультразвуковой волны до препятствия и обратно. |
4 | Gnd | Общий провод (земля) |
Модуль датчика JSN SR-04T во многом похож на модуль ультразвукового датчика, но по сравнению с ним у него есть ряд преимуществ:
- в отличие от HC-SR04 у модуля JSN SR-04T непосредственно датчик не распаян на печатной плате модуля, вместо этого он закреплен на конце достаточно длинного кабеля (2,5 метра), поэтому чувствительный элемент датчика может быть удален на значительное расстояние от платы управления;
- чувствительный элемент датчика заключен в защищённый водонепроницаемый корпус, поэтому его можно размещать в жестких условиях эксплуатации и агрессивных средах.
Но несмотря на эти преимущества имеются и некоторые недостатки. К примеру, минимальное расстояние измерения у датчика JSN SR-04T составляет 20 см, в то время как у датчика HC-SR04 оно равно 2 см. Причина этого заключается в том, что JSN SR-04T имеет только один чувствительный элемент в то время как у датчика HC-SR04 их два – один используется для передачи ультразвуковых волн, а другой для приема. В результате этого чувствительному элементу датчика JSN SR-04T приходится переключаться двумя режимами (прием/передача), а на это требуется дополнительное время. Поэтому и минимальное расстояние измерения для датчика JSN SR-04T равно 20 см, а датчик HC-SR04 может измерять значительно меньшие расстояния благодаря наличию у него отдельных передатчика и приемника.
Основные технические характеристики и особенности датчика JSN SR-04T:
- рабочее напряжение: DC 5V (постоянного тока);
- ток в состоянии покоя (ожидания): 5mA;
- ток в рабочем состоянии: 30mA;
- частота ультразвуковой волны: 40 кГц;
- диапазон измерения расстояний: от 25 см до 4,5 м;
- длина кабеля: 2,5 метра.
4Калибровка ультразвукового дальномера
После небольшого опыта использования данного прибора, выявилось, что измеренное расстояние отличается от действительного, причём чем больше расстояние от датчика до цели, тем больше отклонение. В связи с этим возникла необходимость в корректировке показаний дальномера.
Для этого я измерил на всём рабочем диапазоне датчика (от 0 до 400 см) расстояния и составил таблицу из двух столбцов: реальное расстояние и показания датчика. По этим данным построил график:
График отклонения показаний ультразвукового дальномера
Здесь зелёным цветом показан график для идеального дальномера, как должно быть, а красным – реального, который в моём случае занижает показания.
Зависимость получилась линейная. Прекрасно! Из курса геометрии мы помним, что уравнение прямой, проходящей через две точки: (x − x1)/(x2 − x1) = (y − y1)/(y2 − y1)
Подставив вместо x1, 2 и y1, 2 значения из таблицы и упростив выражение, я получил уравнение для графика измерений ультразвукового дальномера: y = 0,97x + 0,27
В уравнении прямой коэффициент 0,97 возле «икс» является тангенсом угла наклона прямой к оси абсцисс. Назовём его tg(α). Можно посчитать, что угол наклона прямой равняется 44,13 градусам (арктангенс от 0,97), а в идеальном случае он должен быть равен 45 градусам (и уравнение прямой идеального дальномера очень простое: y = x, то есть каждому измеренному числу соответствует точно такое же реальное расстояние). Постоянная 0,27 – это смещение графика относительно нуля по оси ординат.
Посмотрим на следующий рисунок. Видны два прямоугольных треугольника, приподнятые над осью OX. Один из катетов, назовём его h, треугольника с углом α равен измеренному дальномером расстоянию Rизм за вычетом константы b, равной 0,27. Катет другого треугольника равен реальному расстоянию Rреал. У обоих треугольников катеты h равны. Зная длину катета h и тангенс угла α (равный 0,97), мы узнаем реальное расстояние Rреал, поделив, длину катета h на tg(α),
Последовательность коррекции показаний ультразвукового дальномера
Таким образом, для того чтобы скорректировать ошибку при измерениях дальномера, нужно следовать формуле: Rреал = (Rизм − b) / tg(α) = (Rизм − 0,27) / 0,97 Обратите внимание, что это выражение можно было получить из предыдущего уравнения, выразив x через y. В вашем случае коэффициент и константа, естественно, будут отличаться. Эту коррекцию следует внести в скетч для Arduino
После этого ультразвуковой дальномер на датчике HC-SR04 будет показывать расстояние более точно
Эту коррекцию следует внести в скетч для Arduino. После этого ультразвуковой дальномер на датчике HC-SR04 будет показывать расстояние более точно
В вашем случае коэффициент и константа, естественно, будут отличаться. Эту коррекцию следует внести в скетч для Arduino. После этого ультразвуковой дальномер на датчике HC-SR04 будет показывать расстояние более точно.
Напоследок приведу видеодемонстрацию работы готового ультразвукового дальномера (до калибровки).
Исходный код программы
В этом проекте мы использовали библиотеку NewPing.h для ультразвукового датчика, разработанную Tim Eckel. Хотя с ультразвуковым датчиком можно вполне успешно работать и без этой библиотеки, но в виде исключения мы в этом проекте решили использовать ее потому что она имеет много полезных функций для работы с ультразвуковым датчиком и значительно сокращает код программы.
Сначала желательно протестировать работу ультразвукового датчика с помощью примеров из данной библиотеки и лишь затем загружать в плату Arduino код программы для нашего проекта сигнализации.
Переключающий контакт (Trigger pin) датчика подключен к контакту 12 платы Arduino, а Echo pin – к контакту 11 платы Arduino. MAX_DISTANCE обозначает максимальную дистанцию, на котором датчик может обнаруживать препятствие. Оно составляет 500 см (5 м).
Установим скорость последовательного порта (в бодах/с), с которой будут передаваться данные от ультразвукового датчика к плате Arduino.
Контакт 10 конфигурируется для работы на вывод данных и к нему подключен зуммер. Другой контакт зуммера подключен к контакту GND платы Arduino.
В функции void echoCheck() команда sonar.ping_result / US_ROUNDTRIP_CM используется для расчета расстояния от датчика до препятствия. Переменная flag используется чтобы дать сигнал включения зуммера когда препятствие находится на расстоянии менее 50 см от датчика. Вы можете изменить это расстояние на то, которое вам необходимо (будет зависеть от размеров вашей двери).
Работа с ультразвуковым датчиком с помощью библиотеки NewPing.h снабжена подробными комментариями от авторов этой библиотеки. Изучая примеры этой библиотеки вы можете узнать много полезного о работе с ультразвуковым датчиком.
Изначально ультразвуковой датчик предназначен для измерения расстояний, но в этом проекте мы его применили, как вы можете видеть – в качестве охранной системы (сигнализации на дверь). Но его также можно применить и в других нестандартных проектах, например, для измерения уровня воды в баке.
Далее приведен полный текст программы.
Принцип действия
Ультразвуковой дальномер определяет расстояние до объектов точно так же, как это делают дельфины или летучие мыши. Он генерирует звуковые импульсы на частоте 40 кГц и слушает эхо. По времени распространения звуковой волны туда и обратно можно однозначно определить расстояние до объекта.
В отличие от инфракрасных дальномеров, на показания ультразвукового дальномера не влияют засветки от солнца или цвет объекта. Но могут возникнуть трудности с определением расстояния до пушистых или очень тонких предметов. Поэтому высокотехнологичную мышеловку выполнить на нём будет затруднительно.
При отражении звука от препятствия мы слышим эхо. Летучая мышь использует отражение ультразвуковых волн для полётов в темноте и для охоты на насекомых. По такому же принципу работает эхолот, с помощью которого измеряется глубина воды под днищем корабля или поиск рыбы.
Принцип передачи и приема ультразвуковой энергии лежит в основе многих очень популярных ультразвуковых датчиков и детекторов скорости. Ультразвуковые волны являются механическими акустическими волнами, частота которых лежит за пределами слышимости человеческого уха — более 20 кГц. Однако сигналы этих частот воспринимаются некоторыми животными: собаками, кошками, грызунами и насекомыми. А некоторые виды млекопитающих, таких как летучие мыши и дельфины, общаются друг с другом ультразвуковыми сигналами.
УЛЬТРАЗВУКОВОЙ ДАТЧИК Lego Mindstorm EV 3. ЗРИ В КОРЕНЬ
Технические спецификации и особенности продукта:
- Измерение расстояния в диапазоне от 1 до 250 см
- Точность измерения до +/- 1 см
- Передняя подсветка в виде красного кольца горит постоянно при передаче сигнала и мигает при прослушивании эфира
- Если ультразвуковой сигнал распознан, датчик возвращает логическое значение «Истина»
- Автоматическая идентификация производится программным обеспечением микрокомпьютера EV3
Рис. 1 Ультразвуковой датчик Lego Mindstorm EV 3 (стоимость вместе с внутренним микроконтроллером и микросхемами усиления сигнала $50, при себестоимости $5)
Рис. 2 Схема ультразвукового датчика Lego Mindstorm EV 3 (ultrasonic sensor hardware schematics) построена на микроконтроллере STM8S103F3
- Введение в микроконтроллеры stm8
- Микроконтроллер STM8S103F3
- Схема центрального микроконтроллера LEGO MINDSTORMS EV3 programmable brick main hardware schematics
Рис. 3 Ультразвуковые излучатель AW8T40 и приемник AW8R40 ультразвукового датчика Lego Mindstorm EV 3
Улучшенная идея по калибровке датчиков используя известное расстояние
Одним из главных недостатков описанного метода является то, что мы предполагаем что на контакте Echo появляется низкий уровень сразу после того как передатчик передающего датчика излучил волну. Однако это не совсем так поскольку волне нужно время чтобы она «долетела» от передающего датчика до приемного. Следовательно, скорее всего, в результате этого метода передающий и приемный датчики не достигнут идеального синхронизма.
Чтобы преодолеть этот недостаток мы можем сначала откалибровать датчик используя известное расстояние – в этом случае мы можем точно определить время распространения волны от передающего датчика до приемного. Давайте обозначим это время как дельта D как показано на следующем рисунке.
Ультразвуковой дальномер HC-SR04 Arduino
Ультразвуковой датчик (ещё его часто называют сонаром или ультразвуковым дальномером) определяет расстояние до объекта так же, как это делают летучие мыши или дельфины. Датчик HC-SR04 генерирует узконаправленный сигнал на частоте 40 кГц и ловит отраженный сигнал (эхо). По времени распространения звука до объекта и обратно можно достаточно точно определить расстояние до него.
По этому же принципу работает множество приборов для исследования пространства — эхолот, сонар, радиолокатор и даже полицейский радар для определения скорости автомобиля. Все эти приборы излучают узконаправленный ультразвуковой сигнал и получают обратно отраженный сигнал. В отличии от инфракрасных дальномеров (IR), на показания ультразвукового датчика (сонара) не влияет цвет объекта.
Принцип работы ультразвукового дальномера HC-SR04
Но при настройке ультразвукового датчика на Ардуино могут возникнуть трудности с определением расстояния до звукопоглощающих объектов, поскольку они способны полностью погасить излучаемый сигнал. Для идеальной точности измерения расстояния, поверхность изучаемого объекта должна быть ровной и гладкой. Принцип работы ультразвукового датчика hc-sr04 показан на рисунке выше.