Электрификация

Справочник домашнего мастера

Датчик препятствия arduino

Инфракрасный датчик препятствий YL-63

Обзор датчика препятствия YL-63

Цифровой инфракрасный датчик обхода препятствий YL-63 (или FC-51) (рис.1) применяется тогда, когда нужно определить наличие объекта, а точное расстояние до объекта знать необязательно. Датчик состоит из инфракрасного излучателя, и фотоприемника. ИК источник излучает инфракрасные волны, которые отражаются от препятствия и фиксируются фотоприемником. Датчик обнаруживает препятствия в диапазоне расстояний от нуля до установленной предельной границы. Он построен на основе компаратора LM393, который выдает напряжение на выход по принципу: обнаружено препятствие –логический уровень HIGH, не обнаружено – логический уровень LOW, данное состояние показывает и находящийся на датчике красный светодиод. Пороговое значение зависит от настройки датчика и регулируется с помощью установленного на модуле потенциометра. Для индикации питания на датчике установлен зеленый светодиод. Датчик применяется в робототехнике для обнаружения препятствий при движении колесных или гусеничных роботов.

Технические характеристики датчика препятствия YL-63

  • Модель: YL-63(или FC-51)
  • напряжение питания: 3.3–5 В
  • тип датчика: диффузионный
  • компаратор: LM393
  • расстояние обнаружения препятствий: 2 – 30 см
  • эффективный угол обнаружения препятствий: 35°
  • потенциометр для изменения чувствительности
  • светодиод индикации питания
  • светодиод индикации срабатывания
  • размеры: 43 х 16 х 7 мм

Подключение YL-63 к Arduino

Модуль имеет 3 вывода:

  • VCC — питание 3-5 В;
  • GND — земля;
  • OUT — цифровой выход.

Подключим датчик к плате Arduino (Схема соединений на рис. 1) и напишем простой скетч, сигнализирующий звуковым сигналом о наличии препятствия. Загрузим скетч из листинга 1 на плату Arduino и посмотрим как датчик реагирует на препятствия (см. рис. 2).

Рисунок 1. Схема соединений подключения датчика YL-63 к плате Arduino

Загрузим скетч из листинга 1 на плату Arduino и посмотрим как датчик реагирует на препятствия (см. рис. 3). Листинг 1 // Скетч к обзору датчика препятствий YL-63 // http:// http://3d-diy.ru // контакт подключения выхода датчика #define PIN_YL63 5 // Данные с датчика Y63 #define barrier digitalRead(PIN_YL63) void setup() { // инициализация последовательного порта Serial.begin(9600); // настройка контакта подключения датчика в режим INTPUT pinMode(PIN_YL63,INTPUT); } void loop() { if (barrier == 1) { Serial.println(«BARRIER!!!»); // Зона обнаружения препятствия while (barrier == 1) // Ждем выхода {;} } else { Serial.println(«not barrier»); // Вне зоны обнаружения препятствия while (barrier == 1) // Ждем входа {;} } }

Рисунок 2. Вывод данных в монитор последовательного порта

С помощью потенциометра поэкспериментируем с установкой порогового значения.

Пример использования

Рассмотрим пример использования датчика YL-63 на борту популярной самоходной робототехнической платформы – мобильный робот на базе Arduino (см. 3).

Рисунок 3. Робототехническая платформа – мобильный робот на базе Arduino

Создадим скетч обхода роботом лабиринта. Если при движении робота в лабиринте придерживаться одной его стороны (левой или правой), то выход обязательно будет достигнут (рис. 4).

Рисунок 4. Схема обхода лабиринта роботом.

Установим на передний бампер робота три датчика препятствий, два смотрят вперед, один – вправо (см. рис. 5).
Наличие двух передних датчиков улучшает качество определения препятствий спереди, поскольку один датчик не охватывает всю переднюю зону.

Рисунок 5. Подключение датчиков препятствий к мобильному роботу на базе Arduino.

