РадиоКот >Схемы >Цифровые устройства >Примочки к ПК >

Теги статьи:

Доработка гарнитуры для смартфонов на базе OS Android: от идеи до реализации.

Автор: Chekhov
Опубликовано 21.09.2011
Создано при помощи КотоРед.
2011

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

Пролог

      История создания данного девайся тесно связана с событием из моей жизни - появлению у меня другого современного девайса - смартфона на базе OS Android - LG P500. Немного боялся, что трудно будет справиться с таким "зверьком", не превратив его в одну большую игрушку, но на деле ничего страшного. Т.к. данный телефон является маленьким компьютером, то позволяет устанамливать множество софта, коего полно в одноимённом маркете. Одна из самых нужных, как ни странно, программ - mp3 проигрыватель. Тому есть несколько причин:

1) зачем носить и телефон и плеер ?

2) Слушаю я в основном в направлении дом <-> работа, где много шума, поэтому тот факт что звучание у моего  "зверька" не на высшем уровне (не знаю почему, но очень шумит усилитель) меня не сильно тревожит.

      Так я и начал ходить с телефоном вместо плеера. Но не будем забывать об существенных отличиях классического плеера и современного телефона (при рассмотрении на роль плеера). О чём же речь?....  А ответ прост - наличие кнопок для переключения треков и т.д.. К сожалению, телефон обладает сенсорным экраном и не имеет специализированных кнопок, что меня очень озадачило, ведь не буду же я всё время держать телефон или доставать его из кармана каждый раз (ну ленивый я кот). Вот и захотелось мне ещё больше приручить своего "зверька". Мысль была проста - хорошо бы иметь гарнитуру не с одной кнопко для приёма звонков, а с большим их числом.

Зароджение идеи

      Итого, как вы сами понимаете, начал я продумывать варианты. Первым вариантом было изучено наличие таких гарнитур в интернет-магазинах своего города. Отмечу, что среди блютутс гарнитур я искать не пытался, т.к. мне дорога возможность самому в будущем выбрать наушники, которые мне удобны, поэтому искал только среди проводных. Честно говоря, я был немного обескуражен тем, что я не нашёл ровным образом ничего подходящего. Было, кажется, что-то подобное для телефонов HTC, но при дальнейшем изучении вопроса стало понятно, что их гарнитуры не являются универсальными. Всё наводило только на одну мысль - такой гарнитуры просто не существует как таковой, либо она труднодоступна (специализированные и доступные для покупки гарнитуры для LG я тоже, естественно, изучил). Полазив по форумам, узнал, что внутри родной рагнитуры (не хотел разбирать из-за гарантии) всё довольно просто - разьём имеет 4 контакта, 4-й дополнительный контакт идёт к микрофону, который стоит параллельно той самой кнопке для принятия вызова. Раз у HTC есть специализированные гранитуры, а число контактов не может быть увеличино, значит подключается она так же. Значит, в железной части телефона есть что-то, что позволяет "принимать" команды от нажатия кнопок. Мысль простая, но верная. Так я решил во что бы то ни стало раскопать поглубже возможности своего телефона.

      Найдя свободное время, я принялся за "расследование". Отправной точкой для меня стало то, что я взял мультиметр (осциллографом, к сожалению, не обладаю) и попытался посмотреть, что же твориться на этом загадочном четвёртом выводе при подключенной и отключенной гарнитуре. Результат оказался немного обнадёживающим - на нём оказалось порядка 1.7-1.8 вольт, а при замыкании его на "землю" (как при нажатии той самой кнопки) я получил аж 0.6-0.7 миллиампера. Следующей точкой стал мануал по ремонту данного телефона, скачанный с простор нашего интернета и содержащий полную принципиальную схему данного аппарата.

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

      При просмотре настроек выбранного мною mp3 проигрывателя я обнаружил настройки гарнитуры, причём проводной. Заключались они в том, что проигрыватель умел слушать быстрые, подряд идущие нажатия той самой кнопки и совершать при этом пару простых действий - следующий трек или следующая папка, не суть важно. Их было мало, но мысль уже созревала - а что, если самому имитировать несколько нажатий подряд ? Вот оно ! Такое решение как минимум бы упростило мне жизнь, не заставляя меня постоянно тренироваться в нажимании 3 раза (допустим) подряд несчасной кнопки. Я немного увлекаюсь программированием микроконтроллеров, поэтому стал думать именно в этом направлении. (Читатель, вероятно уже понял, как же я в очередной раз захотел "припахать" всеми любимые МК).

Реализация

      Как вы помните, я измерил некоторые электрические величины, которые мне может предоставить мой телефон. Положив их перед глазами, я начал рыться в мануалах по AVR. Было выбрано симейство Tiny, которое потребляет меньше всего. Вообще, любой мануал в главе про минимальные параметры говорил мне примерно следующее  -  1.8V на 0.2-0.3 миллиампера для нормальной работы МК. Если быть чесным, то у меня столько нету, по крайней мере по напряжению совсем впритык получается. Тут многое ещё зависит от источника тактового сигнала, ведь чем меньше частота, тем меньше энергии надо нашему МК, да и доступ к EEPROM нам не нужен. Короче, надо пробовать. В ближайшие выходные были куплены и подопытные - 2 х ATiny13V. Взял я их по двум критериям - напряжение и возможность писать программу на С.

      Особо не мудрствуя, было нарисовано несколько вариантов схем:

1 вариант (используются внутренние подтягивающие резисторы)

2 вариант (используются внешние подтягивающие резисторы)

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

Великая и ужасная "макетка":                                                                                   Адаптер для параллельного программирования:

 

          Согласитесь, что "крепление" МК чересчур сложное, но поверьте, что я об этом ничуть не пожалел - МК остаётся без пайки и его смело можно вытащить из разьёма. Вот тут оставлюсь подробнее. Всё дело в том, что путём проби ошибок была выбрана частота внутреннего генератора в 128 КГц - самая маленькая. Сам я пользуюсь программатором HWPROG, который не поленился спаять несколько лет назад. Он умеет программировать МК в параллельном (высоковольтном) режиме. Изначально я всё время вытаскивал МК и ставил его на соотв площадку, как видно выше. Потом я решил облегчить себе жизнь и впаять на макетку штырьки под ISP разьём (тоже видно на фото). Но меня ждало разочарование - в ISP программатор никак не хотел прошивать МК. Прошивалось в AVRStudio. Прогамма не видила МК, пока я не опущу частоту шины до самой маленькой, но когда сигнатура МК наконец распознавалась, шиться он уже не хотел. STK 200/300, как и менять скорость на COM поре, я не пробовал. Поэтому предупреждаю, если кто-то будет повторять, сначала заливайте прошивку, а только потом меняйте фьюзы, иначе можете получить "непрошиваемый" для себя МК.

      Далее возник, вообще говоря, банальный вопрос - а как же протестировать это "творение". Оно дело - эмулятор, но он вряд-ли сэмулирует мне всю обстановку, тем более я им пользуюсь очень редко. Осциллографа тоже нету. Вспомнил я про то, что можно испльзовать звуковую карту для компьютера в качестве простенького осциллографа. Но мысль пошла дальше - а что , если некие умельцы уже написали нечто подобное под Android? Так оно и оказалось - была найдена бесплатная прогрммка OsciPrime. И начались танцы с бубном, чтобы добиться устойчивой работы МК и выполнения им отведённой задачи. А задача проста - при нажатии кнопки нужно замыкать вход на землю, имитируя нажатия кнопи несколько раз. Пока я вовсю шаманил, меня поситила немного другая идия - в проигрывателе настраиваемых таким способом действий чересчур мало, замыкать вход, отрезая себе питание, приходится надолго, может быть есть похожие, но другие способы ?

     Как говориться в одной книге, <всё что угодно> + <компьютер> = <компьютер>. При пользовании ранее найденным осциллографом я подумал: раз есть такая программа, значит и я могу написать подобную, не анализирующую "нажатия" одной кнопки, а слушая "микрофон", т.к. моя схемка подцеплялась как раз вместо него да и осциллограф был расчитан на то-же самое. Тогда я смогу генерировать обычный меандр определённой частоты, "слушать" его так же, как это делает осциллограф, определять частоту и неким образом уведомлять проигрыватель, что пора бы "песню заводить"  и т.д. Было решено дальше двигаться в этом более, как мне показалось, перспективном направлении. А тут заодно и 2 радостных события - день рождения Кота и конкурс. Это существенно придало мне сил и желания сваять готовое изделие.

      Итак, начался самый ужасный этап - программирование и более тесное знакомство с Android"ом. С одной стороны всё кроме джавы (основного языка для разработки) незнакомое, с другой - нелюбовь к программированию визуальных интерфейсов, на которых тут всё построено. К сожалению, всё это (хотя не всё ещё доделано и обкатано) съело огромное количество времени и нервов, без валерьянки бы не выдержал. Конечное приложение должно было содержать как минимум следующее: механизм прослушки микрофона и определения частоты именно меандра, а не какого-либо другого сигнала, настройку соответствия этих частот и предпринимаемых действий, сервис, который бы всё это делал, когда главное окно приложения свёрнуто (есть тут такой нюанс - простое приложение работает только когда его окно сейчас является главным, как только его сворачиваешь, операционная система его приостанавливает и сохраняет состояние, т.е. оно делать уже ничего не может. Дабы это преодолеть, существует отдельный подкласс приложений - сервисы, которые могут осуществлять фоновые (background) действия ), и собственно говоря, сам механизм посылки проигрывателю команд. Как ни странно, последнее является самым важным. Думать я стал над этим где-то в середине, но когда дошло до реализации, стало понятно, что всё очень плачевно.

      Изначально у меня была идея, основанная на опыте программирования под Windows, где довольно просто можно посылать всякие события, типа "была нажата клавиша X", определённому придожению / окну. В телефоне как раз есть подобный набор событий даже для несуществующих кнопок "старт/стоп" "вперёд" и т.д. Но тут я встретил перед собою действительно бетонную стену. Вообще говоря, такой подгод является "нелегальным", т.к. не отвечает требованиям безопасности. Но ведь должны же быть всякие примочки для тестирования приложений. Они есть, но потиху урезаются из базовых библиотек с ростом версии операционной системы. Преодолев и эту попытку запретить мне делать, что я хочу, я "научил" свою софтинку посылать по нажатию кнопки с моей макетки определённое событие. Всё шло просто замечательно, пока прямо перед написанием статьи, за день до конца подачи заявок, я не обнаружил следующее: события посылались лишь тогда, когда главное окно моей программки было активно, но как только я его сворачивал, то всё заканчивалось. События по прежнему слал мой сервис, но всё время приходили ошибки системы безопасности, которая не давала мне осуществить задуманное. К сожалению, поиск в интернете о методах решения данной проблемы пока что ничего не дал, хотя я и сам уже понял, что так должно и быть, ведь если нет, то любая драгая программа, которую вы установите, также без вашего ведома может что-то нажимать.

Результат

      Какой бы не казалась безвыходной ситуация, для меня всё должно закончится не так печально. Всё дело именно в том, какой проигрыватель использовать. Не буду рекламировать, но использую я PowerAMP - и так довольно извесный. А самое вкусное тут то, что разработчик не поскупился внедрить в него свою собственную, "легальную" систему прослушки дополнительных событий от операционной системы и на своём сайте разместил готовые примеры, как ими воспользоваться. То есть, мне потребовалось лишь заменить метод доставки сообщений проигрывателю. Да, универсальность сразу теряется, но лично моя цель становится достигнутой. Сейчас я на этом остановился, но я думаю, что это ещё не последнее слово. Дело в том, что сейчас вдобавок к джаве, стало возможным писать часть кода на C++, так как работает он значительно быстрее и ближе к линуксу, на котором андройд и основан. Это открывает дополнительные возможности, но требует намного более тщательного разбирательства, которое я всё равно проведу чуть позже, а пока мне и самому приходиться довольствоваться полученным.

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

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

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

Вопросы как обычно на https://radiokot.ru/forum/


Файлы:
Проект и файл прошивки для МК


Все вопросы в Форум.