Речь в статье пойдёт о том, как старый ненужный мобильник переделать в отличные настенные часы с крупными цифрами, всегда точным временем и резервным питанием.
Я расскажу о некоторых выясненных особенностях сихронизации времени в ОС Андроид, а также о разных электрических хитростях в системе питания смартфона. Опишу пример схемы на несложных аналоговых компонентах, которая осуществляет автоматическое резервное питание. И конечно речь будет о программной части андроид – как и с помощью чего можно самому сделать из смартфона красивые часы на любой вкус.
(традиционный disclaimer – любые упомянутые бренды, трейдмарки и т.п. не являются рекламой, надеюсь это понятно.)
Вторую жизнь старому смартфону
У меня давно лежал без дела старенький Philips Xenium W732. Полностью работающий, с целым экраном. Я решил дать ему вторую жизнь – превратить в настенные часы. Мои старые домашние часы, ещё советские, с мерцающими маленькими цифрами было очень плохо видно уже с пары метров. К тому же они жутко отставали, их то и дело приходилось подводить, а при любом пропадании электричества в доме вообще обнулялись и требовали нудной процедуры тыкания в кнопки и установки времени заново. Всё это мне давно надоело, и я решил сделать из старого мобильника хорошие «умные» часы, лишённые всех этих недостатков.
Что мне было нужно
- Большие чёткие цифры любого желаемого цвета, шрифта и яркости.
- Максимальная точность и стабильность хода без какого-либо моего вмешательства извне.
- Энергонезависимость, т.е. часы должны продолжать работать при временных перебоях с электричеством.
- Полностью автономная работа, в смысле – без использования каких-либо оплачиваемых сетей данных, сим-карт, операторов и т.п.
- Максимальное соответствие принципу «сделал, включил и забыл». То есть устройство никогда не должно требовать ни обслуживания, ни ещё какого-то интерактива.
Обеспечиваем Android точным временем
Первым делом нужно было получить в смартфоне постоянно точное мировое время. Понятие «точное» для меня вполне укладывается в 1...2 секунды отклонения от мирового.
Понятно, что собственный системный таймер мобильника не даст такой стабильности хода, от него это и не требуется. Поэтому гарантированное соответствие мировому времени можно получить только регулярной внешней синхронизацией.
В самом простом случае в андроиде её можно настроить по методу «по сети». При этом не потребуется даже сотовая сеть с неизбежными сим-картами и оплатами тарифов. Достаточно раздать на смартфон домашний вайфай, а роутер настроить на синхронизацию времени от провайдера интернета или ntp-сервера.
Однако есть и второй метод синхронизации – по спутникам GPS, который лично я считаю лучше.
Из плюсов – синхронизироваться можно в любой точке планеты, где видно небо. Абсолютная точность времени, так как GPS сам на этом основан. Отсутствие дополнительных лишних радиоканалов и излучений.
Из недостатков GPS – устройство должно видеть хотя бы немного открытого неба. В произвольном месте в глубине комнаты скорее всего ничего не поймается, особенно если в устройстве старый и нечувствительный чип. А так как мои часы располагались именно вдали от окна, мне понадобилась выносная GPS-антенна…
Простейшая внешняя антенна для приёма GPS
В интернете на эту тему всё оказалось довольно туго. Я сразу понял, что изготовить такую антенну сам я не смогу – настолько везде предлагались вычурные, громоздкие конструкции с какими-то сложными запутанными расчётами. Пытался найти покупную – тоже всё не нравилось. Какие-то все большие, несуразные, требующие внешнего питания, с кучей ненужного функционала и при этом неадекватно дорогие.
Решение нашлось случайно – я как-то увидел описание антенны типа «полуволновой диполь». В простейшем исполнении это просто прямой кусок провода с длиной, равной половине длины волны требуемого сигнала. Такая «сложность» конструкции меня вполне устраивала, поэтому я просто взял первый попавшийся коаксиал с произвольным волновым сопротивлением и аккуратно припаял его к смартфону на соответствующие контакты патч-антенны GPS.
Фото контактов GPS-антенны на плате W732
К этим контактам припаивается оплётка и центральная жила коаксиала
К этим контактам припаивается оплётка и центральная жила коаксиала
Другой конец кабеля я просто освободил от экранной оплётки, чтобы осталась центральная жила длиной 95мм – это половина длины волны на частоте L1 стандартного сигнала GPS (1575,42МГц).
Простейшая GPS-антенна. Полуволновой диполь
Эту антенну нужно расположить как можно ближе к окну.
Я приклеил её к стеклу скотчем.
Эту антенну нужно расположить как можно ближе к окну.
Я приклеил её к стеклу скотчем.
Телефон унёс подальше от окна, а зачищенный на 95мм конец провода наоборот поднёс к окну, чтобы ему было побольше видно неба.
И что же – филипс вскоре наловил свои честные 5...7 спутников и зафиксился! Антенна работает!
А я ещё волновался по поводу якобы необходимого в таких случаях согласования волновых сопротивлений кабеля, антенны и приёмника, которым мне запудрили мозги в интернете на антенных форумах. Позже я выяснил, что такое согласование сопротивлений нужно для того, чтобы просто получить максимальную эффективность линии передачи (отсутствие концевых отражений и чрезмерного затухания). А если линия всего 2...3 метра, как у меня, и задача стоит просто доставить хоть какую-то часть сигнала до приёмника, то об этом согласовании можно вообще не задумываться – всё будет работать с любым коаксиалом.
Особенности процесса GPS-синхронизации
Получив работающий GPS, я конечно сразу выставил в настройках андроида метод синхронизации времени «по спутникам GPS» и оставил телефон в таком состоянии на проверку. Каково было моё удивление, когда несколько часов спустя время на телефоне ощутимо «разъехалось» с контрольными часами на компьютере (там windows синхронизирован по ntp). Стал выяснять причину… Оказалось, что андроид, настроенный на синхронизацию времени по GPS, фактически производит эту синхронизацию лишь один единственный раз – в момент фикса координат.
А потом, даже несмотря на то, что смартфон продолжает непрерывно отслеживать спутники, его системное время всё равно определяется только внутренним генератором, то есть никакой синхронизации и не ведётся вовсе! По крайней мере в моём филипсе на андроиде 4.0.3 всё происходит именно так.
Для меня это стало неприятным сюрпризом. Не буду же я то и дело вручную дёргать GPS, чтобы обновить точное время…
Решение было найдено программное. Я использую для навигации программу Locus от Asamm software, в которой можно настроить не постоянное поддержание GPS в активном состоянии, а периодические одноразовые фиксы координат через заданные промежутки времени, то есть именно то, что мне и требовалось. Я выставил интервал 15 минут, и проблема благополучно исчезла – время в мобильнике с этих пор всегда чётко совпадает с мировым! За 15 минут системный таймер любого нормального смартфона не накопит ошибку времени больше 1...2 секунды, что вполне меня устраивает. При желании можно фикситься по-горячему хоть каждые десять секунд.
Организация питания стационарного смартфона
После того, как точное время было обеспечено, настала очередь сделать грамотное питание для моих часов.
Как я уже упоминал, мне требовалось, чтобы часы не отключались и не обнулялись при кратковременных пропаданиях электричества в доме, которые хоть и редко, но случаются.
Первое, самое топорное решение здесь – тупо воткнуть смартфон в розетку и так и оставить. Ведь при этом отлично решается вопрос с перебоями электричества – мобильник просто перейдёт на аккумулятор, который у него всегда будет полностью заряжен и готов к использованию. Сказано – сделано. Подключил… Прошла неделя, вторая – я уже начал было радоваться… А на третью, в один прекрасный день раздался хлопок, и аккумулятор радостно вылетел из телефона на середину комнаты, раздутый внутренним давлением до состояния шара.
Штатный аккумулятор филипса
Это его нормальное состояние. Плоский и твёрдый…
Это его нормальное состояние. Плоский и твёрдый…
Как вы понимаете, мне ещё крупно повезло, что швы корпуса батарейки выдержали и не вскрылись, иначе не миновать бы мне литиевого пожара, дыма, вони и испорченного линолеума.
Вывод один – просто так использовать смартфон месяцами и годами на постоянной зарядке нельзя. Телефон на такой сценарий не затачивался. Его основная задача – грамотно зарядить аккумулятор до максимума, не позволив превыситься вольтажу и температуре. А потом всё же предполагается разряд. Если же аппарат никогда не отключать от розетки, контроллер обычно начинает поддерживать пилообразный график заряженности – сначала доводка до 100%, потом отключение тока и ожидание разряда где-то процентов до 90. И заново подзаправка до 100%. И это ещё более-менее заботливый подход. А многие старые телефоны просто могут тупо всегда держать максимальное напряжение на батарее.
Известно, что чем выше напряжение на литий-ионной ячейке, тем быстрее идёт её старение и деградация. Некоторые смартфоны вообще заливают свои аккумуляторы даже выше 4,2В, чтобы максимально увеличить время автономной работы. А результат один – постоянно находясь под максимальным напряжением, батарея значительно быстрее деградирует. Если она к тому же ещё и старая, то тут недалеко до постепенного развития микроскопических внутренних замыканий, теплового разгона и взрыва, как это случилось у меня.
После казуса со взорвавшимся аккумулятором я задумался – как мне одновременно и иметь резервное питание и не допустить постоянного нахождения батареи под полным напряжением?
Перебрал много разных сценариев, в итоге остановился на следующем.
В обычном режиме телефон будет всегда питаться от розетки, то есть 5В через разъём USB.
Резервный аккумулятор с помощью несложной дополнительной схемы автоматически и единовременно заряжается до его нормального максимума 4,2В, после чего полностью отключается от заряда. Далее аккумулятор просто спокойно разряжается саморазрядом, будучи никуда не подключённым. При этом схема постоянно следит за его напряжением и вновь включает единовременный заряд до 4,2 только когда вольтаж ячейки опустится ниже определённого заданного минимума (я принял 3,6B). И так далее, всё на полном автомате. Реальное время между этими подзарядками составляет годы, в течение которых аккумулятор медленно саморазряжается, но тем не менее остаётся вполне способным в любой момент запитать нагрузку, пусть даже и не от полной своей ёмкости.
В случаях пропадания питания от розетки аккумулятор должен быть тут же автоматически подключён к смартфону (как в бесперебойниках), после чего система продолжит работать от него автономно до восстановления сетевого питания, либо до полного исчерпания заряда (и выключения).
При таком подходе литиевая ячейка эксплуатируется в более щадящем режиме, чем при постоянном поддержании на ней максимального напряжения. И уж точно не взорвётся!
Хитрости смартфонной электрики
Теперь о том, как всё это реализовать схемотехнически.
Дело тут осложняется тем, что в смартфоне оказалось не так всё просто организовано в системе питания.
Например, без аккумулятора телефон не включится даже при наличии 5В по USB.
Если вынуть аккумулятор во время работы от USB – тоже сразу всё гаснет. Хотя питание-то при этом явно идёт только от USB-разъёма!
Ещё поначалу была проблема с третьим контактом аккумулятора. Я не хотел быть привязанным к штатной филипсовской батарейке и решил выяснить – что будет, если оставить клемму третьего контакта вообще не подключённой? Оказалось, смартфон при этом не включится… Я даже начал опасаться, что по среднему контакту идёт какая-нибудь мудрёная цифровая шина, типа i2с, которая передаёт телефону не только разную техническую телеметрию, но и всякие заводские коды в стиле «свой-чужой». Это означало бы, что я навсегда привязан к родному аккумулятору филипса, потому что городить тут какие-то обманывающие цифровые интерфейсы я точно не намеревался (помню, подобный сюрприз был у меня при работе с аккумуляторами видеокамеры от всемирно известной и уважаемой японской фирмы).
Я посмотрел осциллографом что там происходит на третьем контакте. На моё счастье у Philips W732 всё оказалось очень просто! Туда выведено обычное постоянное напряжение от внутреннего датчика температуры аккумулятора. Вход третьего контакта в смартфоне высокоимпедансный.
Я собрал простой подстроечный делитель, и, подавая на средний контакт разные напряжения, снял несколько точек зависимости отображаемой андроидом температуры батареи от напряжения на третьем контакте.
График зависимости отображаемой температуры батареи от напряжения 3-го контакта
Выяснилось, что если на третьем будет менее 153мВ, начнутся полноэкранные предупреждения о перегреве батареи и через несколько секунд телефон штатно выключится. При напряжении выше 630мВ андроид начинает считать, что его аккумулятор замёрз до минусовой температуры, но будет продолжать работать (и даже молча!). Дальше мне экспериментировать уже не требовалось – я просто понял, что обмануть третий контакт здесь элементарно – просто подать туда любой потенциал между 155 и 600мВ.
В итоге у меня оформилось 2 критерия, без соблюдения которых смартфон вообще не заработает:
1. Обязательное наличие напряжения на плюсовой клемме аккумулятора (несмотря на то, что система питается от разъёма USB)
Причём это должна быть не какая-нибудь фейковая обманка потенциала, просто чтобы телефон думал, что в него вставлена батарейка. Требуется именно полноценный низкоимпедансный источник напряжения с током не менее рабочего тока смартфона.
2. Наличие постоянного напряжения на третьем контакте аккумуляторной колодки в диапазоне 155...600мВ. Здесь уже достаточно простого высокоимедансного потенциала-обманки.
Кстати, до сих пор не понимаю для чего в андроиде выставлено такое высокое значение порога выключения (3,4В), в то время как стандартная литиевая ячейка запросто может безопасно разряжаться до 3 и даже 2,8В! Единственное, что приходит на ум – это наличие в смартфонах внутренних потребителей на 3,3В, которым нужен запас по питанию для их buck-преобразователей. Но можно ведь и SEPIC поставить и использовать аккумулятор более полно! Или в современный век об этом уже никто не думает?
Дальше надо было придумать простую вспомогательную схему, которая бы за всем этим следила и автоматически управляла. Я сразу решил, что не стану применять никаких микроконтроллеров, хотя работать с ними умею. В данном случае нужно было просто немного подумать, хорошенько всё оптимизировать, и все функции реализовались на простых аналоговых компонентах. Всё работает и никогда не зависает.
Резервный аккумулятор часов требуется периодически от чего-то заряжать. Поначалу я решил делать это прямо от батарейного плюса смартфона, ведь я наивно полагал, что у него там честные и неизменные 4,2В. С помощью осциллографа я посмотрел что там творится в действительности. Оказалось, что никакими постоянными уровнями там и не пахнет!..
Во-первых, если на батарейный плюсовой вывод ничего не подключено, контроллер заряда всё равно не спит и периодически «щупает» его проверками.
Осциллограмма напряжения на плюсовой клемме аккумулятора
(реконструкция реальной осциллограммы)
(реконструкция реальной осциллограммы)
Видите – примерно через каждые 45 миллисекунд телефон выдаёт лесенку из последовательных «прощупываний» – не появилось ли на контакте аккумулятора внешнее напряжение? А между этими проверками держится некий постоянный уровень 4,05В.
Если подключить аккумулятор, система распознаёт его и исправно начинает заливать туда ток. Но, опять же, не постоянно, а периодами по 10 секунд. Через каждые эти 10 секунд заряда смартфон на 2 секунды включает полноценный реверс тока, т.е. отбирает ток от аккумулятора, причём с приличной силой (точные числовые значения всех этих параметров я не измерял, мне был интересен принцип). Во время этого кратковременного отбора тока смартфон измеряет заряд аккумулятора под нагрузкой, получая таким образом честные цифры процентов и вольтажа. Было хорошо видно, как именно после этого реверса в андроиде обновляются значения всех параметров батареи.
Весь этот хитрый механизм заряда мне совершенно не подходил, и даже мешал, потому что я предполагал строить логику зарядных цепей, основываясь на непрерывном аналоговом контроле напряжения на измерительном шунте. И автоматически выключать заряд, когда падение на шунте снижалось бы до заданного минимума, свидетельствуя о достижении зарядным током окончательной стадии заряда. А тут этот реверс совершенно всё портил… Я сначала пытался как-то это обойти или обмануть, но в результате понял, что проще применить внешний источник эталонного зарядного напряжения. Это будет и надёжнее и прозрачнее для последующего понимания.
Я поставил внешний интегральный стабилизатор (обычный, линейный), с помощью которого получал из плохо стабилизированных 5...6В USB-зарядника точные и температурно-стабильные 4,2В. Ими я, во-первых, запитал смартфону плюсовую клемму аккумулятора, чтобы тот всегда думал, что у него 100% заряженная батарейка и никогда ничего по этому поводу не вещал на весь экран. А во-вторых, от этой шины работает система заряда резервного аккумулятора.
Попутно наткнулся на любопытное наблюдение. Оказывается, что если отключить питание по USB и подать на аккумуляторную клемму смартфона постоянное напряжение от стабилизированного источника, которое никогда не будет меняться, андроид всё равно будет упорно рисовать наклонный, спадающий график процента заряда! Видимо в программу контроля батареи андроида вшито какое-то уравнение расчёта этих процентов, которое учитывает не только фактическое напряжение ячейки, но и ток потребления аппарата. Я специально провёл эксперименты, включая и выключая подсветку экрана, как один из самых прожорливых потребителей тока. Вот какая статистика набралась за сутки:
Так андроид нарисовал график «разряда аккумулятора»
Видите, когда экран работал и ток от клеммы аккумулятора шёл ощутимый, андроид рисовал хороший наклон, примерно 5% спада за час. Потом я выключил подсветку и смартфон заснул, ток упал до каких-то малых дежурных значений, и график пошёл фактически горизонтально. Снова включил экран – и опять скат. Заметьте, напряжение на плюсовой клемме батареи всегда было строго постоянно. Значит андроид рассчитывал свой процент заряда только исходя из замеряемого тока.
Однако как только заряд доходит до 15% (здесь телефон выдаёт предупреждение о разряженной батарее), график перестаёт снижаться и дальше так и идёт горизонтально на 15%… Вот такая хитрость (или глюк).
Была и ещё одна особенность. Оказалось, что если подать одновременно питание по разъёму USB и стабилизированное внешнее питание на клемму аккумулятора, но меньшее, чем 4,2В, то смартфон сначала будет долго и честно показывать неполный процент заряда, а потом вдруг начнёт ругать, в стиле "У вас что-то с батареей! Заряд идёт слишком долго!". И конечно же всё это опять в полный экран и поверх моих часов!
Ну а если подать больше 4,2В, то уже где-то с 4,3В он начнёт ругаться про опасное превышение вольтажа батареи, это понятно. Поэтому «диапазон спокойствия» тут довольно узкий – всего 0,1В.
И вот только если ему обеспечить и питание 5В по USB, и полную эмуляцию точных 4,2В по клемме аккумулятора – вот только тогда андроид счастливо замолкает, считая, что он честно зарядил свою батарейку до максимума. И больше он уже, слава богу, ни на что никогда не жалуется!
Сразу успокою тех, кто, возможно, подумал, что я сделал очень плохо, нагрузив два несогласованных низкоимпедансных источника напряжения друг на друга (т.е. внешний 4,2В-стабилизатор и плюсовую клемму аккумулятора, которая сама по себе тоже «питает»). Дело в том, что мой внешний стабилизатор представляет собой обычный линейный LDO и по своей схемотехнике не умеет отводить ток. Только подводить. Поэтому никаких электрических конфликтов тут не возникает, как это может случиться, например, при параллельном соединении нескольких разных батареек.
Схема
Когда ТЗ наконец полностью определилось, можно было приступать к разработке конкретной схемы. Несмотря на кажущуюся простоту задачи, повозился я с ней знатно! Пришлось понавыдумывать и потом забраковать больше десятка разных вариантов, от неприлично простых, до громоздких. Вот что получилось в итоге:
Схема управления питанием
Несмотря на кажущуюся избыточность, схема несложная. Благодаря SMD, платка размером 35х22 мм легко умещается внутри отсека вынутого штатного аккумулятора. В качестве резервного аккумулятора я применил обычный литий-ион 18650, смонтированный на подставке часов.
Схема обеспечивает следующие функции:
- Основное постоянное питание 5В от розетки через разъём USB.
- Автоматический перевод смартфона на резервный аккумулятор при пропадании питания от USB.
- Подвод стабильных 4,2В в аккумуляторную клемму смартфона (чтобы андроид всегда был спокоен).
- Эмуляцию напряжения для третьего аккумуляторного контакта (при любом режиме питания).
- Автоматический старт заряда резервного аккумулятора при понижении его вольтажа ниже заданного уровня.
- Заряд резервного аккумулятора по упрощённому, но безопасному закону.
- Автоматическое прекращение заряда по достижению заданной величины зарядного тока.
- Резервный аккумулятор не держится всегда под максимальным напряжением.
Теперь вкратце, как схема работает.
Чтобы получить стабильные и температурно-независимые 4,2В, я применил замечательный интегральный LDO ADM7172 от Analog Devices. Он выдаёт мне нужный и идеально ровный вольтаж 4,22В вплоть до 2А нагрузки. Его я пускаю в смартфон на плюс батарейного разъёма (VBAT), а также использую для заряда резервного аккумулятора системы.
Цепь эмуляции напряжения для третьего контакта батареи (TEMP) сделана на простом диоде D2, запитанном мизерным фоновым током.
P-канальный мосфет Q4 подключает к смартфону резервный аккумулятор сразу, как только на основной питающей шине +5V USB пропадает напряжение. Светодиод LED2 здесь поставлен только с целью сдвига уровня для небольшого ускорения открывания Q4 в процессе просадки шины. Он инфракрасный и никуда не светит.
На остальных деталях сделана схема заряда. Резервный аккумулятор BT1 заряжается через мосфет Q3 и контрольно-ограничивающий резистор R9R10.
Здесь интересна работа ИОУ U2. Он тут так включён, что обеспечивает одновременно контроль и степени разряда и степени заряда. ОУ здесь работает в режиме компаратора, а положительная ОС для него получается сама собой за счёт процессов в управляемых им цепях.
Вот как это происходит: когда всё нормально – есть питание +5В USB и резервный аккумулятор заряжен до вольтажа, выше, чем выставлено точкой делителя R4R5R6 – тогда ОУ выдаёт на выходе потенциал 4,2-вольтовой шины (от которой он питается), и зарядный мосфет Q3 закрыт. Когда аккумулятор по той или иной причине разрядится ниже этой точки (+3,63В на схеме), выход ОУ постепенно «отлипнет» от плюса и тем самым откроет зарядный мосфет Q3. В аккумулятор потечёт ток, напряжение на ячейке сразу же подрастёт хотя бы на несколько милливольт (за счёт ненулевого внутреннего сопротивления) и это послужит надёжной ПОС для ОУ. Здесь можно применить и настоящий компаратор с собственным гистерезисом, но в реальности переключение усилителя происходит надёжно и быстро, никаких дребезжащих дрейфов нет.
Заряд аккумулятора идёт через резистор R9R10 (он составной с целью увеличения мощности рассеяния). Во-первых, он ограничивает зарядный ток, что здесь совершенно необходимо, иначе даже 2-амперный зарядник банально не справится и просядет. Во-вторых, по падению напряжения на этом резисторе схема определяет момент, когда надо выключить заряд.
Происходит это так: как только включается заряд, то одновременно открывается вспомогательный мосфет Q2, который перестраивает контрольный делитель R4R5R6 для инвертирующего входа ОУ, и таким образом ОУ начинает отслеживать уже то напряжение, которое выделяется на зарядном резисторе. В самом начале заряда, когда аккумулятор полностью разряжен, на R9R10 падает около 0,5В, отчего ОУ оказывается надёжно разбалансированным в состоянии режима заряда. И только когда аккумулятор постепенно полностью зарядится, ток через контрольный резистор ослабеет до определённого значения (примерно 20мА), тогда и потенциалы входов ОУ выравниваются, после чего он тем же внешним механизмом ПОС перебрасывается в противоположное состояние (плюс на выходе), выключая мосфеты Q2 и Q3 и прекращая заряд.
Что касается получаемого такой схемой профиля заряда литий-ионного аккумулятора, то резистор R9R10 здесь автоматически реализует простую зарядную функцию с максимальным начальным током, автоматическим постепенным его снижением и приближением к нулю.
График зарядной функции
Производители аккумуляторов в свою очередь рекомендуют следующий общеизвестный профиль заряда с участками стабилизации то тока, то напряжения:
Типовой рекомендуемый профиль заряда для Li-ion
В моём случае ни напряжение, ни ток на ячейке никогда специально не стабилизируются, однако вольтаж на ней гарантированно никогда не превысит безопасных пределов. Поэтому такой упрощённый способ заряда я считаю вполне работоспособным и действенным. На практике он работает прекрасно, и при этом требует лишь одного резистора.
Мосфет Q1 применён для того, чтобы при работе только от резервного аккумулятора не тратить напрасно его ток на запитку всей остальной схемы. При пропадании питания от розетки, Q1 закрывается и отсекает всю неиспользуемую часть схемы от общего провода. Благодаря этому собственное потребление всей конструкции падает до ничтожных 3...5 микроампер, и это автоматически предотвращает глубокий разряд аккумулятора в случае, если вообще забыть об обесточенной системе надолго.
Диод Шоттки D1 на входе в стабилизатор U1 выполняет двойную функцию – блокировку обратного тока через U1 (внутри ADM7172 такой блокировки нет) и разгрузку маленькой микросхемки стабилизатора от чрезмерной рассеиваемой мощности. В самом начале заряда аккумулятора зарядный ток достигает 1А, и если весь 1 вольт перепада напряжения от шины +5В USB возложить на крошечную ADM7172 размером 3х3 мм, она будет уж очень горячая, даже несмотря на термопэд, припаянный к плате. Поэтому часть входного напряжения удачно гасится на блокировочном диоде D1, и в итоге обе эти детали разогреваются более равномерно и не так сильно.
Об использованных компонентах
В качестве входного стабилизатора я применил отличный LDO с действительно низким минимальным проходным падением, хотя в данном месте напряжение на нём никогда не опустится менее 0,4В. Просто ADM7172 мне очень нравится по многим его характеристикам. А так тут можно поставить практически любую микросхему линейного стабилизатора, главное, чтобы она выдавала надёжные вольты, не плавающие от температуры, и хотя бы 1,5А тока.
От мосфетов мне здесь были нужны минимальные сопротивления канала в открытом состоянии (RdsON). Особенно это касается разрядного P-канального ключа Q4. Туда я поставил великолепный тошибовский образец TPH1R712MD – лучшее, что нашлось по сопротивлению канала в маленьком плоском корпусе. В открытом состоянии у него реальные 1,3мОм, что при рабочем токе смартфона в 200...300мА даёт транзитные потери ценного аккумуляторного напряжения на уровне ничтожных 0,4мВ!
Низкое RdsON также желательно иметь для Q1, чтобы поточнее привязываться к потенциалу общего провода. У мосфетов FDMC8010 от Fairchild с этим тоже всё хорошо. Есть и более низкоомные экземпляры, но в данной конструкции мне были важны ещё и маленькие размеры деталей.
Остальные мосфеты могут быть любыми, желательно только, чтобы у них было поменьше пороговое напряжение открывания.
В качестве компаратора U2 я использовал микромощный ИОУ MCP6V11 от Microchip, который мне приглянулся прекрасной экономичностью – всего 7 микроампер в фоне. Правда, по сравнению с обычными ИОУ он конечно медленный как черепаха (GBW 80кГц и скорость нарастания всего 0,03В/мкс). Но всё равно прекрасно здесь работает. Я, кстати, пробовал ставить сюда и настоящий компаратор со встроенным гистерезисом. Нашёл отличный образец MCP6541, который потребляет в фоне всего 600 наноампер (!), а при срабатывании умеет дёргать выход с силой до 30мА… Но, поставив его напрямую вместо MCP6V11 (их распиновка совпадает), я внезапно получил несрабатывание схемы. Оказалось, что MCP6541 переключается настолько быстро, что скоростной фронт его импульса легко проникает через межэлектродную ёмкость затвора Q2 в цепь контрольного делителя R4R5R6 и попадает на свой же инвертирующий вход. Получается такая динамическая обратная связь, и компаратор не переключается, а начинает генерировать.
Проблема устранится простым добавлением высокоомного резистора между выходом компаратора и затвором Q2, но у меня уже была готовая плата, на которой даже для одного дополнительного маленького SMD-резистора совершенно не было места, поэтому я просто оставил здесь MCP6V11.
Светодиод LED1 нужен только для индикации, когда в аккумулятор льётся заряд. По-хорошему это должно происходить раз в несколько лет… Можно применить абсолютно любой, любого цвета, а можно его вообще не ставить.
Резисторы и конденсаторы самые обычные SMD, к ним никаких требований, кроме маленького размера. Конденсаторы я применил танталовые, lowESR, в корпусах 7343H, но сгодятся любые, лишь бы влезли вместе с платой в отсек аккумулятора (у филипса W732 он размером 55х60х8 мм).
В процессе заряда аккумулятора вся плата первые пару часов прилично греется, градусов до 60. Так как места в отсеке ещё хватало, я намеренно увеличил площадь платы и пошире разнёс на ней греющиеся детали, чтобы они зря не перегревали друг друга и остальных своих соседей.
Плата управления питанием в отсеке аккумулятора
Делал вручную, фоторезистом. ФР-метод позволяет легко получить «техпроцесс» 0,15мм, но у меня почему-то весь текстолит такого дурного качества, что тонкие дороги норовят отвалиться при лужении… Если кто-нибудь знает где можно с гарантией купить хороший качественный текстолит – пишите в комментах!
Итак, смартфон наконец нормально запитан, и работает «как часы» во всех смыслах! Стабильно включается как с питанием от розетки, так и от аккумулятора, работает молча. При подключённом заряднике всегда показывает 100% заряд. Если вынуть из розетки – продолжает спокойно работать от резервного аккумулятора, и вскоре начинает отображать реальное напряжение на нём. При восстановлении сетевого питания опять же молча и спокойно показывает 100% заряд. Всё как надо!
В принципе, через подобную схему можно запитать любой мобильник, у которого по третьему контакту аккумулятора передаётся простое постоянное напряжение.
Цифровые часы для Android
На этом с железом дело было завершено. Настала пора программной начинки. А именно – нужно было получить на экране смартфона большие цифровые часы.
Вот что мне требовалось:
- Максимально крупные цифры! Не люблю щуриться и разглядывать мелкоту издалека.
- Возможность поставить любой шрифт любого цвета. От этого тоже зависит удобочитаемость.
- Эксклюзивность отображения часов на экране – ничего, кроме цифр времени там быть не должно. Никаких прогнозов погоды, предупреждений, сообщений, строк состояния и прочей ерунды – никогда не должно появляться.
- Ясное дело, что экран смартфона никогда больше не должен был гаснуть сам по себе.
- Грамотно работающая функция автояркости экрана.
- Максимальная надёжность работы (я всё таки живу по этим часам). Зависы, фризы – всё это исключено.
Начал я с того, что зарутовал телефон и безжалостно выкорчевал оттуда весь мусор, до которого сумел дотянуться. Всякие гаппсы, блотвара и всё-всё, что не требуется для нормальной загрузки, полетело в корзину. В том числе куча системных приложений, разные утилиты работы с сим-картами, звонилки, эсэмэсеры, браузеры, календари, обои и прочая ерунда. Пару раз даже переборщил – телефон зациклил ошибками. Но я всё восстановил и опять зачистил.
Потом долго искал в интернете нормальную программу полноэкранных цифровых часов для андроид. Несмотря на целую гору подобных программ, практически ни одна мне не подходила! Все разработчики поголовно стараются напихать в свои изделия кучу ненужного – начиная от какого-нибудь весёленького фона (неотключаемого), и заканчивая прогнозами погоды, новостями, календарями и прочим подобным мусором. Про доставшую уже всех всплывающую рекламу я вообще молчу… Мне от часов нужно было только время!
А ещё всеобщая особенность часовых программ и виджетов – совершенно неэкономное использование площади экрана. Циферки везде маленькие, а отступы от краёв экрана огромные. У моего филипса и так-то экран не самый большой – всего 4,3".
Короче, нашёл практически единственную подходящую программу – Big Digital Clock 1.1.1.
Скриншот Big Digital Clock
У неё самые большие цифры. И всё равно им ещё далеко до полного использования площади матрицы. Из достоинств программы – возможность убрать с экрана всё, кроме времени, возможность выбрать любой цвет, 24-часовой формат, немигающее разделительное двоеточие, любая ориентация экрана и автоматическое поддержание негаснущей подсветки. Из недостатков – намертво вшитый шрифт, имитирующий типовой семисегментник.
Поставил её и начал повседневное использование. Сначала всё было хорошо – цифры вроде крупные, видны нормально, а после моих старых часов – вообще небо и земля! Но вот, где-то через месяц непрерывной работы я внезапно заметил, что время на них застыло и не меняется! Что за ерунда!? Решил проверить – это разовый глюк или «особенность» программы.
Перезапустил часы, и уже через пару недель фриз повторился. Показания времени просто перестают обновляться. Вместо этого программа произвольно отвисает каждые 7...10 минут, обновляет показания часов и снова впадает в ступор. Понятно, что такая «надёжность» меня не устраивала.
Автоматизаторы Android и их «фишки»
Так как это была практически единственная подходящая программа, мне пришлось начать придумывать к ней костыли. Решил, что нужно поставить какой-нибудь автоматизатор андроида, чтобы он периодически перезапускал глючную программу часов ещё до того, как она успела бы зависнуть. Поставил Tasker. Возился, разбирался – но что-то не понравился он мне… Поменял его на Automagic. Кто не в курсе – этот автоматизатор применяет построение сценариев на основе визуальных блок-схем. И вот эта его особенность мне очень даже приглянулась!
Представление сценариев автоматизации в виде блок-схем Automagic
Функцию периодического перезапуска моей глючной программы часов я реализовал практически сразу. А потом ещё поставил Automagic на свой основной рабочий смартфон и на неделю завис в интереснейших экспериментах с ним. В итоге понаделал себе в телефоне множество полезностей для повседневной жизни.
Но главное оказалось не в этом. Я набрёл в свойствах Automagic на такую фишку, как Custom Widgets. И тут оказалось, что с её помощью можно нарисовать и «оживить» практически любой самодельный виджет, на который только хватит фантазии и функционала программы! Тут я и смекнул, что могу нарисовать себе такие часы, какие только душе угодно! Да ещё в справке по программе как раз описывался пример создания виджета часов.
Через пару дней всё было готово в самом лучшем виде! Благодаря ланчеру Nova, я имею возможность растягивать виджеты хоть до самых границ матрицы. Также я скрыл док-бар и статусную строку, освободив экран от всех элементов интерфейса. И вот что в итоге – по-настоящему огромные цифры, касающиеся самых границ дисплея… Наконец-то доволен!!!
Наконец-то цифры занимают ВСЮ ширину экрана!
Применение Automagic позволило удовлетворить все мои требования. Можно поставить любой .ttf или .otf-шрифт. Можно в любой пропорции поджимать и растягивать символы, чтобы идеально вписать их в экран. Наконец, можно иметь только то, что нужно! Я даже разделительное двоеточие в часах не стал рисовать – с простым пробелом всё прекрасно читается. В применении каких-либо внешних программ и костылей сразу отпала всякая необходимость.
Более того, теперь мне не требовался даже Locus, чтобы периодически фиксить GPS-координаты для синхронизации времени. Всё это прекрасно умеет любой автоматизатор. В сценарии управления можно реализовать практически всё, что нужно. К примеру, поддержание экрана в негаснущем состоянии.
Далее вообще пошли заморочки с разными полировками внешнего вида. А почему нет, если всё это можно легко реализовать?
Например, при выборе размера и фактора ширины шрифта нужно исходить из 4-символьного формата времени (ХХ: ХХ). Но в период времени с 0:00 до 9:59 цифр на экране только три, они занимают меньшую ширину, чем четыре, и тем самым используют матрицу не полностью. Мелочь, но некрасиво. С помощью Automagic дело легко решается парой дополнительных команд. Он имеет функцию, позволяющую менять почти любой параметр custom-виджета на лету. В данном случае это фактор ширины (сплюснутость) символов шрифта, которую я задал изменять по срабатыванию триггера вышеуказанных интервалов времени. Работает!
Три и четыре символа вписаны в один и тот же размер экрана
Фактор ширины шрифта меняется «на лету» при переходе от 9:59 к 10:00
и обратно от 23:59 к 0:00
Фактор ширины шрифта меняется «на лету» при переходе от 9:59 к 10:00
и обратно от 23:59 к 0:00
Ещё у меня сначала были сомнения по поводу момента обновления показаний часов, происходящих каждую минуту. Я опасался, что Automagic будет обновлять виждет не синхронно со сменой минут системных часов смартфона, а произвольно, внося таким образом случайную погрешность в течение минуты. Стал проверять…
В Automagic для реализации времени в custom-виджете есть два различных способа. Можно в обычное текстовое поле виджета посылать числовые значения внешним action-событием. Для каждого такого события как раз есть специальная опция «At fixed time», означающая, что отсылать нужно именно синхронно с моментом изменения системного времени.
А второй способ проще – он не использует внешних скриптов и заключается во вписывании прямо в нужное текстовое поле виджета функции системного вызова типа
{getDate(),dateFormat,HH:mm}
Но здесь уже нет такой опции «At fixed time». Виджету просто ставится галочка «Automatically refresh» и задаётся «Refresh interval» ровно в одну минуту. И тут уже мои опасения как раз и заключались в том, что этот интервал самообновления виджета в одну минуту может отсчитываться произвольно относительно временнóй «сетки» смены минут системного времени. Я провёл пару экспериментов, но мне на радость оказалось, что всё в порядке. Виджет самообновляется чётко сразу же, как только сменяется показание минут системных часов!
Независимо от того, в какой момент времени виджет начал работу.
Автояркость экрана
Следующее, что хотелось сделать – хорошую чёткую автояркость экрана. Встроенная автояркость на моём старом филипсе работала ужасно. Дёрганая, неадекватная и с очень узким диапазоном. Здесь я не стал заморачиваться и поставил одну из множества программ автояркости. Сначала попробовал Lux, но мне не понравились какие-то не интуитивные настойки и запутанные профили. Поменял на Velis, и это оказалось то, что надо. Что мне особенно понравилось – Velis даёт возможность рисовать настоящую кривую зависимости яркости от показаний люксометра и в реальном времени показывает на этом графике как смартфон регулирует по нему яркость. Можно настроить любой о-очень плавный закон изменения яркости и конечно же любое её значение, вплоть до 1%, когда экран уже почти не видно. Очень удобно ночью, когда цифры должны еле-еле светиться.
Пока я обкатывал новые часы, заметил, что матрица смартфона даже с абсолютно чёрным фоном экрана всё равно прилично светится пробивающейся сквозь неё подсветкой. Особенно это заметно в полной темноте – прямоугольник экрана хорошо видно в виде серого фона, что-то типа glow-эффекта. Я решил исправить это внешним светофильтром. Цвет цифр часов я выбрал красный, т.к. красный цвет я чётче всего вижу издалека.
Первый светофильтр я изготовил вручную – напечатал на струйном принтере на прозрачной плёнке сплошную красную заливку и сложил два ещё сырых отпечатка чернилами друг к другу. Плёнки надёжно прилипли и получилось хорошее прозрачное «стёклышко» густого красного цвета. Кстати, сейчас такой лайфхак уже не прокатит, банально потому, что у меня на работе заменили абсолютно все струйные принтеры на модные лазерные МФУ. На бумаге они печатают прекрасно, но получить с их помощью прозрачную цветную заливку на плёнке невозможно – будет шумный матовый слой, сквозь который ничего не видно.
Но я тут как-то зашёл в Комус за карандашами, и случайно увидел вот такую штуку:
Фото
Это обычный офисный лоток для бумаг, но посмотрите из чего он сделан. То ли оргстекло, то ли прозрачный пластик, но именно такого цвета и светопропускания, какой мне нужен для фильтра. Купил, аккуратно вырезал из него пластинку по размеру экрана и приспособил. Красота!
С красным светофильтром
Заключительные штрихи
В принципе, на этом превращение старого ненужного мобильника в отличные красивые часы можно считать законченным.
Правда я ещё до кучи заморочился тем, что в редакторе шрифтов немного поменял .otf-шрифт, чтобы символы были такими, как мне хотелось, вплоть до малейших изгибов. Мелочь, но приятно! Также пришлось сделать шрифт моноширинным, чтобы при смене символов строка не съезжала и не залезала за границы дисплея. Использовал один из опенсорсных шрифтовых редакторов, Glyphr Studio.
Ну и в конце концов осталось только закрепить всю конструкцию на полке в углу комнаты. Здесь большой простор для творчества. Я просто согнул Г-образную полоску алюминия и аккуратно прикрутил к ней заднюю крышку смартфона винтиками. Другой конец привинтил к полке. Можно вращать, устанавливая любой угол обзора. И немного сгибать-разгибать алюминий, регулируя угол по вертикали. На деле я вообще как установил всё, так больше и не трогаю.
Резервный аккумулятор приспособил в месте изгиба крепёжной полосы. Здесь я обошёлся без изысканного дизайна, там сзади ничего не видно. Также не стал заморачваться с какими-либо клеммными контейнерами для аккумулятора, а просто осторожно припаялся прямо к металлическому корпусу 18650 в тех местах, которые не примыкают к внутреннему содержимому аккумулятора, чтобы не перегреть его паяльником.
Все соединения сделаны обычными проводками, пущенными через насверленные дырочки в задней крышке смартфона. А внутри я точечно подпаялся прямо к деталям и дорожкам платы смартфона.
Всего от конструкции идут два внешних провода: питание 5В от сетевого зарядника и кабель GPS-антенны, идущий к окну и приклеенный там на стекло скотчем.
Часы уже почти год радуют меня большими красивыми цифрами, точным ходом и бесперебойной надёжной работой.
А ещё ради прикола я нарисовал второй виджет часов – для вертикального расположения смартфона.
Горизонтальные и вертикальные часы в одинаковом масштабе
Его я стал изобретать по той причине, что цифры при таком нетрадиционном расположении можно сделать ещё крупнее, то есть полезное использование площади экрана получается максимально возможным. К тому же в этом случае исчезает необходимость изменять фактор ширины символов каждый раз при переходе от формата времени X:XX к XX:XX и обратно, так как всё всегда влезает автоматически.
Правда почти все, кому я показывал такие нестандартные вертикальные часы говорили «фууу, горизонтальные лучше!». Ну, это дело на любителя, лично мне нравятся и те и другие.
На этом всё. Всех, кто читал, благодарю за внимание!