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

1. Детали и принадлежности



На этом заканчиваются детали, которые необходимо покупать. Резисторы можно не заказывать, похожие по номиналу (но не меньше!) можно выдернуть из ненужной бытовой электроники. Таким образом, суммарные затраты менее 350 рублей, это ничто по сравнению с ценой нового заводского хронографа (over 1000р за самый простой, который по факту еще примитивнее нашего сабжа). Кроме деталей нам пригодятся:

  • Провода — найти в оффлайне бесплатно не проблема
  • Кусок пластиковой водопроводной трубы длиной более 10см (диаметр по вкусу) — так же легко найти
  • Паяльные принадлежности
  • Мультиметр (опционально)

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

1.1. Digispark


Представляет собой простую миниатюрную Arduino-совместимую плату с ATtiny85 на борту. Как подключить к Arduino IDE читаем на официальном сайте проекта, там же можно найти драйвера для нее. Существует два основных вида этой платы: с microUSB и более брутальный с USB коннектором, разведенным прямо на плате.



Мой хронограф не имеет собственного источника питания, поэтому я выбрал первый вариант платы. Встроенная батарейка/аккумулятор сильно повысит цену, не добавив при этом практически ничего к юзабилити. Power bank и кабель для зарядки телефона валяется практически у каждого.

Характеристики само собой унаследованы от ATtiny85, его возможностей в нашем случае достаточно с головой. Фактически МК в хронографе не делает ничего, кроме опроса двух датчиков и управления дисплеем. Для тех, кто впервые сталкивается с Digispark-ом, я свёл наиболее важные особенности в таблицу:
Flash память 6Кб (2Кб заняты загрузчиком)
RAM 512 байт
EEPROM 512 байт
Частота 16,5 МГц (по-умолчанию)
Количество I/O пинов 6
Питание на VIN 5-12В
Pin 0 PWM, SDA
Pin 1 PWM
Pin 2 SCK, ADC1
Pin 3 USB+, ADC3
Pin 4 PWM, USB-, ADC2
Pin 5 PWM, ADC0

Эту табличку я использую как шпаргалку при разработке различных девайсов на базе этой платы. Как вы наверное заметили, нумерация пинов для функции analogRead() отличается, это следует учитывать. И еще одна особенность: на третьем пине висит подтягивающий резистор на 1.5кОм, т.к. он используется в USB.

1.2. Дисплей на базе TM1637


Следующая важная деталь — цифровой дисплей, на который будет выводиться информация. Дисплей можно использовать любой, мой выбор обусловлен только дешевизной и простотой работы с ним. От дисплея в принципе можно вообще отказаться и выводить данные по кабелю на ПК, тогда девайс станет еще дешевле. Для работы понадобится библиотека DigitalTube. Сабж, на который я дал ссылку в начале поста, представляет собой клон дисплея Grove. Вид спереди:



Сзади:



Между цифрами расстояние одинаковое, поэтому при выключенном двоеточии числовые значения читаются нормально. Вместе со стандартной библиотекой поставляется пример, который работает с Digispark-ом без плясок с бубном:



Все, что умеет стандартная библиотека, — выводить числа 0-9 и буквы a-f, а так же менять яркость всего дисплея целиком. Значение цифры задается функцией display(int 0-3, int 0-15).

Экспресс-курс по использованию дисплея
// 1. Объявить заголовочный файл
#include <TM1637.h>
// 2. Задать пины
#define CLK 0
#define DIO 1
// 3. Объявить объект
TM1637 tm1637(CLK, DIO);
// 4. Проинициализировать
void setup() {
  tm1637.init();
  tm1637.set(6); // Яркость
}
// 5. Использовать
void loop() {
  // Вывод числа x на дисплей
  int x = 1234;
  tm1637.display(0, x / 1000);
  tm1637.display(1, x / 100 % 10); 
  tm1637.display(2, x / 10 % 10);
  tm1637.display(3, x % 10);
  delay(500);
}


Если попытаться вывести символ с кодом за границами [0, 15], то дисплей показывает чушь, которая при этом не статичная, поэтому схитрить для вывода спецсимволов (градусов, минуса) без бубна не получится:



Это меня не устраивало, так как в своем хронографе я хотел предусмотреть вывод не только скорости, но и энергии пули (вычисляемой на основе заранее прописанной в скетче массы), эти два значения должны выводиться последовательно. Чтобы понять, что показывает дисплей в данный момент времени, нужно как-то разделять эти два значения визуально, например, при помощи символа «J». Конечно, можно тупо задействовать символ двоеточия как флаг-индикатор, но это же не тру и не кошерно) Поэтому я полез разбираться в библиотеку и на базе функции display сделал функцию setSegments(byte addr, byte data), которая зажигает в цифре с номером addr сегменты, закодированные в data:

void setSegments(byte addr, byte data)
{
  tm1637.start();
  tm1637.writeByte(ADDR_FIXED);
  tm1637.stop();
  tm1637.start();
  tm1637.writeByte(addr|0xc0);
  tm1637.writeByte(data);
  tm1637.stop();
  tm1637.start();
  tm1637.writeByte(tm1637.Cmd_DispCtrl);
  tm1637.stop();
}