В скетче проверяем состояние датчиков и в зависимости от полученных данных принимается решение о движении. Датчики подключены к контактам Arduino 2, 12, 13. // Номера портов к которым подключены датчики препятствия. const int Front1 = 2, Front2 = 12, Right = 13; Создадим в Arduino IDE новый скетч, занесем в него код из листинга 2 и загрузим скетч на на плату Arduino. Листинг 2 // Объявляем переменные для хранения состояния двух моторов. int motor_L1, motor_L2, input_L; int motor_R1, motor_R2, input_R; // Временные константы служат для точного задания времени на поворот, разворот, движение вперед // в миллисекундах. const int time_90 = 390; // Номера портов к которым подключены датчики препятствия. const int Front1 = 2, Front2 = 12, Right = 13; //========================================= void setup() { // Заносим в переменные номера контактов (пинов) Arduino. // Для левых и правых моторов машинки. setup_motor_system(3, 4, 11, 7, 8, 10); // pinMode(Front1, INPUT); pinMode(Front2, INPUT); pinMode(Right, INPUT); // Двигатели запущены. setspeed(255, 255); } // Основная программа. void loop() { boolean d_Front1, d_Front2, d_Right; d_Front1 = digitalRead(Front1); d_Front2 = digitalRead(Front2); d_Right = digitalRead(Right); // Если ни один датчик не сработал. if (d_Front1 && d_Front2 && d_Right) { //Замедление правых колес setspeed(255, 15); forward();//подворот вправо. } else { //Если сработал один из передних датчиков и не сработал правый. if ((!d_Front1) || (!d_Front2)) { //Максимальная мощность на все колеса. setspeed(255, 255); // поворачиваем налево на 90 градусов. left(); delay(time_90 / 5); } else { // Если сработал правый датчик. // Замедление левых колес. setspeed(15, 255); forward();//подворот влево. } } } // Функция инициализации уравления моторами. void setup_motor_system(int L1, int L2, int iL, int R1, int R2, int iR) { // Заносим в переменные номера контактов (пинов) Arduino. motor_L1 = L1; motor_L2 = L2; input_L = iL; // Для левых и правых моторов машинки. motor_R1 = R1; motor_R2 = R2; input_R = iR; // Переводим указанные порты в состояние вывода данных. pinMode(motor_L1, OUTPUT); pinMode(motor_L2, OUTPUT); pinMode(input_L, OUTPUT); pinMode(motor_R1, OUTPUT); pinMode(motor_R2, OUTPUT); pinMode(input_R, OUTPUT); } // Функция задает скорость двигателя. void setspeed(int LeftSpeed, int RightSpeed) { // Задаем ширину положительного фронта от 0 до 255. analogWrite(input_L, LeftSpeed); analogWrite(input_R, RightSpeed); // Чем больше, тем интенсивнее работает мотор. } // Поворот налево с блокировкой левых колес. void forward() { // Левые колеса вращаются вперед. digitalWrite(motor_L1, HIGH); digitalWrite(motor_L2, LOW); // Правые колеса вращаются вперед. digitalWrite(motor_R1, HIGH); digitalWrite(motor_R2, LOW); } // Поворот налево. void left() { // левые колеса вращаются назад digitalWrite(motor_L1, LOW); digitalWrite(motor_L2, HIGH); // правые колеса вращаются. digitalWrite(motor_R1, HIGH); digitalWrite(motor_R2, LOW); } Запускаем робота в лабиринте и смотрим как он движется в лабиринте.

Часто задаваемые вопросы FAQ

1 . Не горит зеленый светодиод

  • Проверьте правильность подключения датчика.

2. Датчик не определяет препятствие на определенном расстоянии

  • С помощью протенциометра подберите порог срабатывания датчика.

Обзор инфракрасного модуля препятствия, LM393

В этой статье рассмотрим модуль препятствия YL-63 (FC-51), который использует принцип инфракрасного (ИК) отражения. Данный модуль часто используется в робототехнике, в различной сигнализации и так далее.

Технические параметры

► Напряжение питания: 3.3 В ~ 5.5 В
► Потребляемый ток: 10 мА
► Цифрового выход: TTL (лог 1 или лог 0)
► Диаметр монтажного отверстия: 2.5 мм
► Выходной ток: 15 мА
► Габариты: 42мм х 15мм х 8мм

Общие сведения

Модуль содержит инфракрасный передатчик (ИК диод) излучающий свет в прямом направлении (~ 700 нм, этот свет не виден невооруженным глазом, его можно увидеть только камерой) и приемник (фотодиод), который измеряет отраженное ИК излучение. Если отраженный свет достигает определенного порога на выходе появляется положительный импульс. Так-же, количество отраженного излучения зависит от цвета поверхности от которой оно отражается. Если поверхность белая то модуль сработает на максимальной расстоянии, если темная или матовая излучение не отразится и модуль не сработает.

Основная микросхема ИК датчика препятствия, это компаратор LM393 (U1), который производит сравнение уровней напряжений на входах INB- и INB+. Чувствительность порога срабатывания задается с помощью потенциометром R2 и в результате сравнений на выходе OUTB микросхемы U1, формируется лог «LOW» или лог «HIGH». Принципиальная схема ИК модуля препятствия показана на рисунке ниже.

Настройка чувствительности.
Чтобы уменьшения воздействия на фоточувствительный элемент от окружающей среды (солнца, различных ИК излучение) и избавив модуль от ложных срабатываний, предусмотрен потенциометр, с помощью которого можно осуществить настройку модуля. Для настройки необходима небольшая плоская отвертка, а так же убираем все препятствия переда модулем. Теперь можно приступить к настройке, подключаем питание (загореться красный светодиод). Если на модуле загорится зеленый светодиод, крутим потенциометр влево пока он не погаснет. После этого можно устанавливать любой предмет (можно и руку) перед модулем и настраивать расстояние срабатывания.

Назначение J1 (в исполнении 3pin)
► VCC: «+» питание модуля
► GND: «-» питание модуля
► D0: цифровой выход

Подключение ИК модуля препятствия к Arduino

Подключение:
В данном примере буду использовать ИК модуль препятствия, LM393 и Arduino UNO R3, данные будут передаваться в «Мониторинг порта». Схема не сложная, сначала необходимо подключить питание, GND к GND и VCC к 5V (можно записать и от 3.3В), затем подключаем вывод OUT к порты D0 (Arduino). Схема подключения приложена ниже.

Запускаем среду разработки и загружаем данный скетч, затем открываем мониторинг порта.

В мониторинг порта, можно увидеть все изменения.

Купить на Aliexpress
Контроллер Arduino UNO R3
Комплект проводов DuPont, 2,54 мм, 20 см
ИК модуль препятствия, LM393, 3 pin x 1 шт.

Купить в Самаре и области
Купить контроллер Arduino UNO R3
Купить провода DuPont, 2,54 мм, 20 см
Купить модуль препятствия, LM393, 3 pin

Датчик обхода препятствий YL-63

Здравствуйте. Сегодня я хочу рассказать о датчике обхода препятствий YL-63. В основном он используется для различных моделей роботов на ARDUINO и не только. С помощью него можно «находить» препятствие и преждевременно его обходить, объезжать и т.д. в зависимости от того, на что вы его поставили.

Этот датчик излучает инфракрасное излучение и принимает его. С помощью переменного резистора (на фото синего цвета) можно менять чувствительность, и менять расстояние срабатывания. Работать очень просто — два вывода питания (плюс VCC и минус GND) и выход сигнала OUT который указывает на появление предмета в области действия датчика. Датчик собран на микросхеме LM393 (компаратор) с относительно низким энергопотреблением. Напряжение питания от 3,3 до 5 В. При замере потребления я получил около 120 мА из которых 90% потребляет ИК светодиод, но тем не менее для экспериментов это вполне нормально. Ширина зоны чувствительности около 35 градусов. Размеры датчика 43 х 16 х 7 мм.


Стоимость: ~20 Подробнее на Aliexpress
Доставка новых самоделок на почту

Получайте на почту подборку новых самоделок. Никакого спама, только полезные идеи!

*Заполняя форму вы соглашаетесь на обработку персональных данных

Каждый робот, способный ездить, летать или плавать, должен видеть препятствия, находящиеся у него на пути. Чтобы робот смог это сделать, ему необходимы соответствующие датчики. В английской литературе такие устройства называют proximity sensor, мы же их будем называть датчиками препятствия. На этом уроке мы рассмотрим один из самых распространенных датчиков препятствия, который работает по принципу отражения. Устроен он очень просто. Датчик содержит направленный источник света и детектор света. Источником часто служит инфракрасный светодиод с линзой, а детектором — фотодиод или фототранзистор. Светодиод на датчике постоянно включен и излучает узкий пучок света в прямом направлении. Если перед датчиком есть препятствие (рисунок А), то на детектор попадает отраженный свет от источника, и на выходе датчика появляется положительный импульс. В противном случае, если препятствия нет, то датчик молчит (рисунок Б). Есть и третий вариант, когда препятствие есть, но свет от него не отражается! На рисунке В изображен как раз такой случай. Получается, матовую черную поверхность робот не увидит.

