Switch to full style
Всё о хронографах и других способах измерения скорости и энергии пули.
Ответить

01 окт 2017, 10:17

plotnik писал(а):Не совсем...
Обманул всех - болтал, болтал, а ссылку на прошивку не дал, поэтому и никто там не регистрируется... :DD

Не болтал,а подробно рассказывал,и делал, болтаем мы здесь обсуждаем критикуем,обсе...м наслаждаясь от этого.Читать желательно не между строк,все скетчи в архивах (часть3) свободны для скачивания,или что то мешает тупо скачать и установить? :old:

01 окт 2017, 19:21

:shock: :shock: :shock:
Вложения
Безымянный.png431.png324512.png

20 дек 2017, 10:43

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

15 мар 2018, 15:03

темка интересная. есть ардуинка нано, попробую макетку собрать..

06 апр 2018, 10:47

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

12 апр 2018, 10:43

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

17 май 2018, 18:53

доброго времени суток. Собрал хронограф на ардуино. И казалось бы все идеально рабоает, но сравнил его показания с рамочным - отличаются довольно сильно. На скоростях около 270м/с скорость скачет хаотично до +-7м/с (когда рамочник показывает разброс +-2м/с). На скоростях 20м/с (плевок бумажкой) ардуино занижает скорость на 6-9м/с также хаотично.

Схемотехника простая - светодиоды светят на фототранзисторы, которые подтянуты к земле резисторами (кажется на 10кОм, точно не помню - паял полгода назад). Т.е. пока транзистор освещен, на сигнальном проводе лог. 1, в темноте лог. 0. Сигнал идет на контакты внешнего прерывания INT0 и INT1.
Ардуино nano запитана от преобразователя напряжением 5,5в.
текст программы:


#include <util/delay.h> // библиотека
#include "TM1637.h" // библиотека экрана
#define CLK 5 // пины подключения к экрану
#define DIO 4
TM1637 tm1637(CLK,DIO); // создаем экземпляр объекта типа «TM1637», с которым будем работать и задаем пины.можно было и не определять константы, а написать проще — вместо трёх предыдущих строк одну:
// TM1637 tm1637(5,4);, но так как мы сделали наглядней


int l = 100; // длинна между воротами в мм
int u = 0; // переменная для скорости
volatile boolean g1 = 0; // переменная для ворот1
volatile boolean g2 = 0; // переменная для ворот 2
volatile int t = 0;

void Timer1 ( void ) // функция инициализаици таймера1
{
TCCR1A = 0; //обычный режим
TCCR1B = 0; // таймер остановлен
TCNT1 = 0; // таймер обнулен
TIMSK1 = 0; //сбросили флаги
TIMSK1 |= (1<<TOIE1); //Разрешение прерывания по переполнению Т1.
}


void external_interrupts () // функция инициализаици внешних прерываний
{
EICRA = 0; // выставляем 0 во всем регистре
EICRA |= (1 << ISC11) | (1 << ISC01); // падающий фронт вызывает прерывания по INT1 и INT0
EIMSK |= (1 << INT1) | (1<<INT0); // разрешили внешние прерывания
}


ISR(INT0_vect) // функция прерывания 0
{
TCNT1 = 0; // обнуляем таймер
TCCR1B |= (1 << CS10); // запускаем таймер1
g1 = 1; // ставим метку, что 1 ворота пройдены
g2 = 0; // на всякий снимаем флаг со 2 ворот.
}


ISR(INT1_vect) // функция прерывания 1
{
TCCR1B = 0; // останавливаем таймер1
g2 = 1; // ставим метку, что ворота 2 пройдены
}



ISR(TIMER1_OVF_vect) // функция прерывания по переполнению таймера1
{
// g1 = 0;
// g2 = 0;
// TCCR1B = 0; // останавливаем таймер1
// TCNT1 = 0; // таймер обнулен
// t = 1;

t = t + 1;
}


void setup() {
Timer1(); // инициализировали таймер1
external_interrupts(); // инициализация внених прерываний
sei(); // разрешили глобальные прерывания
tm1637.init(); // инициализировали библиотеку экрана
tm1637.set(BRIGHT_TYPICAL); // выбираем значение яркости экрана BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
Serial.begin(9600); // сериал соединение с компом
Serial.println("Hello"); // говорим привет компу
for (int i=9999; i > 0; i = i - 1111){ // покажем на дисплее цифры от 9 до 1 для проверки
tm1637.display( i );
_delay_ms(100);
}
tm1637.display(0); // ноль на дисплей

}

void loop()
{

if (g1 == 1 && g2 == 1) // если пуля пролетела все ворота посчитать скорость, сообщить эту скорость, сбросить маркеры ворот, сбросить счетчик
{
u = 16000000/(65535*t+TCNT1); // u = l*v/x u больше в 10 раз для удобства
Serial.print( "speed = " );
Serial.println( u );
tm1637.display( u );
t = 0;
g1 = 0;
g2 = 0;
TCNT1 = 0; // обнуляем таймер
for (int i=0; i < 3; i++){ // помигаем значением
tm1637.clearDisplay();
_delay_ms(100);
tm1637.display( u );
_delay_ms(200);
}
}
}

Вот вроде бы все просто как валенок и обязано работать. Где искать косяки?
Вложения
хрон2.jpg
хрон1.jpg

21 авг 2018, 19:06

Летящий писал(а):доброго времени суток. Собрал хронограф на ардуино. И казалось бы все идеально рабоает, но сравнил его показания с рамочным - отличаются довольно сильно. На скоростях около 270м/с скорость скачет хаотично до +-7м/с (когда рамочник показывает разброс +-2м/с). На скоростях 20м/с (плевок бумажкой) ардуино занижает скорость на 6-9м/с также хаотично.

Схемотехника простая - светодиоды светят на фототранзисторы, которые подтянуты к земле резисторами (кажется на 10кОм, точно не помню - паял полгода назад). Т.е. пока транзистор освещен, на сигнальном проводе лог. 1, в темноте лог. 0. Сигнал идет на контакты внешнего прерывания INT0 и INT1.
Ардуино nano запитана от преобразователя напряжением 5,5в.
текст программы:


#include <util/delay.h> // библиотека
#include "TM1637.h" // библиотека экрана
#define CLK 5 // пины подключения к экрану
#define DIO 4
TM1637 tm1637(CLK,DIO); // создаем экземпляр объекта типа «TM1637», с которым будем работать и задаем пины.можно было и не определять константы, а написать проще — вместо трёх предыдущих строк одну:
// TM1637 tm1637(5,4);, но так как мы сделали наглядней


int l = 100; // длинна между воротами в мм
int u = 0; // переменная для скорости
volatile boolean g1 = 0; // переменная для ворот1
volatile boolean g2 = 0; // переменная для ворот 2
volatile int t = 0;

void Timer1 ( void ) // функция инициализаици таймера1
{
TCCR1A = 0; //обычный режим
TCCR1B = 0; // таймер остановлен
TCNT1 = 0; // таймер обнулен
TIMSK1 = 0; //сбросили флаги
TIMSK1 |= (1<<TOIE1); //Разрешение прерывания по переполнению Т1.
}


void external_interrupts () // функция инициализаици внешних прерываний
{
EICRA = 0; // выставляем 0 во всем регистре
EICRA |= (1 << ISC11) | (1 << ISC01); // падающий фронт вызывает прерывания по INT1 и INT0
EIMSK |= (1 << INT1) | (1<<INT0); // разрешили внешние прерывания
}


ISR(INT0_vect) // функция прерывания 0
{
TCNT1 = 0; // обнуляем таймер
TCCR1B |= (1 << CS10); // запускаем таймер1
g1 = 1; // ставим метку, что 1 ворота пройдены
g2 = 0; // на всякий снимаем флаг со 2 ворот.
}


ISR(INT1_vect) // функция прерывания 1
{
TCCR1B = 0; // останавливаем таймер1
g2 = 1; // ставим метку, что ворота 2 пройдены
}



ISR(TIMER1_OVF_vect) // функция прерывания по переполнению таймера1
{
// g1 = 0;
// g2 = 0;
// TCCR1B = 0; // останавливаем таймер1
// TCNT1 = 0; // таймер обнулен
// t = 1;

t = t + 1;
}


void setup() {
Timer1(); // инициализировали таймер1
external_interrupts(); // инициализация внених прерываний
sei(); // разрешили глобальные прерывания
tm1637.init(); // инициализировали библиотеку экрана
tm1637.set(BRIGHT_TYPICAL); // выбираем значение яркости экрана BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
Serial.begin(9600); // сериал соединение с компом
Serial.println("Hello"); // говорим привет компу
for (int i=9999; i > 0; i = i - 1111){ // покажем на дисплее цифры от 9 до 1 для проверки
tm1637.display( i );
_delay_ms(100);
}
tm1637.display(0); // ноль на дисплей

}

