Инфракрасный датчик расстояния
Инфракрасный дальномер для Arduino позволит определить расстояние до объекта в пределах 10 – 80 см. Дальномер может использоваться для объезда препятствий и ориентирования на местности.
Содержание
Обзор инфракрасного датчика расстояния
Инфракрасный датчик расстояния Sharp GP2Y0A является популярным выбором для различных проектов на базе Arduino, которым требуется точное измерение расстояния.В датчиках Sharp установлен инфракрасный (IR) светодиод (LED) с линзой, который излучает узкий световой луч. Отраженный от объекта луч направляется через другую линзу на позиционно-чувствительный фотоэлемент (Position-Sensitive Detector, PSD). От местоположения падающего на PSD луча зависит его проводимость. Проводимость преобразуется в напряжение и, к примеру, оцифровывая его аналого-цифровым преобразователем микроконтроллера, можно вычислить расстояние.
Выход инфракрасного датчика расстояния Sharp обратно пропорциональный — с увеличением расстояния его значение медленно уменьшается. Вид графика зависимости между расстоянием и напряжением.
Датчики, в зависимости от их типа, имеют границы измерения, в пределах которых их выход может быть признан надежным. Измерение максимального реального расстояния ограничивают два фактора: уменьшение интенсивности отраженного света и невозможность PSD регистрировать незначительные изменения местоположения отображенного луча. В целом график зависимости между расстоянием и напряжением не является линейным, однако в пределах допустимых расстояний график обратной величины выходного напряжения и расстояния к линейности приближается достаточно близко, и с его помощью довольно просто получить формулу для преобразования напряжения в расстояние. Для нахождения такой формулы необходимо точки этого графика ввести в какую-либо программу обработки табличных данных и из них создать новый график. В программе обработки табличных данных на основе точек графика возможно автоматически вычислить линию тренда. Например, для датчика GP2Y0A021YK0F:
Технические характеристики инфракрасного дальномера 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
- соединительные провода
Запустим Arduino IDE. Создадим новый скетч и внесем в него следующее содержимое:
//Инфракрасный датчик расстояния
//3d-diy.ru
// подключение библиотек для работы с дисплеем Nokia
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
// 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.
Часто задаваемые вопросы FAQ
1. На дисплей не выводится информация- Проверьте правильность соединения всех проводов, согласно схеме на рисунке 5.
- Проверьте подсоединение модуля sharp;
- Проверьте срабатывание обнаружения датчиком в мониторе последовательного порта.