PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Разработка устройств (http://pccar.ru/forumdisplay.php?f=18)
-   -   Чтение клавы магнитолы --> эмуляция USB клавы/мыши (http://pccar.ru/showthread.php?t=16958)

AngelOfGrief 09.03.2012 02:42

Чтение клавы магнитолы --> эмуляция USB клавы/мыши
 
Приветствую.

В общем, имеется магнитола Becker, есть желание подключить штатную клаву к девайсу на Андроиде.

Опрос клавиш у магнитолы как положено динамический. В Андроиде мудрить особо ничего не хочется и хочется сделать девайс универсальным. Поэтому идея такая: берем микроконтроллер, на нем пишем прогу, которая будет считывать динамический опрос клавы магнитолы (это несложно, нужно взять матрицу по X, смотреть когда проц магнитолы выставляет там нужные уровни, и читать матрицу по Y, выявляя, соответственно, нажатые клавиши) -- это решение тоже будет универсальным для всех магнитол. Опционально можно считывать код нажатой клавиши с проца магнитолы (т.к. именно в моей магнитоле есть выход data link на внешний блок навигации, предполагаю, что коды нажатых кнопок туда передаются по одному проводу).

Далее, микроконтроллер должен иметь USB slave порт с программируемым ID, чтобы его можно было закосить под стандартную USB keyboard или USB mouse. Коды кнопок, считанных с магнитолы передаем туда, используя таблицу соответствия (должна настраиваться в прошивке).

Девайс можно будет использовать практически с любой магнитолой и с любым carPC, независимо на какой ОС он работает, лишь бы был USB.

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

Есть конечно микроконтроллеры со встроенным USB->COM (та же Ардуина), но это немножко не то... Да и софт придется писать для Андроида, а хотелось бы просто эмулировать клаву USB.

Либо например есть такой чип:

http://www.datasheetcatalog.org/data...3/135595_1.pdf

Он уже сам по себе есть USB клава. Может быть с микроконтроллера на него сигналы посылать? В принципе, он должен быть в любой USB клаве, можно просто оттуда выпаять...

Ах да... Можно просто взять данный чип и зафигачить мультиплексоры для клавы мафона, переключаяя ее между мафоном и этим чипом. Тогда можно вообще обойтись без микроконтроллера, правда коды клавы будут хрен знает какие, да и как-то по-ламерски это. :)

Но вообще, хочется конечно простого решения, чтобы быстро и легко. :)

AngelOfGrief 09.03.2012 02:56

А вот я уже что-то сам нашел...

PIC18F2550

Вот здесь человек написал программу для эмуляции USB клавы:

http://www.picbasic.co.uk/forum/showthread.php?t=8291

Я правда ни разу не писал под PIC... Но там на бейсике. :)

St@rz 09.03.2012 06:11

Может это поможет еще.

AngelOfGrief 09.03.2012 12:11

Да, это пожалуй и есть то что нужно, спасибо. :)

В вольтмастере 330р стоит этот м/к:

http://www.voltmaster.ru/cgi-bin/qwe...2453&group=170

А чип-дипе -- 1000р!!!! Все, завязываем с чип-дипом. :angry:

AngelOfGrief 10.03.2012 00:31

Купил, собрал, прошил микроконтроллер (правда без бутлоадера как у Стансона, потому что его бутлоадер написан под *никс, а у меня его под рукой нету). Можно напрямую шить, работает. Софт взял WinPic800, программатор на LPT порту, вот этот:

http://products.foxdelta.com/art2003.htm

Только почему то не снимается LVP бит, да Бог с ним, замкнул ногу 26 на землю.
У Стансона задумано, что после прошивки бутлоадера режим LVP отключается навсегда.

Можно было использовать виндузовый бутлоадер, но искать было лень.

В результате... Все запустил, светодиодик мигает, команды выдаются на USB интерфейс виртуальной клавы... Проблема в том, что в моей магнитоле клава оказалась не резистивная, в ней используется просто матрица с опросом, причем их три штуки. :( Щас буду смотреть, на разъеме есть data link для блока нави, возможно, туда отсылаются коды нажатых кнопок, будем раскодировать и переписывать стансоновскую прогу.

В любом случае, старт оч. неплохой, спасибо! PIC крутой реально: может эмулировать сразу несколько девайсов на USB шине!

AngelOfGrief 10.03.2012 16:06

В общем, в магнитоле отдельный небольшой проц отвечает за обработку всей клавы. Нашел выход где он выдает код, сейчас пока смотрю его через комп в режиме RS-232, пытаюсь подобрать скорость и параметры. Если получится, можно будет сразу задействовать готовые либы PIC для RS232 и все должно получиться несложно.

AngelOfGrief 10.03.2012 23:13

Вложений: 1
Сегодня весь день потратил на попытки доработать Стансоновский софт, но пока безрезультатно. Во-первых, полдня промучился с бутлоадером, наконец настроил, работает. Оказывается, все это непросто так с пустого места запустить. Вот, сразу выкладываю бутлоадер и драйвер и софт для заливки. Чтобы залить в микроконтроллер сам бутлоадер, потребуется программатор.

Проблема со стансоновским софтом, что у него все написано под *никс и у меня не получается собрать его прошивку под виндой.

Сейчас пытаюсь настроить MPLAB IDE и загрузить в него микрочиповские примеры для эмуляции HID клавы...

p.s. Последняя версия бутлоадера не в архиве, а отдельно - MCHPUSB_2550.hex. В архиве тоже полурабочий: не умеет прошивать config микроконтроллера.

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

Бутлоадер нужен для упрощения загрузки программ микроконтроллер, чтобы не дергать его каждый раз на перепрошивку. Но сам бутлоадер надо хотя бы раз прошить программатором. Один раз можно для этого к другу сходить у кого он есть. :) Либо использовать софт WinPic800 и программатор ART2003, который работает на LPT порту под Windows - в нем практически нет деталей, один резистор и один кондер. :)