void loop()
{

if (g1 == 1 && g2 == 1) // если пуля пролетела все ворота посчитать скорость, сообщить эту скорость, сбросить маркеры ворот, сбросить счетчик
{
u = 16000000/(65535*t+TCNT1); // u = l*v/x u больше в 10 раз для удобства
Serial.print( "speed = " );
Serial.println( u );
tm1637.display( u );
t = 0;
g1 = 0;
g2 = 0;
TCNT1 = 0; // обнуляем таймер
for (int i=0; i < 3; i++){ // помигаем значением
tm1637.clearDisplay();
_delay_ms(100);
tm1637.display( u );
_delay_ms(200);
}
}
}

Вот вроде бы все просто как валенок и обязано работать. Где искать косяки?


ТУТА
Код:
void loop()
{

if (g1 == 1 && g2 == 1) // если пуля пролетела все ворота посчитать скорость, сообщить эту скорость, сбросить маркеры ворот, сбросить счетчик
{
u = 16000000/(65535*t+TCNT1); // u = l*v/x u больше в 10 раз для удобства
Serial.print( "speed = " );
Serial.println( u );
tm1637.display( u );
t = 0;
g1 = 0;
g2 = 0;
TCNT1 = 0; // обнуляем таймер
for (int i=0; i < 3; i++){ // помигаем значением
tm1637.clearDisplay();
_delay_ms(100);
tm1637.display( u );
_delay_ms(200);
}
}

07 окт 2018, 19:35

В общем, дошли руки до проверки хронографа. Для этого я отрезал провода идущие от светодиодов и прицепил их ко второй ардуине. Для неё написал прошивку, позволяющую с нужным интервалом времени отключать сперва один, а потом второй светодиод. Хронограф это разумеется принимал за выстрел и считал скорость. Погонял на скоростях от 26 до 800 м/с.
На высоких скоростях погрешность составила около 2%.
Таким образом, можно сделать вывод, что программная часть работает и скорости фототранзисторов хватает.

03 ноя 2018, 21:39

Однако, дальнейшие тесты показали, что при быстром мигании светодиода фототранзистор не срабатывает. Минимально я смог выставить 280 тактов, а это 17,5мкс. Шарик диаметром 4,5мм на скорости 277м/с пролетает мимо датчика за меньшее время. И датчик не срабатывает. А шарик диаметром 6 мм пролетает мимо датчика за чуть большее время, что приводит к срабатыванию.

Тут мне в руки попался датчик дыма и я выпаял оттуда светодиод и фотодиод. Решил протестить их.
Написал код, который на короткое время отключает светодиод. Это время постоянно уменьшается до тех пор, пока наконец не становится слишком малым для регистрации события.

#include <util/delay.h> // основная библиотека

volatile int a = 0; // переменная
int b = 0; // переменная
unsigned int tact = 1000; // количество тактов


void IniTimer1 (void) // описание функция инициализаици таймера1
{
TCNT1 = 0; // таймер обнулен
TCCR1A = 0; //обычный режим
TCCR1B = 0; // таймер остановлен
TIMSK1 = 0; //сбросили флаги
TCCR1B |= (1<<WGM12); // стс режим (сброс по совпадению)
//////OCR1A = time; // максимальный предел счета
TIMSK1 |= (1<<OCIE1A); //Разрешение прерывания по совпадению
}


void Ini_External_Interrupts () // функция инициализаици внешних прерываний
{
EICRA = 0; // выставляем 0 во всем регистре
EICRA |= (1 << ISC01); // падающий фронт вызывает прерывания по INT0
EIMSK |= (1<<INT0); // разрешили внешние прерывания
}

ISR(TIMER1_COMPA_vect){ //обработчик прерывания по совпадению
PORTB|=(1<<5); // ВКЛЮЧАЕМ СВЕТОДИОД
TCCR1B = 0; // таймер остановлен
TCNT1 = 0; // таймер обнулен
}

ISR(INT0_vect) // функция прерывания 0
{
a++;
}

void setup() {
DDRD&=~(1<<2); // пин на прерывание на вход
DDRB|=(1<<5); // пин на светодиод на выход
PORTB|=(1<<5); // высокий лог уровень на светодиод

IniTimer1(); // инициализировали таймер1
Ini_External_Interrupts(); // инициализация внених прерываний
sei(); // разрешили глобальные прерывания
Serial.begin(9600); // сериал соединение с компом
Serial.println("Hello"); // говорим привет компу
}

void loop()
{
for (b = 0, a = 0; a == b; b++, tact--) {
OCR1A = tact; // указывам задержку
TCCR1B |= (1 << CS10); // запускаем таймер1
PORTB&=~(1<<5); //выключаем светодиод
delay(1); // ждем время
//срабатывают прерывания по таймеру и по внешнему прерыванию
PORTB|=(1<<5); // на всякий случай включаем светодиод
// если прерывания сработали цикл повторяется, если нет выходим из цикла
}
Serial.println(tact);
a = 0;
b = 0;
tact = 1000;
}


В итоге я стал получать данные: 127 тактов, 412 тактов, 600 тактов. И я заметил, что чем больше расстояние между диодами, тем меньшие промежутки времени мы регистрируем. Пробуя перекрыть диод пальцем я получил минимальный промежуток всего в 4 такта. А это 0,25 мкс. Т.е. пулю 4,5 мы заметим до скорости... Чего-то дофига получается :) под 18000м/с :)
Может и с фототранзистором такая же фигня, просто там все детали уже вклеены в трубку, а фотодиод я спаял навесным монтажом и смог обратить внимание на разницу в полученных данных.

