Андрей Смирнов
Время чтения: ~11 мин.
Просмотров: 4

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

Тема этого урока — оптический датчик измерения расстояния. Такие датчики встречаются как в робототехнике, так и в бытовой жизни (например, сушилки для рук, элементы «умного дома», реагирующие на движение, тоже имеют датчик расстояния 🙂 ). Для урока взят датчик SHARP 2Y0A21 с диапазоном измерения 10-80 см.

DSC01189.jpg

Принцип работы оптического датчика измерения расстояния

Часто, можно услышать неправильное мнение, что оптические датчики расстояния работают по принципу акустических — измеряют время прохождения луча от датчика до препятствия. Конечно, подобные датчики тоже существуют, но чаще всего оптические дальномеры работают совсем по другому принципу, основанному на относительно простой геометрии.

Принцип работы оптического датчика Sharp заключается в том, что лазерный луч отражается от препятствия и попадает на матрицу в разные её места, в зависимости от того, на каком расстоянии D произошло отражение .

ODMS_Sharp.png

Перед нами обычный прямоугольный треугольник, так что расстояние до объекта D определяется по формуле D = (FE)/G.

Выход датчика нелинеен. Зависимость показаний датчика от расстояния имеет следующий вид:

graf.jpg

Излом в начале первого графика объясняется тем, что датчик не способен обнаруживать объекты на малых расстояниях. Также, у разных типов датчиков будут разные минимальное и максимальное расстояния.

Подключение датчика к Ардуино

Датчик Sharp аналоговый, а значит его можно подключить к одному из входов АЦП Ардуино. В нашем случае, подключаем к A0.

SHARP 2Y0A21 GND VCC OUT
Arduino Uno GND +5V A0

Принципиальная схема:

Внешний вид макета:

Программа

Считывать полученное значение с датчика мы будем при помощи функции analogRead. Функция analogRead возвращает нам целое число от 0 до 1023 и чтобы узнать уровень напряжение на выходе сенсора,  нам нужно домножить это число на 5 и поделить на 1023. Подробно про АЦП можно прочитать в одном из предыдущих уроков — Аналого-цифровые преобразования — АЦП.

Чтобы не совершать лишние операции в программе, заменим 5/1023 на 0.0048828125. В итоге получим вот такую несложную программу:

float V; // переменная для хранения значения АЦПfloat dist; // переменная для хранения вычисленного расстоянияvoid setup() {    Serial.begin(9600); // старт последовательного порта}void loop() {    // считываем значение сенсора и переводим в напряжение    V = analogRead(A0)0.0048828125;     dist = 65pow(V, -1.10); // вычисляем расстояние    Serial.println(dist); // выдаём результат в порт    delay(1000);  }

Формула dist = 65*pow(V, -1.10) — на самом деле является функцией, которая отражает зависимость напряжения на выходе датчика от расстояния. Ту самую зависимость, которая изображена на графике выше.

Заливаем программу на Ардуино, запускаем монитор последовательного порта и подносим руку к сенсору. В результате, мы должны увидеть на мониторе примерное расстояние до объекта:

Полезные ссылки

Техническая документация датчика

  • Цена: $6.38 (покупал за $5.42)

Роботам, как и смерть всем человекам очень нужны органы чувств, чтобы ориентироваться в пространстве. Инфракрасный дальномер Sharp GP2Y0A21YK очень подходит на эту роль, если вам требуется избегать столкновения с препятствиями или знать, где примерно это самое препятствие находится. Кстати, возможно, у вас дома уже есть один из роботов, где используются похожие датчики. Это практически все вменяемые китайские роботы-пылесосы и, полагаю, многие модели Roomba. И, вероятно, многие другие. А если уж этим сенсорам нашлось место в более-менее серьезной технике, то и мы найдем им применение, правда? Чтобы не кривить душой, скажу сразу: я заказывал эти датчики не просто поиграться. Наоборот, с самого начала знал, что они мне пригодятся, чтобы сделать интерактивную лампу, которая меняет интенсивность свечения в зависимости от положения ладони над ней. Конечно, реальность внесла свои коррективы и в итогеЕвлампия (так зовут лампу) получилась гораздо интереснее базовой концепции. Иными словами, у нее теперь пять режимов: ночник, светильник с регулировкой яркости, термометр, «северное сияние» с ручной регулировкой и автоматическое северное сияние. А кроме того — пара сервисных функций: включение и выключение фонового и верхнего освещения в комнате. Вот как это работает: Ну а теперь самое время подробнее рассказать о датчике, благодаря которому все и случилось. Как я говорил в самом начале, Sharp GP2Y0A21YK — это инфракрасный дальномер. А значит, он оснащен ИК-излучателем и ИК-приемником: первый служит источником луча, отражение которого ловит второй. При этом ИК-лучи датчика для человеческого глаза невидимы (хотя можно различить красное мерцание, если посмотреть в датчик) и при такой интенсивности безвредны. На домашних животных они так же не оказывают никакого влияния. Согласно даташиту характеристики такие:

  • Напряжение питания: 5В
  • Максимальный потребляемый ток: 40 мА (типичный — 30 мА)
  • Диапазон работы: 10 см — 80 см