1. Подключение

Будем подключать самый простой датчик с цифровым выходом. Принципиальная схема подключения к выводам Ардуино Уно:Внешний вид макета

2. Настройка чувствительности

Как известно, вокруг нас имеется множество источников инфракрасного излучения, включая лампы освещения и солнце. Фоточувствительный элемент датчика регистрирует это фоновое излучение, и может дать ложный сигнал срабатывания. Другими словами, датчик препятствия может сработать, когда никакого препятствия и нет вовсе. Чтобы решить эту проблему, на датчике имеется возможность настроить чувствительность таким образом, чтобы воспринимать только свет достаточной силы. Обычно это реализуется с помощью компаратора — электронного устройства, позволяющего сравнивать два уровня напряжения. Одно напряжение подается на компаратор с фотодиода, а другое с делителя напряжения на основе потенциометра. Второе напряжение будем называть пороговым. Теперь датчик даст положительный сигнал только тогда, когда напряжение на фотодиоде станет больше, чем настроенное нами. Для настройки порогового напряжения нам понадобится шлицевая отвертка (она же — плоская). В этой процедуре нам также поможет зеленый светодиод состояния, который загорается когда датчик регистрирует достаточный уровень инфракрасного света. Алгоритм настройки сводится к трем шагам:

  • помещаем датчик в условия освещенности, в которых он будет работать;
  • подключаем датчик к питанию, при этом на нем загорится красный светодиод;
  • убираем перед датчиком все препятствия, и крутим потенциометр до тех пор, пока зеленый светодиод состояния не погаснет.

Для проверки поднесем к датчику ладонь, и на определенном расстоянии загорится зеленый светодиод. Уберем руку — светодиод погаснет. Расстояние на котором датчик регистрирует препятствие зависит от уровня фоновой засветки, от настройки чувствительности и от правильного расположения фотодиода и светодиода на датчике. Они должны быть расположены строго параллельно друг другу. Теперь, когда датчик настроен должным образом, приступим к составлению программы.

3. Программа

Для примера, будем зажигать и гасить штатный светодиод №13 на Ардуино Уно, в зависимости от показаний датчика. При использовании цифрового датчика, программа будет такой же, как и в случае работы с кнопками. На каждой итерации цикла loop мы считываем значение на выводе №2, и затем сравниваем это значение с уровнем HIGH. Если значение равно HIGH, значит датчик видит препятствие, и мы зажигаем светодиод на выводе №13. В противном случае — гасим светодиод. const int prx_pin = 2; const int led_pin = 13; byte v; void setup() { pinMode(prx_pin, INPUT); pinMode(led_pin, OUTPUT); } void loop() { v = digitalRead( prx_pin ); if( v == HIGH ) digitalWrite( led_pin, HIGH ); else digitalWrite( led_pin, LOW ); }

4. Пример использования

Попробуем теперь применить цифровой датчик по прямому назначению. Заставим двухколесного робота реагировать на показания двух датчиков, размещенных слева и справа.Сделаем так, чтобы при обнаружении препятствия робот отворачивал от него в противоположную сторону, а затем продолжал движение вперед. Оформим программу в виде блок-схемы процедуры loop.

Задания

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

  1. Направить датчики препятствия вниз, чтобы робот смог чувствовать край стола. Написать программу, которая предотвращает падение робота со стола.
  2. Снова направить датчики вниз, но на этот раз для другой цели. Как мы выяснили, датчик может отличить черную поверхность от белой. Воспользуйтесь этим свойством, чтобы сделать робота-следопыта (он же LineFollower).
  3. Направить датчики в стороны, и заставить робота двигаться вдоль стены.

На следующем уроке мы познакомимся с датчиком, который устроен практически так же, но больше подходит для детектирования черных и белых поверхностей. Попробуем считывать уже не цифровой, а аналоговый сигнал датчика, чтобы сделать более совершенного робота-следопыта. Вконтакте Facebook Twitter 2+

