Инфракрасный датчик расстояния 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. Создадим новый скетч и внесем в него следующее содержимое: //Инфракрасный датчик расстояния //сайт // подключение библиотек для работы с дисплеем Nokia #include #include // 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.
2. Не срабатывает датчик расстояния
  • Проверьте подсоединение модуля sharp;
  • Проверьте срабатывание обнаружения датчиком в мониторе последовательного порта.

В данной статье рассмотрим подключение и работу с ИК-датчиком измерения расстояния SHARP GP2Y0A02YK0F.
В отличие от того же , данный датчик имеет гораздо более скромный диапазон измерений, но все равно обладает рядом полезных отличительных свойств. Например, данный датчик позволяет измерять расстояние даже через прозрачные поверхности (правда, теряя точность показаний, но все же).

Подключение датчика:

GND на любой из GND пинов--- ардуино

OUT на любой из аналоговых входов ардуино (в примерах подсоединено к A0)

VCC на + 5 вольт на ардуино

Основные технические характеристики:

Диапазон измерения расстояния: от 20 до 150 см

Аналоговый выход

Размеры: 29.5x13x21.6 мм

Потребление тока: 33 мА

Напряжение питания: от 4.5 до 5.5 В

Её необходимо распаковать и добавить в папку "libraries" в папке с Arduino IDE. Не забывайте перезагрузить среду, если на момент добавления IDEшка была открыта.

В чем особенность данной библиотеки и почему именно её рекомендуем к использованию? Ответ прост и кроется в принципе её работы. Для измерения расстояния используется множество замеров, из которых отбрасываются ошибочные, которые сильно отличаются от соседних. По утверждениям авторов - 12% всех показаний вносят 42% ошибки в итоговое значение расстояния, если не отбрасывать ошибочные измерения.

Перейдем к программному коду - примеру работы с датчиком (пример подойдет также для датчика GP2Y0A21Y, в коде необходимо будет изменить значение model на 1080):

Пример программного кода

#include #define ir A0 //пин, к которому подключен датчик. Обязательно аналоговый! #define model 20150 //модель датчика. 1080 для GP2Y0A21Y, 20150 для GP2Y0A02Y SharpIR SharpIR (ir, model); void setup () { Serial .begin (9600); } void loop () { delay (2000); unsigned long pepe1=millis (); // засекаем время до начала измерений int dis=SharpIR .distance(); // получаем расстояние с датчика Serial .print ("Mean distance: " ); // выводим расстояние в монитор порта Serial .println (dis); unsigned long pepe2=millis ()-pepe1; // считаем время, затраченное на измерение Serial .print ("Time taken (ms): " ); // и выводим его Serial .println (pepe2); }

Дальномеры

В этом уроке мы поподробнее познакомимся с дальномерами.

Ультразвуковой дальномер HC-SR04

На сегодняшний день (2016 г) стоит не более 1$ на AliExpress .

Датчик имеет 4 вывода:

  • Vcc – На этот контакт подается питание в 5В.
  • Trig – На этот контакт нужно подать логическую единицу на 10мкс, чтобы дальномер испустил ультразвуковую волну.
  • Echo – После того, как ультразвуковая волна вернется обратно, на этот контакт будет подана логическая единица на время, пропорциональное расстоянию до объекта
  • Gnd – Этот контакт подключается к земле.

Ультразвуковой дальномер – работает по принципу “летучей мыши”. Он посылает ультразвуковую волну и считает время, за которое волна возвратится. Зная скорость звука и время, за которое волна пришла обратно, можно рассчитать расстояние до объекта.

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

Дальномер

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

Код

#define ECHO 13 #define TRIG 12 void setup() { pinMode(ECHO, INPUT); // На ECHO нужно подать логическую единицу pinMode(TRIG, OUTPUT); //С TRIG мы будем считывать значение расстояния Serial.begin(9600); //Установим соединение с Serial портом } void loop() { //Подаем на TRIG HIGH и сразу LOW digitalWrite(TRIG, HIGH); digitalWrite(TRIG, LOW); //Считываем длину пришедшего сигнала в микросекундах int dist = pulseIn(ECHO, HIGH) / 54; // Делим на 54, чтобы перевести показания в см Serial.println(dist); //Выводим показания дальномера в Serial delay(300); //Ждем немного, чтобы глаз успевал различать показания }

Пояснения

pulseIn(ECHO, HIGH); - С помощью этой функции мы считали время, на которое на пине ECHO устанавливается значение HIGH. Это время считается в микросекундах.

В общем виде pulseIn(); можно записать так:

pulseIn(пин, значение, таймаут);

Пин – Пин, на котором будет производиться подсчет времени.

Значение – Уровень ожидаемого сигнала, при котором будет проводиться подсчет. HIGH или LOW.

Таймаут – время в микросекундах, в течение которого ожидается приход сигнала. По истечении таймаута значение, возвращаемое функцией, будет приравнено к нулю.

Так, с принципом работы дальномера разобрались. Время сделать парктроник для игрушечных машинок.

Парктроник

Схема парктроника выглядит так:

#define ECHO 3 // Прием сигнала с дальномера #define TRIG 2 // Подача сигнала на дальномер #define COUNT 5 // Кол-во светодиодов #define BUZZ 6 // Пин для пищалки #define FIRST 9 // Первый пин светодиодов #define dist_setup 1 //Подстроечный коэффициент #define frequency 5000 void setup() { for(int i = 0; i < COUNT; ++i) //Обозначаем светодиоды как выход... { pinMode(i+FIRST, OUTPUT); } pinMode(ECHO, INPUT); //...ECHO как вход... pinMode(TRIG, OUTPUT); //...TRIG как выход... pinMode(BUZZ, OUTPUT); //...пищалку как выход Serial.begin(9600); //Установим соединение с Serial } void loop() { digitalWrite(TRIG, HIGH); //Подаем команду на дальномер digitalWrite(TRIG, LOW); int dist = pulseIn(ECHO, HIGH) / 54; //Измеряем расстояние до объекта dist = constrain(dist, 2, 60); //Полученные значения загоняем в диапазон от 2 до 60 //Сравниваем полученные показания и включаем нужный режим if (dist < 10) { all_led_on(); } else if (dist < 20 * dist_setup) { four_led_on(); } else if (dist < 30 * dist_setup) { three_led_on(); } else if(dist < 40 * dist_setup) { two_led_on(); } else if(dist < 50 * dist_setup) { one_led_on(); } else { for(int i = 0; i < COUNT; ++i) { digitalWrite(i+FIRST, LOW); } noTone(BUZZ); } } // Описание режимов void one_led_on() { digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, HIGH); tone (BUZZ, frequency, 1000); delay(1000); } void two_led_on() { digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, HIGH); digitalWrite(13, HIGH); tone(BUZZ, frequency, 700); delay(700); } void three_led_on() { digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, HIGH); digitalWrite(12, HIGH); digitalWrite(13, HIGH); tone(BUZZ, frequency, 400); delay(400); } void four_led_on() { digitalWrite(9, LOW); digitalWrite(10, HIGH); digitalWrite(11, HIGH); digitalWrite(12, HIGH); digitalWrite(13, HIGH); tone(BUZZ, frequency, 200); delay(200); } void all_led_on() { for(int i = 0; i < COUNT; ++i) { digitalWrite(i+FIRST, HIGH); } tone(BUZZ, frequency, 5000); delay(5000); }

Пояснения

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

dist_ setup – это коэффициент, с помощью которого можно регулировать расстояние до срабатывания парктроника.

У меня он равен единице. Если вам нужно уменьшить расстояние – нужно уменьшить коэффициент, но тогда он будет в виде 0.xxx. Для этого вводится переменная типа float.

Частоту писка можно также изменять. Для этого нужно изменить значение frequency . Но следует помнить, что пищит пьезоизлучатель ужасно. Крайне. И, мне кажется, что он быстро отобьет у вас желание им пользоваться дальше или дольше 5 минут.

Как вариант – понизить частоту до 20 Гц или подключить обычный динамик на 8 Ом, к примеру.

Пароль

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

Внимание на схему.

Код

