Недорогой хронограф для пневматической винтовки


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

Подготавливаем необходимые материалы и инструменты:
- китайский Digispark (обошелся на момент покупки в 80 рублей);
- дисплей сегментного типа на TM1637 (обошелся при покупке в 90 рублей);
- инфракрасные светодиоды и фототранзисторы (10 пар) - стоимость составила 110 рублей;
- сто резисторов на 220 Ом обошлись в 70 рублей, но из них будут нужны только два.

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

Помимо всего прочего, нужно запастись такими деталями как:
- провода;
- кусок трубы длиной не менее 10 см (подойдет пластиковая водопроводная);
- все для пайки;
- мультиметр (желательно).


Первые описанные три детали имеют свои нюансы, поэтому каждую из них нужно рассмотреть отдельно

Digispark
Этот элемент представляет собой миниатюрную плату, которая совместима с Arduino , на борту она имеет ATtiny85. Как подключить этот элемент к Arduino IDE, можно почитать на , еще там можно скачать для нее драйвера.
У этой платы есть несколько вариантов, в одной используется microUSB, а другая оборудована USB-коннектором, который разведен прямо на плате. В связи с тем, что самоделка не имеет индивидуального блока питания, автор выбрал первый вариант платы. Если установить в самоделку батарею или аккумулятор, это сильно повысит ее цену, причем не сильно повлияет на практичность. А кабель для зарядки мобильного и Power bank есть почти у каждого.


Что касается характеристик, то они подобны ATtiny85, здесь его возможностей хватает с избытком. Микроконтроллер в хронографе всего лишь опрашивает датчики и управляет дисплеем.
Если вы еще ни разу не встречались с Digispark-ом, наиболее важные нюансы можно посмотреть в таблице.


Важно учитывать тот факт, что нумерация пинов для функции analogRead() имеет отличия. А еще на третьем пине находится подтягивающий резистор номиналом 1.5кОм, поскольку он применяется в USB.

Пару слов о дисплее
Дисплей для самоделки можно использовать любой, но автор остановил свой выбор на дешевом варианте. Чтобы сделать устройство еще дешевле, от дисплея можно отказаться совсем. Данные просто можно через кабель выводить на компьютер. Здесь будет нужна . Рассмотренный дисплей является копией дисплея .
Как выглядит дисплей спереди и сзади можно увидеть на фото.




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


Как использовать дисплей

// 1. Объявить заголовочный файл
#include
// 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);
}

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


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


{
tm1637.start();
tm1637.stop();
tm1637.start();
tm1637.writeByte(addr|0xc0);
tm1637.writeByte(data);
tm1637.stop();
tm1637.start();
tm1637.stop();
}

Кодируются такие сегменты довольно просто, за верхний сегмент несет ответственность младший бит data, ну а далее по часовой стрелке, 7-ой бит несет ответственность за средний сегмент. Символ «1» при кодировке выглядит как 0b00000110. За двоеточие отвечает восьмой старший бит, он используется во второй цифре, а во всех других игнорируется. Впоследствии автор автоматизировал процесс получения кодов, используя Exсel.


Что же в итоге вышло, можно увидеть на фото




#include
#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);
}



Ну и наконец, датчики

О датчиках точной информации не предоставлено, известно только, что они имеют длину волны 940 нм. В ходе экспериментов было выяснено, что датчики не способны выдерживать ток более 40 мА. Что касается напряжения питания, то оно не должно быть выше 3.3В. Что касается фототранзистора, то он имеет немного прозрачный корпус и реагирует на свет.


Приступаем к сборке и настройке самоделки:

Шаг первый. Сборка

Собирается все по очень простой схеме. Из всех пинов будут нужны всего Р0, Р1 и Р2. Первые два используются для дисплея, а Р2 нужен для работы датчиков.
Как можно заметить, один резистор используется для того, чтобы ограничить ток для светодиодов, ну а второй стягивает Р2 на землю. В связи с тем что, фототранзисторы подключаются параллельно, то когда пуля будет проходить перед любой оптопарой, напряжение на Р2 будет падать. Чтобы определить скорость полета пули, нужно знать расстояние между датчиками, замерить два скачка напряжения и определить время, за которое они произошли.
В связи с тем, что будет использоваться только один пин, не имеет значения, с какой стороны стрелять. Фототранзисторы в любом случае заметят пулю.










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




Еще важно отметить, что пин Р2 был выбран не просто так, дело в том, что Р3 и Р4 применяются в USB, поэтому теперь с помощью Р2 есть возможность прошить самоделку уже после сборки.
Еще Р2 является аналоговым входом, поэтому использовать прерывание нет надобности. Можно просто измерять показания между текущем и предыдущем значением, если разница становится выше определенного порога, значит, в этот момент пуля как раз проходит возле оптопары.

Шаг второй. Прошивка

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);
...
}


Что же получилось узнать в ходе эксперимента, видно на фото

Логика работы прошивки имеет несколько этапов:

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

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

Работает самоделка в трех режимах:

После включения идет приветствие, и потом экран заполняется полосками, это говорит о том, что устройство ожидает выстрела


Если есть ошибки, показывается сообщение «Err», а потом включается режим ожидания


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


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

© 2024 videointercoms.ru. Мастер на все руки - Бытовая техника. Освещение. Металлобработка. Ножи. Электричество.