USBISP - заливаем собственную прошивку в фонарик

Лайв им. SinuX / / комментарии

Наверняка у многих имеются фонари фирмы Convoy, они давно зарекомендовали себя как недорогие и качественные источники света. Но мало кто знает, что с помощью программатора за $3 и клипсы за $3 можно залить в некоторые фонари кастомную прошивку, которая будет иметь больше функций или будет удобнее в использовании. Сразу оговорюсь, что в статье речь пойдет о прошивке фонарей с драйверами на базе микроконтроллера Attiny13a, такие драйвера стоят во всех конвоях S серии (кроме нового S9), а так же в Convoy M1, M2, C8. Многие другие производители так же ставят в свои фонари драйвера с Attiny, к ним данный мануал тоже применим, но следует уделять внимание фьюзам и используемым портам Attiny.

Краткий ликбез

Не все знакомы с устройством современных фонарей, поэтому прежде чем перейти к колдовству, я постараюсь ввести вас в курс дела. Итак, электрическая схема типичного карманного фонарика состоит из следующих частей:

  • Кнопка выключения — у «тактических» EDC фонариков типа Конвоев обычно располагается в хвосте
  • Аккумулятор — обычно это Li-ion банка
  • Драйвер — самая важная часть фонаря, его мозги
  • Светодиод — говорит сам за себя

Драйвер и светодиод
Драйвер и светодиод

 

Из всего этого безобразия нас, как вы уже поняли, интересует в первую очередь драйвер. Он отвечает за работу фонаря в различных режимах яркости, запоминание последнего включенного режима и прочую логику. В одноаккумуляторных фонарях чаще всего встречаются ШИМ-драйвера. В качестве силового ключа в таких драйверах обычно используется либо полевой транзистор, либо куча линейных регуляторов AMC7135. Например, так выглядит довольно популярный драйвер Nanjg 105D:

Микроконтроллер Attiny13a содержит в себе прошивку, которая определяет логику работы фонаря. Далее я покажу, как можно залить в этот микроконтроллер другую прошивку, чтобы расширить функционал фонаря.

Предыстория

Сейчас на рынке представлено поистине огромное количество карманных EDC фонариков, и, что характерно, каждый производитель норовит изобрести свою собственную прошивку с собственным уникальным™ управлением. Из всех существующих решений мне больше всего нравилась прошивка, с которой до недавних пор поставлялись фонари Convoy с драйвером Nanjg 105D. Она имела 2 группы режимов (1 группа: Мин-Средний-Макс, 2 группа: Мин-Средний-Макс-Строб-SOS). Смена групп в ней осуществлялась интуитивно просто: включаем минимальный режим, спустя пару секунд фонарь моргнёт — кликаем кнопкой, и группа режимов переключена. С недавних пор Convoy начал поставлять свои фонари с новой прошивкой biscotti. Она имеет больше возможностей (12 групп режимов, возможность включения-отключения памяти последнего режима, запоминание режима в выключенном состоянии (т.н. off-time memory)), но у нее есть несколько жирных минусов, которые лично для меня перечеркивают все достоинства:

  • Сложное управление. Чтобы сменить группу режимов нужно помнить наизусть шаманскую последовательность кликов кнопкой
  • Off-time memory не работает при использовании светящихся кнопок (например, таких)
  • Много бесполезных групп режимов, отличающихся лишь порядком следования

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

Встречайте Quasar v1.0

Взяв за основу прошивку luxdrv 0.3b от DrJones, я сваял собственную с блекджеком и лунапарками. Я постарался сделать ее максимально похожей на стоковую прошивку Nanjg 105D и более масштабируемой. Что может мой Quasar:

  • 2 группы режимов: (Минимальный — Средний — Максимальный — Турбо) и (Минимальный — Средний — Максимальный — Турбо — Строб — Полицейский строб — SOS)
  • Строб злой (частота вспышек около 12Гц)
  • Новый режим — полицейский строб — делает прерывистые серии по 5 вспышек, режим может быть полезен велосипедистам, т.к. повышает заметность
  • Переключение групп осуществляется как в заводской прошивке: включаем первый режим, ждем пару секунд, кликаем сразу после того, как фонарь моргнет
  • Путем модификации исходников можно добавить до 16 групп, в каждой группе можно задать до 8 режимов
  • Используется традиционная on-time память, можно использовать светящиеся кнопки без потери функциональности
  • При разряде аккумулятора ниже 3В фонарь начинает сбрасывать яркость, но полностью не отключается — используйте аккумуляторы с защитой, если боитесь их убить.
  • Удобная фича для проверки текущего уровня аккумулятора: в любом режиме делаем 10-20 быстрых полу-нажатий  кнопкой до тех пор, пока фонарь не перестанет включаться. После этого фонарь сделает от 1 до 4 вспышек, каждая вспышка означает уровень заряда соответственно < 25%, < 50%, < 75% и < 100%.