Кодируются сегменты предельно просто: младший бит data отвечает за самый верхний сегмент, и т.д. по часовой стрелке, седьмой бит отвечает за центральный сегмент. Например, символ '1' кодируется как 0b00000110. Восьмой, старший бит используется только во второй цифре и отвечает за двоеточие, во всех остальных цифрах он игнорируется. Чтобы облегчить себе жизнь я, как и полагается любому ленивому айтишнику, автоматизировал процесс получения кодов символов при помощи excel:



Теперь можно легко сделать так:



Или так:



Let's say HELLO
#include <TM1637.h>
#define CLK 0
#define DIO 1
TM1637 tm1637(CLK, DIO);

void setSegments(byte addr, byte data)
{
  tm1637.start();
  tm1637.writeByte(ADDR_FIXED);
  tm1637.stop();
  tm1637.start();
  tm1637.writeByte(addr|0xc0);
  tm1637.writeByte(data);
  tm1637.stop();
  tm1637.start();
  tm1637.writeByte(tm1637.Cmd_DispCtrl);
  tm1637.stop();
}

void setup() {
  tm1637.init();
  tm1637.set(6);
}

void loop() {
  // Вывод Hello
  setSegments(0, 118);
  setSegments(1, 121);
  setSegments(2, 54);
  setSegments(3, 63);
  delay(500);
}


1.3. Датчики


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



Ценой одного светодиода определил, что ток больше 40мА для них смертелен, а напряжение питания должно быть ниже 3.3В. Фототранзистор немного прозрачный и реагирует на свет

2. Подготовка деталей и сборка


Схема очень простая и незамысловатая, из всех пинов digispark-a нам понадобятся только P0, P1 — для работы с дисплеем, а так же P2 — для работы с датчиками:



Как видно, один резистор ограничивает ток на светодиодах, второй — стягивает P2 к земле. Фототранзисторы соединены последовательно, поэтому прохождение пули перед любой оптопарой приводит к уменьшению напряжения на P2. Путем регистрации двух последовательных скачков напряжения и замера времени между ними мы можем определить скорость движения пули (зная расстояние между датчиками, ессно). Использование одного пина для замеров имеет еще один плюс — нет никакого требуемого направления движения пули, можно стрелять с обоих концов. Собирать будем из этой горстки деталей:



Я пошел по пути миниатюризации и решил сделать бутерброд при помощи куска макетной платы:



Весь бутерброд залил термоклеем для прочности:





Остается только разместить датчики в трубке и припаять провода:



На фото видно, что я разместил дополнительный электролит на 100мКф параллельно светодиодам, чтобы при питании от повербанка не было пульсаций ИК диодов.



Пин P2 в качестве входа был выбран не просто так. Напомню, что P3 и P4 используются в USB, поэтому использование P2 дает возможность прошивать девайс уже в собранном виде. Во-вторых, P2 — аналоговый вход, поэтому можно не использовать прерывания, а просто мерить разницу в цикле между предыдущим и текущим значением на нем, если разница выше некоторого порога — значит пуля проходит между одной из оптопар. Но есть одна программная хитрость, без которой приведенная схема не взлетит, о ней поговорим далее.

3. Прошивка


3.1. Пару слов о prescaler


Prescaler представляет собой делитель частоты, по-умолчанию в arduino-подобных платах он равен 128. От значения этой величины зависит максимальная частота опроса АЦП, по дефолту для 16 мГц контроллера получается 16/128 = 125 кГц. На каждую оцифровку уходит 13 операций, поэтому максимальная частота опроса пина — 9600 кГц (в теории, на практике реально не выше 7 кГц). Т.е. интервал между замерами примерно 120 мкс, это очень и очень много. Пуля, летящая со скоростью 300 м/с пролетит за это время 3,6 см — контроллер просто не успеет засечь факт прохождения пули через оптопару. Для нормальной работы нужен интервал между замерами как минимум 20 мкс, необходимое значение делителя для этого равно 16. Я пошел еще дальше и в своем девайсе использую делитель 8, делается это следующим образом:

#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

void setup() {
  sbi(ADCSRA,ADPS2);
  cbi(ADCSRA,ADPS1);
  cbi(ADCSRA,ADPS0);
  ...
}

Реальные замеры интервала analogRead на разных делителях:



3.2. Итоговый скетч


Я не буду подробно описывать код, он и так хорошо задокументирован. Вместо этого я в общих словах опишу алгоритм его работы. Итак, вся логика сводится к следующим этапам:

  • Первый цикл — измеряется разница между текущим и предыдущим значением на пине
  • Если разница больше заданного порога, то выходим из цикла и запоминаем текущее время (micros())
  • Второй цикл — аналогично предыдущему + счетчик времени в цикле
  • Если счетчик достиг заданной величины, то информирование об ошибке и переход к началу. Это позволяет не уходить циклу в вечность, если пуля по каким-то причинам не была замечена вторым датчиком
  • Если счетчик не переполнился и разница значений больше порога, то замеряем текущее время (micros())
  • На основе разницы во времени и расстоянии между датчиками вычисляем скорость и выводим на экран
  • Переход в начало

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

Собственно, весь код
/*
 * Хронограф для измерения скорости движения пули, © SinuX 23.03.2016
 */

#include <TM1637.h>

