Хабрахабр

[Из песочницы] TinyFL — драйвер фонарика на микроконтроллере

Привет, Habr!

Хочу рассказать историю о том, как мне в руки попал китайский налобный фонарик на светодиоде Cree XM-L и что дальше с ним стало.

Предыстория

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

Для того, чтобы просто включить и выключить фонарь, требовалось каждый раз перебирать эти 3 режима. Светил он достаточно ярко, но у драйвера было только 3 режима — очень яркий, яркий и стробоскоп, переключение между которыми производилось нажатием кнопки. Вдобавок, этот фонарик, будучи включенным, разряжал батарею до последнего – так пара моих банок 18650 ушли в глубокий разряд.

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

Фонарик со старым драйвером

Вот такой фонарик, наверняка многие имели дело с подобными

Так выглядит оригинальный драйвер

Техническое задание

Итак, драйвер должен: Как известно, для достижения хорошего результата любая разработка должна иметь хорошее ТЗ, поэтому постараюсь сформулировать его для себя.

  • Уметь включаться/отключаться по короткому нажатию кнопки (кнопка без фиксации). Пожалуй, это основная причина, по которой все это затеялось.
  • Иметь плавную (бесступенчатую) регулировку яркости, от самого яркого — "турбо", до "мунлайта", когда диод еле светится. Яркость должна изменяться равномерно.
  • Запоминать установленную яркость на время выключения.
  • Контролировать заряд батареи, предупреждая когда она почти разряжена (примерно 3.3В) и отключаясь, когда разряжена полностью (примерно 2.9В). Для разных АКБ эти параметры могут быть иными. Соответственно, рабочее напряжение должно быть в диапазоне 2.7~4.5В.
  • Иметь 2 специальных режима — аварийный маячок и стробоскоп (ну а почему бы и нет?)
  • Уметь включать/выключать задний светодиод (это актуально при езде на велосипеде ночью, получается что-то вроде габаритного огня).
  • Иметь защиту от переполюсовки и статического электричества. Не обязательно, но будет приятным дополнением, поскольку в темноте можно по ошибке поставить АКБ неправильной стороной.
  • Быть меньше изначального драйвера по размерам, но при этом иметь те же посадочные места. Китайский драйвер просто огромен, сделать крупнее будет непросто.

У меня под рукой всегда есть такой кабель и USB зарядка, а родной блок питания приходится искать. Ну и если фонарик подвергается моддингу, почему бы не встроить в него зарядное устройство с micro-USB разъемом?

Железо

Они широко доступны, легко программируются и имеют режимы пониженного энергопотребления (сна). У меня есть кое-какой опыт работы с Arduino, поэтому было решено делать драйвер на МК семейства AVR.

Доступно всего 1 КБ флеш-памяти (но много ли надо для фонарика), а так же 64 Б RAM и столько же EEPROM.
Attiny13 выпускается в нескольких вариантах корпуса, в частности в DIP-8, который можно воткнуть прямо в обычную макетную плату с шагом 2. В качестве "мозга" драйвера был выбран микроконтроллер Attiny13a — это один из самых дешевых МК фирмы Atmel (ныне поглощенной компанией Microchip), он имеет на борту все необходимое — GPIO для подключения кнопки и светодиода, таймер для генерации ШИМ-сигнала, АЦП для измерения напряжения и EEPROM для сохранения параметров. 54мм.

В качестве такого транзистора я взял AO3401, но можно взять SI2323, он дороже, но имеет меньшее сопротивление открытого канала (40 мОм, тогда как у AO3401 60 мОм, при 4. Поскольку от задней части к голове фонаря идет всего 3 провода, кнопка вынуждена замыкаться на землю (о невозможности замыкать на плюс — позже), придется коммутировать светодиод по плюсу — а значит, нужен P-канальный полевик. 5 В), следовательно драйвер будет меньше греться.

Что ж, от слов к делу, собираю на макетке предварительную версию

Вместо светодиода XM-L пока воткнул обычный светодиод на ножках и поставил слабый транзистор с высоким пороговым напряжением.
Затем в программе Altium Designer была начерчена схема, которую я дополнил защитой от переполюсовки и ESD. Питается оно пока что напрямую от программатора, напряжением 5 В (на самом деле меньше из-за потерь в кабеле USB).

