ζ༼Ɵ͆ل͜Ɵ͆༽ᶘ

Расчет и сборка хронографа своими руками

0 комментов
20.04.2020
4 мин чтения

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

Измерительный прибор работает при помощи 2 оптопар. Оптопара – это один светодиод и один фототранзистор, которые находятся напротив друг друга. Светодиод и фототранзистор работают в инфракрасном диапазоне (длина волны составляет 940нм). Выбор рабочей длины волны объясняется тем, что фототранзистор не будет реагировать на внешнее освещение (солнечное, от лампы и др.). При этом существенно снижается погрешность измерений.

В качестве «мозга» всего устройства был использован микроконтроллер на платформе Arduino, а именно Arduino Uno. Так же были использованы следующие радиокомпоненты: два потенциометра, 2 кнопки и дисплей для настройки устройства и вывода результатов.

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

Материалы были куплены в магазине Чип и Дип.

  • Микроконтроллер Arduino Uno
  • Дисплей SPI/I2C 1602 LCD blue
  • 2 тактовые кнопки
  • 2 потенциометра на 15kΩ
  • 2 светодиода L-53F3C
  • 2 фототранзистора L-53P3C
  • 2 резистора 220kΩ
  • Текстолит
  • Провода
  • Коробка для р/у

Программа для Arduino

Первым делом была написана программа для микроконтроллера Arduino на языке С++. Программа:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
int set, anR1, anR2;
boolean initial;  //флажки
int n=1;            //номер выстрела, начиная с 1
float velocity;    //переменная для хранения скорости
float dist=0.15;       //расстояние между датчиками в метрах  
volatile unsigned long gap1, gap2;    //отметки времени прохождения пулей датчиков
int flag0 = 0;
int flag1 = 0;
const int But0 = 4;
const int But1 = 5;

void setup() {
  lcd.init();                     
  lcd.backlight();// �'ключаем подсветку дисплея
  //Serial.begin(9600);
  attachInterrupt(1,start,RISING);     //аппаратное прерывание при прохож-дении первого датчика
  attachInterrupt(0,finish,RISING);      //аппаратное прерывание при про-хождении второго датчика
}
void start() 
{
  if (gap1==0) {   //если измерение еще не проводилось
    gap1=micros(); //получаем время работы ардуино с момента включения до момента пролетания первой пули
  }
}
void finish() 
{
  if (gap2==0) {  //если измерение еще не проводилось
    gap2=micros();  //получаем время работы ардуино с момента включения до момента пролетания второй пули
  }
}
void loop() {
  if (initial==0) {                          //флажок первого запуска
    lcd.setCursor(0,0);              // Установка курсора в начало первой строки
    lcd.print("Wait please...");
    delay(1000);
    lcd.clear();
    lcd.setCursor(0,1);              
    lcd.print("System is ready");
    initial=1;       //первый запуск, больше не показываем сообщения
  }

  if (digitalRead(4) == HIGH && flag0==0){
    set=0;
    initial=0;
    }
  if (digitalRead(4) == LOW && flag0==1){
    flag0=0;
  }
  if (digitalRead(5) == HIGH && flag1==0){
    set=1;
    }
  if (digitalRead(5) == LOW && flag1==1){
    flag1=0;
  }

  if (set==1) {                    //если 1 режим
    anR1 = analogRead(2);
    anR2 = analogRead(3);
    lcd.clear();
    lcd.setCursor(0,0);              
    lcd.print("sensor 1: ");
    lcd.setCursor(11,0);             
    lcd.print(anR1);
    lcd.setCursor(0,1);              
    lcd.print("sensor 2: ");
    lcd.setCursor(11,1);             
    lcd.print(anR2);              
  }

  if (gap1!=0 && gap2!=0 && gap2>gap1 && set==0) {        //если пуля про-шла оба датчика в 0 режиме
    velocity=((dist)/((gap2-gap1)*0.000001));         //вычисление скорости как расстояние/время
    lcd.clear();
    lcd.setCursor(0,0);              
    lcd.print("Shot #");
    lcd.setCursor(7,0);              
    lcd.print(n);
    lcd.setCursor(0,1);              
    lcd.print("Speed: ");
    lcd.setCursor(8,1);              
    lcd.print(velocity);
    lcd.setCursor(13,1);              
    lcd.print("m/s");
    gap1=0;                                   //сброс значений
    gap2=0;
    n++;                                      //номер выстрела +1
  }

  if (micros()-gap1>1000000 && gap1!=0 && set!=1) { // (если пуля прошла первый датчик) � (прошла уже 1 секунда, а второй датчик не тронут)
    lcd.setCursor(8,1);              
    lcd.print("FAIL");
    gap1=0;
    gap2=0;
  }
  delay(20);    //задержка для стабильности
}

В устройстве есть 2 режима. Один из них используется для отладки устройства, другой непосредственно для самой стрельбы. В режиме отладки при помощи прокручивания потенциометра подбирается значение, которое высвечивается на дисплее, меньше 300(на обоих датчиках). На дисплее отображаются 2 значения в пределах от 0 до 1023. Это аналоговый сигнал, который принимает микроконтроллер (чем меньше значение, тем лучше принимает фототранзистор, но не надо ставить меньше 200). Схему подключения всех компонентов вы можете увидеть ниже:

Испытания

Испытание – это была стрельба из пневматического страйкбольного пистолета. Устройство показало результат 72м/с. Для проверки результата в страйкбольном магазине AirsoftRus нам разрешили сделать пару выстрелов и пневматического оружия. Результат был примерно тот же (был в промежутке от 68 м/с до 75 м/с, так как мы проверяли на разных пистолетах). После этого из точно такого же оружия мы стреляли через заводской хронограф. И результаты иногда были идентичными или отличались всего лишь на 0,01! Таким образом, можно утверждать, что нестабильность устройства мала и калибровка проведена верно.

На видео вы можете видеть работу устройства

Заключение

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

3
Сегодня
День улёта