RU EN DE
Illegal Systems Corporation

Почему бы не использовать то, что уже есть?

Автомобильный PC - подключение съёмной панели магнитолы

Это устройство является full-speed USB 2.0 интерфейсом к съёмной панели магнитолы. В устройстве реализованы несколько логических блоков:

  • Обучаемый контроллер кнопок съёмной панели (стандартная USB HID клавиатура)
  • Контроллер энкодера (стандартная USB HID клавиатура, клавиши Up и Down)
  • Контроллер сегментного дисплея с последовательным интерфесом (USB HID Alphanumeric display (bitmapped usage))

Планируется добавить:

  • Контроллер IR дистанционного управления (стандартная USB HID клавиатура)
  • Контроллер управления звуковой частью магнитолы - громкость, тембр, управление приёмником и т.п. (USB audio device mixer ???)

Хотя устройство многофункционально, всё общение устройства с компом происходит через единственное USB соединение. С точки зрения ОС компьютера у этого USB устройства несколько интерфейсов, сейчас это интерфейс клавиатуры и интерфейс дисплея. Интерфейсы стандартны и сделаны в соответствии со спецификациями организации USB-IF - Universal Serial Bus Revision 2.0, Device Class Definition for HID 1.11 и HID Usage Tables 1.12, поэтому никаких специальных драйверов не требуется, и если в ОС и софте правильно реализована спецификация HID, то всё будет работать "из коробки". Возможно, в дальнейшем добавятся интерфейс аудиомикшера и интерфейс синтезатора частоты радиоприёмника. Также я рассматриваю возможность реализовать простую USB звуковую карту прямо в этом же устройстве, благо нынче на рынке с ЦАП'ами для аудио всё просто отлично. В результате получится законченный полноценный интерфейс к требухе автомагнитолы, который целиком будет реализован в единственном USB устройстве.

Исходники я старался как можно тщательнее комментировать и грамотно разбить на файлы, каждая пара *.c и *.h исходников прошивки относится к соответствующему логическому блоку устройства и невелика по размеру, так что если что-то непонятно из этого описания - загляните и туда, скорее всего разберётесь.



Схема USB устройства

Кнопки

Контроллер кнопок опрашивает кнопки съёмной панели и прикидывается для компьютера самой обычной USB клавиатурой. Т.е. для него не нужны никакие драйверы и какие-то изменения в компьютере. Устройство обучаемо - всегда можно переопределить кнопки съёмной панели так, как удобнее и запомнить новую раскладку. Деталей - минимум, стоимость - рублей 300 (если покупать PIC18F2550 в нормальных местах, а не в "Чип и дипе" где они почему-то стоят около 500 рублей). Устройство может работать параллельно с магнитолой, однако придётся придумать как запрограммировать кнопки так, чтобы при общении с компом не мешать работе магнитолы и наоборот

Кнопки в большинстве съёмных панелей недорогих магнитол JVC, Sony, Hyundai, Prology, LG и, возможно, других производителей сделаны в виде последовательной резистивной матрицы. При нажатии на кнопку её контакты соединяют с землёй один из резисторов матрицы, и на выходе клавиатуры появляется определённое напряжение. Типичную схему съёмной панели можно посмотреть здесь.

Как видно из схемы, есть 2 резисторные матрицы к которым подключены кнопки, в том числе кнопка включения питания и кнопка под ручкой энкодера. Линии матриц KIN0 и KIN1 подключены ко входу процессора магнитолы, где подтянуты внутренними сопротивлениями процессора к +5V (или +3.3V, в зависимости от напряжения питания процессора). В результате получается коммутируемый делитель напряжения, где каждой нажатой кнопке соответствует определённое напряжение на линиях KIN0 и KIN1. Если ни одной кнопки не нажато, то на линии присутствует напряжение питания процессора.

