...продолжение.
Цитата из билайновской рекламы про робота - "ой, а разговоров-то было !".
Все оказалось в разы проще. Дольше всего пришлось МГТФ зачищать.
Нижу привожу гайд по борьбе в клавиатурной матрицей для домохозяек и других аналогичных мне неучей.
Итак, клавиатура от Asus X200, макетка с atmega32 и кварцем, arduino IDE с модулями MightyCore для поддержки atmega32.
С атмеги32 подключены только SPI (PB4-PB7) на CPLD и UART (PD0, PD1) для дебага через USB-UART. Остальные портовые ноги PD2-PD7, PC0-PC7, PA0-PA7, PB0-PB3 свободны для подключения к разъему клавиатурной матрицы.
Для дебага/обратной связи с МК нужен USB-TTL-UART навроде такого, но у меня его нет, а садиться и ехать за ним куда-то не позволяет новогоднеесостояниенастроение. Поэтому вместо него используется ардуинка с залепленнымдуломна землю ресетом.
Модуль для atmega32 (и других контроллеров, не нативных для плат Ардуино) удобен тем, что мы можем удобно ссылаться на удобно описанные ноги портов соответствующего контролера, а также задав в настройках IDE частоту кварца не заботиться о правильности частоты UART для нужной скорости.
Пакет модулей берется по ссылке https://mcudude.github.io/MightyCore...ore_index.json
Как его добавить в IDE и сделать доступным из менеджера плат, есть картинки тут.
Код, написанный при помощи топора - сразу же после hello world:
Этот скетч компиляем, экспортируем и заливаем в атмегу любым удобным способом (avrdude, khazama, и т п), фьюзы у меня на нем LOW=0x0e, HIGH=0xD7, EXT=0xFD, но из них важен по сути только внешний источник CKSEL=1110, а задержки включения SUT и генераторный CKOPT не принципиальны (впрочем, внутренний генератор тоже можно использовать, не забыв в настройке IDE это указать, чтоб частота UART пересчиталась).Код://описание алиасов для пинов #define PINS_MAX 26 #define PIN0 PIN_PD2 #define PIN1 PIN_PD3 #define PIN2 PIN_PD4 #define PIN3 PIN_PD5 #define PIN4 PIN_PD6 #define PIN5 PIN_PD7 #define PIN6 PIN_PC0 #define PIN7 PIN_PC1 #define PIN8 PIN_PC2 #define PIN9 PIN_PC3 #define PIN10 PIN_PC4 #define PIN11 PIN_PC5 #define PIN12 PIN_PC6 #define PIN13 PIN_PC7 #define PIN14 PIN_PA7 #define PIN15 PIN_PA6 #define PIN16 PIN_PA5 #define PIN17 PIN_PA4 #define PIN18 PIN_PA3 #define PIN19 PIN_PA2 #define PIN20 PIN_PA1 #define PIN21 PIN_PA0 #define PIN22 PIN_PB0 #define PIN23 PIN_PB1 #define PIN24 PIN_PB2 #define PIN25 PIN_PB3 //массив номеров пинов для перебора клавиатуры const uint8_t pins[PINS_MAX] = { PIN0, PIN1, PIN2, PIN3, PIN4, PIN5, PIN6, PIN7, PIN8, PIN9, PIN10, PIN11, PIN12, PIN13, PIN14, PIN15, PIN16, PIN17, PIN18, PIN19, PIN20, PIN21, PIN22, PIN23, PIN24, PIN25 }; // initial setup void setup() { //все клавиатурные ноги ставим в режим входа с пуллапом for (uint8_t i=0; i<PINS_MAX; i++) pinMode (pins[i], INPUT_PULLUP); //и инициализируем вывод по UART для получения данных о клавишах в "мониторе порта" Serial.begin(115200); Serial.flush(); Serial.println(F("Unikeyboard matrix explorer v1.0")); } // main loop void loop() { uint8_t colcount, rowcount; //перебираем все потенциальные столбцы for (colcount=0; colcount<PINS_MAX; colcount++) { //при опросе очередного столбца переключаем все линии "как бы строк" в режим входа, чтоб не получить конфликт уровней на выходах for (rowcount=0; rowcount<PINS_MAX; rowcount++) pinMode (pins[rowcount], INPUT_PULLUP); //один пин потенциального столбца включаем в режим выхода, даем уровень 0 pinMode (pins[colcount], OUTPUT); digitalWrite (pins[colcount], LOW); //перебираем все пины строки, пропуская пин столбца for (rowcount=0; rowcount<PINS_MAX; rowcount++) // если на входе строки находим 0 (нажата клавиша на пересечении текущих COL/ROW) - выводим ее в консоль // в виде двух индексов пинов (меньший+1, больший+1). Плюс единица, т к индексы нумеруются с 0, а контакты на разъеме с 1. if ( (rowcount != colcount) and !digitalRead(pins[rowcount]) ) { Serial.println ("Pressed key ("+String((colcount<rowcount?colcount:rowcount)+1)+", "+String((colcount<rowcount?rowcount:colcount)+1)+")"); delay (300); } } }
Подключаем клавиатуру к атмеге, подключаем USB-UART к компу и запускаем IDE в режиме монитора порта (или любой другой терминал на соответствующем компорте), давим по порядку клавиши, видим вывод следующего характера:
Я записал соответствующие сочетания линий для каждой клавиши прямо на самой клавиатуре:
Дальше, если верить легенде о 8 столбцах в любой клавиатуре, то надо выделить эти самые 8 столбцовых линий.
Рекомендуют это делать по линиям modifier keys, в моем случае они такие:
LCTRL 4 12
RCTRL 4 6
LALT 2 7
RALT 2 9
LSHIFT 5 11
RSHIFT 5 8
GUI(WIN) 3 13
Fn 1 6
MENU 1 9
В парах "близнецовых" клавиш видим непересекающиеся линии 6,7,8,9,11,12. И у GUI есть линия 13. Это в сумме 7 линий.
Дальше лотерея - надо восьмую линию подобрать как-то наугад, долго глядя в клавиатуру. Я просто предположил, что эта клава имеет столбцовые линии в одной подряд идущей группе, и в ряду 6,7,8,9,11,12,13 пропущена линия 10. Если это не так - далее при построении таблицы вылезет какой-то несходняк и эту итерацию надо будет повторить.
Итак имеем столбцовые линии 6,7,8,9,10,11,12,13. Остальные строковые.
Строим таблицу:
Цветом выделены мастхэв-клавиши для спектрума, ненужные строки можно исключить целиком (в целом это означает, что если у клавиатуры больше 26 линий, то не используя некоторые можно ее заюзать с той же атмегой, где их <=26).
Тайна клавиатуры раскрыта.
Если есть идеи, как автоматизировать поиск столбцовых линий - кидайте идеи, я не смог придумать.
Мапить эту клавиатуру в регистр клавиш в CPLD буду немного позже. Но тоже скоро.




Ответить с цитированием