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

Чувства роботов: ИК-датчик расстояния Sharp GP2Y0A21YK

Роботам, как и смерть всем человекам очень нужны органы чувств, чтобы ориентироваться в пространстве. Инфракрасный дальномер 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:
// Желтый — A0, Черный — земля, Красный — +5В unsigned int l; void setup() { Serial.begin(9600); pinMode(A0, INPUT); pinMode(13, OUTPUT); l = 0; } void loop() { l = analogRead(A0); Serial.println(l); delay(1000); if (l > 100 && l < 200) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } }
Если подводить итог, то датчик, хотя и немного капризен, очень прост в использовании и относительно дешев.
Использовать его можно в роботах, а также для контроля пересечения дверных проемов, в каких-нибудь интерактивных устройствах, управляемых жестами и в чем-то, что еще подскажет фантазия.

Принципы работы ИК дальномеров

Иллюстрация, поясняющая метод определения расстояния дальномерами Sharp

Представленная линейка GP2DXX дальномеров Sharp, была разработана не только для обнаружения обьектов на дальних расстояниях, но и для предоставления данных о расстоянии, в случае с моделями GP2D12, GP2D120 и GP2DY0A (‘0A’). Эти модели работают намного лучше, так как используются новый метод измерения.

Для определения расстояния либо просто наличия объекта в поле зрения сенсора используется метод триангуляции и малая линейная CCD матрица.

Основная идея в следующем. Импульсы ИК излучения испускаются излучателем. Это излучение распространяется и отражается от обьектов находящихся в поле зрения сенсора. Отраженное излучение возвращается на приемник. Испускаемый и отраженный лучи образуют треугольник «излучатель — обьект отражения — приемник».

Угол отражения напрямую зависит от расстояния до обьекта. Полученные отраженные импульсы собираются высококачественной линзой и передаются на линейную CCD матрицу. По засветке определенного участка CCD матрицы определяется угол отражения и высчитывается растояние до обьекта.

Этот метод более защищен от эффектов интерференции излучения и разной отражающей способности поверхностей, выполненных из различных материалов и окрашенных в различные цвета. Например, стало возможно определение черной стены при ярком освещении.

Какой дальномер выбрать?

Серия дальномеров GP2XX включает несколько типов. Они различаются минимальными и максимальными значениями дальности измерения, а также форматом возвращаемого сигнала (есть модели, имеющие аналоговый выход — они возвращают растояние до объекта; также есть модели, имеющие цифровой выход и возвращающие лишь булевое значение — есть объект в поле зрения датчика или нет).

Сравнительные характеристики сведены в файл.

Модели с красной меткой на диапазоне — цифровые (определяют только есть ли препятствие в интервале расстояний до метки или нет), остальные модели — аналоговые (определяют расстояние в указанном диапазоне).

Ни одному из датчиков не требуется внешний синхросигнал. Вместо этого они излучают постоянно, потребляя примерно 25mA.

0A700 поставляется в специальном корпусе, который намного больше, чем другие дальномеры. Это видно на картинке ниже. Увеличение размера связано с увеличением линзы, что позволило увеличить максимальный диапазон до 5.5 метров.

Выбор дальномера зависит от ваших необходимостей, возможностей «Мозга» робота (наличия АЦП), и т. д. и т. п. Надеемся, что приведенная в этом разделе информация поможет вам сделать правильный выбор.

Нелинейный выход

Выходная характеристика детекторов нелинейно (см. рисунок) зависит от измеренного расстояния.

Выходная характеристика дальномеров Sharp

График изображает типичную (например, для GP2Y0A21YK и GP2D12) выходную характеристику дальномеров Sharp.