#define CLK 1   // Пин дисплея
#define DIO 0   // Пин дисплея
#define START_PIN 1   // Аналоговый пин старта
#define END_PIN 1     // Аналоговый пин финиша
#define START_LEV 50 // Порог срабатывания старта
#define END_LEV 50   // Порог срабатывания финиша
#define TIMEOUT 10000 // Время ожидания финиша в микросекундах
#define BULLET_WEIGHT 0.00051 // Масса пули в килограммах (для вычисления энергии)
#define ENCODER_DIST 0.1      // Расстояние между датчиками в метрах (10см = 0.1м)
#define SHOW_DELAY 3000       // Время показа результата

// Для ускорения analogRead
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

// Служебные переменные
int prevVal, curVal;
unsigned long startTime, endTime;
TM1637 tm1637(CLK, DIO);

/* Переделанная функция TM1637::display(), которая позволяет зажигать отдельные сегменты
 * Нумерация сегментов: младший бит - верхний сегмент и т.д. по часовой стрелке
 * Центральный сегмент - старший бит */
void setSegments(byte addr, byte data)
{
  tm1637.start();
  tm1637.writeByte(ADDR_FIXED);
  tm1637.stop();
  tm1637.start();
  tm1637.writeByte(addr|0xc0);
  tm1637.writeByte(data);
  tm1637.stop();
  tm1637.start();
  tm1637.writeByte(tm1637.Cmd_DispCtrl);
  tm1637.stop();
}

// Инициализация
void setup() {
  // Устанавливаем prescaler на 8 для ускорения analogRead
  cbi(ADCSRA,ADPS2);
  sbi(ADCSRA,ADPS1);
  sbi(ADCSRA,ADPS0);
  
  // Инициализация дисплея
  tm1637.init();
  tm1637.set(6);
  // Отображение приветствия
  setSegments(0, 118);
  setSegments(1, 121);
  setSegments(2, 54);
  setSegments(3, 63);
  delay(1000);
}

// Главный цикл
void loop() {
  // Заставка ожидания
  showReady();  
  // Ожидание старта
  curVal = analogRead(START_PIN);
  do
  {
     prevVal = curVal;
     curVal = analogRead(START_PIN);
  } while (curVal - prevVal < START_LEV);
  startTime = micros();

  // Ожидание финиша
  curVal = analogRead(END_PIN);
  do
  {
     prevVal = curVal;
     curVal = analogRead(END_PIN);
     // Если превышен интервал ожидания - показ ошибки и выход из цикла
     if (micros() - startTime >= TIMEOUT) { showError(); return; }
  } while (curVal - prevVal < END_LEV);
  endTime = micros();

  // Вычисление и отображение результата
  showResult();
}

// Отображение заставки ожидания выстрела
void showReady()
{
  setSegments(0, 73);
  setSegments(1, 73);
  setSegments(2, 73);
  setSegments(3, 73);
  delay(100);
}

// Вычисление и отображение скорости, энергии пули
void showResult()
{
  // Вычисление скорости пули в м/с и вывод на дисплей
  float bulletSpeed = ENCODER_DIST * 1000000 / (endTime - startTime);
  tm1637.display(0, (int)bulletSpeed / 100 % 10); 
  tm1637.display(1, (int)bulletSpeed / 10 % 10);
  tm1637.display(2, (int)bulletSpeed % 10);
  setSegments(3, 84);
  delay(SHOW_DELAY);
  
  // Вычисление энергии в джоулях и вывод на дисплей
  float bulletEnergy = BULLET_WEIGHT * bulletSpeed * bulletSpeed / 2;
  tm1637.point(1); // Вместо точки ':' - костыль, но пойдет)
  tm1637.display(0, (int)bulletEnergy / 10 % 10);
  tm1637.display(1, (int)bulletEnergy % 10);
  tm1637.display(2, (int)(bulletEnergy * 10) % 10);
  setSegments(3, 30);
  delay(SHOW_DELAY);
  tm1637.point(0);
}

// Вывод ошибки при превышении времени ожидания пули
void showError()
{
  setSegments(0, 121);
  setSegments(1, 80);
  setSegments(2, 80);
  setSegments(3, 0);
  delay(SHOW_DELAY);
}


4. Примеры работы


При правильном подключении девайс взлетел практически сразу, единственный обнаруженный недостаток — он негативно реагирует на светодиодное и люминисцентное освещение (частота пульсаций около 40 кГц), отсюда могут появляться спонтанные ошибки. Всего в девайсе предусмотрено 3 режима работы:

Приветствие после включения и переход в режим ожидания выстрела (экран заполняется полосками):



В случае ошибки — отображается «Err», и снова переход в режим ожидания:



Ну и сам замер скорости:



После выстрела сначала показывается скорость пули (с символом 'n'), затем — энергия (символ 'J'), причем энергия вычисляется с точностью до одного знака после запятой (на гифке видно, что при показе джоулей горит двоеточие). Корпус покрасивее найти пока не смог, поэтому просто залил все термосоплями:



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

Комментарии (92)


  1. shuvaevgl
    31.05.2016 14:08

    Отличный текст. Большая работа проделана. Вот только возникает вопрос: если для пейнтбола взять трубочку побольше будет нормально, то для страйкбола или обычный воздушки будет ли работать при крайне малом размере снаряда? Если пуля пролетит не по оси связи светодиодов, а сбоку или рикошетом внутри трубки?


    1. EwgenW
      31.05.2016 15:01

      Хронографы с трубкой плохо реагируют на СО2 пневматику


      1. shuvaevgl
        31.05.2016 15:16

        а если накачка воздухом?
        почему на СО2 пневматику плохо реагирует?


        1. EwgenW
          31.05.2016 15:33

          ИМХО CO2 при выстреле «генерирует» туман — потому что углекислота охлаждается при резком расширении. Это из личного опыта наблюдение.


      1. LineAir
        03.06.2016 11:10

        В России в пейнтболе чаще воздух используется, т.к. зимой с СО2 особо не постреляешь. А страйкболе, вроде бы, распространены электроприводы.


    1. SinuX
      31.05.2016 15:36

      Размер пульки от ППП (калибр 4.5 мм) не сильно отличается от таковой у страйкболистов, все должно работать при правильном прохождении пульки через оптопары. С трубкой длиной 10 см обеспечить точное попадание не очень сложно. По поводу CO2 осмелюсь предположить, что хронографы плохо работают из-за вылетающего вслед за пулей струи пара, она размазывает импульс с датчика во времени


      1. va4ok
        31.05.2016 22:28

        Размер шара для привода в страйкболе 6 мм (бывает но редко 8 мм). Масса шара варьируется от 0.12 до 0.46 гр.
        Характерные скорости указанные на упаковке с приводом указываются для шара 6 мм и массой 0.2 гр. (про 8 мм привода сказать не могу, не распространены они), да и вообще если речь идет о скоростях, говорят по скорости для шара массой 0.2 гр.


  1. dimao79
    31.05.2016 14:11
    +12

    Измерять микросекундные интервалы через АЦП и analogRead? Поллингом в программных циклах?
    Меня сложно удивить, но тут у вас удалось.


    1. Nizametdinov
      31.05.2016 14:47
      -2

      Чего предлагаешь? Прерывания?


      1. sprutspb
        31.05.2016 14:51
        +3

        таймер


        1. dimao79
          31.05.2016 15:31
          +1

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


          1. andrrrrr
            31.05.2016 22:28

            очень интересны ваши предложения.
            может поделитесь?

            я вот думаю что центровать трубку в таком виде по оси выстрела сложно и нужно её немного модифицировать.
            например изначально взять трубку длиннее и срезать часть трубы вдоль, чтобы получился желоб.
            вот примерно так,
            __________
            |_._._._._._._\__________
            |____________________|

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

            или можно желоб к имеющейся трубке прикрутить.


            1. SuhoffGV
              01.06.2016 10:35

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


    1. REPISOT
      31.05.2016 14:55

      Особенно, учитывая, что частота АЦП не выше 15kSPS.


      1. SquareIronBox
        01.06.2016 06:19

        Можно и выше, с понижением разрядности.


    1. dimao79
      31.05.2016 15:37
      +1

      Ох…
      Там еще светодиоды включены параллельно через один резистор, а вот фотодиоды — последовательно


      1. SquareIronBox
        31.05.2016 18:15
        +1

        Вот с последними никакой проблемы. Они же постоянно освещены диодами и оба открыты, на каждом падение около 0,5-0,7 В, что приемлемо. Хотя бы один перекрывается, и ток в измерительной цепи почти пропадает. Вот если бы они на отражение работали, то пришлось бы их параллельно включать.


  1. safari2012
    31.05.2016 15:26

    Отличная статья. Только ТЗ описано как-то скомкано в одну строчку. Хотелось бы увидеть электро-механический принцип действия этой штуковины. Как именно она замеряет скорость, за счет чего.


    1. encyclopedist
      31.05.2016 15:42

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


      См. схему в пункте 2 статьи.


    1. SinuX
      31.05.2016 15:44

      Суть проста: есть две оптопары, включенные последовательно к одному пину микроконтроллера, который в цикле измеряет напряжение на нем. При прохождении пули через датчики меняется напряжение на пине. Датчика два, поэтому напряжение резко меняется 2 раза при прохождении пули. Контроллер вычисляет время между этими двумя скачками напряжения. Расстояние между датчиками известно, время прохождения известно, находим скорость и выводим на дисплей


      1. DIHALT
        31.05.2016 21:04
        +4

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


        1. impulse
          31.05.2016 22:29
          +4

          Да что там! Я вот сегодня искал реализации часов без RTC и обнаружил проект «Make an accurate Arduino clock using only one wire». Один провод? Да, один провод, соединяющий два пина, на одном пине ШИМ с частотой 490Гц, а другой дергает прерывание по подсчету этих самых герц. Пора открывать новую дисциплину специальной Олимпиады.


          1. DIHALT
            31.05.2016 23:12

            ууу…


      1. 10s
        01.06.2016 01:15

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


  1. Moog_Prodigy
    31.05.2016 16:51

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


    1. tUUtiKKi13
      31.05.2016 17:24

      Я почему-то всегда думал, что датчик в хронографах ёмкостный.


  1. SquareIronBox
    31.05.2016 18:25

    Красиво, когда ничего лишнего) Но тут как раз кое-чего не хватает, как по мне. Во-первых, индивидуальные резисторы светодиодам, а во-вторых, кварцевого генератора. Тактовая частота внутреннего генератора у AVR сильно зависит от температуры.


    1. jaiprakash
      31.05.2016 21:05

      А ещё завести фотодиоды на два раздельных входа, каждый со своим резистором, и ловить прерывания, повысив точность на порядки (ну или в разы), а потом выбросить все эти скетчи и написать по-нормальному, но это я размечтался…


      1. SquareIronBox
        01.06.2016 06:42

        А ещё завести фотодиоды на два раздельных входа, каждый со своим резистором

        А зачем?


        1. jaiprakash
          01.06.2016 11:45

          А вообще, достаточного одного входа. Только я бы фотодиоды подключил параллельно, тогда и компаратор не нужен. Но таймер + прерывания — обязательно!

          На «схеме» бы указать полярность светодиодов и фотодиодов.


          1. SquareIronBox
            01.06.2016 18:05

            В данной схеме параллельное включение ничего не даст. В любой момент времени хотя бы один из диодов будет открыт, причём почти максимально — ведь ему прямо в упор светит светодиод. Если включить параллельно, то сигнал на выходе датчика будет скакать лишь на милливольты. А вот если закрыть оба, то да, сигнал изменится ощутимо. Другими словами, вы предлагаете логическое «и», а в схеме автора логическое «или».
            По идее, этот сигнал лучше завести на вход компаратора, а не АЦП, или вообще на ногу внешнего прерывания. А чтобы засветка от внешних источников не мешала, добавить фильтр высоких частот.


    1. SinuX
      31.05.2016 22:41

      Таки да, но в моем случае диоды от двух резисторов грелись, один даже сгорел, поэтому я решил оставить один резистор) Тут все индивидуально, а по поводу частоты — у ППП винтовок разброс показателей от выстрела к выстрелу намного больше погрешности, которая вносится плавающей частотой


      1. SquareIronBox
        01.06.2016 06:41

        Так резисторы считать надо)


  1. hdg_79
    31.05.2016 22:30

    Насколько точен результат?


    1. SinuX
      31.05.2016 22:33

      Проверить не с чем) По существу — это просто показометр, особой точности не даст, но что-то похожее на правду показывает. На гифке МР-512 в стоке (7.5 Дж по паспорту) — реально около 6 Дж и выдает (судя по отзывам владельцев более продвинутых хронов)


      1. ittakir
        01.06.2016 06:42
        +1

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


        1. MerryKaze
          01.06.2016 15:55

          А как учесть энергию, затрачиваемую на деформацию пластилина?


          1. Zenitchik
            01.06.2016 15:59
            +2

            Она Вам не нужна. Вам нужны импульсы, чтобы рассчитать скорость пули, а начальную энергию рассчитаете через скорость.


            1. Alexeyslav
              01.06.2016 23:29

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


              1. Zenitchik
                02.06.2016 00:03

                Не только. Закон сохранения импульса действует для обоих видов столкновения.


                1. Alexeyslav
                  02.06.2016 07:39

                  Действует, но в данном случае формула будет не тривиальной — надо будет учесть превращение части энергии при деформации.


                  1. Zenitchik
                    02.06.2016 11:01

                    Ещё раз: импульс ни во что не переходит. Наоборот, он при неупругом сохранении сохраняется ИМЕННО потому, что часть энергии расходуется на деформацию.
                    Не путайте импульс и энергию.


                    1. Zenitchik
                      02.06.2016 11:25

                      опечатка. Должно быть «при неупругом столкновении».

                      Годную ссылку на учебник не нашёл, они все в pdf. Но, допустим, здесь, формулы верные
                      https://www.calc.ru/Stolknoveniye-Tel-Uprugiy-I-Neuprugiy-Udary.html


                    1. SquareIronBox
                      02.06.2016 15:56

                      Часть импульса переходит в тепловую энергию. Пластилин и пуля нагреваются при соударении.


                      1. encyclopedist
                        02.06.2016 16:30

                        Импульс и энергия это разные вещи. Не стоит их путать, они не переходят друг в друга. Импульс при попадании в пластилин сохранится.


                      1. Zenitchik
                        02.06.2016 18:12

                        «Часть импульса переходит в тепловую энергию»
                        Вас не насторожило то, что они в разных единицах измеряются? Это прямое указание на то, что они друг в друга переходить не могут.


                        1. SquareIronBox
                          03.06.2016 06:43
                          +1

                          Часть кинетической энергии переходит в тепловую. Так лучше?
                          Да, ошибся, но сути не меняет: кинетическая энергия не полностью перейдёт в потенциальную, поскольку её часть уйдёт на разогрев.


                          1. Zenitchik
                            03.06.2016 10:59
                            +1

                            Полностью согласен. Но импульс сохраняется.


                            1. SquareIronBox
                              03.06.2016 15:05

                              Да, вы правы, я залажал. После университета школьная физика кажется чересчур упрощённой и не учитывающей множество факторов. Например, разогрев пластилина)
                              Вспомнил пример из похожей области. Полётный КПД ракетного двигателя может быть неограниченно великим, хоть 10%, хоть 100%, хоть 1000%, в зависимости от скорости движения ракеты. См. эффект Оберта. Весьма неочевидная штука.


                              1. Zenitchik
                                03.06.2016 15:16

                                А Вы, если не секрет, кто по образованию?


                                1. SquareIronBox
                                  03.06.2016 18:40

                                  Новоиспеченный инженер-ракетостроитель)


                    1. Alexeyslav
                      02.06.2016 16:28

                      Вы оперируете идеальными телами, у вас ни пуля ни пластилин не деформируются теряя энергию которая переходит в тепловую форму.
                      Интересно, а как работают демпферы сводя импульс к нулю?


                      1. Zenitchik
                        02.06.2016 18:11

                        >Интересно, а как работают демпферы сводя импульс к нулю?

                        Не импульс, а энергию. Импульс весь остаётся при них.

                        > вас ни пуля ни пластилин не деформируются теряя энергию которая переходит в тепловую форму.
                        Ещё раз: я вам про импульс говорю, а не про энергию. Разницу понимаете?


                        1. Alexeyslav
                          02.06.2016 19:28

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


                          1. Zenitchik
                            03.06.2016 01:07
                            -1

                            Вы даже учебник не осилили, раз так и не врубились, чем энергия от импульса отличается. Грузу импульс передастся полностью. А энергия частично перейдёт в деформацию и тепло.
                            Тфу, уже сил нет объяснять.
                            Вы хоть один технический расчёт в своей жизни сделали?


                          1. ittakir
                            03.06.2016 05:57

                            Учите физику, класс 7й наверное. Потом уже на хабр с комментариями.


                            1. Zenitchik
                              03.06.2016 11:22

                              В очередной раз убеждаюсь, что программист — это не технарь.


                          1. Zenitchik
                            03.06.2016 11:28
                            +1

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


                            1. Alexeyslav
                              03.06.2016 12:40

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


                              1. Zenitchik
                                03.06.2016 13:05

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

                                А если допустить, что часть импульса может пропасть, как Вы говорите, тогда должно выйти, что маятник получит меньший импульс, но всё-таки получит. Следовательно, будет колебаться, но с меньшей амплитудой, чем выходит по «моим» формулам.
                                Вопрос о том, будет ли он колебаться вечно или в конце концов остановится, от этого никуда не делся. Т.е. против Вашего варианта подходит Ваше же возражение.
                                А почему? А потому что моя модель, как и ваша, не рассматривает другие взаимодействующие с грузом тела — воздух и подвес. Почему я считаю возможным их не рассматривать — я писал выше.

                                Дальше, Вы опять путаете термины. в тепло ушёл не импульс, а энергия.
                                У нас стоит задача измерить скорость пули. Энергия и импульс для этого — средства.


                          1. Zenitchik
                            03.06.2016 15:42
                            +1

                            «Все эти формулы из учебников не учитывают такую ситуацию, они идеализированы.»

                            Вы в этом уверены?
                            Вот, допустим, у нас тела с массами m1 и m2 имели скорости v1 и v2 и неупруго столкнулись.

                            Полный импульс и полная механическая энергия системы до столкновения:
                            p_до = m1*v1 + m2*v2;
                            E_до = 0.5*m1*v1^2 + 0.5*m2*v2^2;

                            После столкновения получилось тело массой m1+m2 имеющее скорость v.
                            p_после = (m1+m2)*v;
                            E_после = 0.5*(m1+m2)*v^2;

                            По формулам из учебника
                            p_до =p_после;
                            m1*v1 + m2*v2 = (m1+m2)*v;
                            v = (m1*v1 + m2*v2)/(m1+m2);

                            Тогда
                            E_после = 0.5*(m1*v1 + m2*v2)^2/(m1+m2)
                            Больше это или меньше, чем было?

                            Рассмотрим разность:
                            E_после — E_до = 0.5*(m1*v1 + m2*v2)^2/(m1+m2) — 0.5*m1*v1^2 + 0.5*m2*v2^2;
                            Путём несложных преобразований (все ведь помнят формулы квадрата суммы и разности и правила сложения дробей?) получаем:
                            E_после — E_до = — 0,5*(m1*m2)*(v1-v2)^2/(m1+m2);

                            Легко видеть, что это разность меньше нуля при любых положительных m1, m2, и ненулевых v1, v2.
                            Т.е. E_после < E_до.

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


                            1. Alexeyslav
                              03.06.2016 20:34
                              -1

                              Как раз при упругом/неупругом столкновении никаких проблем нет.
                              Если бы был предложен стальной шар или даже брусок и стальная пуля — никаких проблем считаем по формулам и всё.
                              Но в исходном комментарии был выбран пластилин… а он подвергается деформации, да и пуля тоже не абсолютно твёрдая особенно на таких скоростях. Появляется составляющая энергии которую не получится просто учесть по формулам она рассеивается в виде тепла и недодаёт импульс телу при помощи которого собираемся измерять скорость пули. Какова величина этого кусочка? А фиг его знает… можно ли его отбросить с чистой совестью? Едва ли…
                              Чтобы просчитать этот эффект надо моделировать столкновение пули с пластилином, при этом необходимо будет знать как минимум вязкость пластилина и собственно самой пули.


                              1. Zenitchik
                                03.06.2016 22:22
                                +1

                                Вы неправы от слова совсем. Описанные законы работают в случае пластилина ничуть не хуже, чем в случае стали.
                                Приложенные мной формулы можете прокомментировать?

                                Напишите методику расчёта для стального бруска или шара.


                                1. Alexeyslav
                                  05.06.2016 10:37
                                  -1

                                  Формулы тут вообще причём? Математика это математика, а меня интересуют основания на которых они были применены к данной ситуации.
                                  Пока я их не нахожу, следовательно двигаться дальше не имеет смысла.
                                  Мне не надо объяснять как работает закон сохранения импульса, объясните почему он может и должен быть применён без изменений к телам которые деформируются в процессе взаимодействия?
                                  «потому что так написано в учебнике» — это не аргумент.
                                  Мне хочется понять что не так пошло в моих рассуждениях и скорректировать это в будущем.


                                  1. Zenitchik
                                    05.06.2016 12:34

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

                                    Если учебник — не аргумент, то Ваше неверие — не повод для доказательства. Рекомендую не забывать, что слова отдельно взятого программиста, тем более, физику не сдававшего, весят ещё ниже, чем цитата из школьного учебника.

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


                              1. encyclopedist
                                04.06.2016 02:44

                                Ещё раз: законы сохранения импульса и энергии это две отдельные вещи. Да, часть энергии перейдёт в деформацию пластилина и пули, но на сохранение импульса это никак не повлияет.


                                1. Alexeyslav
                                  04.06.2016 20:38

                                  Конечно не повлияет, только из-за этой потери энергии пуля грузу недодаст часть импульса.
                                  Вещи конечно разные, но взаимосвязаны — изменение кинетической энергии пули будет несомненно отражаться на изменении импульса(если она не разваливается в полёте).
                                  Теперь перейдём к пластилину.
                                  Процесс передачи импульса в учебниках физики предполагается мгновенным, т.е. бац и передали. Всё как бы чётко.
                                  Но реальная пуля весь свой импульс передаёт не мгновенно а по мере проникновения в брусок пластилина. Где формулы на этот случай? Или доказательство что в этом процессе нет никаких потерь импульса. У меня на это имеются сомнения. Ибо производимая пулей работа по торможению приводит к изменению её импульса и к нагреву пластилина в следствие деформации.
                                  На входе в брусок пластилина имеем скорость пули, а когда она остановилась — 0. Часть работы по торможению пули перешло в импульс бруска пластилина, а часть ушла в нагрев и брусок недополучит эту часть.
                                  Законы сохранения импульса и сохранения энергии несомненно работают, но красиво это выглядит только в учебнике, с идеальным пластилином в котором пуля останавливается мгновенно и передаёт весь импульс. В реальности у нас происходит много всяких процессов с ньюансами, чтобы их учесть простой формулой из учебника уже не отделаешься.

                                  Попробуйте ответить на очень простой вопрос. Вот пуля летит с некоторой скоростью, момент касания пластилинового бруска — что происходит в этот момент? Бруску передаётся весь импульс?
                                  Проходит она 1мм, какова её скорость? сколько энергии она потратила на передачу импульса пластилиновому бруску а сколько энергии ушло безвозвратно на нагрев?
                                  Ну или чтобы всё это опровергнуть, приведите ситуацию когда изменение кинетической энергии пули НЕ ПРИВОДИТ к изменению импульса. У меня что-то или глаза замылились или учебник по физике какой-то не тот.


                                  1. encyclopedist
                                    04.06.2016 21:19

                                    У вас ужасная каша в голове.


                                    1. Alexeyslav
                                      04.06.2016 21:47

                                      Отличный ответ, а главное такой подробный… уже второй час читаю.


                                      1. Zenitchik
                                        05.06.2016 01:12

                                        Не врите. Вы не читаете ответы абсолютно. Это видно по Вашим комментариям.

                                        Если импульс может потеряться — постройте инерциоид.


                                      1. SquareIronBox
                                        05.06.2016 08:26

                                        Это весьма неочевидная вещь. Как раз таки через закон сохранения импульса и закон сохранения энергии можно вычислить количество энергии, перешедшей в тепловую. Вот задачка школьного уровня, и её решение на википедии.


                                        1. Moog_Prodigy
                                          05.06.2016 19:52

                                          На курсах подготовки к инсту препод:
                                          — Решим задачу: На нитке висит брусок. Пуля пробивает его насквозь и летит дальше, потеряв половину скорости. Найдите угол фи, на который отклонился брусок.
                                          Деффачка с первой парты:
                                          — А у вас есть задачи про белочек и орешки?
                                          Препод:
                                          — Конечно. На нитке висит белочка…


              1. ittakir
                02.06.2016 18:22
                +1

                Импульс всей системы P = Mпули * V пули + Mгруза * Vгруза.
                До попадания он равен Mпули * Vпули.
                После попадания он остается такой же и равен (Mпули + Мгруза) * Vгруза.
                Vгруза можно вычислить по максимальной высоте его подъема как маятника. Тут уже работает закон сохранения энергии: (Mпули + Мгруза) * (Vгруза^2) / 2 == (Mпули + Мгруза) * g * H.
                Vпули == Мгруза * Vгруза / Мпули.


                1. Zenitchik
                  02.06.2016 18:33

                  Гораздо неприятнее вращение. Пуля, очевидно попадёт не в центр масс, поэтому создаст момент импульса. Значит часть энергии перейдёт в кинетическую энергию вращательного движения. Её учесть труднее, придётся как-то уменьшать. Скажем, делать маятник узким, чтобы смещением точки попадания пули от плоскости центра масс можно было пренебречь.


                  1. ittakir
                    03.06.2016 05:55

                    Обычно груз делают в виде длинной трубки, наполненной пластилином, и подвешеной за 2 нити. Тогда боковые колебания не возникают, особенно если пуля будет попадать точно в центр масс.


              1. Zenitchik
                02.06.2016 18:28

                Кстати, наоборот. При абсолютно упругом соударении придётся как-то измерять и учитывать сколько энергии и импульса унесла срикошетившая пуля.


  1. crw614
    31.05.2016 22:30

    Что-то представил как человек пытается сдать такую штуку в багаж перед перелетом.


    1. avs24rus
      01.06.2016 09:49

      Ничего страшного, она же не заряжена! Видите трубка пустая?


      1. Deesy
        02.06.2016 14:32

        Хотите расскажу как вылетал из Лондона вывозя около 8кг шаров для страйкбола в ручной клади? Предыдущим рейсом удалось вывезти свой «гир» в виде СВД и АК в полностью разобранном виде в багаже. =)


  1. Alexeyslav
    01.06.2016 10:12

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


  1. binariti
    01.06.2016 11:01

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


    1. dimao79
      01.06.2016 12:02

      Типичный проект на Ардуине.
      Выглядит ужасно, куча переплетенных проводов, держится все на изоленте и термоклее — зато с блютузом.


  1. riartem
    01.06.2016 15:57

    Тоже как-то делал такую штуку.
    Есть два недостатка существенных. Нужно стрелять не то, что в трубку, а так, чтобы шар пролетал через обе пары. Взять автомат в одну руку и такой хрон в другую и замерять проблематично. Нужно раз пять стрельнуть, чтобы попасть.
    Вторая беда вытекает из первой: если диоды хоть чуть чуть выступают внутрь трубки (а иначе будет узкий луч), то вы очень скоро попадаете шаром по одному из них.
    В общем, доя постоянных измерений конструкция очень ненадёжна. Её можно доработать, соорудив в корпусе декоративного «глушителя», тогда будет соосно.
    Если же измерения нужно проводить редко, то рекомендую попробовать «табуреточно-микрофонный» метод, там всё гораздо проще, а точность такая же практически.


    1. Zenitchik
      01.06.2016 16:01

      «табуреточно-микрофонный» метод

      Это как? Поделитесь ссылочкой.


      1. SinuX
        01.06.2016 16:12

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


        1. Zenitchik
          01.06.2016 17:40

          Хм… А идея хороша.


      1. riartem
        01.06.2016 23:58

        Ссылочки нету, про программу для смартфона написали в соседнем комментарии.
        Оригинальный ламповый метод состоял в том, что нужно поставить две табуретки. На ножках табуреток зафиксировать вертикально два самых тонких листа бумаги. Дальше паяем конструкцию из двух дешёвых китайских микрофонов, чтобы оба микрофона на длинных проводах шли в один разъём 3.5.
        Каждый микрофон крепим максимально вплотную к бумажкам, чтобы удар по бумаге воспринимался, как громкий звук.
        Включаем звукозапись на ПК и стреляем. На гистограмме будет 3 пика. 1 — звук выстрела. Второй и третий — звук пробивания листов шаром. Смотрим время между 2 и 3 пиком, расстояние между табуретками мы знаем. Готово!

        Для улучшения точности метода можно с помощью профессионального хронографа замерить «на сколько уменьшается скорость шара после пробивания листа данной бумаги» и добавлять эту скорость (один раз). Но это для получения абсолютных значений. Для сравнения же мощности (например: до и после обслуживания) сойдёт и так.


  1. bRUtality
    02.06.2016 14:47

    ТС, все круто, но вот наствольные хроны это ппц как неудобно. Я сам отстрелил один, и сколько видел застреленных. Можно ли по тем же методам сотворить рамочный, или расстояние между диодами не позволит?


    1. SinuX
      02.06.2016 21:49

      Расстояние позволит, но придется точнее метить + фототранзисторы реагируют на обычный свет, это все сильно усложнит использование. Лучше, как писали выше, сделать жёлоб с одной стороны, в который вкладывается ствол и фиксируется резинками какими-нибудь


      1. bRUtality
        03.06.2016 09:45

        Колхозинг с фиксаторами на ствол не панацея, поверьте. И даже не решение, если строго подойти. Посмотрите, например, Вайраух HW40 — сложно здесь что-то придумать для соблюдения соосности ствола и трубки хрона.
        У меня было много стволов и лишь 2 хрона: первый наствольный — продал через неделю, как подстрелил; второй рамочный — был со мной до конца увлечения пневматикой.
        Из тех хронов, что продаются на форумах пневманутых, почему-то все наствольные не меряют углекислотники. То ли ВВ-шки в этом виноваты, то ли частицы СО2 — не вдавался в подробности. Но все рамочные меряют все что угодно. Видимо, диоды разные используются.
        И еще один момент — о точности прибора. Вам удалось оценить точность?


        1. SinuX
          03.06.2016 11:19

          По мне так рамочный легче пристрелить, если стрелять с некоторого расстояния) СО2 при выстреле образует пар, который не дает датчикам нормально отследить пулю, поэтому трубочные не работают. И я честно не представляю как можно подстрелить трубку 10 см длиной, надетую на ствол винтаря, просто трубку надо выбирать с внутренним диаметром подходящим или переходники использовать. Точность проверял через прогу для смартфона, разница +- 5 м/с.
          UPD: с пистолетами реально проблема, для них трубочный приспособить почти нереально


          1. bRUtality
            03.06.2016 12:04

            Поверьте моему опыту — все ровно наоборот. Рамочный по юзабилити сильно превосходит наствольный.
            Точность +-5, т.е. коридор в 10см не приемлем для реального использования. Для прямодуев как раз добиваются настройки плато не более 10м/с, для редукторных девайсов не более 5м/с.