Как измерить скорость и направление движения с помощью двух датчиков?

wapanapa
Offline
Зарегистрирован: 29.09.2018

Задача такая. Есть два индуктивных датчика. А и Б. мимо них на некой скорости, с одинаковым расстоянием движутся металлические предметы.  (детали цепи покрасчной линии на производстве)

Алгоритм работы устройства я представляю но не хватает знаний в программировании ардуины.

Механизм такой, если конечно так будет работать (??)

1) Оба датчика вешаем на пины для прерываний 2 и 3.

2) oбработчик прерывания int1 - срабатывает как  на rising 2-го пина так на RISING 3-го пина. (PCINT?)

в прерывании int1:

 2.1 если таймер не запущен - то  запускаем таймер и не возвращаем ничего. запоминаем время, в которое было вызвано прерывание.

 2.1 если таймер уже запущен - то останавливаем и возвращаем

время

, которое насчитал таймер/счетчик.

3) обработчик прерывания int2 - будет срабатывать только на  RISING 2-го пина.

В нем сравниваем время когда был запущен int1  с временем когда был запущен int2.  таким образом вычисляем направление. (если оони равны - то вперед, еслинет то назад.)

 

Вопросы собственно такие:

можно ли это реализовать именно так как я описал?

так ли работают таймеры?

как мне запускать\останавливать таймеры, брать из них значения, узнавать что таймер запущен?

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А че так сложно-то? Попроще никак?

wapanapa пишет:

можно ли это реализовать именно так как я описал?

Можно, наверное, откуда ж нам знать? Например, я понятия не имею, возможна ли ситуация, когда следующая деталь доедет до первого датчика раньше, чем первая деталь доедет до второго датчика?

wapanapa пишет:

так ли работают таймеры?

Как "так"?

wapanapa пишет:

как мне запускать\останавливать таймеры, брать из них значения, узнавать что таймер запущен?

Ну, а как Вы это обычно делаете? Там, вроде, способов-то не так много. 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Линия движется с космической скоростью? Я бы, для решения в лоб - посадил датчики на прерывания, без всяких таймеров - просто attachInterrupt. Деталь прошла первый датчик - смотрим, не прошла ли она раньше второй датчик, если прошла раньше - движение назад, если прошла позже - движение вперёд.  То же самое по прерыванию на втором датчике, только наоборот. Пока на обоих датчиках не будет факта прохода - выводы не делать. Факт прохода через оба датчика зафиксирован - сбрасываем систему в исходное состояние.

Используя банальный millis() - всё реализуется.

Или я чего не понял?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Ещё проще (раз уж энкодер поставить нельзя, для определения направления вращения) - взять три датчика, разместив их на неравномерном расстоянии, например: 0м, 1м, 3м. Если временной график по факту прохода детали через все три датчика выглядит так: |_|__| - движение вперёд, если так: |__|_| - движение назад.

sadman41
Offline
Зарегистрирован: 19.10.2016

Я бы, пожалуй, расположил датчики так, чтобы учитываемый объект перекрывал оба. Потом как на энкодере: 10 - в одну сторону едем, 01 - в другую.

wapanapa
Offline
Зарегистрирован: 29.09.2018

ну да, можно и так. что то я намудрил. линия идет со скоростью 1 датчик в 1-3 секунды.

wapanapa
Offline
Зарегистрирован: 29.09.2018

я имею ввиду, таймер - это буфер, в котором лежит что то или это сам счетчик который этот буфер напоняет? тоесть можно ли таймер запускать/останавливать или с таймера можно только снимать данные и все что можно с ним делать это замедлять/ускорять

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, вы определитесь с потребностью... в AVR есть таймеры, которые можно запускать и останавливать. Wiring в ардуино сам стартует один из таймеров при начале исполнения прошивки, и сидя на нем, каждую миллисекунду увеличивает значение millis() на единицу. Так что можете и запускать/останавливать, а можете просто значение millis() откидывать в переменную при определенном событии.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

wapanapa пишет:

я имею ввиду, таймер - это буфер, в котором лежит что то или это сам счетчик который этот буфер напоняет? тоесть можно ли таймер запускать/останавливать или с таймера можно только снимать данные и все что можно с ним делать это замедлять/ускорять

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