Следует обратить внимание на две вещи:

  • Выходная характеристика дальномера (дистанция 10 см — 80см) нелинейна и близка к логарифмической. Эта кривая незначительно отличается от дальномера к дальномеру, поэтому можно «нормализовать» характеристику с помощью таблицы или функции. В этом случае, вы можете калибровать каждый дальномер, получая в результате линейную характеристику, независящую от дальномера к дальномеру.

  • В случае если дистанция меньше минимально измеряемой (на графике это 10 см) характеристика падает очень быстро и возникает впечатление что измерено далекое растояние. Это может ввести в заблуждение и даже повредить вашего робота, если он двигается с высокой скоростью. Простейший способ этого избежать — устанавливать дальномер на робота с учетом длины робота.

Пример перекрестной установки дальномера для компенсации минимального ограничения измерения.

Нормализация нелинейности выхода

Как говорилось ранее (раздел «Нелинейный выход»), выходная характеристика дальномеров нелинейно зависит от измеренного расстояния. Нужно найти функцию для преобразования напряжения на аналоговом выходе дальномера (Вольты) в расстояние (то есть сантиметры или дюймы).

Можно пойти двумя путями: создать таблицу значений или написать функцию преобразования.

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

На основании страницы 10 Sharp Device Specification для GP2D120 график характеристики следует преобразовать по формуле

<math>V = \frac{1}{R + k}</math>

где V — напряжение, результат АЦП преобразования;

R — расстояние; k = 0,42 константа для GP2D120.

Уравнение как результат дает прямую линию. Операция деления выпрямляет характеристику. Константа в функции зависит от модели дальномера. k = 0,42 — это константа для GP2D120, но это же значение может быть применено и для других моделей. Поэтому первым шагом для хорошей функции преобразования необходимо экспериментальным путем определить константу k. На рисунке ниже представлен график для GP2D12 с k = 4.0.

Следующим шагом сведем полученную приближенно линейную характеристику с формулой линейного уравнения.

<math>y = m \cdot x + b</math>

В этом случае y соответствует линейному расстоянию, заменяем в функции y и x

<math>\frac{1}{R + k} = m \cdot V + b</math>

Преобразовываем для получения функции расстояния от напряжения

<math>R = \frac{1}{m \cdot V + b} — k</math>

Результат содержит операции с плавающей запятой, от которой нам надо избавится:

<math>R = \frac{m’}{V + b’} — k</math>

где <math>m’ = \frac{1}{m}</math> и <math>b’ = \frac{b}{m}</math>. После чего мы можем применять формулу в целочисленных расчетах.

Пример применения для 10 bit АЦП (0..1023) и GP2D12:

<math>R = \frac{m’}{V + b’} — k</math>

<math>R = \frac{6787}{V — 3} — 4</math>

Где <math>m’=6787</math>, <math>b’=-3</math> и <math>k=4</math>. Необходимо проверить значение V для предотвращения деления на 0, V должен быть больше b’. Для данной формулы V должен быть больше 3.

С 10-bit целым, напряжение для GP2D12 изменяется от 80 при отсутствии препятствий до 0 если объект прямо перед GP2D12.

Этот подход работает и для других дальномеров. После подбора константы для GP2D120 формула будет выглядеть так:

<math>R = \frac{2914}{V + 5} — 1</math>
(для опорного напряжения 5 вольт)
<math>R = \frac{5222}{V — 13}</math>
(для опорного напряжения 2.56 вольт)

Так как это целочисленная математика то результат получаем в сантиметрах, что более дружелюбно, чем результат АЦП преобразования.

Диаграмма направленности

Диаграмма направленности для этих всех моделей дальномеров Sharp довольно схожа. В основном, диапазон измерений колеблется от 10 см до 80 см, а «угол зрения» таков, что его можно представить примерно в виде конуса с диаметром в средней его части около 16 см(по другим документам 6см для GP2D12 и 12см для GP2Y0A21). В связи с тем, что диаграмма направленности достаточно узкая, рекомендуется установка дальномера на вращающуюся платформу с сервомашинками для сканирования окрестностей. Это позволяет расширить угол обзора и исследовать пространство более детально. Дальномер будет вращаться на манер радара, сообщая о наличии объектов в определенном секторе на определенном удалении от платфоромы.

