Инфракрасный датчик расстояния
Инфракрасный дальномер для Arduino позволит определить расстояние до объекта в пределах 10 – 80 см. Дальномер может использоваться для объезда препятствий и ориентирования на местности.
Содержание
Обзор инфракрасного датчика расстояния
Инфракрасный датчик расстояния Sharp GP2Y0A является популярным выбором для различных проектов на базе Arduino, которым требуется точное измерение расстояния.
Датчики, в зависимости от их типа, имеют границы измерения, в пределах которых их выход может быть признан надежным. Измерение максимального реального расстояния ограничивают два фактора: уменьшение интенсивности отраженного света и невозможность 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;
- Проверьте срабатывание обнаружения датчиком в мониторе последовательного порта.