понедельник, 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 микросекунд. Также, в написанном мной скетче, помимо названной функции, есть  еще чему вносить погрешность. Таким образом точность измерений составит плюс/минус несколько метров в секунду.

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

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