При использовании дальномеров в роли бампера необходим наиболее широкий луч излучения для охвата наибольшей зоны перед роботом. Типовое решение — это применение 2х дальномеров, установленных перекрестно (см. рисунок ниже). Наиболее часто применяется для этой цели GP2D15.

В зависимости от типа используемого дальномера, выход с них можно объединять для экономии портов ввода-вывода на микропроцессоре.

ИК Дальномеры аналоги

Нам понадобится:

Arduino uno: http://ali.ski/gC_mOa

Дальномер Sharp 2Y0A21: http://ali.ski/VZW_wp

Датчик Sharp 2YoA21 это аналог ультразвукового дальномера HC-SR04 только он меряет дальность не ультразвуком как его собрат, а инфракрасными диодами.

Согласно даташиту характиристики такие:

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

Как видите характеристики гораздо хуже, но достоинство от ультразвукового дальномера это безвредность, то есть ультразвук довольно вреден здоровью. так что выбор за Вами.

Ну а тут приведет пример работы данного датчика.

Схема подключения приведена в самом начале статьи.

После подключения всех компонентов необходимо скопировать программный код приведенный ниже и вставить его в программу Arduino IDE и загрузить этот программный код в саму плату Arduino.

const int IRpin = A0; // аналоговый пин для подключения выхода Vo сенсора int value1; // для хранения аналогового значения void setup() { Serial.begin(9600); // Запуск последовательного порта } void loop() { Serial.println(irRead(), DEC); // получаем сглаженное значение и переводим в напряжение float volts = analogRead(IRpin)*0.0048828125; // и в расстояние в см float distance=32*pow(volts,-1.10); Serial.print(distance); // выдаем в порт значение delay(200); } // Усреднение нескольких значений для сглаживания int irRead() { int averaging = 0; // переменная для суммирования данных // Получение 5 значений for (int i=0; i<5; i++) { value1 = analogRead(IRpin); averaging = averaging + value1; delay(55); // Ожидание 55 ms перед каждым чтением } value1 = averaging / 5; // усреднить значения return(value1); }

Дальномер — это устройство для измерения расстояния до некоторого предмета. Дальномер помогает роботам в разных ситуациях. Простой колесный робот может использовать этот прибор для обнаружения препятствий. Летающий дрон использует дальномер для баражирования над землей на заданной высоте. С помощью дальномера можно даже построить карту помещения, применив специальный алгоритм SLAM.

1. Принцип действия

На этот раз мы разберем работу одного из самых популярных датчиков — ультразвукового (УЗ) дальномера. Существует много разных модификаций подобных устройств, но все они работают по принципу измерения времени прохождения отраженного звука. То есть датчик отправляет звуковой сигнал в заданном направлении, затем ловит отраженное эхо и вычисляет время полета звука от датчика до препятствия и обратно.Из школьного курса физики мы знаем, что скорость звука в некоторой среде величина постоянная, но зависящая от плотности среды. Зная скорость звука в воздухе и время полета звука до цели, мы можем рассчитать пройденное звуком расстояние по формуле: s = v*t где v — скорость звука в м/с, а t — время в секундах. Скорость звука в воздухе, кстати, равна 340.29 м/с. Чтобы справиться со своей задачей, дальномер имеет две важные конструктивные особенности. Во-первых, чтобы звук хорошо отражался от препятствий, датчик испускает ультразвук с частотой 40 кГц. Для этого в датчике имеется пьезокерамический излучатель, который способен генерировать звук такой высокой частоты. Во-вторых, излучатель устроен таким образом, что звук распространяется не во все стороны (как это бывает у обычных динамиков), а в узком направлении. На рисунке представлена диаграмма направленности типичного УЗ дальномера.

