Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 109, ЯНВАРЬ 2008 г.

Каждый выстрел на счету

lamobot (lamobot@gmail.com)

Хакер, номер #109, стр. 122

Цифровой счетчик патронов своими руками

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

Жертва

В принципе, для модернизации подойдет любая пушка, обладающая электронным спуском, в корпус которой можно будет уместить печатную плату девайса и индикатор. Это, например, страйкбольные стволы, некоторые модели пейнтбольных и CO2-пистолетов/пулеметов/винтовок. Если же выбор пал на пушку, обладающую традиционным (сугубо механическим) ударно-спусковым механизмом, то тебе останется только придумать способ захвата события «выстрел произошел». Например, установить оптопару, чтобы при выстреле курок перекрывал луч, или задействовать геркон. Вся остальная логика схемы сохранится.

У меня уже давно валяется и скучает пневматический пистолет-пулемет «Дрозд», который просто создан для модификаций. Как ты уже догадался, именно его я и буду препарировать.

Нутро

Родная плата «Дрозда» довольно примитивна. Ее сердце - безликая микросхема с минимальной обвязкой, напоминающая собой таймер. Трехпозиционные переключатели меняют темп (300, 450, 600 выстрелов в минуту) и режим стрельбы (1, 3, 6 выстрелов за раз) - микруха будет генерировать различные пачки импульсов. Ты жмешь на спуск - порождается «логический» импульс, который поступает на ключ. Ключ этот выполнен на мощном полевом транзисторе и служит для коммутации большого тока на соленоид. Ты, наверное, еще со школы знаешь, что если по катушке пропустить ток, она втянет сердечник. Тут этот эффект используется для открытия клапана: сердечник бьет по нему, и высвободившийся газ разгоняет снаряд. Большой электролитический конденсатор установлен туда неслучайно. Он призван обеспечить быструю отдачу достаточного количества энергии на соленоид, так как аккумуляторы сами по себе не могут дать желаемый ток. Это сравнимо со вспышкой в фотоаппарате. Емкий конденсатор сравнительно медленно накапливает энергию, а в момент съемки резко отдает ее лампе.

Импульсы, названные мной «логическими», мы и будем считать. Как видишь, все очень просто. На картинке я обозначил дорожку, которая ведет к затвору полевого ключа. Это как раз то место, в которое мы врежем наш счетчик. С IN будем снимать импульсы, при необходимости обрабатывать и пропускать дальше в OUT на затвор. Питание возьмем с ножек толстого конденсатора: там, где у него широкая серая полоска, - земля; другой вывод, соответственно,- плюс. Смотри не перепутай! Если сомневаешься, на обратной стороне платы выводы подписаны :).

Схема

Чтобы тебе было понятнее, я набросал схемку в САПРе (САПР - Система автоматизации проектных работ. – Прим. dlinyj). Вообще, советую не обделять вниманием подобные программы - без них ни один мало-мальски мудреный прибор не сделаешь (когда будем получать рисунок печатной платы, ты поймешь почему).

Девайс в сборе.

Схема тривиальна из-за применения микроконтроллера. На рассыпухе она была бы куда сложнее и бестолковее :). Кроме того, мы имеем приятные дополнительные возможности вроде сохранения остатка боезапаса в EEPROM, проведения какой-нибудь хитрой обработки и т.д. 78М05 - это линейный регулятор напряжения, который поддерживает на выходе 5 В, при входном напряжении большем 5 В. Это как раз то, что нужно для питания нашей микрухи. Конденсаторы C1, C2, C3 сглаживают возможные пульсации. Линия PB4 отвечает за захват входного импульса, а резисторы R1, R2 составляют делитель напряжения для снижения его размаха с 9-12 В до 3,5-5,0 В, на которые с удовольствием среагирует наш контроллер. Мы же не хотим ничего спалить?! Линия PB5, в свою очередь, отвечает за посылку импульса на затвор ключа.

Распайка шлейфа. Ориентир — красная жила.

На ножку PB6 я повесил кнопку. Она будет выполнять несколько важных функций. Во-первых, это восстановление счетчика после перезарядки и сохранение текущего значения, а во-вторых, вход в режим установки емкости (для совместимости с разными обоймами: от 0 до 99 патронов). Единственная хитрость состоит в подключении индикатора. Как можно догадаться по картинке, каждый цифровой разряд состоит из семи сегментов. Производители индикаторов договорились обозначать сегменты буквами, с верхнего и далее по часовой стрелке: a, b, c, d, e, f. Сегмент g - средний горизонтальный. Каждый сегмент, по сути, обычный светодиод. В индикаторе DA-04 эти светодиоды внутри соединены анодами и общий контакт выведен наружу. Чтобы рационально использовать пространство, мы не будем тупо лепить каждый диод к линии порта, раздувая шлейф на 16 жил, а используем стробирование. Это позволит сократить количество проводников до девяти. Соединим сегменты обоих разрядов параллельно, то есть a1-a2, b1-b2, и т.д. Будем последовательно зажигать каждый разряд путем коммутации только одного анода, и делать это мы будем очень быстро, чтобы никто не заметил легкого обмана. Сетчатка человеческого глаза довольно инертна и поэтому никакой разницы наблюдатель не обнаружит. Соединяем пары а1-а2, b1-b2, c1-c2, d1-d2, e1-e2, f1-f2, g1-g2 с линиями порта A контроллера через токоограничивающие резисторы. Аноды индикатора присоединяем к линиям PB0, PB1 через ключи на биполярных транзисторах.

Разводка

Разъемы для подключения шлейфа и прочего я решил не ставить и паять напрямую - в первую очередь из-за отсутствия в продаже нормальных соединителей с шагом 1,27 мм, а также из-за банальной экономии места. Даже самый миниатюрный разъем занял бы треть площади платы. На фиг такой расклад. Девайсик уместился на односторонней плате с двумя перемычками, габариты которой менее 25х40 мм. Места в «Дрозде» хватает с запасом. На картинке наглядно проиллюстрирован процесс разводки.

Изготовление

В этот раз при изготовлении печатки я заморочился по полной программе. Применил фоторезист, шаблоны, УФ-лампу, NaOh и FeCl3 (рекомендую посмотреть этот метод в интернете – очень полезная штука). Мои старания не прошли даром, и я получил рисунок проводников высокого качества! Ты можешь сделать печатную плату любым способом, который осилишь. Оптимальным, пожалуй, будет метод лазерного утюга. Картинку с разводкой платы в высоком разрешении ищи на диске. Размеры платы для самостоятельного изготовления: 38 на 21,5 мм. Когда протравишь, не забудь залудить дорожки и контактные площадки (как у меня). Будет проще паять крохотные детали. Более того, твое устройство будет выглядеть гораздо приличнее.

Устанавливаем индикатор в торец.

В первую очередь капитально впаяй 78M05. Земляной вывод этой детали является еще и радиатором, поэтому положи туда побольше припоя, чтобы тепло лучше рассеивалось. И еще - не вздумай припаять регулятор напряжения легкоплавким припоем! Даже при входном напряжении, находящемся в рамках допустимых значений, он может очень сильно греться и банально отпаяться. Затем установи C1, C2, C3. Желтая бобышка С1 - это танталовый конденсатор. Он полярен (при его впайке имеет значение, где минус, а где плюс), положительная ножка у него там, где полоска. С2 и С3 впаивай любой стороной, они керамические. С помощью тестера проверь полярность и номинал напряжения на площадках под микроконтроллер: на пятой площадке относительно шестой, должно быть примерно 5 вольт. Может быть чуть больше, поскольку в нашей, схеме пока ничто ничего не потребляет (это называется «режимо холостого хода»). Но если тестер показывает напряжение больше 5,5 В, а то и все 9 В, то тут что-то не ладно. Если норма, смело впаивай все остальное. В самую последнюю очередь сделай две проводные перемычки от транзисторов. И не забудь приделать кнопочку, ее лучше будет вывести на левую сторону корпуса «Дрозда».

Ключевая дорожка на плате.

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

Грамотно прокачанная пушка.

После сборки смой флюс/канифоль с платы. Сделать это можно спиртом или бензином. Если ты использовал какой-то особенный флюс, прочитай на упаковке: возможно, он смывается обычной водой. Проделать эту операцию лучше после того, как зальешь прошивку, проверишь и отпаяешь программатор. Флюс надо смыть обязательно, а то некоторые виды флюсов со временем становятся токопроводящими, и устройство перестает работать.

Сейчас займемся установкой счетчика внутрь корпуса «Дрозда». Первым делом выпаяй большой транзистор IRF из родной схемы. Мы заменим его IRL3502 - аналогичным, но срабатывающим от логического уровня на затворе. По цоколевке они абсолютно идентичны, поэтому вопросов тут быть не может. Возьми резистор 2,2 кОм и припаяй между затвором (если смотреть спереди, затвор - это первая ножка!) и землей. Это позволит избежать непроизвольных выстрелов или по крайней мере странных шептунов во время инициализации контроллера. В бета-версии этой схемы затвор к земле я не подтягивал и катастрофы не произошло, но мы же делаем надежный девайс, не правда ли? Для военного, так сказать, применения! Затем присоедини питание и линии IN – «сигнал», OUT – «на затвор».

Писанина и шитье

Итак, самое тяжелое позади! Прикинем алгоритм работы программы.

старт, инициализация портов

проверка, входим ли в режим установки

если да, то работаем в цикле

юзер выбирает значение емкости

рисуем цифры

закончили? выходим из цикла

бесконечный цикл основной работы

есть входящий импульс && патроны еще есть?

да - пропустить и декрементировать патроны

нет - блокировать импульс

нарисовать цифры

Программирование под контроллер, парень, - это не какое-то там формошлепство на бейсике! Тут все серьезно, хотя тоже не очень сложно :). Я расскажу об этом в двух словах. Написание программы на Си не сильно отличается от программирования на «большом» компьютере, но тут появляются такие факторы, как существенная ограниченность памяти ОЗУ и памяти программ. Значит надо делать все вдумчиво, экономно и красиво! Плюс к этому, необходимо в реальном времени реагировать на происходящее, чтобы не получилось так, что какой-нибудь медицинский прибор типа кардиостимулятора, считая жесткий тангенс/секис, не успеет подать импульс на сердце пациента и капут. Путем чтения/записи чисел в определенные регистры программа может переконфигурировать кристалл, общаться с внешним миром через порты ввода-вывода, прерываться и прочее.

Моя программа получилась немаленькой, поэтому приводить ее здесь целиком я не буду. Исходник с makefile’ом и прошивкой ищи на диске. А тут мы рассмотрим только самое интересное.

Как реализовать поразрядный вывод на наш индикатор, если мы имеем, скажем, байт с целым числом патронов? Люди, воспитанные на бейсике, вероятно, предложат поделить на 10 и взять остаток от деления. Но это ложный путь. Сколько тактов выполняется такая операция на RISC-контроллере avr, в котором нету инструкций mod и div? Если реализовать деление байта на байт на ассемблере вручную, то, в зависимости от оптимизации по скорости или по размеру кода, мы получим от 58 до 97 тактов. Учитывая, что наш tiny26 работает на 1 МГц, такая операция оказывается довольно дорогой: за время ее выполнения может произойти много интересного во внешнем мире. Поэтому родился гораздо более экономичный способ с вычитанием:

void display(uint8_t number)

{

uint8_t decs=0;

// считаем десятки

while(number>=10)

{

number-=10;

decs++;

}

// отключаем аноды индикатора

cbi(PORTB,PORTB0);

cbi(PORTB,PORTB1);

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

if(r==0)

{

r=1; // в следующем цикле рисуем единицы

PORTA=0xff; // программа без магических чисел неинтересна

cbi(PORTB,PORTB0); // выключаем анод правого разряда

sbi(PORTB,PORTB1); // включаем анод левого разряда

PORTA=dig[decs]; // выводим цифру

}

else if(r==1)

{

r=0; // в следующем цикле рисуем десятки

PORTA=0xff; // программа без магических чисел неинтересна

cbi(PORTB,PORTB1); // включаем анод правого разряда

sbi(PORTB,PORTB0); // выключаем анод левого разряда

PORTA=dig[number]; // выводим цифру

}

}

Чтобы залить прошивку, я подпаял пять проводков от LPT напрямую к ножкам микросхемы: [MOSI-1] к [LPT-7], [MISO-2] к [LPT-10], [SCK-3] к [LPT-6], [RST-10] к [LPT-9], [GND-6] к [LPT-25]. И сделал две перемычки: [LPT-2] к [LPT-12] и [LPT-3] к [LPT-11], чтобы шнурок опознался как программатор. В PonyProg’е необходимо указать, что мы используем AVR ISP I/O на LPTx и шьем tiny26. Заливай .hex в кристалл. После проверки работоспособности изделия отпаивай провода, чтоб не мешались.

Этот программатор называется STK-200. В интернете приведена очень мудреная схема его использования. Но ее вполне можно упростить до прямого соединения проводников. Этим программатором можно прошивать напрямую из Си-компилятора. Но если неохота переучиваться и паять новый программатор, используй программу, которой зашивал Di_Halt в предыдущей статье. Только распайка его будет другая (посмотри соответствие программируемых контактов микросхемы ATmega8535 и Attiny26).

В бой

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

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

Используемые детали

  • ATtiny26 soic20 х 1 шт.
  • DA04-11HWA х 1 шт.
  • 78M05 dpak х 1 шт.
  • BC817 sot-23 х 2 шт.
  • IRL3502 x 1 шт.
  • танталовый конденсатор 16 мкф х 16 В, тип - В х 1 шт.
  • керамический конденсатор, 100 нф, типоразмер 0805 х 2 шт.
  • 100 Ом, типоразмер 0805 х 7 шт.
  • 2,2 кОм, типоразмер 0805 х 5 шт.
  • 1,6 кОм, типоразмер 0805 х 1 шт.
  • маленькая кнопка на замыкание
  • шлейф с шагом 1,27 мм
  • пара метров монтажного провода МФГ

Изготовление pcb с помощью фоторезиста

Эта технология позволяет получать более качественные и сложные платы, нежели ЛУТ. Фоторезистом называют светочувствительный лак, который меняет свои свойства при облучении ультрафиолетом. У нас в продаже чаще всего встречается Positive 20. На очищенный текстолит в центрифуге напыляют равномерный слой лака (следует избегать попадания света и бытовой пыли). Сушат 15 минут при 70 градусах. Затем через пленку-фотошаблон, на которой черным цветом напечатан рисунок проводников, засвечивают заготовку ультрафиолетом (340-420 нм – 1-10 сек). После этого плату примерно на минуту помещают в слабый раствор NaOh. С тех мест, на которые попал УФ, лак смоется и позволит стравить медь. Промыв, плату травят в FeCl3. Перед лужением лак на дорожках растворяют ацетоном.

На диске ты найдешь исходник программы, прошивку в виде hex-файла, софт для программатора PonyProg, документацию на контроллер и изображение печатной платы, по которому ты сумеешь повторить ее методом ЛУТ или фоторезиста.

Содержание
ttfb: 7.6830387115479 ms