Если устройство будет подключаться в параллель с процессором магнитолы, то нужно просто измерить напряжения для каждой кнопки на линиях KIN0 и KIN1 и посчитать границы значений АЦП исходя из измеренных напряжений.
Если процессор магнитолы не будет использоваться, то нужно подтянуть линии KIN0 и KIN1 к +5V резисторами. В приведённом примере их величина будет 1.8k (она выбирается равной сопротивлению матрицы при нажатой средней кнопке, чтобы равномерно распределить напряжения по всему диапазону входных напряжений АЦП).

резисторы в матрице 4.7k3.3k2.2k1.5k1k680470330220180 
сопротивление матрицы при нажатой кнопке 14.5k9.88k6.58k4.38k2.88k1.88k1.2k7304001800
напряжение на выходе при подтягивающем резисторе 1.8k 4.45V4.22V3.92V3.54V3.07V2.55V2.0V1.44V0.9V0.45V0V
величины значений 8 бит АЦП 2272152001811571301027446230
верхние границы значений АЦП 24122120719016914311688603411

В таблице представлены значения для вышеупомянутой схемы. Используются только 8 старших бит АЦП, для данной схемы этого достаточно, чтобы чётко различать кнопки. В зависимости от модели могут быть некоторые различия - больше или меньше кнопок, другие номиналы резисторов матрицы, но принцип остаётся тем же. Если различия есть, то нужно подправить исходники и пересобрать прошивку. Править нужно файлы keys.h и keys.c исходников прошивки - в них всё, что касается клавиатуры.
Количество кнопок в линии устанавливается #define'ом KBD_KEYS_IN_ROW в keys.h.
Верхние границы значений АЦП считаются как среднее между соседними кнопками (или среднее между 255 и первой кнопкой). Эти значения нужно занести в массив key_limits в keys.c.

Кнопка S1 - это часть железа нужного для бутлоадера. Если при подключении устройства к USB держать её нажатой, то PIC заработает в режиме бутлоадера и можно будет обновить прошивку при помощи соответствующей утилиты.

В нормальном режиме кнопка S1 используется для входа в режим обучения клавиатуры. Режим обучения позволяет без каких-либо правок исходников и перепрошивки присвоить кнопкам съёмной панели магнитолы требуемые клавиатурные HID-коды и сохранить настройки в EEPROM PIC18F2550. В дальнейшем, при нажатии кнопки в компьютер будет посылаться запомненный код. По-умолчанию в прошивке определены следующие HID-коды:

#define в исходникахHID codeAT-101 keys
KEY_1 0x1E<1> на основной клавиатуре
KEY_2 0x1F<2> на основной клавиатуре
KEY_3 0x20<3> на основной клавиатуре
KEY_4 0x21<4> на основной клавиатуре
KEY_5 0x22<5> на основной клавиатуре
KEY_6 0x23<6> на основной клавиатуре
KEY_7 0x24<7> на основной клавиатуре
KEY_8 0x25<8> на основной клавиатуре
KEY_9 0x26<9> на основной клавиатуре
KEY_0 0x27<0> на основной клавиатуре
KEY_ENTER 0x28<Enter> на основной клавиатуре
KEY_ESCAPE 0x29<Esc>
KEY_BACKSPACE 0x2A<Backspace>
KEY_TAB 0x2B<Tab>
KEY_SPACE 0x2C<space>
KEY_RIGHT 0x4F<Right Arrow>
KEY_LEFT 0x50<Left Arrow>
KEY_DOWN 0x51<Down Arrow>
KEY_UP 0x52<Up Arrow>
KEY_PAGE_UP 0x4B<PgUp>
KEY_PAGE_DOWN 0x4E<PgDown>
KEY_HOME 0x4A<Home>
KEY_END 0x4D<End>

Для обучения клавиатуры нужно подключить устройство к любому компьютеру и запустить на нём какой-нибудь редактор или другую программу которая позволит видеть вводимые с клавиатуры символы. Убедиться, что включена латинская раскладка и не нажат CapsLock. Нажать кнопку S1. После нажатия кнопки S1 начнёт мигать светодиод LED1 и устройство, изображая нажатия клавиш клавиатуры выдаст приглашение:

Learning keys: Key 0:

В ответ нужно нажать кнопку на съёмной панели на которую нужно повесить клавишу <0> клавиатуры. Устройство запомнит соответствие кнопки коду и предложит выбрать следующую кнопку:

Learning keys: Key 0: OK Key 1:

Если предлагаемый код не нужен в устройстве, то его можно пропустить, нажав на кнопку S1. Повторное нажатие уже определённых кнопок съёмной панели выдаст ошибку "ERR". Таким образом нужно определить все необходимые кнопки съёмной панели, пока не появится текст "Thank you! All done.":

Learning keys: Key 0: OK Key 1: OK Key 2: OK Key 3: OK Key 4: OK Key 5: OK Key 6: OK Key 7: OK Key 8: OK Key 9: OK Enter: OK Escape: OK Backspace: OK Tab: OK Space: OK Right: OK Left: OK Down: OK Up: OK PageUp: OK PageDown: OK Home: OK End: OK Thank you! All done.

Светодиод LED1 перестанет мигать и устройство выйдет из режима обучения. Теперь можно проверить все запомненные кнопки. При нажатии кнопок съёмной панели будут посылаться установленные коды клавиш клавиатуры AT-101, так же как от обычной USB клавиатуры. Если нужно изменить что-то то можно снова нажать кнопку S1 и заново обучить устройство.

Изменить количество, набор кодов клавиатуры и сообщения устройства при обучении можно в файле main.c, массив learn_table, после чего пересобрать прошивку.

Энкодер

Самая простая часть устройства. Выходы энкодера подключены к RC0 и RC1 PIC. Процессор анализирует изменения состояния выходов и посылает соответствующие клавиатурные коды в компьютер.

Принцип работы энкодера прост. У энкодера есть 2 выхода. При вращении ручки в ту или иную сторону на выходе появляются сигналы сдвинутые друг относительно друга по фазе. В одном направлении фаза на выходе A опережает фазу на выходе B, а при вращении в другом направлении фаза B опережает фазу A:

При вращении в одну сторону:

+---+ +---+ +---+ +--- Фаза A | | | | | | | -+ +---+ +---+ +---+ +---+ +---+ +---+ +- Фаза B | | | | | | | ---+ +---+ +---+ +---+ Код 0 1 3 2 0 1 3 2 0 1 3 2 0 1 3

При вращении в другую сторону:

+---+ +---+ +---+ +--- Фаза A | | | | | | | -+ +---+ +---+ +---+ ---+ +---+ +---+ +---+ Фаза B | | | | | | | +---+ +---+ +---+ +- Код 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1

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

const char enc_table[] = {0, +1, -1, 0, -1, 0, 0, +1, +1, 0, 0, -1, 0, -1, +1, 0};

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

Всё, что относится к энкодеру находится в файлах encoder.c и encoder.h исходников прошивки. В случае, если софт обнаружит вращение, будет вызвана пользовательская функция void enc_user_event(char direction) в качестве аргумента которой будет передано направление вращения - +1 или -1. А дальше основной софт решит что делать в том или ином случае. В данном устройстве при вращении энкодера софт посылает в компьютер через USB коды клавиш Up или Down, см. файл main.c .

  • Софт, исходники, прошивка, схема в формате Eagle - всё тут
  • USB бутлоадер для PIC18F2550
  • Описание PIC18F2550 - на сайте Microchip
  • SDCC - компилятор C для всяких мелких процессоров, который потребуется для сборки прошивки
  • gputils - ассемблер, линкер и пр. для процессоров PIC, который потребуется для сборки прошивки
 
 

©2005 Illegal Systems Corp. Designed by Stanson.