AngelOfGrief 11.03.2012 20:50

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

Найденная мною программа успешно скомпилировалась в MPLAB под виндой (она была под другой проц, пришлось править до фига...), на данном этапе мой девайс умеет печатать символы через USB как клавиатура. Подрубил уже с другой стороны к магнитоле, пытаюсь теперь для PIC написать функцию, которая будет читать и расшифровывать коды мафоновских кнопок. Когда заработает, останется составить таблицу соответствия... И ВСЕ! :)

Кстати, выяснил, что в андроиде (по крайней мере на тукане) на клаве есть эквиваленты всех служебных кнопок: НАЗАД, ДОМОЙ, НАСТРОЙКА, ПЛЕЕР, ПОЧТА. Они назначены на функ. клавиши. Так что у меня на магнитоле будут эти кнопки, УРА! Вверх/вниз назначу на энкодер, а ENTER -- на нажимаемую крутилку энкодера.

AngelOfGrief 12.03.2012 02:33

Ну что... Сделал я, заработало! Боялся очень, что на андроиде не будет пахать (проверял же на ПК), но USB есть USB! :) Некоторые клавиши работают неправильно, видимо наши друзья из тукана на своем пульте функц. клавиши некоторые поменяли местами. Подключу щас к андроиду обычную клаву и проверю.

У меня только не совсем получилось написать процедуру декодирования кодовых посылок магнитофона, в общем в 10% случаев нажатия кнопок пропускаются. Кварц на 4мгц маловат, надо другой, а эти деятели (создатели магнитолы) почему-то изволили передавать данные из проца клавиатуры на скорости около 260 кбит. Зачем это было нужно, конечно вопрос. :)

Но вцелом выглядит круто! :) Можно теперь пользоваться магнитолой без пульта. Работают кнопки домой, Enter, отмена, настройка, стрелки курсора, вызов области уведомлений (F3).

Не придумал как прикрутить кнопки к запуску навигации и плеера. По клавише F6 родной клавы вызывается встроенный плеер. Это не та F6 что в обычной клаве (коды отличаются почему-то).

Мож выложу видео попозже. Ну и исходники разумеется.

AngelOfGrief 12.03.2012 02:57

Так и есть: поключил к тукану обычную usb клаву, у нее функ. клавиши частично не совпадают с его родной беспроводной клавой. Кто-нибудь знает где можно взять USB скан-коды, которые использует Android или где они у него хранятся? Нужны именно USB скан-коды, не коды символов и не обычные скан-коды клавиатуры. Вот кусочек моей программы:

if (n=='H') return 0x3B; // F2 home
if (n=='A') return 0x3f; // F6 audio/player
if (n=='N') return 0x3e; // (F5) navi
if (n=='L') return 0x50; // left
if (n=='R') return 0x4f; // right
if (n=='U') return 0x52; // up
if (n=='D') return 0x51; // down
if (n=='E') return 0x28; // enter
if (n=='B') return 0x29; // ESC back
if (n=='S') return 0x3a; // F1 settings
if (n=='F') return 0x3d; // F4 find/search
if (n=='O') return 0x3c; // F3 notification area

То, что возвращает функция, USB скан-коды. Не работает F6, F4 и F5.

AngelOfGrief 14.03.2012 01:36

В общем, дописал функцию энкодера... Несложно. Если его пины подключить к двум битам, он выдает последовательность 0 1 3 2. Двойку с тройкой меняем местами, получается 0 1 2 3. Далее, вычитаем, если разность 1 или -3, то вращение в одну сторону, если -1 или 3, -- в другую. Просто Стансон там какую-то целую таблицу забабахал для этого. :)

Теперь PowerAMP управляется прям четко: ручка-энкодер и она же enter! Мечта!

Собирать все буду теперь...

AngelOfGrief 19.03.2012 01:49

Вложений: 1
Выкладываю исходник, прошивку .HEX и бутлоадер. Написал там небольшой readme, по идее тому кто знаком с программированием несложно будет переделать эту программу под кнопки другой магнитолы. Кстати, обработка энкодера работает и ее можно использовать с любой магнитолой даже в текущей прошивке.

Долго бился: девайс вис после перезагрузки тукана. Добавил в два места вылет по таймауту, а также отслеживание CONFIG_STATE (т.е. если хост перестал поддерживать USB девайс). Перезапускаем проц с обязательной очисткой регистра USBCON -- теперь все четко! У тукана какая-то проблема с перезагрузкой, после нее перестает работать часть USB девайсов, wifi свисток например. А мой девайс теперь гордо рестартует и работает! :)

AngelOfGrief 22.03.2012 02:29

Алгоритм чтения клавы переделал, там оказалась 2-х проводная шина (DATA и STROBE), а я пытался своим гениальным алгоритмом прочитать код кнопки только через DATA. ;)

Вопрос теперь в следующем, как заменить приложения, которые андроид вызывает по умолчанию? Файлы layout доработал как надо (почему то часть функ. клавиш тупо не работает), теперь имею: по нажатию клавиш магнитолы, которые назначены на функ. клавиши у меня запускается: стоковый плеер (music.apk), просмотрщик видео (videoplayer.apk), почта (email.apk), итд. Для них соответственно в файле layout команды MUSIC, VIDEO, EMAIL.

Вопрос такой: как мне вместо этих программ назначить другие? Хочу PowerAMP вместо music.apk, Яндекс.Карты вместо видео плеера итд итп. Обыскал весь инет, везде пишут, что надо зайти в Applications и там изменить Launch by default, но это действует для скачанных программ, а для тех, что по умолчанию как? Где-то должен быть конфиг файл с путями запуска этих приложений, но я не могу найти, подскажите? ....

AngelOfGrief 23.03.2012 00:57

Вложений: 1
В общем, я сегодня чуть ни весь день потратил, уже голову сломал... Я не могу найти где находятся настройки какое приложение вызывается при нажатии на хард-клавишу, прописанную в keylayout. Например, почему по коду MUSIC он запускает music.apk, а не что-то другое? Даже написал в xda-developers, весь день прошел, тишина...

Вот софтину нашел, вроде меняет именно запускаемые приложения по хард-клавишам, но у меня не работает. :( Прилагаю, попробуйте, может кому пригодится... DreamKeys называется.

Пробовал чисто на удачу заменить music.apk на apk от PowerAMP, вылетает с ошибкой. Видимо, его надо переименовать прежде чем устанавливать, но это какой-то кривой путь, я так не хочу! Вообще, именно таким образом IconBIT заменили браузер в последней прошивке, он под тем же именем, но размер другой. :)

Еще выяснил, что некоторые клавиши не работали из-за того, что были дважды назначены в keylayout, а так делать нельзя. Например:

key 67 HOME
...
...
...
key 67 VOLUME_UP

HOME не будет работать.

И еще, смысл этого файла оказывается просто в конвертации кодов клавиатуры. Т.е. 67 - Linux-код клавиши, а VOLUME_UP - код Андроид-клавиши. Т.е. это типа #define' ы.

Скоро я уже дойду до того чтобы самому написать такую программу, но надо чтобы она работала не только когда она активна, а всегда. В винде это называется hook (когда перехватываешь системную процедуру и данные пропускаешь через свою), в Андроиде не знаю как... Может тупо с девайса клавиатуры читать в /dev ??

AngelOfGrief 23.03.2012 18:22

Пришла в голову такая идея для запуска приложений по горячей клавише: запустить скрипт из командной строки, который будет читать данные из станд. устр-ва клавиатуры и запускать нужные приложения. Для запуска андроид-приложений из шела есть команда 'am', вот описано:

http://learnandroid.blogspot.com/200...m-command.html

Пример строки:

am start -a android.intent.action.MAIN -n com.iftitah.android.contact/com.iftitah.android.contact.Contact

com.iftitah.android.contact - название приложения,
com.iftitah.android.contact.Contact -- как я понял, activity который надо запустить
в данном приложении.

AngelOfGrief 24.03.2012 03:03

Как я отписал в другом топике, приложения запускаются.
Например,

am start -n com.maxmpz.audioplayer/.PlayListActivity

запускает PowerAMP.

Теперь надо найти стандартный /dev клавиатуры и читая оттуда коды кнопок,
запускать нужные приложения при помощи .sh файла -- вот такая идея.

Потому как gcc под андроид готового вроде нету: люди пробовали, говорят тормоза страшные и памяти мало для работы компилятора. Говорят, нативные приложения лучше на компе писать.

AngelOfGrief 24.03.2012 03:11

Хм, получается вроде event2 и event4 - две мои USB клавиатуры, но только cat /dev/input/event4 выдает непонятный мусор... причем по несколько байт на одно нажатие.

AngelOfGrief 24.03.2012 03:21

Нашел, надо использовать утилиту getevent, она при нажатии клавиш клавиатуры выдает разумные коды и даже показывает с какого устр-ва event* они пришли.

Осталось .sh файл сочинить, чем займусь завтра. :) Придется форумы курить, я в них не силен...


Часовой пояс GMT +4, время: 04:42.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot