Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 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, документацию на контроллер и изображение печатной платы, по которому ты сумеешь повторить ее методом ЛУТ или фоторезиста.

Содержание
загрузка...
Журнал Хакер #151Журнал Хакер #150Журнал Хакер #149Журнал Хакер #148Журнал Хакер #147Журнал Хакер #146Журнал Хакер #145Журнал Хакер #144Журнал Хакер #143Журнал Хакер #142Журнал Хакер #141Журнал Хакер #140Журнал Хакер #139Журнал Хакер #138Журнал Хакер #137Журнал Хакер #136Журнал Хакер #135Журнал Хакер #134Журнал Хакер #133Журнал Хакер #132Журнал Хакер #131Журнал Хакер #130Журнал Хакер #129Журнал Хакер #128Журнал Хакер #127Журнал Хакер #126Журнал Хакер #125Журнал Хакер #124Журнал Хакер #123Журнал Хакер #122Журнал Хакер #121Журнал Хакер #120Журнал Хакер #119Журнал Хакер #118Журнал Хакер #117Журнал Хакер #116Журнал Хакер #115Журнал Хакер #114Журнал Хакер #113Журнал Хакер #112Журнал Хакер #111Журнал Хакер #110Журнал Хакер #109Журнал Хакер #108Журнал Хакер #107Журнал Хакер #106Журнал Хакер #105Журнал Хакер #104Журнал Хакер #103Журнал Хакер #102Журнал Хакер #101Журнал Хакер #100Журнал Хакер #099Журнал Хакер #098Журнал Хакер #097Журнал Хакер #096Журнал Хакер #095Журнал Хакер #094Журнал Хакер #093Журнал Хакер #092Журнал Хакер #091Журнал Хакер #090Журнал Хакер #089Журнал Хакер #088Журнал Хакер #087Журнал Хакер #086Журнал Хакер #085Журнал Хакер #084Журнал Хакер #083Журнал Хакер #082Журнал Хакер #081Журнал Хакер #080Журнал Хакер #079Журнал Хакер #078Журнал Хакер #077Журнал Хакер #076Журнал Хакер #075Журнал Хакер #074Журнал Хакер #073Журнал Хакер #072Журнал Хакер #071Журнал Хакер #070Журнал Хакер #069Журнал Хакер #068Журнал Хакер #067Журнал Хакер #066Журнал Хакер #065Журнал Хакер #064Журнал Хакер #063Журнал Хакер #062Журнал Хакер #061Журнал Хакер #060Журнал Хакер #059Журнал Хакер #058Журнал Хакер #057Журнал Хакер #056Журнал Хакер #055Журнал Хакер #054Журнал Хакер #053Журнал Хакер #052Журнал Хакер #051Журнал Хакер #050Журнал Хакер #049Журнал Хакер #048Журнал Хакер #047Журнал Хакер #046Журнал Хакер #045Журнал Хакер #044Журнал Хакер #043Журнал Хакер #042Журнал Хакер #041Журнал Хакер #040Журнал Хакер #039Журнал Хакер #038Журнал Хакер #037Журнал Хакер #036Журнал Хакер #035Журнал Хакер #034Журнал Хакер #033Журнал Хакер #032Журнал Хакер #031Журнал Хакер #030Журнал Хакер #029Журнал Хакер #028Журнал Хакер #027Журнал Хакер #026Журнал Хакер #025Журнал Хакер #024Журнал Хакер #023Журнал Хакер #022Журнал Хакер #021Журнал Хакер #020Журнал Хакер #019Журнал Хакер #018Журнал Хакер #017Журнал Хакер #016Журнал Хакер #015Журнал Хакер #014Журнал Хакер #013Журнал Хакер #012Журнал Хакер #011Журнал Хакер #010Журнал Хакер #009Журнал Хакер #008Журнал Хакер #007Журнал Хакер #006Журнал Хакер #005Журнал Хакер #004Журнал Хакер #003Журнал Хакер #002Журнал Хакер #001