Содержание
Обзор инфракрасного датчика расстояния
Инфракрасный датчик расстояния 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
- соединительные провода
//Инфракрасный датчик расстояния //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;
- Проверьте срабатывание обнаружения датчиком в мониторе последовательного порта.