Исходники, скомпилированный бинарник с двумя группами режимов и проект для Atmel Studio вы можете найти на моем гитхабе. Помните, что исходники распространяются под лицензией CC-BY-NC-SA, и прошивку вы используете на свой страх и риск без каких-либо гарантий.

Принадлежности

Для заливки кастомной прошивки нам понадобятся:

  • SOIC клипса Купить
  • Любой клон Arduino Nano 3.0 для использования в качестве программатора Купить
  • Arduino у меня уже была, поэтому я решил завести отдельный самостоятельный девайс для прошивки фонарей и купил USBISP программатор Купить
  • Dupont провода для подключения клипсы к программатору Купить

 

Подготовка программатора

 

Для прошивки драйвера подойдет обычная Arduino Nano 3.0 с залитым скетчем ArduinoISP, но я решил завести отдельный программатор, поэтому купил USBISP. Он имеет форм-фактор флешки в алюминиевом корпусе:

Из коробки этот программатор определяется на компе как HID устройство и работает только с китайским кривым софтом, чтобы использовать его с avrdude можно перепрошить его в USBASP. Для этого нам, как ни странно, понадобится другой рабочий программатор. Здесь нам поможет Arduino Nano, подключаем её к компьютеру, открываем Arduino IDE и открываем стандартный скетч ArduinoISP:

Раскомменчиваем строку #define USE_OLD_STYLE_WIRING:

И заливаем скетч в Nano. Теперь у нас есть AVRISP программатор, которым можно перепрошить наш USBISP в USBASP. Для этого нам в первую очередь понадобится avrdude, он лежит в папке установки Arduino IDE по пути \hardware\tools\avr\bin. Для удобства советую добавить полный путь к avrdude.exe в переменную окружения PATH.

Теперь нам необходимо открыть USBISP и перевести его в режим программирования, установив перемычку UP:

Вот так:

Заодно убеждаемся, что на плате распаян Atmega88 или 88p, как в моем случае:

Другие перемычки, несмотря на советы в инете, трогать не нужно, все прекрасно прошивается и с ними.

Теперь внимательно смотрим на распиновку USBISP программатора, нанесенную на его алюминиевом корпусе, и подключаем его к Arduino Nano:

  • VCC и GND к VCC и GND сответственно
  • MOSI к D11
  • MISO к D12
  • SCK к D13
  • RESET к D10

У меня не оказалось Female-Female проводов, поэтому я заюзал мини-макетку:

Следующий шаг — скачиваем прошивку usbasp.atmega88-modify.hex, подключаем Arduino к компу, запускаем консоль и переходим в папку с сохраненной прошивкой. Для начала выставим фьюзы командой:

avrdude -p -m88 -c avrisp -b 19200 -U lfuse:w:0xff:m -U hfuse:w:0xdd:m

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

avrdude -p m88p -c avrisp -b 19200 -U flash:w:usbasp.atmega88-modify.hex

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

Теперь у нас есть полноценный компактный USBASP программатор в удобном металлическом корпусе.

SOIC клипса

Программировать микроконтроллеры можно и без клипсы, подпаивая каждый раз проводки к соответствующим контактам, но это настолько рутинный процесс, что лучше все же не пожалеть денег на клипсу. Первое, что нужно сделать после получения клипсы, — это «распушить» контакты, поскольку из коробки они расположены слишком близко друг к другу, и к ним невозможно нормально подпаять провода:

Подключаем контакты клипсы к программатору в соответствии с распиновкой микроконтроллера:

Для большей надежности я припаял провода к клипсе и затянул все это термоусадкой:

Заливаем прошивку в фонарь

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

Крепим клипсу, соблюдая ориентацию. Ориентир в данном случае — кругляш на корпусе микросхемы, он обозначает первый её пин (RESET в нашем случае):

Смотрим, чтобы все пины клипсы утопились в корпус. Подключаем программатор к компу, теперь дело осталось за малым — нужно залить прошивку) Для этого идем на гитхаб, качаем бинарник quasar.hex, запускаем консоль, переходим в папку с бинарником и выполняем команду:

