ИК-дальномеры Sharp GP2Y0A: принцип работы и счётчик посетителей

Как инфракрасные дальномеры Sharp превращают отражённый луч в напряжение, как пересчитать его в сантиметры и собрать на Arduino счётчик посетителей.
Как датчик определяет расстояние
Инфракрасные дальномеры Sharp серии GP2Y0A часто применяют в проектах на Arduino, где нужно измерять расстояние до объекта.

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

Напряжение и расстояние: нелинейная зависимость
Выходной сигнал обратно пропорционален расстоянию: чем дальше объект, тем ниже напряжение, причём убывает оно плавно.

У каждой модели есть рабочий диапазон, в котором показаниям можно доверять. Дальнюю границу определяют два обстоятельства: отражённый свет слабеет, а PSD перестаёт различать малые смещения луча.
В целом зависимость нелинейна, однако в пределах рабочего диапазона график обратной величины напряжения от расстояния близок к прямой. Этим пользуются для получения формулы пересчёта: точки графика заносят в программу для работы с таблицами, строят по ним новый график и автоматически рассчитывают линию тренда.

Характеристики
| Рабочее напряжение | 4,5–5,5 В |
| Потребляемый ток | типичный 30 мА, максимальный 40 мА |
| Выходной сигнал | аналоговый |
| Перепад выходного напряжения в диапазоне измерения | 2,0 В |
| Время отклика | 38 ± 10 мс |
| Диапазон GP2Y0A41SK0F | 4–30 см |
| Диапазон GP2Y0A021YK0F | 10–80 см |
| Диапазон GP2Y0A02YK0F | 20–150 см |
Проект: счётчик посетителей
Практический пример — подсчёт людей, входящих в магазин. Задача упрощена: вход и выход идут через разные неширокие двери, поэтому достаточно одного дальномера на входе. Его устанавливают так, чтобы пустой проём давал показание около 80 см, а проходящий человек — от 10 до 50 см.
Результат выводится на Nokia 5110 — монохромный графический ЖК-дисплей 84×48 точек, который поставляется на плате с контроллером PCD8544 и штыревым разъёмом. Потребление у него небольшое, и питать его можно от выхода +3,3 В платы Arduino. Список деталей:
- плата Arduino Uno;
- макетная плата;
- инфракрасный датчик расстояния Sharp;
- дисплей Nokia 5110;
- соединительные провода.
Подключить дальномер несложно: подаётся питание, а выход Vo заводится на аналоговый вход, в примере A0. Дисплей занимает контакты 3 (SCLK), 4 (DIN), 5 (D/C), 6 (CS) и 7 (RST) и обслуживается библиотеками Adafruit_GFX и Adafruit_PCD8544.
Что делает скетч
Функция analogRead возвращает число от 0 до 1023. Чтобы получить напряжение на выходе датчика, его умножают на 0,0048828125, то есть на 5 В / 1024. Далее напряжение переводится в сантиметры; в листинге для этого записано выражение distance = 32*pow(volts, -1.10).
Отдельные отсчёты у дальномера могут расходиться даже при неподвижном объекте: сигнал имеет некоторую амплитуду колебаний, и момент чтения иногда попадает на провал. Поэтому чтение вынесено в функцию irRead(), которая берёт пять измерений с паузой 55 мс и возвращает их среднее.
Основной цикл сравнивает усреднённое значение с порогом 50. Зафиксировав появление объекта в проёме, программа запоминает время и ждёт, пока объект не уйдёт. Если проход длился дольше 300 мс, счётчик увеличивается на единицу, а новое значение отправляется в последовательный порт и на дисплей в строке «Visitors». Более короткие события — взмах руки, пролетевший предмет — отбрасываются.
Диагностика
Если на дисплее ничего нет, проверяют все соединения по схеме. Если не срабатывает дальномер, проверяют его подключение и смотрят в мониторе последовательного порта, фиксируются ли обнаружения.