Подробное описание и предназначение всех компонентов

Обязательные компоненты:

U1 – микроконтроллер Attiny13a в корпусе 8S1 (индекс SSU)

1 мкф, корпус 1206 или 0805, температурный коэффициент X7R С1 — развязывающий конденсатор по питанию микроконтроллера, должен быть в районе 0.

41) и ток утечки, который будет больше, если увеличить номиналы (при текущих он порядка 4 мкА). R1-R2 — резисторный делитель для измерения напряжения батареи, номиналы можно ставить любые, тут главное соотношение (750К/220K, коэффициент деления 4. 1 В, согласно даташиту он может быть в пределах 1. Поскольку используется внутренний ИОН (1. 2 В), максимальное напряжение на выходе делителя не должно быть более 1 В. 0 В — 1. 41 В, что более чем достаточно для всех типов литиевых аккумуляторов.
Делитель я рассчитывал при помощи вот этого калькулятора . При делителе 750/220 максимально допустимое напряжение на входе делителя будет 4.

R3 — защита вывода порта микроконтроллера от замыкания (если вдруг PB1 окажется притянуто к VCC, через пин потечет большой ток и МК может сгореть)

R4 — подтяжка RESET МК к питанию, без него возможны перезагрузки от наводок.

Q1 — P-канальный полевой транзистор в корпусе SOT-23, я поставил AO3401, но можно и любой другой с подходящей распиновкой (например SI2323)

Поскольку затвор транзистора имеет некоторую емкость, при зарядке этой емкости через пин может проходить большой ток и пин может выйти из строя. R7 — токоограничительный резистор затвора. Можно ставить в районе 100-220 Ом (больше не следует, транзистор начнет долго находиться в полузакрытом состоянии, и, как следствие, будет сильнее греться).

На случай, если PB0 перейдет в высокоимпедансное состояние, через этот резистор на затворе Q1 установится логическая 1 и транзистор будет закрыт. R6 — резистор подтяжки затвора к питанию. Такое может произойти из-за ошибки в коде или в режиме программирования.

D2 — "запирающий" диод — позволяет при "проседании" напряжения (когда светодиод включается на короткий период на полную яркость) питаться МК от конденсатора какое-то время, так же защищает от переполюсовки.
Можно ставить любой диод шоттки в корпусе SOD323 с минимальным падением напряжения, я поставил BAT60.

После распайки вылезла неприятная особенность — при включении нагрузки возникала просадка напряжения и МК перезагружался, поскольку полевик не ограничивает ток в обратном направлении. Изначально, защита от неправильной полярности питания была сделана на полевом транзисторе (это можно увидеть на платах, изготовленных лутом). Пришлось отпаивать транзистор и на его место ставить диод, благо SOT-23 и SOD-323 имеют похожие размеры. Сначала я припаял между VCC и GND электролитический конденсатор на 200 мкФ, но мне не понравилось такое решение из-за его размеров.

Итого, в схеме всего 10 компонентов, обязательных для установки.

Необязательные компоненты:

Минимальный номинал R5 — 100 Ом. R5 и D1 отвечают за заднюю подсветку (LED2). D1 — любой светодиод в корпусе 1206, я поставил зеленый, т.к. Чем больше номинал, тем слабее светится задний светодиод (он включается в постоянном режиме, без ШИМ). визуально они ярче при тех же токах, чем прочие.

0В) в корпусе SOD323. D3 и D4 — защитные диоды (TVS), я использовал PESD5V0 (5. Если кнопка закрыта мембраной, то в нем нету особого смысла. D3 защищает от перенапряжения по питанию, D4 — по кнопке. ВАХ двунаправленного защитного диода). Защитные диоды наверное имеет смысл использовать двунаправленные, иначе при переполюсовке через них пойдет ток и они выгорят (см.

C2 — танталовый конденсатор в корпусе А (похож на 1206), имеет смысл ставить при нестабильной работе драйвера (напряжение питания мк может просаживаться при больших токах коммутации светодиода)

Все резисторы типоразмера 0603 (для меня это адекватный предел для пайки вручную)

5мм (соотношение сторон 2:1) с двумя отверстиями диаметром 2мм для крепления к корпусу фонаря родными винтами. С компонентами все ясно, можно делать печатную плату по вышеприведенной схеме.
Первым делом для этого нужно построить 3D модель будущей платы, вместе с отверстиями — имхо, в Altium Designer это самый удобный способ определить геометрию ПП.
Измерил размеры старого драйвера и его посадочных отверстий — плата должна крепиться к ним же, но иметь меньшие габариты (для универсальности, вдруг куда-то еще придется встроить).
Разумный минимум здесь получился где-то 25х12.

Для удобства подключения ЗУ я вывел под него отдельные контакты, которые дублируют контакты батареи.
Всю разводку (за исключением одной перемычки) я сделал на верхнем слое — для того, чтобы была возможность изготовить плату в домашних условиях ЛУТом.
Минимальная ширина сигнальных дорожек — 0. 3D-модель я сделал в SolidWorks, затем экспортировал в Altium Designer как STEP.
Затем я разместил компоненты по плате, контакты сделал по углам (так паять удобнее и проще разводить землю), Attiny13 поставил по центру, транзистор поближе к контактам LED.
Развел силовые дорожки, разместил остальные компоненты как получится и развел сигнальные дорожки. 254 мм / 10 mil, силовые имеют максимальную ширину там, где это возможно.

Так выглядит разведенная плата в Altium Designer:

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

На момент написания статьи было сделано 3 версии платы — первая под ЛУТ, вторая для промышленного изготовления и 3-я, финальная с некоторыми исправлениями.

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

Самодельный способ

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

Экспортирую в PDF слой top_layer, получаю векторное изображение. Для начала нужно подготовить шаблон, который будет распечатан на термобумаге.

5-1мм (зависит от способа разделения, об этом позже), платы должны быть расположены симметрично — иначе будет сложно их разделить. Поскольку плата маленькая, есть смысл брать кусок текстолита с габаритами в несколько раз больше и делать то, что в промышленности называют панелизацией.
Для этих целей весьма удобен CorelDraw, но можно пользоваться и любым другим векторным редактором.
Размещаю копии шаблонов на документе, между платами делаю промежутки в 0.

Печатаю на термобумаге шаблон для травления (тут важно не забыть отзеркалить шаблон).
При помощи утюга и терпения, аккуратно поглаживая по бумаге, перевожу на текстолит. Подбираю кусок одностороннего текстолита размерами чуть больше, чем скомпонованная панель, зачищаю и обезжириваю (предпочитаю тереть ластиком и потом спиртом). Жду пока остынет и осторожно отдираю бумагу.
Свободные участки меди (не покрытые тонером) можно покрыть лаком или заклеить скотчем (чем меньше площадь меди, тем быстрее идет реакция травления).

Большое количество плат позволяет компенсировать брак производства — например, на фото видно место, где тонер отслоился. Такая вот домашняя панелизация.

Я травлю платы лимонной кислотой в растворе перекиси водорода, это самый доступный способ, хотя и довольно медленный.
Пропорции такие: на 100мл перекиси 3% идет 30г лимонной кислоты и примерно 5г соли, это все перемешивается и выливается в емкость с текстолитом.
Подогревание раствора ускорит реакцию, но может привести к отслаиванию тонера.

Начинается неведомая химическая магия: медь покрывается пузырями, а раствор приобретает синий оттенок

У меня его не получается смывать какими-либо растворителями, поэтому я удаляю его механически — мелкозернистой наждачной бумагой. Через какое-то время достаю протравленую плату, очищаю от тонера.

Лудить я предпочитаю сплавом Розе — этот сплав плавится при температуре около 95 градусов, что позволяет лудить им в кипящей воде (да, возможно не самый надежный состав для лужения, но для самодельных плат годится). Теперь остается залудить плату — это поможет при пайке и защитит медь от окисления и облегчит пайку.

0, для перемычек — ф0. После лужения я сверлю плату (для контактов использую твердосплавные сверла ф1. Пилить текстолит я не люблю из-за пыли, поэтому после сверления разрезаю платы канцелярским ножом — с двух сторон делаю несколько надрезов по одной линии, затем разламываю по надрезу. 7), сверлю дремелем за неимением другого инструмента. Это напоминает метод V-cut, используемый в промышленности, только там надрез делается фрезой.

Так выглядит плата, готовая к пайке

Сначала я запаиваю мелочь (резисторы 0603), затем все остальное. Когда плата готова, можно приступать к распайке компонентов. После пайки я проверяю, нет ли КЗ по питанию драйвера, после чего уже можно приступать к прошивке МК. Резисторы примыкают вплотную к МК, поэтому в обратной последовательности запаять может быть проблематично.

Драйверы, готовые к загрузке прошивки

Промышленный способ

Проблематично сделать двухсторонную плату, дорожки могут быть перетравлены, а о металлизации отверстий остается только мечтать. ЛУТ — это быстро и доступно, но технология имеет свои недостатки (как и почти все "домашние" методы изготовления ПП).

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

Нижний слой платы в Altium Designer

На сайте есть удобный калькулятор расчета стоимости плат в зависимости от их параметров, размеров и количества. Для этого проекта я решил заказать печатную плату на сайте PcbWay. После расчета стоимости я загрузил gerber-файл, созданный ранее в Altium Designer, китайцы его проверили и плата отправилась на производство.

При регистрации нового пользователя дается скидка $5 на первый заказ, поэтому я оплачивал только доставку, которая тоже стоит где-то в районе $5.
На этом сайте есть возможность выложить проект в общий доступ, поэтому если кто-то захочет заказать эти платы, можно просто добавить в корзину этот проект. Изготовление комплект из 10 плат TinyFL обошлось мне в $5.

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

Программа (прошивка)

Основная трудность, которая возникла при написании прошивки драйвера, связана она с крайне малым размером flash-памяти — у Attiny13 ее всего-навсего 1024 байта.
Так же, поскольку изменение яркости плавное, нетривиальной задачей оказалось равномерное ее изменение — для этого пришлось делать гамма-коррекцию.

Алгоритм управления драйвером

Драйвер включается по короткому нажатию на кнопку, выключается по нему же.
Выбранный режим яркости сохраняется на время выключения.

Повторное длинное нажатие изменяет направление (сильнее/слабее). Если во время работы сделать двойное короткое нажатие кнопки (двойной клик), будет включен/выключен дополнительный светодиод.
При длинном нажатии во время работы начнет плавно изменяться яркость фонаря.

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

Более подробное описание алгоритма работы драйвера

  1. При подаче питания на МК производится настройка периферии и МК погружается в сон (если STARTSLEEP определено). При подаче питания на драйвер оба светодиода мигают некоторое количество раз, если STARTBLINKS определено.
  2. Сон. Attiny13 засыпает в режиме power-down (это самый экономичный режим, по даташиту потребление МК составит ~ 1 мкА), выйти из которого оно может только по какому-либо прерыванию. В данном случае это прерывание INT0 — нажатие кнопки (установка PC1 в логическое 0).
    На PC1 при этом должна быть включена внутренняя слабая подтяжка к питанию. АЦП и компаратор являются основным потребителями тока из всей периферии, поэтому их тоже нужно отключить. На время сна содержимое регистров и оперативной памяти сохраняется, поэтому EEPROM не нужен для запоминания яркости.
  3. После сна периферия и ШИМ включается и драйвер входит в бесконечный цикл, в котором отслеживается нажатие кнопки и периодически проверяется напряжение батареи.
  4. Если кнопка нажата — засекается время нажатия.
    4.1. Если нажатие короткое — ожидается двойной клик (если BTN_DBCLICK определено).
    Если он был, переключается дополнительный светодиод LED2
    Если нет, то переход к п.2 (сон)
    4.2. Если нажатие долгое (дольше, чем BTN_ONOFF_DELAY) — включается режим управления яркостью. В этом режиме:
    • Инвертируется направление изменения (больше/меньше) и изменяется % заполнения ШИМ, пока нажата кнопка.
    • Если достигнуто максимальное/минимальное значение (RATE_MAX / RATE_MIN), светодиод начинает мигать;
    • Если прошло n-миганий (AUXMODES_DELAY) и кнопка все еще нажата, включается дополнительный режим. Таких режимов два — стробоскоп ( включается на 25 мс, частота 8 Гц) и аварийный маячок (включается на полную яркость на 50мс, частота 1 Гц). В этих режимах не происходит проверки заряда батареи, а для выхода нужно какое-то время держать нажатой кнопку.
  5. Если пришло время проверять напряжение батареи — считываются показания с ADC2, результат сравнивается с предустановленными значениями.
    • Если значение АЦП больше значения BAT_WARNING – все нормально
    • Если меньше BAT_WARNING – пользователь предупреждается о разряде, драйвер мигает основным светодиодом. Кол-во вспышек будет пропорционально степени разряда. Например, с дефолтными значениями при полном разряде фонарь мигнет 5 раз.
    • Если меньше BAT_SHUTDOWN — МК переходит в п.2 (сон).

Управление яркостью светодиода

Из-за особенностей человеческого глаза кажется, что светодиод светит менее ярко, чем если бы он был включен постоянно. Как известно, самый простой способ управлять яркостью — изменять скважность ШИМ, при этом светодиод на какое-то время включается на полную яркость, затем выключается. Время открытия транзистора по отношению ко времени его закрытого состояния будет коррелировать с заполнением ШИМ.
За скважность шим отвечает переменная rate, 255 rate = 100% ШИМ.
При частоте тактирования 1. Поскольку светодиод подключен через P-канальный полевой транзистор, для его открытия необходимо притянуть затвор к земле, а для закрытия — наоборот, к питанию. 7 КГц. 2 МГц и предделителе таймера в 1, частота ШИМ будет равна 1200000/256 = 4. Если мешает, можно увеличить рабочую частоту до 9. Поскольку это частота звуковая (воспринимаемая человеческим ухом), на некоторой скважности ШИМ драйвер может начать пищать (точнее, пищит не драйвер, а провода, либо элементы питания). 8 МГц (CKSEL[1:0]=01, CKDIV8=1), тогда частота ШИМ будет в 8 или в 4 раза больше, но энергопотребление МК так же вырастет пропорционально. 6 (CKSEL[1:0]=10, CKDIV8=1) или 4.

Тут я соглашусь и скажу, что у меня в фонаре светодиод не подключается напрямую к драйверу, а до него идут достаточно длинные и тонкие провода, сопротивление которых, а так же внутреннее сопротивление батареи и сопротивление драйвера ограничивают максимальный ток в районе 1. Кто-то считает, что диод нужно питать путем стабилизации тока через него, а в таком режиме он быстро выйдет из строя. 5 А, что в 2 раза меньше максимального тока для данного светодиода (максимальный ток для Cree XM-L согласно документации — 3 А).

В случае, когда ток превышает максимальный ток вашего диода, рекомендую уменьшить параметр RATE_MAX до получения приемлемых значений. Если вы будете собирать драйвер, советую замерять потребление тока в режиме максимальной яркости (rate = 255). Хотя, по спецификации транзистора SI2323DS его максимальный ток превышает 4А, лучше не превышать порог в 2А, иначе драйверу потребуется охлаждение.

Гамма-коррекция

В случае с этим драйвером, разница между 5-10% ШИМ будет восприниматься как многократное увеличение яркости, тогда как разница между 75-100% будет практически не будет заметна глазу. Человеческий глаз воспринимает яркость объектов нелинейно. Если увеличивать яркость светодиода равномерно, со скоростью n процентов в секунду, будет казаться, что в начале яркость очень быстро растет от нуля до среднего значения, затем очень медленно увеличивается от середины до максимума.

Его суть в том, что шаг изменения яркости увеличивается от 1 при минимальных значениях ШИМ до 12 при максимальных значениях. Это весьма неудобно, и для компенсации этого эффекта пришлось сделать упрощенный алгоритм гамма-коррекции. Таким образом, кажется, что яркость изменяется равномерно на всем диапазоне. В графическом представлении это выглядит как кривая, точки которой сохранены в массиве rate_step_array.

Контроль напряжения батареи

Положительный контакт батареи, который подключается к VIN и попадает на резисторный делитель R1-R2, к средней точке которого подключен пин PB4 (он же ADC2 у мультиплексора АЦП). Каждые n-секунд (за интервал в миллисекундах отвечает параметр BAT_PERIOD) происходит замер напряжения батареи.

1 В. Поскольку напряжение питания изменяется вместе с измеряемым напряжением, не получится измерить его, использовав в качестве опорного напряжения Vref, поэтому в качестве ИОН я применил внутренний источник на 1. 1 В будет соответствовать значение АЦП в 1023 или 255, если использовать 8-битное разрешение). Как раз для этого и нужен делитель — МК не может измерить напряжение, большее чем напряжение опорного источника (так, напряжению 1. 1 В, а целых 4. Проходя через делитель, напряжение в средней его точке будет в 6 раз меньше входного, значению 255 будет соответствовать уже не 1. 03), что с запасом покрывает диапазон измерений. 33 В (делитель на 4.

При достижении значения BAT_WARNING светодиод начинает мигать некоторое количество раз (чем сильнее разряжено, тем больше мигает — за это отвечает BAT_INFO_STEP, подробнее в коде), а при достижении BAT_SHUTDOWN драйвер отключается.
Значение АЦП переводить в милливольты я не вижу смысла, т.к. В итоге получается некоторое значение, которое дальше сравнивается с предустановленными значениями минимальных напряжений. это тратит лишную память, которой в тиньке и так мало.

Так, делитель на 4. Кстати, делитель является основным потребителем питания, когда МК находится в режиме сна. Это почти не заметно для глаз, но помогает стабилизировать напряжение, иначе измерения будут некорректные (а делать какие-либо поправки на скважности шим и прочее — слишком сложно). 03 с R1 = 1M и R2 = 330К, будет иметь общее R = 1330K и ток утечки при 4 В = 3 мкА.
На время измерения напряжения нагрузка (светодиод) отключается примерно на 1 мс.

Внесение изменений в прошивку

Это нетрудно сделать, особенно если был опыт работы с Arduino или просто с C/C++.
Даже если такого опыта не было, можно настроить почти все рабочие параметры путем редактирования определений (defines) заголовочного файла flashlight.h.
Для редактирования исходного кода нужно будет поставить Atmel Studio – оно не сложнее, чем Arduino IDE, но гораздо удобнее.

Таковых всего два — flashlight.h содержит определения (настройки), flashlight.cpp содержит собственно код.
Расписывать более подробно содержимое исходников не вижу смысла — в коде полно комментариев.
После внесения изменений надо нажать F7, исходники скомпилируются (или нет, тогда компилятор укажет, где ошибка). После установки надо открыть проект (flashlight.atsln) и выбрать нужный файл. В папке debug появляется flashlight.hex, который можно загрузить в микроконтроллер по инструкции ниже.

Загрузка прошивки в микроконтроллер

Программа представляет из себя подобие GUI для программы avrdude, есть удобный встроенный калькулятор фьюзов — достаточно поставить галочки возле нужных битов. Для загрузки прошивки и настройки фьюзов я использую программатор USBASP в сочетании с программой AVRDUDEPROG. Только после того, как значения фьюзов считаны из МК, можно их изменять. В списке контроллеров нужно выбрать подходящий (в данном случае Attiny13(a), зайти на вкладку Fuses и нажать кнопку read. Подходящие значения фьюзов записаны в файле flashlight.h После изменения нужно нажать programm, новые фьюзы будут записаны в МК.

Статус прошивки будет отображаться в окне снизу. Для заливки прошивки надо перейти на вкладку Program, в строке Flash выбрать скомпилированный файл прошивки в формате HEX (flashlight.hex) и нажать Program. Кстати, именно для этого был сделан параметр STARTBLINKS — однократное мигание LED2 в момент подачи питания на драйвер служит индикацией контакта драйвера с программатором.
Вместо USBASP для загрузки прошивки можно использовать Arduino, подробнее тут и тут Если загрузка неудачна, возможно дело в плохом контакте, так бывает — стоит попробовать еще раз.

Программатор USBASP, подключенный к драйверу через клипсу со шлейфом

Не очень удобное приспособление, приходится помучаться минут 10, прежде чем поймаешь контакт (возможно, мне просто попалась бракованная клипса). Для подключения USBASP к тиньке я использую клипсу под 8-контактный SOIC. Бывают так же адаптеры SOIC-DIP, куда вставляется микросхема до пайки и в нее заливается прошивка — этот вариант удобнее, но теряется возможность программировать драйвер внутрисхемно (то есть обновлять прошивку после пайки МК на плату).
Если всего этого нет, то можно просто припаять проводки к выводам МК, которые затем прикрепить к Arduino.

Калибровка

Для светодиода XM-L это 3 А, для драйвера оно зависит от используемого транзистора, например для SI2323 максимальный ток около 4 А, но лучше гонять на меньших токах из-за чрезмерного нагрева.
Если ток на максимальной яркости превышает эти значения, можно уменьшить параметр RATE_MAX (#define RATE_MAX xx).
Калибровка АЦП не является обязательной процедурой, но если хочется, чтобы драйвер точно отслеживал пороговое напряжение, то придется с этим повозиться. Токи, проходящие через драйвер и светодиод, не должны превышать максимальных значений.

во-первых, номиналы резисторов могут варьироваться в пределах допуска (обычно 1-5%), а во-вторых, внутренний ИОН может иметь разброс от 1. Расчеты не дадут высокой точности измерений, т. к. 2 В.
Поэтому, единственный приемлемый способ — выставить значение в единицах АЦП (BAT_WARNING и BAT_SHUTDOWN), экспериментально подбирая его под нужное. 0 до 1. Когда драйвер начинал предупреждать о разряде, я оставлял текущее значение BAT_WARNING как нужное.
Это не самый удобный способ, возможно в будущем надо сделать процедуру автоматической калибровки с сохранением значений в EEPROM. Для этого понадобится терпение, программатор и регулируемый источник питания.
Я выставлял в прошивке значение BAT_PERIOD в 1000 (проверка напряжения раз в секунду) и постепенно снижал напряжение питания.

Сборка фонарика

Я выпаял старый драйвер и припаял на его место новый. Когда плата была готова и прошивка была залита, можно было наконец ставить ее на место старого драйвера.

Новый драйвер подключается вместо старого по этой схеме

Затем смонтировал плату зарядки (TP4056), для этого пришлось немного дремелем рассверлить отверстие разъема зарядки, и зафиксировал ее термоклеем (тут важно было, чтобы клей не затек в разъем, достать его оттуда будет сложно). Проверив, нет ли короткого замыкания по питанию, подключил питание и проверил работоспособность.

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

Тестирование и расчет стоимости изготовления

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

04 В): Энергопотребление старого драйвера (измерялось при 4.

  1. Во время сна — не измерялось
  2. Максимальный режим: 0.60 А
  3. Средний режим: 0.30 А
  4. Стробоскоп: 0.28 А

0 В): Энергопотребление нового драйвера (измерялось при 4.

  1. В режиме сна потребляет в районе 4 мкА, это намного меньше тока саморазряда литий-ионной батареи. Основной ток в этом режиме протекает через резисторный делитель.
  2. На минимальном режиме, "мунлайт" — около 5-7 мА, если считать, что емкость одной ячейки 18650 около 2500 мА*ч, то получается около 20 дней непрерывной работы. Сам МК потребляет где-то 1.2-1.5 мА (при рабочей частоте 1.2 МГц).
  3. На максимальном режиме, "турбо" — потребляет около 1.5 А, в таком режиме проработает около полутора часов. Светодиод на таких токах начинает сильно нагреваться, поэтому данный режим не предназначен для длительной работы.
  4. Аварийный маячок — потребляет в среднем около 80 мА, в таком режиме фонарь проработает до 30 часов.
  5. Стробоскоп — потребляет около 0.35 А, проработает до 6 часов.

Цена вопроса

С китая заказывать имеет смысл, если делается несколько штук — тогда в пересчете на штуку выйдет дешевле, китайцы продают как правило партиями от 10 штук.
Платы выйдут по цене в районе 300р за 10 штук (без доставки), если заказывать их в Китае.
Распайка и прошивка одного драйвера у меня занимает где-то час. Если покупать компоненты в Чип и Дипе, выйдет около 100р (60р Attiny13, ~40р остальная рассыпуха).

Заключение

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

Драйвер крупным планом (версия 2_t)

Исходники прошивки, схема, и разводка платы теперь лежит на гитхабе, скачать можно тут: https://github.com/madcatdev/tinyfl_t

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть