понедельник, 13 мая 2013 г.

Arduino хронограф (часть 1)

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


Измерения производятся с помощью сенсора. Его схема приведена на рисунке. Здесь же показано как подключить сенсор к ардуино.


Для изготовления сенсора нужны: два фототранзистора L-3DP3C (T1, T2), два светодиода L-34F3C (LED1, LED2), два резистора на 240 Ом (R1, R2) и два резистора на 1 КОм (R3, R4). Проще всего найти резисторы на 0.25 Вт. Они прекрасно подойдут для этого устройства. Обратите внимание, что у фототранзисторов L-3DP3C ножки короче, чем у светодиодов L-34F3C. Еще у светодиодов и у фототранзисторов одна ножка короче другой. При сборке сенсора важно не перепутать светодиоды с фототранзисторами и ножки у каждого светодиода и фототранзистора. Также не спутайте какой резистор куда нужно ставить. Сопротивление резисторов удобно проверять омметром. Надеюсь проблем со сборкой не будет. Схема достаточно проста и подробно нарисована.

В качестве корпуса сенсора я использовал пластиковую водопроводную трубу на 1/2 дюйма. Она достаточно прочная и легко обрабатывается (нужно отрезать кусок подходящей длины и просверлить в нем четыре отверстия диаметром три миллиметра).

Работает это устройство следующим образом. Пуля пролетая под светодиодами перекрывает их свет, что регистрируется фототранзисторами. Зная расстояние между фототранзисторами и посчитав время между сигналами с фототранзисторов можно вычислить скорость пули по формуле: v = s / t , где v - скорость, s - расстояние и t - время.

В моем хроне данные передаются в ПК через USB. Результат измерений можно наблюдать в стандартном ардуиновском мониторе порта.

Еще можно подключить к ардуино Bluetooth модуль и передавать данные беспроводным способом.

Что касается мобильных устройств, есть немало терминальных программ для Android. Они также должны корректно отображать результаты. Я не проверял, так как у меня нет подходящего Android устройства. Некоторые терминальные программы распространяются бесплатно и при наличии соответствующего мобильного устройства с Android проверить это будет не сложно. Буду благодарен, если в комментариях напишите о результатах.

Скетч:

////////////////////////
//
// Arduino Uno
//
////////////////////////
//
// Sketch: Chronograph
//

unsigned int data = 0;

volatile unsigned long int time1 = 0;
volatile unsigned long int time2 = 0;

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

    attachInterrupt(0, sensor_1, FALLING);
    attachInterrupt(1, sensor_2, FALLING);
}

void loop()
{
    while ( time1 == 0 && time2 == 0 ) ;
    delay(800);

    if ( time1 != 0 && time2 != 0 && time2 > time1 )
    {
        data = 0.06 / ((time2 - time1) / 1000000.0); // v = s / t
    }
    else
    {
        data = 0;
    }

    Serial.println(data);

    time1 = 0;
    time2 = 0;
}

void sensor_1()
{
    if ( time1 == 0 )
    {
        time1 = micros();
    }
}

void sensor_2()
{
    if ( time2 == 0 )
    {
        time2 = micros();
    }
}

//
// End
//
////////////////////////

Теперь немного расскажу о точности этого прибора.

Функция micros() имеет разрешение 4 микросекунды (возвращаемое значение всегда кратно 4). Посчитаем какую погрешность это внесет в измерения. При скорости 100 м/с пуля пролетит расстояние равное 6 см за:

(0.06 / 100.0) * 1000000.0 = 600.0 мкс

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

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

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

6 комментариев:

  1. how to display this result as feet per second ? fps

    ОтветитьУдалить
    Ответы
    1. Use international standard, my foot is bigger than yours. My finger is longer. Our hair got different length. But meter is always meter, independent from feet or penises length.

      Удалить
  2. Спасибо за схему! Используя распространённые 3 мм китайские ИК транзисторы, резисторы R3, R4 необходимо заменить на построечные 1К (или больше) и настроить отдельно чувствительность каждого. Иначе не реагирует.

    ОтветитьУдалить
  3. Здравствуйте.
    Собрал подобную схемку, только для засветки УФ диодов (трассеный модуль). Столкнулся с проблемкой. При скорости шара 80-90 м/с шары нормально регистрируются детектором. При скорости 120/130 м/с шары не регистрируются. Правда на 1 КОм не нашлось резистора, стоит на 2 КОм. Может быть вызвана этим проблема с чувствительностью сенсора?

    ОтветитьУдалить
    Ответы
    1. Вы не могли бы поделиться кодом как вы его реализовали?

      Удалить
  4. доброго всем,подскажите,если поставить на входе три и на выходе три фото диодов,какие нужны изменения в схеме и программе?

    ОтветитьУдалить