Хронограф для измерения скорости пули на arduino

PEOPLE
Offline
Зарегистрирован: 29.10.2011

 Вечер добрый)

Есть такая проблемма)вообщем необходимо измерить количество времени в микросекундах между импульсами на двух разных портах)

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

всё остальное я сам всё обыграю)

Помогите чем кто сможет)заранее спасибо))

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

Я тоже планирую сделать хронограф. Какой датчик используешь? 

HOCKU
HOCKU аватар
Offline
Зарегистрирован: 25.04.2011

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

arduino.ru/forum/programmirovanie/ekholot

leshak
Offline
Зарегистрирован: 29.09.2011

 >Вот тут тема с аналогичной ситуацией

Можно сделать и "как там" (и будет более универсально), но там сложней ситуация. Там еще сам импульс слать нужно (другими словами вместе с замером делать другую работу.

Тут IMHO можно обойтисть банальным вызовом двух pulseIn

pulseIn(FIRST_PIN,HIGH); //ждем сработку первого датчика
time1=micros(); // засекли время сработки
pulseIn(SECOND_PIN,HIGH); //ждем сработку второго датчика
timeDiff=micros()-time1; // посчитали сколько времени прошло

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

PEOPLE
Offline
Зарегистрирован: 29.10.2011

Спабо огромное за ответы)я думаю будет отлично если он будет ждать импульсов и ничего не делать)больше ничего не требуеться)

Датчик еще не делал)но собираюсь делать рамочный на светодиодах))буду ставить логику)ну и потом все навороты типа память екранчик и всякое такое)а потом портируем на отдельный контроллер)

LEVV2006 что можешь еще предложить??)))идеи))

 

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

Я просто видел видео на YouTube как чел сделал хронограф для измерения скорости пули с дисплеем, но не сохранил видео(( 

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

вот чо есть!

Датчики думаю можно взять из шариковой мыши 

Есть ещё видео но оно не то которое я видел.

MAFia
Offline
Зарегистрирован: 26.10.2011

По-моему лучше прерываниями. Пуля летит быстро, есть вероятность что постоянным опросом датчиков ее можно упустить.

long Time1=0; //Время срабатывания первого датчика
long Time2=0; //Время срабатывания второго
boolean flag=false;
void setup(){
attachInterrupt(0, Start, RISING); //Прерывание по нарастающему фронту на D2
attachInterrupt(1, End, CHANGE); //Прерывание по нарастающему фронту на D2
Serial.begin (9600);
}

void loop(){
if (flag==true){Serial.println(Time2-Time1);}

}

void Start(){
Time1=micros();
}

void End(){
Time2=micros();
flag=true;
}

 Только есть один косяк - Time - long, в Serial.println надо byte. Придумайте сами, как решить эту проблему. И мне скажите, плиз!

step962
Offline
Зарегистрирован: 23.05.2011

MAFia пишет:

[...]

Только есть один косяк - Time - long, в Serial.println надо byte. Придумайте сами, как решить эту проблему. И мне скажите, плиз!

 Преобразовани типов (в данном случае приведение к типу байт: (byte) ) - наше все:

void setup() {
  Serial.begin(9600);
}

void loop() {
  byte B_1,B_2,B_3,B_4;
  long b;
  for(long a=0;a<1000000L;a+=65978) {
    b=a;
    B_1=(byte)b; b=b>>8;
    B_2=(byte)b; b=b>>8;
    B_3=(byte)b; b=b>>8;
    B_4=(byte)b;
  Serial.print(a, HEX);   Serial.print(": ");
  Serial.print(B_4, HEX); Serial.print("-");
  Serial.print(B_3, HEX); Serial.print("-");
  Serial.print(B_2, HEX); Serial.print("-");
  Serial.println(B_1, HEX);
  delay(1000);
  }
}

 

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

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

 

MAFia
Offline
Зарегистрирован: 26.10.2011

Спасибо. Думаю в виде DEC тоже ничто не мешает выводить. 

step962
Offline
Зарегистрирован: 23.05.2011

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

PEOPLE
Offline
Зарегистрирован: 29.10.2011

Спасибо парни))дали мне пищу для обдумывания)только мне вот не понятно пару вещей

(можно ли в строчке

06
attachInterrupt(1, End, CHANGE); //Прерывание по нарастающему фронту на D2

заменить CHANGE на RISING  )

И еще одно подтвердите если правильно думаю

(сначала на одной ножке появляеться импульс и начинаеться отчет микросекунд, он продолжаеться до тех пор пока не появиться единица на второй ножке и в етом случае программа прекратит счет в функции start и начнет отсчет микросекунд в функции end 

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

обьясните пожалуйста, или тут принцип не схожен с вызовом двух pulseIn.....??

спасибо)

 

 

 

step962
Offline
Зарегистрирован: 23.05.2011

Можно. CHANGE/RISING/FALLING/LOW - выбирайте в зависимости от того, требуется ли отлавливать изменение состояния сигнала, возрастающий/ниспадающий фронт либо низкий уровень.