Как видно на диаграмме, угол обзора самого простого УЗ дальномера составляет примерно 50-60 градусов. Для типичного варианта использования, когда датчик детектирует препятствия перед собой, такой угол обзора вполне пригоден. Ультразвук сможет обнаружить даже ножку стула, тогда как лазерный дальномер, к примеру, может её не заметить. Если же мы решим сканировать окружающее пространство, вращая дальномер по кругу как радар, УЗ дальномер даст нам очень неточную и шумную картину. Для таких целей лучше использовать как раз лазерный дальномер. Также следует отметить два серьезных недостатка УЗ дальномера. Первый заключается в том, что поверхности имеющие пористую структуру хорошо поглощают ультразвук, и датчик не может измерить расстояние до них. Например, если мы задумаем измерить расстояние от мультикоптера до поверхности поля с высокой травой, то скорее всего получим очень нечеткие данные. Такие же проблемы нас ждут при измерении дистанции до стены покрытой поролоном. Второй недостаток связан со скоростью звуковой волны. Эта скорость недостаточно высока, чтобы сделать процесс измерения более частым. Допустим, перед роботом есть препятствие на удалении 4 метра. Чтобы звук слетал туда и обратно, потребуется целых 24 мс. Следует 7 раз отмерить, прежде чем ставить УЗ дальномер на летающих роботов.

4. Программа

Итак, попробуем приказать датчику отправить зондирующий ультразвуковой импульс, а затем зафиксируем его возвращение. Посмотрим как выглядит временная диаграмма работы HC-SR04.На диаграмме видно, что для начала измерения нам необходимо сгенерировать на выводе Trig положительный импульс длиной 10 мкс. Вслед за этим, датчик выпустит серию из 8 импульсов и поднимет уровень на выводе Echo, перейдя при этом в режим ожидания отраженного сигнала. Как только дальномер почувствует, что звук вернулся, он завершит положительный импульс на Echo. Получается, что нам нужно сделать всего две вещи: создать импульс на Trig для начала измерения, и замерить длину импульса на Echo, чтобы потом вычислить дистанцию по нехитрой формуле. Делаем. int echoPin = 2; int trigPin = 3; void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { int duration, cm; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); cm = duration / 58; Serial.print(cm); Serial.println(» cm»); delay(100); } Функция pulseIn замеряет длину положительного импульса на ноге echoPin в микросекундах. В программе мы записываем время полета звука в переменную duration. Как мы уже выяснили ранее, нам потребуется умножить время на скорость звука: s = duration * v = duration * 340 м/с Переводим скорость звука из м/с в см/мкс: s = duration * 0.034 м/мкс Для удобства преобразуем десятичную дробь в обыкновенную: s = duration * 1/29 = duration / 29 А теперь вспомним, что звук прошел два искомых расстояния: до цели и обратно. Поделим всё на 2: s = duration / 58 Теперь мы знаем откуда взялось число 58 в программе! Загружаем программу на Ардуино Уно и открываем монитор последовательного порта. Попробуем теперь наводить датчик на разные предметы и смотреть в мониторе рассчитанное расстояние.

Задания

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

  1. Строительный дальномер. Программа каждые 100мс измеряет расстояние с помощью дальномера и выводит результат на символьный ЖК дисплей. Для удобства полученное устройство можно поместить в небольшой корпус и запитать от батареек.
  2. Ультразвуковая трость. Напишем программу, которая будет «пищать» зуммером с различной частотой, в зависимости от измеренного расстояния. Например, если расстояние до препятствия более трех метров — зуммер издает звук раз в пол секунды. При расстоянии 1 метр — раз в 100мс. Менее 10см — пищит постоянно.

Ультразвуковой дальномер — простой в использовании, дешевый и точный датчик, который отлично выполняет свою функцию на тысячах роботов. Как мы выяснили из урока, у датчика есть недостатки, которые следует учитывать при постройке робота. Хорошим решением может стать совместное использование ультразвукового дальномера в паре с лазерным. В таком случае, они будут нивелировать недостатки друг друга. Вконтакте Facebook Twitter Google+ 1+