Я предполагаю, что при слишком ярком освещении фотодиода (и наверняка фототранзистора) накапливается избыточный заряд, который пропадает не сразу. И это приводит к большим задержкам и ошибкам.
Так что наверное стоит тонко подбирать яркость светодиода и тестировать готовую сборку на скорость реакции.
Вложения
RYXGK6_acIs.jpg
схема подключения фотодиода
RYXGK6_acIs.jpg (14.58 Кб)

12 ноя 2018, 01:51

1. noname фототранзисторы могут быть ОЧЕНЬ тормозными (желательно использовать оригинал Kingbright).
2. подключать фототранзисторы лучше как в хронографе sparrow (чтобы при затенении напряжение поднималось).

Напряжение при засвеченных транзисторах настроить на 1.6-1.8 вольта (чем больше - тем выше чувствительность, но выше 1.9-2.1 вольт срабатывает прерывание).

12 ноя 2018, 07:27

скетч хронографа для дисплея нокиа 1202
Если кто переделает под TM1637 то удешевит и геморроя как с дисплеем 1202 не будет.
https://yadi.sk/d/nn8Krhh4wz1H9w

и еще один скетч под дисплей 1602

https://yadi.sk/d/ts8joQSHJjBdFg

28 мар 2019, 10:10

и еще один скетч под дисплей 1602

https://yadi.sk/d/ts8joQSHJjBdFg[/quote]
Всем здравствуйте. Раздобыл платы и решил сделать себе хрон. Скачал по ссылке программу , нажал "проверить " - красное что то выскочило .
Вложения
Безымянный.png
DSCN8351.JPG

28 мар 2019, 11:41

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

28 мар 2019, 11:58

библеотеки все стоят

28 мар 2019, 13:11

VROON писал(а):библеотеки все стоят

В этом деле я :(

28 мар 2019, 19:35

На 1.8.8 версии все нормально компилируется.

22 апр 2019, 22:16

Тоже собрали хрон, правда немного доработали его

http://www.youtube.com/watch?v=T_oZRQ7R1bc&t=1s

23 май 2019, 22:30

Сильно разочаровался в фототранзисторах.
У всеми любимых L-3DP3C (L-32P3C) время реакции 15 мкс, а время пролета пульки длинной 5мм на скорости :? 300м/с - 17мкс.
Они их просто не замечают :?

05 сен 2019, 18:31

Прошивка для хронографа с дисплеем на чипе TM1637.
Измерение скорости + сохранение результатов в EEPROM (до 50).

Полностью совместима с хронографом от AlexGyver.

Работает на Atmega168/328 (возможно, будет работать и на Atmega8, с ней я проверял только на запуск).

Используется таймер1 без предделителя, также можно настраивать напряжение на датчиках без мультиметра (удерживая кнопку включить хронограф - войдет в сервисный режим).
Вложения
Chrono.zip
(21.3 Кб)

08 сен 2019, 07:57

GenFail писал(а):Прошивка для хронографа с дисплеем на чипе TM1637.
Измерение скорости + сохранение результатов в EEPROM (до 50).

Полностью совместима с хронографом от AlexGyver.

Работает на Atmega168/328 (возможно, будет работать и на Atmega8, с ней я проверял только на запуск).

Используется таймер1 без предделителя, также можно настраивать напряжение на датчиках без мультиметра (удерживая кнопку включить хронограф - войдет в сервисный режим).

Время будет. заценим.

13 сен 2019, 01:15

up: на atmega8/Arduino NG работало не очень корректно, т.к. ломается таймер0 (и перестает работать delay).

Переписал инит таймера, теперь должно быть нормально.

И почему-то нормально работает только с бутлоадером.
Вложения
ChronoMega8.zip
(21.34 Кб)

14 фев 2020, 13:40

Доработал немного датчик. Использовал вот такую штуку

https://umnaya-elektronika.ru/datchiki/ ... pyatstviy/

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

Платы закрепил к трубе обычными стяжками.
Вложения
_датчик_обхода_препятствий.jpg
Ответить