Инфракрасный датчик расстояния

Содержание:


Обзор инфракрасного датчика расстояния

Инфракрасный датчик расстояния Sharp GP2Y0A является популярным выбором для различных проектов на базе Arduino, которым требуется точное измерение расстояния.

Инфракрасный датчик расстояния Sharp

В датчиках Sharp установлен инфракрасный (IR) светодиод (LED) с линзой, который излучает узкий световой луч. Отраженный от объекта луч направляется через другую линзу на позиционно-чувствительный фотоэлемент (Position-Sensitive Detector, PSD). От местоположения падающего на PSD луча зависит его проводимость. Проводимость преобразуется в напряжение и, к примеру, оцифровывая его аналого-цифровым преобразователем микроконтроллера, можно вычислить расстояние.

infrakrasnyj-datchik-rasstojanija-raschet

Выход инфракрасного датчика расстояния Sharp обратно пропорциональный — с увеличением расстояния его значение медленно уменьшается. Вид графика зависимости между расстоянием и напряжением.

infrakrasnyj-datchik-rasstojanija-grafik

Датчики, в зависимости от их типа, имеют границы измерения, в пределах которых их выход может быть признан надежным. Измерение максимального реального расстояния ограничивают два фактора: уменьшение интенсивности отраженного света и невозможность PSD регистрировать незначительные изменения местоположения отображенного луча.
В целом график зависимости между расстоянием и напряжением не является линейным, однако в пределах допустимых расстояний график обратной величины выходного напряжения и расстояния к линейности приближается достаточно близко, и с его помощью довольно просто получить формулу для преобразования напряжения в расстояние. Для нахождения такой формулы необходимо точки этого графика ввести в какую-либо программу обработки табличных данных и из них создать новый график. В программе обработки табличных данных на основе точек графика возможно автоматически вычислить линию тренда. Например, для датчика GP2Y0A021YK0F:

infrakrasnyj-datchik-rasstojanija-dannye


Технические характеристики инфракрасного дальномера Sharp

• Рабочее напряжение: 4,5 — 5,5 В;
• Максимальный потребляемый ток: 40 мА (типичный — 30 мА);
• Тип выходного сигнала: аналоговый;
• Дифференциальное напряжение, большее диапазона распознавания расстояния: 2,0 В;
• Время отклика: 38 ± 10 мс
• Диапазон работы:
• Датчик GP2Y0A41SK0F: 4 — 30 см;
• Датчик GP2Y0A021YK0F: 10 см — 80 см;
• Датчик GP2Y0A02YK0F: 20 см — 150 см;


Пример использования

Создадим пример подсчета посетителей магазина. Упростим задачу, предполагая, что вход осуществляется через неширокую дверь, и для входа и выхода разные двери. На входе ставим инфракрасный дальномер Sharp GP2Y0A21YK0F (20-150 cм) таким образом, чтобы при прохождении человека показания имели значения 10 – 50 см, при отсутствии людей 80 см. При обнаружении посетителя увеличиваем счетчик подсчета посетителей. Данные выводим на графический дисплей Nokia 5110. Для отображения информации с датчиков будем использовать ЖК-дисплей Nokia 5110. Это графический монохромный дисплей с разрешением 84×48 точек. Дисплей Nokia 5110 поставляется на плате в паре с контроллером PCD8544 и штыревым разъемом. Электропотребление дисплея позволяет питать его от выхода +3.3 В платы Arduino.

Для проекта нам понадобятся следующие детали:
• плата Arduino Uno;
макетная плата (Breadboard Half ) ;
инфракрасный датчик расстояния sharp GP2Y0A21YK0F;
• дисплей Nokia 5110;
соединительные провода.

Соберем схему, показанную на рисунке.

infrakrasnyj-datchik-rasstojanija-shema

Запустим Arduino IDE. Создадим новый скетч и внесем в него следующее содержимое:

//Инфракрасный датчик расстояния
//makerplus.ru
// подключение библиотек для работы с дисплеем Nokia
#include
#include
// Nokia 5110
// pin 3 - Serial clock out (SCLK)
// pin 4 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 6 - LCD chip select (CS)
// pin 7 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);
// аналоговый пин для подключения выхода Vo сенсора
const int IRpin = A0;
// переменные
int value1; // для хранения аналогового значения
unsigned long timevisitors; // время прохождения
int count_visitors=0; // переменная подсчета посетителей

void setup() {
// запуск последовательного порта
Serial.begin(9600);
Serial.println("start");
// инициализация дисплея
display.begin();
// установить контраст фона экрана
display.setContrast(60);
display.clearDisplay(); // очистить экран
display.setTextSize(1); // размер шрифта
display.setTextColor(BLACK); // цвет
// заставка
display.setCursor(5,15);
display.print("Visitors: 0");
display.display();
delay(2000);
}

void loop() {
// получаем сглаженное значение и переводим в напряжение
value1=irRead();
if(value1>50) // фиксация прохождения
{
timevisitors=millis();
while(irRead()>50) ;
if(millis()-timevisitors>300) // > минимального времени прохождения
{
Serial.println("passage!!!");
count_visitors=count_visitors+1; // увеличение счетчика
// вывод в монитор последовательного порта
Serial.print("count_visitors=");
Serial.println(count_visitors);
// вывод на дисплей
display.clearDisplay();
display.setCursor(5,15);
display.print("Visitors: ");
display.print(count_visitors);
display.display();
}
}
delay(200);
}

// Усреднение нескольких значений для сглаживания
int irRead() {
int averaging = 0; // переменная для суммирования данных
// Получение 5 значений
for (int i=0; i<5; i++)
{
value1 = analogRead(IRpin);
// значение сенсора переводим в напряжение
float volts = analogRead(IRpin)*0.0048828125;
// и в расстояние в см
int distance=32*pow(volts,-1.10);
averaging = averaging + distance;
delay(55); // Ожидание 55 ms перед каждым чтением
}
value1 = averaging / 5; // усреднить значения
return(value1);
}

Работать с сенсорами SHARP очень просто — достаточно подключить к нему питание и завести вывод Vo на аналоговый вход Arduino. Значение получаемой функции analogRead представляет собой целое число от 0 до 1023. Таким образом, чтобы узнать напряжение на выходе сенсора, необходимо значение на аналоговом входе Arduino умножить на 0,0048828125 (5 В / 1024). Расстояние вычисляем по формуле distance=volts*0.0001831-0.003097. При чтении данных, при каждой итерации цикла, иногда приходят разные значения сигнала при одном и том же расстоянии. Датчик передает сигнал на аналоговый порт с некоторой амплитудой и иногда в момент считывания данных значение оказывалось отличным от нормального, потому что итерация приходится на провал. Для сглаживания значений, получаемых с дальномера используем функцию irRead(). Датчик обнаруживает попадание объекта в дверной проем. Далее ожидаем окончания прохода. Если это время больше минимального времени прохода (отсечение взмаха руки, пролет предмета и пр.) инкрементируем счетчик посетителей и выводим данные в последовательный порт и на дисплей. Для работы с дисплеем Nokia 5110 нам понадобятся Arduino библиотеки Adafruit_GFX и Adafruit_PCD8544.

infrakrasnyj-datchik-rasstojanija-podkljuchenije

infrakrasnyj-datchik-rasstojanija-primenenie


Часто задаваемые вопросы FAQ

1. На дисплей не выводится информация
Проверьте правильность соединения всех проводов, согласно схеме на рисунке 5.
2. Не срабатывает датчик расстояния
Проверьте подсоединение модуля sharp;
Проверьте срабатывание обнаружения датчиком в мониторе последовательного порта.