//Пины первого дальномера #define TRIG1 12 #define ECHO1 13 //Пины второго дальномера #define TRIG2 10 #define ECHO2 11 //Светодиоды #define FIRST 3 #define COUNT 5 //Кнопка сброса #define RESET 2 //Переменные для пароля int key1; int key2; int key3; void setup() { //Обозначение светодиодов как выход for(int i = 0; i < COUNT; i++) { pinMode(i+FIRST, OUTPUT); } //Обозначение пинов на дальномерах pinMode(TRIG1, OUTPUT); pinMode(ECHO1, INPUT); pinMode(TRIG2, OUTPUT); pinMode(ECHO2, INPUT); pinMode(RESET, INPUT_PULLUP); } void loop() { //Подача сигнала на дальномеры digitalWrite(TRIG2, HIGH); digitalWrite(TRIG2, LOW); int dist2 = pulseIn(ECHO2, HIGH,3000) / 54; digitalWrite(TRIG1, HIGH); digitalWrite(TRIG1, LOW); int dist1 = pulseIn(ECHO1, HIGH) / 54; //Дополнительная индикация "ввода" символов if(dist1 < 10 && dist2 < 10) { digitalWrite(5, HIGH); delay(100); } if(dist2 > 20 && dist2 < 25) { digitalWrite(4, HIGH); delay(100); } if(dist1 > 20 && dist1 < 25) { digitalWrite(6, HIGH); delay(100); } //Код пароля + индикация "ввода" символов if(dist2 > 10 && dist2 <15) { key1 = 1; digitalWrite(3, HIGH); delay(100); } if(dist1 > 10 && dist1 < 15) { digitalWrite(7, HIGH); delay(100); key1 = 0; } if(dist1 > 20 && dist1 < 25 && key1 == 1) { key2 = 1; } else if(dist2 > 20 && dist2 <25 || key1 == 0) { key1 = 0; key2 = 0; } if(dist1 < 10 && dist2 < 10 && key2 == 1) { key3 = 1; } if(key3 == 1) { for(int i = 0; i < COUNT; i++) { digitalWrite(i + FIRST, HIGH); } } if(key3 == 0) { for(int i = 0; i < COUNT; i++) { digitalWrite(i + FIRST, LOW); } } //Сброс пароля boolean res = digitalRead(RESET); if(res == 0) { key1 = 0; key2 = 0; key3 = 0; } }

Пояснения

Для того чтобы зажечь все пять светодиодов – нужно знать последовательность действий, которую нужно выполнять. Вот для вас задание – “Не смотря объяснения ниже, определить, какую же последовательность действий нужно выполнять, чтобы загорелись все пять светодиодов”

Это выполнимая задача, если вы читали первую часть курса и разобрались в работе функции if().

Разобрались? Если да – молодцы, а если нет – почти молодцы.

Всего есть три “символа ввода” – от 0 до 10, от 10 до 15 и от 20 до 25.

Состояние от 0 до 10 включается, если поднести обе руки на расстояние от 0 до 10 см к обоим дальномерам. Если это сделать – загорится желтый светодиод.

Состояние от 10 до 15 включится, когда вы поднесете руку к правому или левому дальномеру на расстояние от 10 до 15 см. О совершении этого действия вам подскажут крайний левый светодиод для левой руки и крайний правый – для правой.

Состояние от 20 до 25 включается в тот момент, когда расстояние от руки до одного из дальномеров будет от 20 до 25 см. Об этом вас проинформируют второй слева и второй справа светодиоды для левой и правой руки соответственно.

Стоит отметить, что выполнять последовательность нужно строго.

  • Поднести ПРАВУЮ руку на расстояние от 10 до 15.
  • После того, как загорелся крайний правый светодиод – поднести ЛЕВУЮ руку на расстояние от 20 до 25. Все это делается, не меняя положения правой руки.
  • После индикации второго слева светодиода – отвести ЛЕВУЮ руку влево, чтобы не загорелся крайний левый светодиод, иначе – код нужно будет набирать сначала. ПРАВУЮ руку приблизить на расстояние от 0 до 10, а ЛЕВУЮ подвести на это же расстояние, не задевая расстояние от 10 до 15
  • Светодиоды должны гореть и не реагировать на ваши действия.
  • Нажать кнопку RESET, для сброса пароля. Светодиоды должны потухнуть.

Каждое неверное движение сбрасывает пароль, и его нужно вводить заново. С первого раза может и не получиться, но спустя несколько минут тренировки, я уверен – все получится, и светодиоды загорятся.

После того, как у вас будет получаться зажечь все светодиоды, можно вам проверить себя и изменить код так, чтобы последовательность была другая – на ваше усмотрение. Можно сделать больше “символов”, а можно оставить те же, но сделать каждый символ с использованием двух дальномеров. Это будет заданием для самостоятельного решения.

