Хронограф для измерения скорости пули на arduino
- Войдите на сайт для отправки комментариев
Сб, 29/10/2011 - 22:06
Вечер добрый)
Есть такая проблемма)вообщем необходимо измерить количество времени в микросекундах между импульсами на двух разных портах)
Например (пуля летит засвечивает первый датчик, начинаеться отсчет времени в микросекундах, а когда пуля пролетела второй датчик прератить отсчет и просто дать численное значение в микросекундах)
всё остальное я сам всё обыграю)
Помогите чем кто сможет)заранее спасибо))
Я тоже планирую сделать хронограф. Какой датчик используешь?
Вот тут тема с аналогичной ситуацией (измерение временного интервала, между двумя срабатываниями датчика). Надеюсь поможет.
arduino.ru/forum/programmirovanie/ekholot
>Вот тут тема с аналогичной ситуацией
Можно сделать и "как там" (и будет более универсально), но там сложней ситуация. Там еще сам импульс слать нужно (другими словами вместе с замером делать другую работу.
Тут IMHO можно обойтисть банальным вызовом двух pulseIn
Но этот вариант будет "стоять и ждать" пока оба датчика не сработают, ничем другим проц заниматся в это время не сможет. Если это не подходит - тогда через превывания, как делали по ссылке выше.
Спабо огромное за ответы)я думаю будет отлично если он будет ждать импульсов и ничего не делать)больше ничего не требуеться)
Датчик еще не делал)но собираюсь делать рамочный на светодиодах))буду ставить логику)ну и потом все навороты типа память екранчик и всякое такое)а потом портируем на отдельный контроллер)
LEVV2006 что можешь еще предложить??)))идеи))
Я просто видел видео на YouTube как чел сделал хронограф для измерения скорости пули с дисплеем, но не сохранил видео((
вот чо есть!
Датчики думаю можно взять из шариковой мыши
Есть ещё видео но оно не то которое я видел.
По-моему лучше прерываниями. Пуля летит быстро, есть вероятность что постоянным опросом датчиков ее можно упустить.
Только есть один косяк - Time - long, в Serial.println надо byte. Придумайте сами, как решить эту проблему. И мне скажите, плиз!
[...]
Только есть один косяк - Time - long, в Serial.println надо byte. Придумайте сами, как решить эту проблему. И мне скажите, плиз!
Преобразовани типов (в данном случае приведение к типу байт: (byte) ) - наше все:
Вот что получится после нескольких циклов вывода:
0: 0-0-0-0
101BA: 0-1-1-BA
20374: 0-2-3-74
3052E: 0-3-5-2E
406E8: 0-4-6-E8
508A2: 0-5-8-A2
60A5C: 0-6-A-5C
70C16: 0-7-C-16
80DD0: 0-8-D-D0
90F8A: 0-9-F-8A
A1144: 0-A-11-44
B12FE: 0-B-12-FE
C14B8: 0-C-14-B8
D1672: 0-D-16-72
E182C: 0-E-18-2C
F19E6: 0-F-19-E6
Спасибо. Думаю в виде DEC тоже ничто не мешает выводить.
Ничего не мешает - только не так наглядно соответствие между значением раскладываемого длинного целого и отдельными байтами результата.
Спасибо парни))дали мне пищу для обдумывания)только мне вот не понятно пару вещей
(можно ли в строчке
06
attachInterrupt(1, End, CHANGE); //Прерывание по нарастающему фронту на D2
заменить CHANGE на RISING )
И еще одно подтвердите если правильно думаю
(сначала на одной ножке появляеться импульс и начинаеться отчет микросекунд, он продолжаеться до тех пор пока не появиться единица на второй ножке и в етом случае программа прекратит счет в функции start и начнет отсчет микросекунд в функции end
так а зачем тогда засекать время время на второй ножке.....пуля то улетела))
обьясните пожалуйста, или тут принцип не схожен с вызовом двух pulseIn.....??
спасибо)
Можно. CHANGE/RISING/FALLING/LOW - выбирайте в зависимости от того, требуется ли отлавливать изменение состояния сигнала, возрастающий/ниспадающий фронт либо низкий уровень.
Отсчет микросекнд не начинается - он продолжается с самого момента запуска микроконтроллера. Функция micros() считывает текущее состояние счетчика времени с момента запуска/последнего сброса.
Считали состояние счетчика в функции start, затем считали состояние счетчика в функции end. Разница в состояниях дает время в микросекундах между двумя моментами считывания. А поскольку эти моменты считывания привязаны к моментам появления ниспадающего фронта на ноге 2 (INT0) или 3 (INT1), а ниспадающие фронты появляются из-за того, что где-то рядом пуля пролетела, то...
Получили то, что хотели - время пролета пули между двумя точками. А пуля, конечно, улетела.
>или тут принцип не схожен или тут принцип не схожен
Совсем не схож. В pulseIn, вы говорите "стой и жди пока пин не перейдет в указанное состояние", после чего запоминаете "который сейчас час".
В attachInterrupt, вы фактически говорите: если на указанно пине произойдет такое событие (перешел в High/LOW или просто поменялся) чем бы ты не занимался в данный момент, вызови указанную при атаче функцию, а потом продолжи с прерванного места.
>заменить CHANGE на RISING )
Если верить коментарию, то "нужно". А вообще что там должно быть - зависит то того как ваш датчик сообщает что пуля "пролетела". Падением, выдачей 5v или "сменой стостояния".
>появляеться импульс и начинаеться отчет микросекунд
Нет. Отсчета нет. Когда на первой ножке произошел переход из LOW->HIGH будет просто "запомненно текущие время" в переменную Time1,
когда пролетит через через вторую опять "некущие время запомнится", но уже в переменную Time2. Кроме того, "взведется флаг". Когда loop будет, в очередной раз, прокручиватся, он увидет что "флаг взведен", вычислит разницу между Time1 и Time2 и пошлет ее в serial.
Что-бы лучше понимать почитайте документацию на использованные функции attachInterrupt, micros, pulseIn.
Найти доку можно тут
Присоединяюсь к теме. Даже макет сваял. Датчики купил - название что то типа щелевой датчик ... Выдернул оттуда диод ик и транзистор, соеденил. Вроде все работало пока скорость пролета объекта небольшая. Пулю не засекает. Обидно. Пробовал и через прерывания и всяко - пулю не берет почему то.
Текст проги:
>Пулю не засекает
А как именно "не засекает", вообще нет сработки прерываний "разница времени нулевая"?
Лучше покажите скетч "с прерываниями", тот скетч что вы показали имеет намного больше шансов "упустить". Вполне реальный расклад:пуля пролетает первый пин, а в этом время вы опрашиваете второй пин, пока она долетела "до второго" датчика, вы уже опрашиваете первый.
Либо через pulseIn (скетч выше я давал), либо возмите скетч что Mafia приводил (на прерываниях), в нем разве что переменным Time1,Time2, flash желательно добавить модификатор "volatile", и аттачать на событие FALLING (я так понял что у вас датчик падает в ноль, когда пуля пролетает).
>оттуда диод ик и транзистор, соеденил
Не совсем понятно что и как соеденили. Диод - "светит", а транзистор в качестве приемника? Фототранзистор? Может еще какой-то кондер в схемме есть? Он может "сглаживать" короткие импульсы.
никаких кондеров не было. Проект был заброшен около полугода назад. Исходники все уже куда то девались. Я даже что то неуверен что там был фототранзистор а не фоторезистор. Попробую восстанвить этот проект - железо осталось. Сюда как нибудь можно фото вставлять?
>Проект был заброшен около полугода назад.Попробую восстанвить этот проект - железо осталось.
Ну если заброшен и востанавливать только для того что-бы ответить на форуме, то не обязательно. Я вообщем-то спрашивал из любопытсва/может подсказать че получится. Сам я подобный проект не делаю. Думал вы делаете и "не получается".
>Сюда как нибудь можно фото вставлять?
Форум "общий", первая прикрепленная тема.
Вот тут есть пример хронографа может он подойдет ltagkirov.narod.ru/bullet.html
Видел такой хрон)штука прикольная)только у него вот исходники не ардуиновские )
а так норм)
спасибо)