Отсчет микросекнд не начинается - он продолжается с самого момента запуска микроконтроллера. Функция micros() считывает текущее состояние счетчика времени с момента запуска/последнего сброса.

Считали состояние счетчика в функции start, затем считали состояние счетчика в функции end. Разница в состояниях дает время в микросекундах между двумя моментами считывания. А поскольку эти моменты считывания привязаны к моментам появления ниспадающего фронта на ноге 2 (INT0) или 3 (INT1), а ниспадающие фронты появляются из-за того, что где-то рядом пуля пролетела, то...

Получили то, что хотели - время пролета пули между двумя точками. А пуля, конечно, улетела.

leshak
Offline
Зарегистрирован: 29.09.2011

 >или тут принцип не схожен или тут принцип не схожен

Совсем не схож. В pulseIn, вы говорите "стой и жди пока пин не перейдет в указанное состояние", после чего запоминаете "который сейчас час".

В attachInterrupt, вы фактически говорите:  если на указанно пине произойдет такое событие (перешел в High/LOW или просто поменялся) чем бы ты не занимался в данный момент, вызови указанную при атаче функцию, а потом продолжи с прерванного места.

 

>заменить CHANGE на RISING )

Если верить коментарию, то "нужно". А вообще что там должно быть - зависит то того как ваш датчик сообщает что пуля "пролетела". Падением, выдачей 5v или "сменой стостояния".

>появляеться импульс и начинаеться отчет микросекунд

Нет. Отсчета нет. Когда на первой ножке произошел переход из LOW->HIGH будет просто "запомненно текущие время" в переменную Time1,

когда пролетит через через вторую опять "некущие время запомнится", но уже в переменную Time2. Кроме того, "взведется флаг". Когда loop будет, в очередной раз, прокручиватся, он увидет что "флаг взведен", вычислит разницу между Time1 и Time2 и пошлет ее в serial.

Что-бы лучше понимать почитайте документацию на использованные функции attachInterrupt, micros, pulseIn.

Найти доку можно тут

 

 

sancta
Offline
Зарегистрирован: 01.11.2011

Присоединяюсь к теме. Даже макет сваял. Датчики купил - название что то типа щелевой датчик ... Выдернул оттуда диод ик и транзистор, соеденил. Вроде все работало пока скорость пролета объекта небольшая. Пулю не засекает. Обидно. Пробовал и через прерывания и всяко - пулю не берет почему то.

Текст проги:

const int buttonPin1 = 3; // the number of the pushbutton pin
const int buttonPin2 = 4;
const int ledPin = 13; // the number of the LED pin
long time1;
float time2,speeds;
byte flag;
// variables will change:
int buttonState1 = 0;
int buttonState2 = 0;
// variable for reading the pushbutton status

void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
Serial.begin(9600);
flag=0;
}

void loop(){
// read the state of the pushbutton value:
buttonState1 = digitalRead(buttonPin1);

// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (buttonState1 == LOW) {
time1=micros();
flag=1;
}
buttonState2 = digitalRead(buttonPin2);
if (buttonState2 == LOW && flag==1) {
time2=(micros()-time1);
speeds=100000/time2;
Serial.println(time2, DEC);
Serial.println(speeds, DEC);
flag=0;
digitalWrite(ledPin, HIGH);
delay(5000);
digitalWrite(ledPin, LOW);
}
}
leshak
Offline
Зарегистрирован: 29.09.2011

 >Пулю не засекает

А как именно "не засекает", вообще нет сработки прерываний "разница времени нулевая"?

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

Либо через pulseIn (скетч выше я давал), либо возмите скетч что Mafia приводил (на прерываниях), в нем разве что переменным Time1,Time2, flash желательно добавить модификатор "volatile", и аттачать на событие FALLING (я так понял что у вас датчик падает в ноль, когда пуля пролетает).

>оттуда диод ик и транзистор, соеденил

Не совсем понятно что и как соеденили. Диод - "светит", а транзистор в качестве приемника? Фототранзистор? Может еще какой-то кондер в схемме есть? Он может "сглаживать" короткие импульсы.

sancta
Offline
Зарегистрирован: 01.11.2011

никаких кондеров не было. Проект был заброшен около полугода назад. Исходники все уже куда то девались. Я даже что то неуверен что там был фототранзистор а не фоторезистор. Попробую восстанвить этот проект - железо осталось. Сюда как нибудь можно фото вставлять?

leshak
Offline
Зарегистрирован: 29.09.2011

 >Проект был заброшен около полугода назад.Попробую восстанвить этот проект - железо осталось.

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

>Сюда как нибудь можно фото вставлять?

Форум "общий", первая прикрепленная тема.

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

Вот тут есть пример хронографа может он подойдет ltagkirov.narod.ru/bullet.html 

PEOPLE
Offline
Зарегистрирован: 29.10.2011

Видел такой хрон)штука прикольная)только у него вот исходники не ардуиновские )

а так норм)

спасибо)