https://stavroskrest.ru/sites/default/files/files/books/chelpanov_logika.pdf

Особенно главу 11, по законы мышления.

faworit20
Offline
Зарегистрирован: 18.07.2017

Да не судете слишком парня :) А по поводу механизма, почитай про работу энкодера и тут нет смысла оба датчика вешать на инты. Достаточно одного, и как писали ранее, важное условие - оба индукционника расположить так чтобы деталь перекрывала оба датчика! И не совсем понятно нафига использовать таймер? Мерять время, или вернее на этом регулировать скорость движения конвеера, так в этом случае все решаемо и сложности здесь нет никакой. Почитай, посмотри уроки по ардуинке, или пиши запрос на разработку проги под задачу.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

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

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

faworit20
Offline
Зарегистрирован: 18.07.2017

Да не вопрос в количестве датчиков, только экономически вешать 3 и более датчиков для решения простых задач - это пожалуй... ну это определяется индивидуаль ;) а по мне так ...экономика должна быть экономна...

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

faworit20 пишет:
...экономика должна быть экономна...
А ум должен быть разумным. Нужна скорость и направление - энкодер на ось.  А если вы собираетесь мерять время при помощи весов. Да можно, да глупо. Но все же есть банальные часы. Так и здесь нечего придумывать то что придумано до нас и давно.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

faworit20 пишет:

Да не вопрос в количестве датчиков, только экономически вешать 3 и более датчиков для решения простых задач - это пожалуй... ну это определяется индивидуаль ;) а по мне так ...экономика должна быть экономна...

Ну так энкодер - тоже предлагался, куда уж экономней ;)

wapanapa
Offline
Зарегистрирован: 29.09.2018

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

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

кто нибудь знает как измерить время между двумя прерываниями с помощью таймеров?

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

wapanapa пишет:
ладно это все лирика, я же сразу написал что я хочу и как.

кто нибудь знает как измерить время между двумя прерываниями с помощью таймеров?

 https://kolobok.ua/ot-3-do-6/shkola/uchimsya-polzovatsya-chasami-208.html

Таймер это те же часы. Я просто не понимаю что ТС не понятно.

wapanapa пишет:
чтобы повешать энкодер надо заменять вал  (как? вытачивать новый?) побирать и где то искать муфту, покупать сам энкодер (а они немало стоят), останавливать линию в конце концов..
После того как освоите часы перейдите к этой теме. https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D1%82%D1%8F%D0%B6%D0%BD%D0%BE%D0%B9_%D1%80%D0%BE%D0%BB%D0%B8%D0%BA

 Вот энкодер вешайте на него. Если не хотите останавливать линию. Да и где у вас там инженер конструктор бегает. Он все может чертежами реализовать.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

wapanapa пишет:

кто нибудь знает как измерить время между двумя прерываниями с помощью таймеров?

Таймеры тут ни к чему. Как вариант:

volatile uint32_t interrupt1Micros = 0;
volatile uint32_t interrupt2Micros = 0;
volatile bool hasInt1 = false;
volatile bool hasInt2 = false;

void int1()
{
	interrupt1Micros = micros();
	hasInt1 = true;
}

void int2()
{
	interrupt2Micros = micros();
	hasInt2 = true;
}

void setup()
{
	attachInterrupt(digitalPinToInterrupt(2),int1,FALLING);
	attachInterrupt(digitalPinToInterrupt(3),int2, FALLING);
	Serial.begin(9600);
}

void loop()
{
	if(hasInt1 && hasInt2)
	{
		noInterrupts();
		hasInt1 = hasInt2 = false;
		uint32_t diff = interrupt1Micros - interrupt2Micros;
		interrupts();
		Serial.print(F("Time between interrupts, us: "));
		Serial.println(diff);
	}
	
}

 

faworit20
Offline
Зарегистрирован: 18.07.2017

да для измерения частоты и одного пина прерывания хватит(для уно 2 или 3), вот ссылка, и приведено несколько вариантов, может пригодиться https://habr.com/post/346126/