Для проекта нам понадобятся:

  • Arduino UNO или иная совместимая плата;
  • инфракрасный датчик препятствий;
  • инфракрасный приёмник;
  • соединительные провода (рекомендую вот такой набор);
  • макетная плата (breadboard);
  • персональный компьютер со средой разработки Arduino IDE.

1Описание и принцип действия ИК датчика препятствий

Инфракрасное (ИК) или infrared (IR) излучение – это невидимое человеческим глазом электромагнитное излучение в диапазоне длин волн от 0,7 до 2000 мкм. Вокруг нас существуют огромное количество объектов, которые излучают в данном диапазоне. Его иногда называют «тепловое излучение», т.к. все тёплые предметы генерируют ИК излучение.

Длины волн разных типов электромагнитного излучения

Модули на основе ИК излучения используются, в основном, как детекторы препятствий для различного рода электронных устройств, начиная от роботов и заканчивая «умным домом». Они позволяют обнаруживать препятствия на расстоянии от нескольких сантиметров до десятков сантиметров. Расстояние до препятствия при этом определить с помощью ИК-сенсора невозможно.

Если оснастить, для примера, своего робота несколькими такими ИК модулями, можно определять направление приближения препятствия и менять траекторию движения робота в нужном направлении.

Модуль сенсора обычно имеет излучатель (светодиод) и детектор (фотодиод) в инфракрасном диапазоне. Инфракрасный светодиод излучает в пространство ИК излучение. Приёмник улавливает отражённое от препятствий излучение и при определённой интенсивности отражённого излучения происходит срабатывание. Чтобы защититься от видимого излучения, фотодиод имеет светофильтр (он выглядит почти чёрным), который пропускает только волны в инфракрасном диапазоне. Разные поверхности по-разному отражают ИК излучение, из-за чего дистанция срабатывания для разных препятствий будет отличаться. Выглядеть ИК модуль может, например, вот так:

Модуль с ИК излучателем и ИК приёмником

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

Помимо инфракрасного свето- и фотодиода важная часть модуля – это компаратор LM393 (скачать техническое описание на LM393 можно в конце статьи). С помощью компаратора сенсор сравнивает интенсивность отражённого излучения с некоторым заданным порогом и устанавливает «1» или «0» на выходе. Потенциометр позволяет задать порог срабатывания ИК датчика (и, соответственно, дистанцию до препятствия).

2Подключение ИК датчика препятствийк Arduino

Подключение ИК модуля к Arduino предельно простое: VCC и GND модуля подключаем к +5V и GND Arduino, а выход OUT сенсора – к любому цифровому или аналоговому выводу Arduino. Я подключу его к аналоговому входу A7.

Модуль с инфракрасным датчиком подключён к Arduino Nano

3Скетч Arduino для инфракрасного датчика препятствий

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