Что касается конкурентов, то по сравнению с ультразвуковыми сенсорами, например, сверхпопулярным HC-SR04, у этого датчика есть и достоинства, и недостатки. К достоинствам можно отнести все то, что сказано выше, т.е. нейтральность и безвредность. А недостатки — меньший радиус действия (у HC-SR04 порядка 4 м) и зависимость от внешних помех, в том числе — некоторых типов освещения. Я, к примеру, встречал упоминания, что солнечный свет может влиять на показания датчика. Датчик поставляется в спартанском комплекте, т.е. сам датчик и кабель с разъемом для подключения к датчику. На другой стороне — просто залуженные провода, что не очень удобно для использования с Arduino Uno, но вполне подходит для контроллеров без распаянных разъемов. Так как я планировал использовать датчик с Arduino Pro Mini, это был вполне подходящий вариант — провода просто запаял в макетную плату. Провода различаются по цвету: желтый — сигнал, черный — земля, красный — плюс питания (+5В). Выход датчика аналоговый (хотя в даташите почему-то написано — цифровой). То есть, напряжение на нем пропорционально расстоянию до препятствия. Вместе с тем, как и в случае с ультразвуком, для датчика есть разница между разными типами препятствий. В связи с этим в даташите Sharp приводит данные при использовании в качестве отражателей эталонных карточек Kodak с коэффициентом отражения 90%. Судя по нему, на 20 см датчик выдает 1.3В. Давайте сравним с моими экспериментальными данными: Напоминаю, что аналоговый вход Arduino работает в диапазоне 0В — 5В и имеет 1024 ступеней, отсюда расчет: (5/1024)*(показания датчика). Так что если учесть то, что все своими (дрожащими) руками, то показания вполне вписываются в характеристики датчика. И заодно видно, что черная поверхность вносит свои коррективы. . так он светит Вместе с тем, как заметил внимательный читатель, есть и специфика. Суть в том, что когда препятствие находится ближе нижней границы радиуса действия (10 см), датчик начинает считать, что препятствие, наоборот, удаляется (когда накрыл рукой показания зафиксировались на 345). Примерно так это выглядит: В связи с этим рекомендация: в целевом устройстве датчик должен быть установлен так, чтобы препятствие физически не могло оказаться ближе нижней границы радиуса действия. Отсюда вывод: хотя для многих целей даташит вполне адекватен, иногда имеет смысл провести эксперименты, чтобы потом не было мучительно больно. И это особенно актуально, если датчик несколько заглублен (или закрыт ИК-прозрачным материалом), а значит, может получать отражения от стенок или других элементов корпуса. Например, я столкнулся с тем, что Евлампия, будучи установленной на штатном месте после успешно проведенных «настольных» тестов, стала сходить с ума. Сначала я думал, что виноваты помехи по питанию и даже поставил параллельно питанию датчика пару конденсаторов (10 мкФ и 0.1 мкФ), подтянул аналоговый вход Arduino к нулю через резистор 10 кОм и даже купил сетевой фильтр-розетку. Но когда это не помогло, то снова вернулся на стол, где покрутил датчик в разные стороны и увидел, что по факту даже если расстояние до ближайшего препятствия больше 80 см, показания датчика заметно меняются. Так что если ваши подопечные будут неадекватны — проверяйте фактические показания в реальных условиях. Вот, например, элементарный скетч, который, во-первых, с интервалом в полсекунды выводит показания датчика, а, во-вторых, зажигает светодиод Arduino, если показания попадают в диапазон от 100 до 200: Если подводить итог, то датчик, хотя и немного капризен, очень прост в использовании и относительно дешев. Использовать его можно в роботах, а также для контроля пересечения дверных проемов, в каких-нибудь интерактивных устройствах, управляемых жестами и в чем-то, что еще подскажет фантазия.

Содержание

  • Обзор
  • Технические характеристики модуля
  • Пример использования
  • Часто задаваемые вопросы FAQ

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

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

infrakrasnyj-datchik-rasstojanija.jpg

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

infrakrasnyj-datchik-rasstojanija-raschet.jpg

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

infrakrasnyj-datchik-rasstojanija-grafik.jpg

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

infrakrasnyj-datchik-rasstojanija-dannye.jpg

Технические характеристики инфракрасного дальномера 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.jpg

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

//Инфракрасный датчик расстояния  //3d-diy.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 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.jpg

 

infrakrasnyj-datchik-rasstojanija-primenenie.jpg

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

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

Используемые источники:

  • https://robotclass.ru/tutorials/arduino-distance-optical-sensor/
  • https://mysku.ru/blog/aliexpress/29357.html
  • https://3d-diy.ru/wiki/arduino-datchiki/infrakrasnyj-datchik-rasstojanija/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации