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

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

Alex_St 11.10.2013 13:53

Многофункциональная USB клавиатура
 
Вложений: 1
Выложу и я свой вариант USB клавиатуры с расширенной функциональностью )

Дело было вечером. Заняться было чем, но в результате установки круиз-контроля в мою машину оказалось, что у меня есть два свободных провода из недр руля наружу через специализированную контактную группу в виде спирали. А у меня в руле уже давно сидят два ИК пульта управления компьютером и магнитолой. Плюс еще проводной пульт управления Круиз-Контролем. Так получается, что в силу ИК принципа передачи сигнала на фотоприемники компа и магнитолы - при незначительном повороте руля (больше 20градусов) - сигнал перестает достигать цели. А тут еще Костя740 поделился информацией о либе V-USB.
В общем - было принято решение начать работы по передаче команд с руля по проводам.
В качестве системы кодирования были выбраны резистивные кнопки. Т.е. нажатая кнопка определяется по сопротивлению между двумя проводами. Подключать к компьютеру было решено по USB, эмулируя стандартную и мультимедийную клавиатуры.
Но тут полет мысли опередил разум, и понеслось....
Захотелось управлять не только компьютером, но и прочими устройствами - магнитолой (спец протокол), бортовичком (аналог), круизом (аналог), прочими девайсами.

Девайс умеет следующее:
1. Принимает команды с резистивного пульта (до 15 кнопок). Измеряет напряжение и считает сопротивление цепи. На любую из кнопок можно повесить любую комбинацию из следующих функций:
2. Определяется компьютером как USB клавиатура. Может посылать в комп любые нажатия на кнопки. При этом можно задействовать alt, ctrl, shift левые и правые в любых комбинациях. На данный момент можно посылать только одну стандартную кнопку в один момент(+ alt/shift/ctrl). Или одну мультимедийную кнопку.
3. Позволяет управлять до 8ми внешними линиями. При этом можно задавать режим работы выхода - либо просто при нажатии кнопки подать +5В или 0В на выход, либо триггерный выход (нажал один раз - появилось напряжение, нажал второй - пропало).
4. Управлять двумя аналоговыми устройствами - магнитола, бортовик, круиз контроль. Т.е. всем, что управляется такими же аналоговыми кнопками.
5. Управлять одним устройством (магнитолой), работающим по проводам и использующим стандартным протоколом проводного ДУ от Clarion/Alpine.
6. Использовать два банка кнопок для эмуляции управления разными устройствами при помощи одних и тех же кнопок. Кнопку переключения между банками можно задавать программно.
7. Все вышеперечисленные функции можно конфигурировать на лету при помощи програмки-конфигуратора для PC через тот же USB интерфейс.
8. Девайс может работать и без компьютера, если надо управлять, скажем, магнитолой.
9. Так же конфигуратор позволяет показывать на лету сопротивление, напряжение, и код нажатой кнопки, что удобно для конфигурирования.
10. Питание устройства - от USB или от борт сети автомобиля.

Фото макета:
http://photo.qip.ru/photo/alexstanko.../210360165.jpg http://photo.qip.ru/photo/alexstanko.../210360167.jpg

Скрины конфигуратора:
http://photo.qip.ru/photo/alexstanko.../210949481.gif
http://photo.qip.ru/photo/alexstanko.../210949482.gif

Alex_St 11.10.2013 13:56

Фотки готового устройства:
http://photo.qip.ru/photo/alexstanko.../211063235.jpg http://photo.qip.ru/photo/alexstanko.../211063307.jpg

Alex_St 11.10.2013 13:58

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

На данный момент девайс управляет двумя устройствами:
1. Комп (ЮСБ - клава)
2. Круиз-контроль (через аналоговый выход).
Теперь в планах подключить его еще к бортовичку.

Alex_St 11.10.2013 14:02

Вложений: 2
Вот все необходимое для повторения девайса.
Архив содержит:
1. Прошивка девайса в виде hex файла
2. Схема и плата в формате PCad2006
3. Приложение для конфигурирования
4. Моя текущая конфигурация как пример использования

Вложение 33142
Назначение элементов интерфейса программы:
1. Кнопки прочитать/сохранить/сравнить в описании не нуждаются )
2. Слева снизу три радиокнопки - ADC, Voltage, Resistance. Они переключают варианты отображения данных в таблице. Рядом с ними три текущих значения, которые раппортует нам устройство.
3. Кнопка "Установить значение" записывает текущее значение из одного из значений слева от нее в активную строку. Записывает только в случае если вся строка выделена. Таким образом можно быстро записать сопротивления всех подключенных кнопок в таблицу.
4. Таблица содержит значения сопротивлений кнопок, и реакцию на нажатие каждой кнопки. Одна строка - одна аналоговая кнопка. Все варианты реакций независимы и могут работать параллельно. Исключение - параллельно не могут работать клавиши стандартной и мультимедийной клавиатур.

Поля таблицы:
- Bank - номер банка кнопок. Есть возможность записывать до трех банков кнопок в устройство. Всего не более 22х кнопок. Переключение между банками - при помощи кнопки, которая назначена как Standard: Switch. Переключение происходит по кольцу.
- ADC_Val/Voltage/Resistance - один из вариантов отображения значения сопротивления кнопки.
- ADC_Diff/Volt Diff/Res_Diff - размер корридора значений. Кнопка считается нажатой, если значение укладывается в диапазон (Resistence - Res_Diff)...(Resistence + Res_Diff).
- Left Ctrl/Left Shift/Left Alt/Left Win/Right Ctrl/Right Shift/Right Alt/Right Win - Данные события будут посланы в комп при нажатии на кнопку.
- Key - Клавиша стандартной клавиатуры, которая будет нажата при нажатии соответствующую аналоговую кнопку.
- mmKey - клавиша мультимедийной клавиатуры, которая будет нажата при нажатии на соответствующую аналоговую кнопку.
- MM Key Repeat - пока не реализовано. В будущем возможно будет автоповтор для мультимедийных клавиш.
- Dac Out1/Dac Volt1/Dac Res1 - управляют первым аналоговым выходом. Принцип такой: по-умолчанию на выходе максимальное напряжение. При нажатии на кнопку на выходе будет выставлено напряжение соответственно таблице. Пересчет в сопротивление идет из расчета, что на приемном конце сопротивление на плюс 4.7к. Рекомендую смотреть на напряжение, а не на сопротивление.
Примечание: т.к. устройство питается от USB через диод шоттки - то максимальное напряжение на выходе будет меньше 5В (примерно 4.85В). Остальные напряжения уменьшатся так же пропорционально. Если не предусматривается питание от внешнего источника питания - рекомендую диод шоттки на входе закоротить.
- Dac Out2/Dac Volt2/Dac Res2 - то же самое, только для второго аналогового канала.
- rcAddr, rcCmd - задает команду для цифрового выхода управления магнитолами Clarion/Alpine. Подробное описание формата тут, системы команд - тут.
- PortData/PortInit/PortTrig - управление 8ю бинарными цифровыми выходами. PortInit задает начальное значение на выходах. Так же он задает полярность реакции на PortData. Иными словами - PortData показывает - на какие каналы действует данная кнопка. PortTrig - задает триггерную реакцию на кнопку вместо обычной.
Данный механизм временный, ищу лучшие решения.
Пока сделано так:
Код:

void controlPortKeyPressed( UInt8 portData, UInt8 portInit, UInt8 portTrig )
{
  UInt8 port = getPortState();

  portInit &= portData; // mask only necessary pins
  portTrig &= portData; // mask only necessary pins

  releasedPortValue = port ^ portTrig; // this value will be applied when the key will be released

  UInt8 set = ( portData ^ portInit ) & ~portTrig;
  UInt8 reset = ~( portData & portInit ) | portTrig;

  port |= set;
  port &= reset;
  port ^= portTrig;

  setOutputsState( port );
}

Если что-то не понятно - на вопросы постараюсь ответить ).

Alex_St 11.10.2013 14:05

Вложений: 1
Совсем забыл добавить. Аналоговые выходы расчитаны на работу с устройствами, имеющими диапазон входных напряжений 0...5В. Для устройств с напряжениями на входе до 3.3В необходимо поставить на выходе диод шоттки катодом к выходу девайса, а анодом ко входу управляемого устройства. Таким образом напряжение 5В на выходе девайса никоим образом не сможет помешать управляемому устройству ).

Фузы:
Вложение 33144

Для работы конфигуратора требуется .Net framework 4.0. Скачать его можно тут.

Alex_St 29.11.2013 12:54

Вложений: 1
1. Т.к. протокол NEC для ИК пультов я реализовал по описанию в интернете, а не по реальному сигналу - в софт затесалась досадная ошибка - сигнал на выходе получился инвертированным. Как ни странно, но магнитолы Clarion и Alpine принимают свободно и прямой и инвертированный сигнал, поэтому с ними все работало хорошо. А вот с другими устройствами пришлось доработать прошивку. Результат в аттаче.

2. Т.к. у меня в системе появился новый монитор с контроллером на чипе RTD2660 - меня заинтересовало - а какой там протокол ИК пульта. Оказался - все тот же NEC 16бит адрес + 8 бит команда. Ес-сно, мне стало интересно снять его команды и проверить на моем девайсе. Все заработало успешно )
Результат:
Код:

Адрес:        0x6B86

Клавиша        код команды
Video Select:  1B
Menu:          05
Power:        12
Left:          04
Right:        06
Mode Select:  15


Alex_St 29.11.2013 12:57

Так же пробовали подключить девайс к головному устройству Alpine INE-W977BT.
Как ни странно - заработала с полутыка. Коды отсюда подошли, и альп с удовольствием скушал наши команды.
Девайс управлялся от пульта Sony X4S без каких либо доработок.

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

prts 29.11.2013 15:22

Не совсем понял, за что прошу извинения.
Можно ли данный дивайс использовать для управления магнитолой и carPC используя только рулевые кнопки?

Alex_St 29.11.2013 18:49

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

doneAlexandro 02.12.2013 19:28

Отличная идея, отличная подборка ссылок!
Разве что не пытались ли вы найти описания проводных протоколов для ГУ? Меня вот сильно интересует Clarion.. Или же вы сразу решили работать с ИК?

Alex_St 02.12.2013 19:33

Спасибо!
Пытался. И нашел. И реализовал )
Тут реализован именно проводной протокол. Отличается от ИК он только тем, что нет заполнения импульсов частотой 36кГц.
Вот описалово, по которому я реализовал его. Сначала проверил обычным ИК пультом и фотоприемником. Подал сигнал с фотоприемника на вход магнитолы, предварительно закрыв фотоприемник магнитолы. Заработало!
Потом реализовал протокол в своем устройстве. Сигнал с устройства подал на вход проводного пульта Клариона. Так же заработало )

doneAlexandro 02.12.2013 19:40

Спасибо! Вы сильно облегчили мне жизнь! А то полдня убил на поиск протокола, а нашел все, как обычно, на pccar))

Alex_St 02.12.2013 20:22

Да, я тоже долго искал, пока случайно не наткнулся на тот ресурс.

doneAlexandro 08.12.2013 23:00

Так как исходников прошивки нет, то можно вам пару оптимизаторских предложений? :)
1) Обработка в ПО ИК-фотодиода. Чтобы можно было всем этим хозяйством управлять при помощи пульта (настраивать, соответственно, в конфигураторе). Таким образом, на выходе будет адаптер к магнитоле для работы с любым ИК-пультом.
2) Возможность выбора управляемого устройства (например, магнитола или планшет) при нажатии кнопки, на которую уже назначено действие. Просто было бы удобно: нажимаешь кнопку "Source" на руле, магнитола переключается, в режим радио, и проводной пульт управляет уже магнитолой. Повторное нажатие - переход в AUX и управление планшетом. Правда тут еще придется настраивать пропуски (ибо в магнитолах обычно несколько источников звука переключаются циклически - CD, Radio, USB, AUX). Из пункта 2 вытекает пункт 3
3) Возможность назначить некторые действия строго для определенного устройства (например, клавиши громкости должны управлять только магнитолой, клавиша "Source" тоже).
Если честно, я прогу вашу не ставил еще на комп, потому, возможно, пункт 3 реализован?

Для меня, конечно, не проблема написать ПО для контроллера по моим требованиям самому, но ваш проект подкупил именно возможностью конфигурирования без правки ПО и перепрошивки. Написать подобное мне слабо) Потому я и пристаю с вопросами))

doneAlexandro 10.12.2013 20:08

В общем ладно, свои вопросы снимаю. Протокол Клариона сделал на Ардуинке) Тоже неплохой вариант, если надо переназначить клавиши. Остальное - дело техники)

Alex_St 11.12.2013 15:09

Сорри за поздний ответ..
1. По поводу ИК фотодиода - тоже думаю. Но не уверен пока что буду делать.
2. Такое уже есть - можно назначить кнопку, которая будет переключать банки кнопок. В конфигураторе она зовется "switch key" в кнопках стандартной клавиатуры. В таблице конфигурации есть столбец - номер банка. И соответственно - на каждую кнопку можно задать несколько действий. Например - для кнопка с сопротивлением 1кОм для первого банка будет слать Play в магнитофон, а для другого банка - жать что-то на компе.
При старте устройство использует первый банк. При нажатии на switch - переключается на второй (если есть), затем третий (если есть). Если следующего нет - переключаемся обратно на первый.
Есть правда, нюанс - из-за малого объема еепром и неоптимального расхода этого объема - максимальное кол-во действий не может превышать 22.
3. Если надо чтобы какая-то кнопка делала одно и тоже действие во всех банках - то просто делаешь для нее по строчке для каждого банка. Сказано сумбурно, но думаю - должно быть понятно.

П.с. мне не нравится уже как сделано конфигурирование. В будущем думаю сделать его по-другому, проще, и экономичнее в плане памяти. Но когда это будет - сказать не могу...

doneAlexandro 11.12.2013 17:31

Спасибо!) Я все понял. На самом деле ваша разработка тянет на серийное изделие:
-просто для конечного пользователя;
-сложно в реализации при, в общем-то, единоразовой настройке. Да и если даже нужно вам что-то изменить, то уж вы-то, как разработчик, сделали бы это быстро)

Так что задумайтесь)

Alex_St 11.12.2013 17:45

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

doneAlexandro 11.12.2013 21:29

Это ресурс для энтузиастов. Продавайте на авито. Готовые подрбные девайсы от 2-х с лишним тыщ.

NiMar 02.07.2014 15:40

Купил! Огромное спасибо!
Подключил к субару Форестер рулевые кнопки на магнитолу Alpine UTE-72BT и Nexus7. Завел два банка. одну кнопку задействовал на переключения банков. после выключения зажигания адаптер возвращается к первому банку, все как надо - с самого начала управление только магнитолой. Единственный недостаток: если компа в машине нет то надо нести ноут чтоб настроить быстро.
За такую цену лучше адаптера не купить.

Alex_St 02.07.2014 15:45

Спасибо за добрый отзыв!
Пусть служит тебе долго и комфортно!

Помнится, ты еще круиз хотел завести туда...

NiMar 14.07.2014 08:47

пока даже не знаю к чему его прикрутить:) родных кнопок на руле оказалось достаточно.

bolwoi 30.07.2014 15:44

Добрый день, Alex_St.
Можно немного подробнее про управление магнитолой, (спецпротокол)? Вы его сами сниферили, или где-то надыбали?

Alex_St 30.07.2014 15:57

Процитирую сам себя:
Цитата:

Сообщение от Alex_St (Сообщение 273301)
- rcAddr, rcCmd - задает команду для цифрового выхода управления магнитолами Clarion/Alpine. Подробное описание формата тут, системы команд - тут.


Alex_St 24.08.2014 00:09

Вложений: 1
В конфигуратор и прошивку закралась интересная недоработка ). Оказалось, что нет возможности использовать кнопку с нулевым сопротивлением...
Теперь такая возможность есть.
Исправленная версия конфигуратора и прошивки в аттаче ).

ZyaK 25.12.2014 10:09

Штука конечно интересная, но мне такой огромный функционал не нужен...
В не далеком будущем планирую менять руль, на нем будет около 10 кнопок, шлейф подрулевой со свободными 2-мя проводами, не поможете сделать что-то подобное на какой нибудь Тини45-й?
в программировании не силен, грубо говоря могу мограть светодиодами :)

Alex_St 25.12.2014 11:06

Зачем из тини? Мега стоит столько же, места занимает лишь чуть чуть больше.
Использовать все не обязательно. Например, можно не распаивать аналоговые выходы, выход на магнитолу. А остальное - и с тиней, и с мегой будет одинаковым. Только вот софт, связанный с USB в тиню может не влезть. Да и ног скорее всего не хватит, т.к. для USB обязательно нужен внешний кварц.

ZyaK 25.12.2014 11:22

Какие пины из вашей схемы лучше взять для подключения к резистивным кнопкам?
Если я правильно понимаю, то она сама должна будет увидеть кнопки? тоесть прошивку ковырять не надо?

Alex_St 25.12.2014 11:25

Лучше всего сделать так, как нарисовано на схеме. Там есть конкретный вход для резистивных кнопок, и только его анализирует прошивка.

ZyaK 25.12.2014 11:31

Это который Pc0 23-й пин и на схеме он "input" ?

Alex_St 25.12.2014 11:34

Да, это он.

ZyaK 25.12.2014 11:46

Ок, буду собирать. Контроллер какой пойдет ATMEGA8-16AU, ATMEGA8A-AU, ATMEGA8L-8AU ?

Alex_St 25.12.2014 11:49

Надо быть чуть внимательней. Кварц на 12МГц, значит, ATMEGA8L-8AU точно не пойдет. Выбирай нужный тебе корпус (не забудь, что у дипа другая цоколевка), и выбирай проц с частотой не менее 12МГц.

ZyaK 26.12.2014 09:15

Вложений: 2
Подскажите, вычитал, что вы её подключали к авео, можно ли подключить к тойоте старенькой 95-го года протокол Toyota data stream
подключал через переходник Usb-> Com, схема подключения в файле.
Работало через программу MyEngine

Может получится сделать пока я плату не протравил :)

Alex_St 26.12.2014 11:29

По этому варианту ничего не скажу. У меня нет тойоты )
Мою плату можно подключить только к резистивным кнопкам.

ZyaK 26.12.2014 12:53

Собрал, работает как надо! очень понравилось! спасибо!

Alex_St 25.09.2015 20:04

Появилась странная проблема - после апгрейда материнки с Intel GCLF2 (Atom 330) на ASRock Q1900 (проц J1900) устройство начало периодически отваливаться.. Как правило, после гибернейта, но может отвалиться и в процессе работы. Стек USB использован VUsb. После отваливания диспетчер задач пишет "неизвестное устройство". Работа восстанавливается, если устройство физически отключить и снова включить, или перегрузить комп. Но не восстанавливается после гибернейта.

У кого-то есть мысли что могло поменяться в новой плате? Кстати, поведение одинаково и в портах USB2, и в портах USB3.

И еще - у кого-то есть ломанный USBLyzer или что-то подобное? Поставил в машине и дома USBLyzer, думал - триала хватит для решения проблемы, собрал логи в машине, а посмотреть их дома не смог. Прога говорит, что 64битная версия не может открыть логи, снятые 32битной версией.. Так триал и закончился, а я логи не увидел )))

Прям хоть переделывай на stm32 )))

awtoap 25.09.2015 20:12

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

Alex_St 25.09.2015 20:22

Это резервный вариант (stm32), но он требует много времени на разводку платы со всеми необходимыми мне фичами и разбирательством с его стеком USB...
Хотелось бы обойтись малой кровью )

awtoap 25.09.2015 20:55

Возьми PIC18F14K50 замечательная штукенция и скачай компиль от Mikroe. Там есть многие готовые библиотеки.


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

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