const int ir = A7; void setup() { Serial.begin(115200); } void loop() { int r = analogRead(ir); // r в диапазоне от 0 до 1023 Serial.println(r); if (r < 100) { // т.к. используется аналоговый пин Arduino Serial.println(«Detected!»); } delay(100); }

Напомню, в Arduino используется 10-разрядный АЦП, поэтому значение аналогового сигнала кодируется числом в диапазоне от 0 до 1023. При использовании аналогового входа Arduino предельные значения «0» или «1023» мы вряд ли получим с датчика, поэтому лучше использовать некоторый порог, например, равный 100 (поэтому в скетче r < 100). При использовании же цифрового вывода Arduino для чтения показаний инфракрасного датчика, можно можно написать (r == LOW) или (r == 0) или (r < 1).

Хорошая статья про аналоговые измерения на Arduino.

Думаю, довольно понятно, как найти применение такому модулю в ваших проектах. Необходимо периодически опрашивать состояние на выходе модуля, и как только напряжение меняется с HIGH на LOW, предпринимать необходимые действия: менять направление движения робота, включать свет в помещении и т.п.

4Подключение к Arduino модуля с инфракрасным приёмником

ИК датчик может состоять из одного только инфракрасного приёмника, как в этом случае:

ИК приёмник

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

К Arduino модуль с ИК приёмником подключается тоже очень просто:

Пин модуля Пин Arduino Назначение
DAT Любой цифровой Признак наличия ИК излучения на входе приёмника
VCC +5V Питание
GND GND Земля

Подключение ИК приёмника к Arduino

Напишем скетч, в котором будем просто показывать с помощью встроенного светодиода, что на входе приёмника присутствует ИК излучение. В данном модуле аналогично с ранее рассмотренным на выходе DAT уровень «0», когда ИК излучение попадает на приёмник, и «1» когда ИК излучения нет.

const int ir = 2; void setup() { pinMode(LED_BUILTIN, OUTPUT); // это 13-ый вывод Arduino со встроенным светодиодом pinMode(ir, INPUT); } void loop() { int r = digitalRead(ir); digitalWrite(LED_BUILTIN, r!=HIGH); // зажигаем светодиод, если модуль среагировал на ИК излучение // в противном случае — гасим }

Если загрузить этот скетч в Arduino, направить на ИК приёмник ИК пульт и нажимать на нём разные кнопки, то мы увидим, что светодиод нашего индикатора быстро мигает. Разные кнопки – по-разному мигает.

Чтение команд ИК пульта с Arduino

Очевидно, что каждая команда закодирована своей бинарной последовательностью. Хотелось бы увидеть, какие именно команды приходят от пульта. Но прежде чем ответить на этот вопрос, нужно посмотреть другим способом, что же отправляет пульт. А именно – с помощью осциллографа. Подключим осциллограф DS203 к тому месту, где сигнал непосредственно излучается в пространство: к аноду инфракрасного светодиода.

Осциллограф отображает часть команды ИК пульта

На осциллограмме видна серия «пачек» импульсов примерно одинаковой длительности. Каждая «пачка» состоит из 24-х импульсов.

Осциллограф отображает часть команды ИК пульта

В таком виде довольно трудно увидеть, какой сигнал передаётся от пульта ДУ. Прелесть нашего приёмника в том, что он выполняет рутинную работу по оцифровке аналогового инфракрасного сигнала и выдаёт уже «красивый» цифровой сигнал. Давайте посмотрим его на осциллографе.

Подключение выхода с ИК приёмника и выхода ИК пульта к осциллографу

Вот так выглядит посылка пульта целиком. Здесь жёлтая линия – аналоговый сигнал пульта ДУ, голубая – цифровой сигнал с выхода ИК приёмника. Видно, что продолжительность передачи составляет примерно 120 мс. Очевидно, время будет несколько варьироваться исходя из того, какие биты присутствуют в пакете.

Осциллограмма пакета с ИК пульта ДУ

При большем приближении видно, что высокочастотное заполнение, которое имеется в аналоговом сигнале, в цифровом сигнале с ИК приёмника отсутствует. Приёмник прекрасно справляется со своей задачей и показывает чистый цифровой сигнал. Видна последовательность коротких и длинных прямоугольных импульсов. Длительность коротких импульсов примерно 1,2 мс, длинных – в 2 раза больше.

Биты пакета ИК пульта, масштаб: 1 клетка – 200 мкс Биты пакета ИК пульта, масштаб: 1 клетка – 1 мс Начало пакета ИК пульта, масштаб: 1 клетка – 5 мс, только цифровой сигнал

Мы уже видели подобный сигнал, когда разбирали сигнал комнатной метеостанции. Возможно, здесь применяется тот же способ кодирования информации: короткие импульсы – это логический ноль, длинные – логическая единица. На следующем видео можно посмотреть пакет целиком:

Если зарисовать этот пакет, то получится как-то так:

Один из пакетов ИК пульта

Дальнейшие исследования показали, что все пакеты данного пульта ДУ состоят из двух пачек импульсов. Причём первая всегда содержит 35 бит, вторая – 32.

Есть несколько вариантов, как поступить для получения цифровых данных пакета:

  1. опрашивать пакет через равные промежутки времени (т.н. «стробирование»), а затем принимать решение, это логический «0» или «1»;
  2. ловить фронты импульсов (детектор фронта), затем определять их длительность и также принимать решение, какой это бит.

Напомню, что будем считать короткие импульсы логическим нулём, длинные – логической единицей.

Для реализации первого варианта понятно, с какой частотой необходимо опрашивать ИК датчик, чтобы принимать с него корректные данные: 600 мкс. Это время в два раза меньшее, чем длительность коротких импульсов сигнала (логических нулей). Или, если рассматривать с точки зрения частоты, опрашивать приёмник нужно в 2 раза большей частотой (вспомним Найквиста и Котельникова). Напишем скетч, реализующий вариант со стробированием.

Скетч для чтения пакета от ИК пульта методом стробирования const int ir = 2; // с выхода ИК приёмника int t = 600; // период стробирования, мкс void setup() { Serial.begin(115200); pinMode(LED_BUILTIN, OUTPUT); pinMode(ir, INPUT); } void loop() { int r = digitalRead(ir); // читаем значение ИК сенсора digitalWrite(LED_BUILTIN, r!=HIGH); // зажигаем светодиод, если сенсор сработал // Если зафиксировали ИК излучение, обрабатываем команду с пульта: if (r==LOW) { precess_ir(); } } // читает пакет ИК пульта void precess_ir(){ delay(13); // пропустим стандартное начало пакета byte bits; // 100 бит должно хватить // читаем пакет for (int i=0; i<100; i++){ int bit = readBit(); bits = bit; } // выводим пакет в монитор; for (int i=0; i<100; i++){ Serial.print(bits); } Serial.println(); } // читает 1 бит пакета int readBit() { // дожидаемся уровня HIGH и ставим первый строб int r1; do { r1 = digitalRead(ir); } while (r1 != HIGH); delayMicroseconds(t); // ждём // затем ставим второй строб int r2 = digitalRead(ir); delayMicroseconds(t); // ждём if (r2 == LOW) { return 0; } else { // третий строб delayMicroseconds(t); // ждём return 1; } }

Поэкспериментируем с данным скетчем и ИК приёмником. Загрузим скетч в память Ардуино. Запустим последовательный монитор. Нажмём на пульте несколько раз одну и ту же кнопку и посмотрим, что мы увидим в мониторе.

Выводим принятые пакеты ИК пульта в последовательный монитор

Это похоже на пакет, который мы видели на осциллограмме, но всё-таки есть ошибки. Между одинаковыми пакетами также встречаются различия, которых быть не должно. Можно улучшить результат, если увеличить частоту стробирования, чтобы точнее определять биты пакета. Для безошибочного приёма необходимо чтобы строб попадал ближе к середине импульса. Но мы не можем гарантировать это, т.к. импульсы могут распространяться с варьирующимися задержками; Arduio выполняет код также не моментально, каждый цикл требует малого, но всё же времени, поэтому с каждым битом мы немного будем уходить от исходной позиции посередине импульса и рано или поздно «промахнёмся» (определим бит с ошибкой).

Перепишем скетч, используя метеод детекции фронтов.

Скетч для чтения пакета от ИК пульта методом детекции фронтов const int ir = 2; int t_low = 600+10; // длительность «0» (с запасом), мкс int t_max = t_low * 4; // таймаут, мкс void setup() { Serial.begin(115200); pinMode(LED_BUILTIN, OUTPUT); pinMode(ir, INPUT); } void loop() { int r = digitalRead(ir); digitalWrite(LED_BUILTIN, r!=HIGH); // если зафиксировали ИК излучение, обрабатываем команду пульта if (r==LOW) { precess_ir(); } } // читает пакет ИК пульта void precess_ir() { delay(13); // пропустим стандартное начало пакета byte bits; for (int i=0; i<100; i++){ int bit = readBit(); bits = bit; } for (int i=0; i<100; i++){ Serial.print(bits); } Serial.println(); } // читает 1 бит пакета int readBit() { int r1; do { r1 = digitalRead(ir); } while (r1 != HIGH); // ждём передний фронт импульса int t1 = micros(); // запоминаем время начала импульса int t2; int t; do { r1 = digitalRead(ir); t2 = micros(); // запоминаем время опроса (оно же длительность импульса) t = t2 — t1; // длительность импульса } while ((r1 != LOW) && (t < t_max)); // ждём задний фронт импульса, но не больше таймаута //Serial.println(t); // можно вывести длительность импульса if (t < t_low) { return 0; } else { return 1; } }

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

Загрузим скетч, запустим монитор, нажмём несколько раз ту же кнопку пульта.

Выводим принятые пакеты ИК пульта в последовательный монитор

Результат, как видно, более стабильный.

Здесь уже была заметка о самом простейшем датчике робота — . Настала пора рассмотреть более продвинутый датчик препятствий — инфракрасный.
Вариант такого датчика на TSOP рассмотрим позже, а пока разберёмся с простым аналоговым сенсором на фототранзисторе.
Так как датчик аналоговый, то его выход должен подключаться к портам контроллера (на вход АЦП микроконтроллера).
По величине аналогового сигнала мы сможем примерно оценивать расстояние до препятствия (разумеется, абсолютных величин мы получить не сможем, так как уровень сигнала будет меняться в зависимости от объекта).
Простейшая схема — это пара из ИК-светодиода и фототранзистора:
LED1 — ИК-диод (L-53F3C)
Q1 — транзистор (например, 2N4401 из StarterKit-а)
Q2 — фототранзистор (L-53P3C)
R1 — 100
R2 — 1K
R3 — 4K7
Но как узнать, что ИК-диод работает? ИК-излучения ведь не видно. Очень просто — нужно воспользоваться фотокамерой мобильного телефона. Матрица чувствительна к ИК-излучению и вы увидите фиолетовое свечение работающего ИК-диода.
Для усиления сигнала от фототранзистора, можно дополнительно подключить транзистор.
Когда фототранзистор освещается, то через него начинает протекать ток, величина которого зависит от уровня освещения датчика. Так как меняется ток, проходящий через фототранзистор, то меняется и падение напряженяия на подключённом последовательно резисторе. Напряжение с резистора мы отправляем на аналоговый вход Arduino (вход АЦП) и по его величине судим об уровне освещения датчика.
Обратите внимание, что для управления светодиодом используется дополнительный транзистор. Дело в том, что светодиод потребляет 50 мА, а максимальная нагрузка на порт МК – не более 40 мА.
Самый прямолинейный алгоритм работы — это просто включить светодиод и замерить напряжение на аналоговом порту контроллера и при превышении определённого значения делать вывод о приближении препятствия.

/* * IR-led & phototransistor * тестовый скетч для работы с фототранзистором * * http://robocraft.ru */ int photoPin = 0; // фоторезистор подключен 0-му аналоговому входу int ledPin = 13; // светодиод подключается к digital pin 9 int val = 0; // переменная для хранения значения входного напряжения void setup() { Serial.begin(9600); } void loop() { digitalWrite(ledPin, HIGH); // зажигаем val = analogRead(photoPin); // считываем значение с фототранзистора Serial.println(val); // здесь можно проверить значение на превышение заданного порога delay(200); }
Но этот подход плох тем, что при такой работе датчик будет реагировать на общий уровень засветки.
Обойти этот недостаток очень просто — нужно делать два замера:
первый — при включенном светодиоде,
а второй — при выключенном.
Искомое значение будет составлять разницу в напряжении между первым и вторым замерами.
/* * IR-led & phototransistor * тестовый скетч для работы с фототранзистором * замер разности освещённости * * http://robocraft.ru */ int photoPin = 0; // фоторезистор подключен 0-му аналоговому входу int ledPin = 13; // светодиод подключается к digital pin 9 int val = 0; // переменная для хранения значения входного напряжения void setup() { Serial.begin(9600); } void loop() { digitalWrite(ledPin, HIGH); // зажигаем delay(2); val = analogRead(photoPin); // считываем значение с фототранзистора digitalWrite(ledPin, LOW); // гасим delay(2); val = val — analogRead(photoPin); // считываем значение с фототранзистора Serial.println(val); // здесь можно проверить значение на превышение заданного порога delay(200); }
Благодаря переходу к работе с разностью освещенности, датчик будет нечувствителен к общему уровню засветки.
Итого, мы получили простой, но удобный ИК-сенсор, который можно использовать, как ИК-бампер на мобильном роботе. Если же сгруппировать несколько таких датчиков на одной плоскости(схеме), то можно получить простейший прототип «», с помощью которого можно даже следить за объектом.
Правда у этого датчика остаётся одна проблема — при сильной внешней засветке(на ярком солнце и т.п.), фототранзистор откроется полностью и никаких признаков отражённого сигнала светодиода мы не увидим.
Можно поставить ИК-фильтр(засвеченый негатив напимер)- хоть транзистор и инфракрасный, на видимый свет он всеже реагирует, однако паразитная засветка ИК-излучением никуда от этого не денется=(
Более радикально избавится от тот недостатока позволит модуляция сигнала но об этом в следущей статье=)
Ссылки
По теме

admin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Наверх