avrdude -p t13 -c usbasp -u -Uflash:w:quasar.hex:a -Ulfuse:w:0x75:m -Uhfuse:w:0xFF:m

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

Просто, да? А вот нифига, с вероятностью 90% вместо загрузки прошивки вы увидите это:

Причина чаще всего кроется в том, что у новых моделей драйверов замкнуты пины 5 и 6 (MISO и MOSI), что делает невозможным программирование. Поэтому если avrdude жалуется на target doesn't answer, то первым делом вооружаемся скальпелем и внимательно смотрим на плату. Нужно перерезать дорожку, как показано на картинке:

После этого прошивка обычно заливается без проблем. Если нет — внимательно посмотрите на микроконтроллер, возможно у вас вовсе не Attiny13a, по крайней мере мне попадались драйвера с Fasttech с PIC контроллерами.

Модификация прошивки

Скомпилированная прошивка на гитхабе посути является чуть более продвинутым аналогом оригинальной прошивки, поэтому куда интереснее собрать собственную версию прошивки со своими группами и режимами. Сейчас я расскажу, как это сделать. Первым делом качаем и устанавливаем Atmel Studio с официального сайта. Потом скачиваем все файлы проекта (кто умеет в git — могут просто клонировать всю репу) и открываем Quasar.atsln через установленную студию:

Перечислю наиболее интересные места в коде:

#define LOCKTIME 50

Задает время, через которое текущий режим будет сохранен. Значение 50 соответствует 1 секунде, соответственно поставив 100 можно получить интервал ожидания в 2 секунды

#define BATTMON 125

Задает критический уровень напряжения на аккумуляторе, при достижении которого фонарь начнет сбрасывать яркость. У стандартного Nanjg 105D величина 125 соответствует примерно 2.9 вольтам, но все зависит от величин резисторов делителя напряжения на плате. Если удалить эту строку целиком — фонарь не будет следить за напряжением аккумулятора.

#define STROBE        254

#define PSTROBE       253

#define SOS           252

Определения режимов-мигалок, цифровые значения трогать не следует, если не нужен какой-либо режим — соответствующую строку можно удалить, не забыв после этого поправить объявления групп режимов в массиве groups.

#define BATTCHECK

Включает режим индикации уровня аккумулятора после 16 быстрых кликов. Можно удалить, если эта функция не нужна.

#define MEM_LAST

Задает запоминание последнего режима. Возможны следующие значения: MEM_LAST — фонарь включается в последнем включенном режиме, MEM_FIRST — фонарь всегда включается в первом режиме, MEM_NEXT — фонарь всегда включается в следующем режиме.

#define MODES_COUNT     7

#define GROUPS_COUNT    2

Задают количество режимов в группе и количество групп соответственно. Тесно связаны со следующим массивом groups:

PROGMEM const byte groups[GROUPS_COUNT][MODES_COUNT] = {{ 6, 32, 128, 255, 0, 0, 0 },
                                                        { 6, 32, 128, 255, STROBE, PSTROBE, SOS }};

Здесь перечислены сами группы режимов работы. Числа 6, 32, 128, 255 — значения яркости, STROBE, PSTROBE, SOS — обозначения специальных режимов. Нулевые значения яркости игнорируются, поэтому в разных группах можно задавать разные количества режимов (в данном случае в первой группе 4 режима, во второй — 7).

Например, если вы хотите оставить один единственный режим работы со 100% яркостью, то сделать это можно так:

#define MODES_COUNT     1

#define GROUPS_COUNT    1

PROGMEM const byte groups[GROUPS_COUNT][MODES_COUNT] = {{ 255 }};

Если вам нужны 3 группы режимов без мигалок и с обратным следованием (от максимального к минимальному), то можно сделать так:

#define MODES_COUNT     4

#define GROUPS_COUNT    3

PROGMEM const byte groups[GROUPS_COUNT][MODES_COUNT] = {{ 255, 0, 0, 0 },

                                                        { 255, 64, 6, 0 },

                                                        { 255, 128, 32, 6 }};

При таком раскладе в первой группе всего один режим со 100% яркостью, во второй — 3 режима, в третьей — 4 режима с более плавным уменьшением яркости. Легко и просто, правда? Остается лишь скомпилировать исходник в hex файл с помощью студии, для этого выбираем «Release» в диспетчере конфигураций и жмем «Запуск без отладки»:

Если нигде в коде не накосячили, то в папке проекта появится директория Release, а в ней — hex файл, который остается залить в драйвер описанным в предыдущем разделе способом.

На этом все, надеюсь сей мануал будет кому-нибудь полезен. Если у кого возникнут вопросы — милости прошу в комменты)

18 комментариев

  
Vadim Vadimych
Полезно. Спасибо.
DenisM
Без какой-то доли иронии, меня зацепил заголовок, с большим уважением к проделанной работе, но «Прошивка для фонарика» — это круто вообще!
Suslo
Это все конечно любопытно, но реальной необходимости перепрошивать фонарь и реальных преимуществ после перепрошивки, я как-то не заметил…
Suslo
«При разряде аккумулятора ниже 3В фонарь начинает сбрасывать яркость, но полностью не отключается — используйте аккумуляторы с защитой, если боитесь их убить.»
Приз за антифичу года! =)
99.999%, что в итоге по забывчивости, в спешке, передав фонарь кому-то другому и тд все закончится несколькими убитыми АКБ…
SinuX
Как можно забыть про разряженный аккумулятор, если фонарь сбрасывает яркость на минимум сразу после включения любого режима?) И по-моему страхи по поводу убийственного переразряда сильно преувеличены, у меня несколько разных банок (sanyo, samsung, panasonic) без защиты садились в 0.0В. После прикуривания другой заряженной банкой они нормально заряжаются и работают, потеря емкости после этого — максимум 5%. Поэтому из вариантов остаться без света в самый неподходящий момент или купить новый акк в самом худшем случае я выбрал второе
Suslo
Скажу так: если вы реально активно пользуетесь фонарями или часто оказываетесь в ситуациях, когда он вам нужен, лучше иметь с собой 1-2 запасных акб. Тогда гемороиться и оживлять убитые батареи не понадобится.
SinuX
Зачем таскать, если можно не таскать?) В минимальном режиме фонарь может проработать довольно долго до начала урона аккуму, часов 6 точно. И, к слову, отключения при критическом заряде нет и в оригинальной прошивке, оно вообще мало где используется. Проще поставить акк с защитой и не париться
Suslo
Вот только как я понял по разным обзорам, реально хорошие банки выпускаются безо всяких защит, а с защитами — чаще всего кетайский подвал и идет.


Ответ SinuX на коментарий
Зачем таскать, если можно не таскать?)

Не ожидал от вроде технически грамотного и тд человека перехода на демагогию…
SinuX
Просто не понятна суть недовольства, есть разные типы аккумуляторов, которые имеют разное критическое напряжение, те же NCR18650B можно и нужно сажать до 2.5В. По-вашему нужно сделать отдельную прошивку под каждый тип аккумулятора?) По-моему логично предоставить пользователю самому выбирать, нужен ему свет до отсечки, или пойдет защищенный аккумулятор, который сам отрубится. На фирменных акках типа keeppower сюрпризов с защитой нет
Suslo

Ответ SinuX на коментарий
keeppower

Фирменные — это хотя бы самс, лг, сони, саньо, панас… Остальное — китай той или иной степени подвальности… ;-)
SinuX
самс, лг, сони, саньо, панас
Так это все сами OEM банки, а keeppower, liitokala и т.п.- это сборки на основе них, обычно они пишут какая банка завернута) Хотя liitokala в последнее время ругают часто, походу заворачивают старые банки с просевшей ёмкостью, но зато они и стоят дешевле всех
Cirrhosis
Когда прошивки для жён пойдут? Маетесь всякой хренью…
николай г
Это сколько ж нужно иметь свободного от отдыха времени, чтоб таким заниматься.Как говорил Жванецкий-*это какому нормальному человеку в голову придет?*.А вообще вы реально в голове весь этот миллион режимов фонарика держите и действительно им пользуетесь? Еще нехватает только чтоб вош фонарик молвил человеческим голосом, варил кофе и тапки приносил.По моему это уже перебор.
NoName.Man
вы реально в голове весь этот миллион режимов фонарика держите и действительно им пользуетесь?
Вот тоже интересно. Особенно «SOS».
SinuX
Особенно «SOS»
Все несколько проще — все сделано по аналогии с заводской прошивкой, у которой закрыты исходники
A-Gugu
А я делаю эргономичный драйвер, для нормальных людей, а не для полукликеров-счётчиков :)
SinuX
Вы намекаете, что среднестатистический тип не в состоянии разобраться в двух группах по 4/7 режимов, отличающихся только мигалками?)
я делаю эргономичный драйвер
Если вам не нужна карманная лампочка с одним режимом вкл/выкл, то придется ставить МК и возвращаться к режимам)
A-Gugu
Доделаю, там увидите всё :)
Оставить комментарий