IR датчики препятствий/линии KY-032, IR-08H кто-то использовал, как?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Внезапно обнаружилась некузявая проблема: датчики препятствий/линии периодически перестают срабатывать. И ваще, до сих пор не совсем понятно как их настраивать. Маркировка датчиков IR-08H или KY-032, те которые с 2 регуляторами.

Датчики одел в ПВХ коробочку с 2 отверстиями и перегородкой между излучателем и приемником и дополнительно обклеены "юбкой" в 1.5см для устранения боковой засветки. Фотку датчиков и результата одевания в коробочку могу выложить, если надо.

Измерение делаю таким кодом:

#include "arhat.h" // замена типовых функций на 1-командные макросы

#define sL1 15
#define sL2 16
#define BLACK HIGH
#define WHITE LOW
#define MAX_COUNT     5
#define IS_BLACK      1
#define MAX_SENSORS   2
uint8_t sensors[MAX_SENSORS];
uint8_t oldSensors[MAX_SENSORS];

uint8_t getSensors()
{
  uint8_t i,num;

  for(i=0; i<MAX_SENSORS; i++){
    sensors[i] = WHITE;
  }
  for(num=MAX_COUNT; num>0; num--){
    sensors[0] += digitalRead(sL1);
    delayMicro8(3);
    sensors[1] += digitalRead(sL2);
    delayMicro8(3);
  }
  for(i=0; i<MAX_SENSORS; i++){
    sensors[i] = (sensors[i] >= IS_BLACK? BLACK : WHITE );
  }
} 

То есть по сути, делаю 5 замеров подряд с задержкой между соседними чтениями в 9 тактов ЦПУ (delayMicro8() -- 3х3 такта на 16Мгц = 500нс). digitalRead() по сути одна команда в моей либе. Далее, смотрим если датчик сработал хотя бы раз, то считаем что под ним черное.

Так вот, когда результат замеров вывожу в монитор - все практически кучеряво. Из 5 попыток черное обнаруживает не менее 3-4 раз. А вот когда едет по трассе, то периодически тупо пропускает линию. Частота повторов loop() достаточно высока, проверка датчиков идет примерно каждые 0.5мм трассы. Тем не менее, периодически тележка даже не реагирует на линию, тупо проезжает прямо не снижая ни скорости ни не делая каких-либо попыток среагировать на пересечение линии в 2 см.

Кто-то пользовал эти датчики, как их настраивать?

P.S.

Грешил на питание, типа при управлении моторами "пробивает" на внутренние 5в. Питание разведено примерно так: 8 батареек 1.5в или аккумуляторы Ni-MH 8шт, с отводами:

1) от 5-го элемента (6 - 7.5в) - питание серводвигателей на них висит пара кондеров: на 470мкф электролит + 10нф керамика для защиты модулей серв от скачков по питанию. Сервы работают устойчиво, сбоев не наблюдается;

2) от 6-го элемента (7.2 - 9в) - питание маршевых моторов. Подается на L298N как внешнее питание моторов;

3) от 8 (9.6-12в) - питание ардуины через внешний разъем. На плату питание подается через диод на электролит в 1000мкф, который стоит параллельно внешнему разъему (как-бы через него на стабилизатор питания). Кроме этого, на внутренние +5в повешен ещё один электролит в 1000мкф.

6-й и 8-й отвод могу менять местами назначения, с целью подачи на моторы большего напряжения. Вроде бы как пробоя по питанию от маршевых моторов или от серв - не наблюдаю, Светодиоды на датчиках светят ровно, без дерганий... точнее померять пока нечем. Ну и узв. датчик работает стабильно как часы ..

не должно быть засады с этой стороны. Грешу на кривую настройку датчиков. Кто-то их пользовал?

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

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

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Нет. робот едет по черной линии. Датчики выдают HIGH при отсутствии препятствий (черное) и LOW при его наличии (белое). Процедура чтения датчиков поэтому и настроена так, что если из 5 (делал до 10) замеров хотя бы 1..2 "черное", то результат - черное. Периодически, похоже на то, что они на черном выдают "белое" без вариантов, хотя в мониторе этого нет, там все идет ровно без пропусков.

Пробовали по-разному: и прижимать датчики с обоих сторон к линии, и расставлять подальше и ставить 3 датчика, один "на линию" и ставить 4-5 датчиков: один на линию, два прижаты и пара подальше.. пофиг. На ходу есть "пропуски" или алгоритм срабатывает некорректно.

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Несколько лет назад игрался с инфракрасными парами светодиод+фотодиод, типа как на этом модуле, только отдельно диоды(не смог сходу ссылку найти), дак вот, их излучение почти полностью поглощается черным цветом, то есть почти не реагируют на него. Специально выводил аналоговое значение и пробовал на разных материалах, когда настраивал.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Алгоритм примерно такой:

в loop() опрашиваем процедурой датчики, строим "новый статус" = "левый" + 2*"правый" {0 - оба белое,1 - левый черное,2 - правый черное,3 - оба черных(перекресток)} и свичем выбираем действие от "предыдущего" состояния:

0 или 3 (оба белых или оба черных): если новый статус такой же, то едем прямо с небольшим разгоном двигателей; если новый статус "влево" или "вправо" - то тормозим движки (один в 4 раза сильнее, тот который в внутренний в повороте) и/или поворачиваем руль (если с рулевыми передними колесами).

1 или 2: был поворот влево или вправо: если новый статус "прямо" или "наоборот" (было влево, стало вправо и т.д.), то понемногу выравниваем двигатели и/или руль; если надо ещё левее или правее - то продолжаем поворот (торомозим вплоть до остановки внутренний движок и разгоняем внешний) и/или увеличиваем отклонение руля (если вариант с поворотными передними колесами).

после обработки статусов и вычисления ШИМов - изменяем состояние моторов;

после чего сохраняем новый статус как "бывший".

Цикл в loop() повторяется каждые 2мсек. Пробовал поднимать задержку до 10..50мсек - реакция только "хуже". После 20мсек - в поворот не входит категорически ни на какой скорости.

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

Стоит ещё УЗВ. датчик на обнаружение препятствия ближе 20см .. тупо выключает моторы и ставить руль в среднее положение. Требование регламента по проезду перекрестков: "перекресток проезжает первый" и используется как "кнопка старта": ставим на старт, закрываем датчик, по свистку убираем руку - поехали. Работает как часы.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Такой конкретно (KY-033) у нас только 1шт .. и его когда тестировали, у нас он срабатывает только с расстояния менее 1см .. и очень неудобен с точки зрения монтажа. Поэтому конкретно его не пользуем. Пользуем вот такие:

sensor IR-08H

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Arhat109-2 пишет:

Цикл в loop() повторяется каждые 2мсек. Пробовал поднимать задержку до 10..50мсек - реакция только "хуже". После 20мсек - в поворот не входит категорически ни на какой скорости.

Получается, что при увеличении задержки он просто не успевает засеч полосу и проезжает поворот. Вот я так подумал и потому предложил прерывания использовать(как с энкодерами), а не в цикле проверять состояние датчиков.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

можно попробовать конечно .. есть куда втыкнуть как "прерывание".

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

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

Frequency adjustment potentiometer is used to adjust the carrier frequency
 of the infrared emission tube, because the integration receiver 38KHZ
 in particular when the carrier frequency is the most sensitive. 
The 502 resistor clockwise transferred do (that is, the launch tube at maximum brightness),
 and then at a white wall tone 103 resistance, has been transferred to the sensing distance 
is the farthest so far so that the sensor will work in the best state

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

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

О спасибки. То есть получается, что сначала его надо настроить на макс. дальность подстройкой частоты, и только потом вторым резистором настраивать на требуемую чувствительность и дальность (белое/черное) .. о как, не знал.

Да, сегодня приеду с работы будем ставить очередные эксперименты:

1. Частота обхода loop() без if( millis()-previous>=waitTime ){} .. посчитаем количество анализов датчиков за 0.1 .. 0.5сек, посмотрю "как часто" оно успевает в реальности и что кажет;

2. устойчивость по питанию: надо будет сделать моргалку в setup() светодиодом, если МК все-таки уходит в перезагруз из-за работающих моторов, то это станет заметно;

3. обработка датчиков по прерываниям, а не в цикле loop().

Пока все, других идей нет.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ну и вот ..

1. Скорость работы loop() = 2103..2115 проходов в сек .. или около 2-х в мсек. или 500нсек на цикл.

2. Сделал моргалку в setup() с выключенным состоянием моторов на 3сек. При движении "по кругу" за 5 минут не встало ни разу. Пробоев по питанию - нет. Но, "проскоки" линии наблюдаются регулярно.

Вывод: датчики периодически глючат. Калибровка датчиков не помогла. Точнее, помогло тем что теперь датчик при ручном контроле видит линию 100%: 5 из 5.

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

.. ушел думать.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

И так. Датчики, которые приехали 5шт - неимоверно глючат. Настроить их по схеме как FC-51 - не получается ни разу. Из 5-и датчиков относительно устойчиво работает только 1. Проблема в эффекте самогенерации датчика: при настройке на белое на черном он начинает "дрожать" с частотой около 5гц. Или наоборот. Положение где он более-менее стабильно работает очень узкое, но и в нем наблюдается "странность": при наличии 2-х и более датчиков у Ардуины, настройка одного датчика как-бы "сбивает" остальные. Попытался допаять на разъем датчиков керамические кондеры по 10нф .. не помогло.

Да, ещё. При настройке по "методике" - 502 резистор (он ваще-то маркирован как 202) не имеет выраженного "пика" как написано для установки частоты генерации в 38кгц .. такое ощущение, что один резистор тупо регулирует яркость ИК-светодиода, а второй чувствительность усиления приемника. Но на плате стоит HC00AG .. типа 4шт 2И-НЕ элемента .. получается что 2-3 шт используются как генератор, и в нем должен быть регулирующий резистор .. а один элемент стоит явно на сигнал EN, разрешающий прием с датчика .. нифига не понимаю, как оно должно настраиваться.

Старый датчик FC-51 по методике настраивается хорошо. У него есть пик дальности находимый этим самым 502 резистором .. а 103 - тупо определяет дальность срабатывания.

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