Инфракрасный дальномер Sharp

С этими дальномерами все даже проще. Подключать их нужно, как и все аналоговые датчики. И даже можно без резистора на 10 кОм. Если вы по каким-то причинам этого не умеете, то это описано в моей статье про .

Терменвокс

Есть такой музыкальный инструмент, как терменвокс. И сейчас мы соберем подобие этого инструмента.

Код

// Обозначаем дальномер, кнопку и пищалку #define RFIND A5 #define BUT 9 #define BUZ 8 // Логические переменные для кнопки bool sound_on = false; bool but_up = true; void setup() { pinMode(RFIND, INPUT); pinMode(BUZ, OUTPUT); pinMode(BUT,INPUT_PULLUP); } void loop() { //Код для включения и выключения терменвокса bool but_now = digitalRead(BUT); if(but_up && !but_now) { delay(10); bool but_now = digitalRead(BUT); if(!but_now) { sound_on = !sound_on; } } but_up = but_now; //Код для терменвокса if(sound_on == 1) { int val, freq; val = analogRead(RFIND); //Со значениями constrain и map можно поиграть, как душе угодно val = constrain(val, 100, 400); freq = map(val, 100, 400, 1000, 2500); tone(BUZ, freq, 20); } }

Пояснения

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

Кнопка нужна для остановки или запуска нашего “Терменвокса”

Итог

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

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
Схема 1
Плата Arduino

Arduino Uno

1 В блокнот
Макетная плата Breadboard-half 1 В блокнот
Соединительные провода "Папа-Папа" 4 В блокнот
Дальномер HC-SR04 2 В блокнот
Схема 2
Плата Arduino

Arduino Uno

1 В блокнот
Дальномер HC-SR04 1 В блокнот
Соединительные провода "Папа-Папа" 15 В блокнот
Макетная плата Breadboard-half 1 В блокнот
Пьезоизлучатель 1 В блокнот
Резистор

220 Ом

1 В блокнот
Светодиод

АЛ102Б

2 В блокнот
Светодиод

АЛ307В

1 В блокнот
Светодиод

АЛ307Д

2 В блокнот
Схема 3
Плата Arduino

Arduino Uno

1 В блокнот
Дальномер HC-SR04 2 В блокнот
Резистор

220 Ом

5

Роботам, как и смерть всем человекам очень нужны органы чувств, чтобы ориентироваться в пространстве. Инфракрасный дальномер 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); } }

Если подводить итог, то датчик, хотя и немного капризен, очень прост в использовании и относительно дешев.

Использовать его можно в роботах, а также для контроля пересечения дверных проемов, в каких-нибудь интерактивных устройствах, управляемых жестами и в чем-то, что еще подскажет фантазия.

Планирую купить +32 Добавить в избранное Обзор понравился +38 +67

Лазерный дальномер инфракрасного диапазона излучает энергию в диапазоне, невидимом человеческим глазом. Он является лазерным устройством, относящимся к классу 1 в соответствии с требованиями Управления контроля продукции и лекарств США, 21 CFR 1040.10-11. Маркировка соответствия лазера требованиям FDA, закреплена на корпусе системы CMS Wireless. На этой маркировке указываются также модель, серийный номер и дата изготовления.

К классу 1 относятся лазеры, которые в нормальных рабочих условиях не могут причинить человеку вреда. При нормальной установке человек может смотреть на лазерный луч без очков или в своих обычных очках (Не смотрите на лазерный луч, когда система включена – стандартная мера предосторожности).

Лазер остается в возбужденном состоянии, пока команды LASER TEST или START SURVEY продолжают быть выбраны в программном обеспечении контроллера. Когда лазер находится в возбужденном состоянии, на экран контроллера выводятся расстояния и другие данные.

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

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

Рисунок 7.2 - Сканирующая головка

Рисунок 7.3 - Внешний вид лазерной сканирующей головки

Рисунок 7.4 - Установка VIP в подземных условиях

Рисунок 7.5 - Установка штанг и мачт в подземных условиях

Рисунок 7.6 - Ввод сканера в полость в подземных условиях

Таблица 33 -Технические характеристики

Лазерная сканирующаяголовка
Дальность измерения цели с 20 – процентным отражением 350 м.
Дальность измерения до белой стены 650 м
Диапазон угла вращения 0 - 360º
Диапазон угла наклона 0 – 145º
Линейная точность измерения -+2 см в диапазоне рабочих температур
Разрешающая способность 1 см
Угловая точность измерения -+ 0,3º
Максимальная скорость вращения 21º/с
Длина волны 905 нм (в инфракрасном диапазоне), 635 нм (в оптическом диапазоне).
Отклонение лазерного луча 5 мрад
Мах кол-во отсчетов 100 000 (для каждой съемки)
Опорная конструкция
Материалы Углепластик, стыковочные узлы из полиэтилена высокой плотности, зажимы из нержавеющей стали.
Длина штанги 2-9 м, регулируется
Кол-во штанговых секций 5 конических по 2 м каждая
Длина опор мачты (2 шт) 2-5 м, регулируется
Кол-во мачтовых надставок 5 (различной длины)
Питание (внешние батареи)
Напряжение Номинально 24 В
Емкость 7.2 А/ч, номинально 24 В
Потребляемая мощность 2.5 А, номинально 24 В
Внешние условия
Рабочая температура Дальномер (- 10º до +50º), указатель (0º до 40º)
Температура хранения От –20 до +50º
Влажность воздуха От 0 до 95%, без конденсата
Размеры
Блок питания (мм) 270 * 247 * 175
Вес, кг 8.3
Мачта (мм) 2290*230*250
Секция штанги (мм) 1930*200*250
Вес, кг 44.5
Безопасность для глаз
Указатель 2 класс
Дальномер 1 класс
Устройство вертикального ввода в полость (VIP)
Компоненты 25 алюминиевых стержней (около 1.5 метра каждый)
1 адаптер сканирующей головки
2 центрирующие пружинные системы
1 соединительный кабель, около 41 метра

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

Эта статья также доступна на следующих языках: Тайский

  • Next

    Огромное Вам СПАСИБО за очень полезную информацию в статье. Очень понятно все изложено. Чувствуется, что проделана большая работа по анализу работы магазина eBay

    • Спасибо вам и другим постоянным читателям моего блога. Без вас у меня не было бы достаточной мотивации, чтобы посвящать много времени ведению этого сайта. У меня мозги так устроены: люблю копнуть вглубь, систематизировать разрозненные данные, пробовать то, что раньше до меня никто не делал, либо не смотрел под таким углом зрения. Жаль, что только нашим соотечественникам из-за кризиса в России отнюдь не до шоппинга на eBay. Покупают на Алиэкспрессе из Китая, так как там в разы дешевле товары (часто в ущерб качеству). Но онлайн-аукционы eBay, Amazon, ETSY легко дадут китайцам фору по ассортименту брендовых вещей, винтажных вещей, ручной работы и разных этнических товаров.

      • Next

        В ваших статьях ценно именно ваше личное отношение и анализ темы. Вы этот блог не бросайте, я сюда часто заглядываю. Нас таких много должно быть. Мне на эл. почту пришло недавно предложение о том, что научат торговать на Амазоне и eBay. И я вспомнила про ваши подробные статьи об этих торг. площ. Перечитала все заново и сделала вывод, что курсы- это лохотрон. Сама на eBay еще ничего не покупала. Я не из России , а из Казахстана (г. Алматы). Но нам тоже лишних трат пока не надо. Желаю вам удачи и берегите себя в азиатских краях.

  • Еще приятно, что попытки eBay по руссификации интерфейса для пользователей из России и стран СНГ, начали приносить плоды. Ведь подавляющая часть граждан стран бывшего СССР не сильна познаниями иностранных языков. Английский язык знают не более 5% населения. Среди молодежи — побольше. Поэтому хотя бы интерфейс на русском языке — это большая помощь для онлайн-шоппинга на этой торговой площадке. Ебей не пошел по пути китайского собрата Алиэкспресс, где совершается машинный (очень корявый и непонятный, местами вызывающий смех) перевод описания товаров. Надеюсь, что на более продвинутом этапе развития искусственного интеллекта станет реальностью качественный машинный перевод с любого языка на любой за считанные доли секунды. Пока имеем вот что (профиль одного из продавцов на ебей с русским интерфейсом, но англоязычным описанием):
    https://uploads.disquscdn.com/images/7a52c9a89108b922159a4fad35de0ab0bee0c8804b9731f56d8a1dc659655d60.png