Как сделать хронограф для пневматики своими руками

Академия Гитарной Электроники: Самодельный Хронограф Для Пневматики — Академия Гитарной Электроники

  • Перейти на сайт
  • Обсуждения
  • Пользователи
  • Календарь
  • Чат
  • Академия Гитарной Электроники
  • >Дополнительный раздел
  • >Прочая электроника
  • Правила форума
  • Просмотр новых публикаций

Самодельный Хронограф Для Пневматики измерение скорости вылета пули

#1 HeJIeIIoCTb

  • Группа: Паяльные маньяки
  • Сообщений: 633
  • Регистрация: 14 July 11

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

Прикрепленные изображения

  • Наверх of the page up there ^

#2 WiSked

  • Группа: Паяльные маньяки
  • Сообщений: 2381
  • Регистрация: 13 February 10
  • Наверх of the page up there ^

#3 Vitalka

  • Антиум

  • Группа: Паяльные маньяки
  • Сообщений: 4226
  • Регистрация: 30 May 09
  • Наверх of the page up there ^

#4 Батя

  • Группа: Паяльные маньяки
  • Сообщений: 1868
  • Регистрация: 16 February 10
  • Наверх of the page up there ^

#5 Kira

  • Группа: Паяльные маньяки
  • Сообщений: 1619
  • Регистрация: 30 July 09
  • Наверх of the page up there ^

#6 Graff

  • Князь тьмы!

  • Группа: Пользователи
  • Сообщений: 3099
  • Регистрация: 06 April 09

Внемли Креведу, вестнику Всемогушего, гласу Ктулху истинного.

  • Наверх of the page up there ^

#7 HeJIeIIoCTb

  • Группа: Паяльные маньяки
  • Сообщений: 633
  • Регистрация: 14 July 11

Ого честно говоря думал что тема так и «умрет» без ответа, спс ребят что откликнулись. Судя по прайсу в Вольтмастере можно легко уложиться в бюджет 500р ну + корпус гайнта 0124 и пр. расходы: итого 1к

только вот чето не пойму, светодиоды/фототранзисторы любые подойдут или там какието специальные?

посидел, подумал, есть вопрос. а гитарный датчик засечет пролет мимо него кусочка свинца со скоростью не меньше 150м/с О_о? Ато может и заморачиваться с пайкой смысла нет (2 самых дешовых датчика + стерео запись, а там по разнице во времени пролета можно и посчитать. )

  • Наверх of the page up there ^

#8 Monomax

  • Любитель

  • Группа: Паяльные маньяки
  • Сообщений: 578
  • Регистрация: 15 August 10
  • Наверх of the page up there ^

#9 Kira

  • Группа: Паяльные маньяки
  • Сообщений: 1619
  • Регистрация: 30 July 09
  • Наверх of the page up there ^

#10 HeJIeIIoCTb

  • Группа: Паяльные маньяки
  • Сообщений: 633
  • Регистрация: 14 July 11

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

вот кстати! такое не мне одному в голову пришло.

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

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

Прикрепленные изображения

  • Наверх of the page up there ^

#11 Kira

  • Группа: Паяльные маньяки
  • Сообщений: 1619
  • Регистрация: 30 July 09

HeJIeIIoCTb, отошлют, они же в цепь включены чего-то. А чем тебя тобою же выложенная схема выше не устраивает? самое простое из той же фольги можно сделать так — берёшь значится какой нить профиль, или трубку — делаешь на известном расстоянии клеммы — одни клеммы с прочным зажимом, другие можно вообще как контактную площадку — без зажима, иначе пуля просто прострелит фольгу и всё (тут лучше конечно опытным путём проверить.) Далее, эти две фольги — это собственно правый и левый канал в стерео-джеке, точнее разрыв — с одной стороны допустим джек, далее приблуда с фольговыми контактами, далее снова джек — с одной стороны ставишь плеер, дабы не городить генератор, с другой втыкаешь в комп на запись в режиме шкалы времени — чтоб видно было где есть сигнал, где нет, в последствии — включаешь запись, проверяешь что через фольгу идёт звук, проверяешь что будет в отсутствие звука — какой уровень шумов — далее всё просто — стреляешь — пуля так же поочерёдно сносит одну фольгу, вторую фольгу — на записи — два обрыва сигнала в правом и левом канале с какой то разницей по времени. Расстояние между клемами ты знаешь — далее собственно — из точки А в точку Б объект двигался время t, задача : найти скорость объекта)))

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

Дешёвый хронограф для пневматики своими руками

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

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

  • Китайский Digispark — 80 рублей на момент покупки
  • Сегментный дисплей на TM1637 — 90 рублей на момент покупки
  • ИК светодиоды и ИК фототранзисторы (10 пар) — 110 рублей на момент покупки, нам нужны 2 пары
  • Резисторы 220 Ом (100шт) — 70 рублей на момент покупки, нам нужно только 2 штуки

На этом заканчиваются детали, которые необходимо покупать. Резисторы можно не заказывать, похожие по номиналу (но не меньше!) можно выдернуть из ненужной бытовой электроники. Таким образом, суммарные затраты менее 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).

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

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

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

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

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, делается это следующим образом:

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

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

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

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

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

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

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

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

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

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

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

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

Хронограф своими руками

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

Читайте также  Регулятор напряжения на 220 вольт своими руками

Измерительный прибор работает при помощи 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 на языке С++. Программа:

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

Испытания

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

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

Заключение

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

Что бы поставить лайк, необходимо зарегестрироваться (;・ω・)ア

Серая коробочка радиодеталей. Хронометр для пневматики своими руками

  • Цена: 2,99
  • Перейти в магазин

Владею пневматической винтовкой, всегда была интересна скорость вылета пули из ствола, это кому-то покажется странным, но у пневмолюбов скорость пули одна из главных тем для членометрии. Погуглив немного нашел несколько вариантов схем на разных микроконтроллерах, так как у меня уже был опыт работы с AVR, без раздумий выбрал вариант на avr. Все необходимые детали я нашел на упоминавшемся уже здесь Taydaelectronics.com. Покупка собрана, оплачена, получена, приступим…

Сразу приложу схему:

поподробнее желающие могут посмотреть на сайте автора.

Итак, нам понадобится:

Микроконтроллер attiny 2313 — 1 шт.
Регулятор напряжения L7805 — 1 шт.
Пара конденсаторов 330 нФ и 100нФ для регулятора напряжения
(можно запитать всю схему от трех пальчиковых батареек вместо кроны, тогда регулятор и конденсаторы не понадобится)
Подстроечный резистор на 20-50 килоом 2 шт.
7-сегментный индикатор на три цифры с общим катодом 1 шт.
УФ светодиод 2 шт.
Фототранзистор 2 шт.
выключатель, панелька для микроконтроллера, панелька для индикатора, коннекторы для шлейфов, сам шлейф я использовал от старого компьютера. Так же набор резисторов.
КОРОБОЧКА.

добавил разъемов в схему

кое-как расставил компоненты, чтобы иметь примерное представление, как рисовать дорожки. И да, у меня нет принтера, я рисую дорожки перманентным маркером)))

сначала пробую на бумаге

потом переношу на текстолит

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

Чистим

Сверлим. Дрельку делал из патрона и моторчика с фасттека.

Вот все компоненты запаяны на плату, осталось только прошить микроконтроллер

ОНО ЖИВОЕ!

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

/*
* Прошивка без наворотов, расстояние между датчиками 100мм
* общий анод!
* Updated at: 15.12.2013
* Author: pahan
*/

#define F_CPU 1000000UL

0b00111111
#define LED_1

0b00000110
#define LED_2

0b01011011
#define LED_3

0b01001111
#define LED_4

0b01100110
#define LED_5

0b01101101
#define LED_6

0b01111101
#define LED_7

0b00000111
#define LED_8

0b01111111
#define LED_9

0b01101111
#define LED_DOT

0b01000000
#define LED_E

0b01111001
#define LED_r

0b01010000
#define LED_G

0b00111101
#define LED_o

#define BASE_LENGTH 1000

typedef struct LedPanel <
int seg1;
int seg2;
int seg3;
> LedPanel;

void renderSegmentNext() <
static int activeSegment = 0;
activeSegment = (activeSegment + 1) % 3;

switch (activeSegment) <
case 0:
PORTB = led.seg1;
PORTD =

0b0110000;
break;
case 1:
PORTB = led.seg2;
PORTD =

0b1010000;
break;
case 2:
PORTB = led.seg3;
PORTD =

void initPorts() <
//init led ports
DDRB = 0xFF;
DDRD |= (0b111 400) <
led.seg1 = LED_MINUS;
led.seg2 = LED_MINUS;
led.seg3 = LED_MINUS;
return;
>

led.seg3 = digitToLedValue(value % 10);
if (value >= 10) <
led.seg2 = digitToLedValue((value / 10) % 10);
> else <
led.seg2 = LED_EMPTY;
>
if (value >= 100) <
led.seg1 = digitToLedValue((value / 100) % 10);
> else <
led.seg1 = LED_EMPTY;
>
>

ISR( TIMER1_OVF_vect ) <
//stop timer and reset value
TCCR1B &=

(1 Планирую купить +32 Добавить в избранное Обзор понравился +69 +128

[Из песочницы] Дешёвый хронограф для пневматики своими руками 31.05.2016 14:39

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

На этом заканчиваются детали, которые необходимо покупать. Резисторы можно не заказывать, похожие по номиналу (но не меньше!) можно выдернуть из ненужной бытовой электроники. Таким образом, суммарные затраты менее 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).

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

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

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

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

1.3. Датчики

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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