Проект. Секундомер со стартом по датчику движения. Обучение.

vrc17
Offline
Зарегистрирован: 22.08.2016

Привет!

Мне тут подарили стартовый комплект ардуино Уно. И в поисках его применения я вспомнил об одной задаче, которую именно сейчас мне здорово было бы разрешить.

Конечно, можно было бы все это вывесить просто в "ищу исполнителя", но интересно понять, как оно все работает. Тем более с программированием знаком (правда не на сях), с электроникой знаком. Издалека. Да.

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

Итак.

за готовое решение готов заплатить.

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

 

Платформа Arduino Uno v3

 

PIR Motion Sensor HC-SR501

 

vrc17
Offline
Зарегистрирован: 22.08.2016

Итак, проблема первая: датчик постоянно детектит движение (на cериал мониторе постоянно "Motion Detected")

Датчик PIR Motion Sensor HC-SR501 подключен к GND, Ардуино вход 2,  5V

#define pirPin 2
#define ledPin 13

void setup()
{
  Serial.begin(9600);
  pinMode(pirPin, INPUT);
  pinMode(ledPin,OUTPUT);
}

void loop()
{
  int pirVal = digitalRead(pirPin);

  if(pirVal == HIGH)
  {
    digitalWrite(ledPin, HIGH);
    Serial.print("Motion detected");
    delay(2000);
  }
  else
  {
    Serial.print("No motion");
    digitalWrite(ledPin,LOW);
  }
}

 

fixedip
Offline
Зарегистрирован: 16.03.2015

Я бы вместо датчика движения использовал инфракрасный передатчик и приемник....так точнее  да и проще ...

 

vrc17
Offline
Зарегистрирован: 22.08.2016

Спасибо, поменяю на ИК. Тем не менее не понятно, почему врет датчик. Брак?

fixedip
Offline
Зарегистрирован: 16.03.2015

Подтяни вход 2 на минус через резистор 10КОм

 

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

vrc17 пишет:

Спасибо, поменяю на ИК. Тем не менее не понятно, почему врет датчик. Брак?

1. Затупите чувствительность.

2. Такой датчик не подходит вооооообще для єтих целей. Отловить десятые секунды - нужно прибавлять чувствительность, но тогда начнет срабатывать на все на свете и постоянно сигналить. Да и угол действия такого датчика 80-180 градусов. Попробуйте лазерный датчик.

vrc17
Offline
Зарегистрирован: 22.08.2016

fixedip пишет:

Подтяни вход 2 на минус через резистор 10КОм

Помогло, спасибо!

Лазерный датчик заказал, спасибо за ссылку, Okmor!

Какие преимущества и недостатки между "инфракрасным передатчиком с приемником" и "лазерным датчиком" для этого проекта? Цена? Точность? Простота реализации?

И еще вопрос. Нужно заказывать 7 сегменты. Желательно с высотой буквы не меньше 10 см. Есть тут какие подводные камни или в схеме ничего не меняется от размера и только вопрос цены самих дисплеев имеет место быть? 

fixedip
Offline
Зарегистрирован: 16.03.2015

Лазерный датчик думаю не подходит для вашего проекта.... так как вам нужно мониторить всю ширину трека а это датчик  макс. 1.5м может...

Самый простой и дешевый способ это фоторезистор и лазерная указка.

 

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

vrc17 пишет:
Какие преимущества и недостатки между "инфракрасным передатчиком с приемником" и "лазерным датчиком" для этого проекта? Цена? Точность? Простота реализации?

Оба варинта не измеряют расстояние (поэтому точность тут не при чём), а определяют наличие-отсутствие препятствия по отражению светового потока. ИК-вариант имеет "дальность действия" до 30 см, а лазерный  - до полутора метров. Возможно, для ваших целей не подойдёт ни один из этих вариантов, в том виде, как они выполнены (на одгной плате и приёмник и излучатель). Фотофиниш, в моём понимании, должен иметь отдельный излучатель со своим питанием, который направляет прямой луч на приёмник, подключённый к контроллеру. В этом варианте лазерный вариант имеет преимущество по удобству наведения на приёмник и по ширине зоны финиша (если это критично), хотя и дороже по стоимости.

 

ЗЫ. Про лазерную указку то я изабыл )) Указка-фотосенсор - нормальный вариант!

vrc17
Offline
Зарегистрирован: 22.08.2016

Фиксироваться должно пересечение ворот шириной 1 метр.

Указка и фотосенсор должны быть расположены на разных сторонах "ворот" и при установке нуждаются в регулировке. Еще и питание указке необходимо. 

Лазерному же датчику никакой "напарник" на другой стороне ворот не нужен, правильно?

fixedip
Offline
Зарегистрирован: 16.03.2015

Нужен.... так как сигнал должен от чего то отразится..... хотя этим отрожателем может и стать мотоциклист :-))

vrc17
Offline
Зарегистрирован: 22.08.2016

fixedip пишет:

Нужен.... так как сигнал должен от чего то отразится..... хотя этим отрожателем может и стать мотоциклист :-))

Ну да, я это и имел в виду, что пересекающий ворота и будет отражателем.

vrc17
Offline
Зарегистрирован: 22.08.2016

Сегодня проект прошел первые боевые испытания.

В качестве датчика был применен фоторезистор и лазерная указка, как и советовали выше.

Из минусов этого решения:

за 2 с хвостиком часа заездов сели батарейки в двух указках. Можно и указку, конечно, запитать как и саму Ардуину от пауэр-банка, но есть еще и второй недостаток - указка периодически теряла резистор. Уж очень стабильны должны быть обе стороны "ворот". Ни на миллиметр в сторону. Ну и яркое солнце пришлось изолировать "козырьком" в виде трубки над датчиком. Не красиво :) 

Поэтому жду с алиэкспресса лазерный датчик и буду пробовать с ним.

Код написал вот такой (добавил комменты, которыми объяснял другу, как это работает):


#include <LiquidCrystal_I2C.h>

int timeDelay = 25;
int ldr = 0;
int lightLevel;

unsigned long time;
long startTime = 0; //millis на момент старта
long lastChange = 0; // millis на момент последнего срабатывания датчика
bool onTrack = false; // секундомер бежит или готов к старту
bool isRealChange; // действительно ли срабатывание
int falseAlarmPeriod = 1500;
LiquidCrystal_I2C lcd(0x27,16,2);

void setup()
{
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
}

void loop() 
{
  lightLevel=analogRead(ldr); //считываем значение на датчике. 1000 и более - указка на датчике. Хотя и прямое яркое солнце дает такой же результат. Поэтому датчику необходим какой-то козырек. Я сделал его в виде трубки, в глубине которой "спрятан" датчик.
  lcd.clear(); //Очищаем дисплей
  lcd.setCursor(12,0);// курсор на позицию 12 в первой строке (т.е. следующий выводимый на экран символ появится на позиции 12 в первой строке)

  lcd.print(lightLevel); //выводм значение, считанное с датчика
  lcd.setCursor(0,1); //курсор на начало второй строки
  if (lightLevel < 990) // если датчик "потерял" указку (и как следствие возвращаемый им уровень освещения упал ниже 990), то:
    {
      isRealChange = millis() - lastChange > falseAlarmPeriod;// если датчик срабатывает повторно менее, чем через полторы секунды - считать его недействительным
      if (isRealChange)  //если срабатывание датчика признано действительным
      {
        lastChange = millis(); // фиксируем значение millis в переменной lastChange
        onTrack = !onTrack; // Инвертируем состояние секундомера (если на трассе был пилот - то теперь включаем ожидание старта и наоборот)
        if (onTrack) // Если пилот выехал на трек - 
        startTime = millis(); // фиксируем время старта в переменную startTime
      }
    }       
  if (onTrack) // Если на трассе пилот
    {
      lcd.print("On Track");  // каждую итерацию void loop() выводим на дисплей извещение об этом      
      time = millis() - startTime; // В переменную time сохраняем время, прошедшее с момента старта
    }
  else lcd.print("Finished"); // Если же заезд окончен - выводим извещение об этом

  lcd.setCursor(2,0); //курсор - в полжение 2 места первой строки (или другое место, определенное для вывода секунд)
  lcd.print(double(time)/1000, 1);// вывод секунд на дисплей

  delay(timeDelay); // программа "спит" время, определенное в переменной timeDelay. Мне лично это не нравится, но без такой паузы обновление монитора становится слишком частым, что приводит к мерцанию, а с другой стороны такие паузы вполне допустимы, учитывая, что на преодоление линии страт-финиш пойдет заведомо большее время и такая задержка не помешает срабатыванию старта или остановке секундомера
}


Еще приложил бы схему (пусть она и простейшая, но может кому-то и пригодится), но пока не нашел софтинку, что бы оформить схему в удобоворимом для форума виде (может кто подскажет?)

Акромя лазерного датчика необходимы следующие доработки:

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

Больший циферблат (в настоящее время используется двустрочный 1602 LСD c IIC/I2C). Но это не удобно. С одной стороны зрителям не видно, с другой - самому участнику нужно остановиться ровно около экрана (я расположил его на треноге от фотокамеры в паре метров вперед от ворот старт/финиш). Т.е. хочется получить большие цифры, но, по возможности, что бы это было не сильно сложнее, чем данная реализация (4 провода, библиотека и команда Print :) ). 7-segment сантиметров на 10 или может кто-то еще что-то посоветует? 7-segment опять же идет в разрез с далекими планами.

А именно:

Из далеких планов - лучшее время как и отставание от него у текущего участника постоянно находится на экране, лидерборд , номера участников (пока ума не приложу как их отличать, может по сигналу с блютюз телефона или еще что), сохранение результатов где-то в сети. Да и мало ли можно еще придумать :)

Пока все :)

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

Интерестно, что это за фигня?

Расстояние можно подлечить фокусировкой и установкой катафота на противоположной стороне плюс козырек. Инфракрасный диапазон немного видно на камеру смартфона.

Также интерестно модулирован ли сигнал в этом датчике.

Относительно индикации, предлагаю использовать старый LCD монитор. Благо, такой можно на барахолке купить за 10$-20$. Вот пример использования.

Или вот:

vrc17
Offline
Зарегистрирован: 22.08.2016

Okmor пишет:

Интерестно, что это за фигня?

Расстояние можно подлечить фокусировкой и установкой катафота на противоположной стороне плюс козырек. Инфракрасный диапазон немного видно на камеру смартфона.

Также интерестно модулирован ли сигнал в этом датчике.

Пришел лазерный датчик. Срабатывает на расстоянии до 30 см. Иногда вообще перестает срабатывать. Рестарт Ардуино восстанавливает его работоспособность. А надо бы хотя бы сантиметров 50-70 строгого срабатывания.

Вот эта цитата выше про катафот, фокусировку с козырьком - это про лазерный датчик? Можно по-подробнее? Как осуществляется фокусировка? Что даст катафот или если перефразировать вопрос - каков принцип работы этого лазерного датчика?

Может имеет смысл заменить его на http://www.elecrow.com/water-proof-integrated-ultrasonic-ranging-module-jsnb02-p-1202.html ?
 

Относительно старой схемы (с лазерной указкой и и фоторезистором) тоже вопрос. Вернее относительно самой указки. Имеет ли она свойство "садиться"? Т.е. при стабильном питании со временем уменьшать интенсивность свечения, улавливаемого фоторезистором? 

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

Скорее всего там нет лазера, а светодиод с линзой фокусировки (тот, что поменьше). Надо увидеть луч света, а его можно посмотреть через камеру телефона. Возможно конструктив позволяет двигать линзу и таким образом сфокусировать луч.

Вместо катафота можно использовать светоотражающую пленку из автомагазина. Козырек надо для прикрытия от засвета солнцем.

Я дико извиняюсь, что толкнул вас на эту покупку, но только смелым покоряются моря.

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

vrc17 пишет:
Относительно старой схемы (с лазерной указкой и и фоторезистором) тоже вопрос. Вернее относительно самой указки. Имеет ли она свойство "садиться"? Т.е. при стабильном питании со временем уменьшать интенсивность свечения, улавливаемого фоторезистором? 

Лазерная указка тоже не выход. Пятно очень маленькое и подвержено засвету. Можно использовать вот такую схему из инфракрасного светодиода+линза+козырек и приемник. Схема особенна тем, что сигнал модулирован и это не допускает ложных срабатываний.

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

Для фокусировки передатчика я использовал трубку от пищевой пленки и старую линзу вклееную в эту трубку. Фокусировал используюя камеру мобильного телефона.

Чесно слово я не думал, что вы сразу закажете этот датчик.

 

vrc17
Offline
Зарегистрирован: 22.08.2016

Okmor пишет:
Я дико извиняюсь, что толкнул вас на эту покупку, но только смелым покоряются моря. 

О чем речь?! Я очень благодарен за любую информацию по теме!

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

Наверное, попробую все же этот "ультразвук", тем более он есть в наличии в соседнем магазине :)

 

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

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

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

Ультразвуковой датчик имеет задержки. Скорость звука 340 м/с. Предел измерения ультразвукового датчика 4 или 12м в зависимости от модификации. Тоесть, в идеальном случае можно сделать 85 замеров в секунду. Сюда надо добавить модуляцию сигнала, длительность импульса и время срабатывания. Думаю, что чаще чем 5-10 раз в секунду измерять не получится.

vrc17
Offline
Зарегистрирован: 22.08.2016

Okmor пишет:

Думаю, что чаще чем 5-10 раз в секунду измерять не получится.

Я понял. Но на данной стадии точность 0,2с меня устраивает. Куда важнее не иметь привязки ко второй половине ворот. Хотя, скорее всего я попробую реализовать оба варианта и посмотрю, что на практике удобнее, дешевле и проще в изготовлении.

А если выбирать между http://www.ittgroup.ee/en/sensors-and-accessories/508-ir-distance-sensor-gp2y0a60szlf-10-150-cm.html? и тем ульрасоником?

 

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

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

Вот нарыл немного дешевле 

vrc17
Offline
Зарегистрирован: 22.08.2016

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

vrc17
Offline
Зарегистрирован: 22.08.2016

Теперь проблема в том, что при отсутствии помех датчик выдает значение 80-100. При проезде через ворота - 200-500 и больше (чем ближе к датчику - тем больше). Выставляю срабатывать на 200 - ложные срабатывания. Ставлю больше - ожидаемо не улавливает некоторые пересечения, которые потенциально должен ловить. Бракованный датчик? Или что может служить причиной скачков значений на выходе датчика? Солнце, отражения или еще что? Есть идея поставить напротив датчика черную стенку (тряпичную или деревяшку, окршенную матовой краской). Но это все интуитивно, ибо физика процесса не понятна...

tika
Offline
Зарегистрирован: 22.07.2015

Все давно решено - и лучшее решение это с алиэкспрес на 20 метров-решаете вопрос с питанием на 14 воль и вуаля.450 рупий

 

Черный инфракрасный датчик один луч сигнализации фотоэлектрические инфракрасный детектор главная двери системы безопасности

AVL4ARDUINO
Offline
Зарегистрирован: 04.01.2012

Всем привет.
Как успехи?