User Tag List

Показано с 61 по 70 из 88

Тема: Как переделать практически любую клавиатуру в PS/2

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #17

    Регистрация
    03.05.2020
    Адрес
    г. Челябинск
    Сообщений
    796
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    260
    Спасибо Благодарностей получено 
    274
    Поблагодарили
    145 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    ...продолжение.

    Цитата из билайновской рекламы про робота - "ой, а разговоров-то было !".
    Все оказалось в разы проще. Дольше всего пришлось МГТФ зачищать.
    Нижу привожу гайд по борьбе в клавиатурной матрицей для домохозяек и других аналогичных мне неучей.

    Итак, клавиатура от 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 свободны для подключения к разъему клавиатурной матрицы.
    Нажмите на изображение для увеличения. 

Название:	IMG_20210104_024957.jpg 
Просмотров:	115 
Размер:	41.5 Кб 
ID:	74385
    Для дебага/обратной связи с МК нужен USB-TTL-UART навроде такого, но у меня его нет, а садиться и ехать за ним куда-то не позволяет новогоднее состояние настроение. Поэтому вместо него используется ардуинка с залепленным дулом на землю ресетом.
    Нажмите на изображение для увеличения. 

Название:	IMG_20210104_004712.jpg 
Просмотров:	101 
Размер:	32.4 Кб 
ID:	74382

    Модуль для atmega32 (и других контроллеров, не нативных для плат Ардуино) удобен тем, что мы можем удобно ссылаться на удобно описанные ноги портов соответствующего контролера, а также задав в настройках IDE частоту кварца не заботиться о правильности частоты UART для нужной скорости.
    Пакет модулей берется по ссылке https://mcudude.github.io/MightyCore...ore_index.json
    Как его добавить в IDE и сделать доступным из менеджера плат, есть картинки тут.

    Код, написанный при помощи топора - сразу же после hello world:
    Код:
    //описание алиасов для пинов
    #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);
                      }
       }
    }
    Этот скетч компиляем, экспортируем и заливаем в атмегу любым удобным способом (avrdude, khazama, и т п), фьюзы у меня на нем LOW=0x0e, HIGH=0xD7, EXT=0xFD, но из них важен по сути только внешний источник CKSEL=1110, а задержки включения SUT и генераторный CKOPT не принципиальны (впрочем, внутренний генератор тоже можно использовать, не забыв в настройке IDE это указать, чтоб частота UART пересчиталась).
    Подключаем клавиатуру к атмеге, подключаем USB-UART к компу и запускаем IDE в режиме монитора порта (или любой другой терминал на соответствующем компорте), давим по порядку клавиши, видим вывод следующего характера:
    Нажмите на изображение для увеличения. 

Название:	изображение_2021-01-04_034529.jpg 
Просмотров:	100 
Размер:	20.6 Кб 
ID:	74381

    Я записал соответствующие сочетания линий для каждой клавиши прямо на самой клавиатуре:
    Нажмите на изображение для увеличения. 

Название:	IMG_20210104_024402.jpg 
Просмотров:	118 
Размер:	61.6 Кб 
ID:	74384

    Дальше, если верить легенде о 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. Остальные строковые.
    Строим таблицу:
    Нажмите на изображение для увеличения. 

Название:	AsusX200_keymatrix.jpg 
Просмотров:	119 
Размер:	25.2 Кб 
ID:	74383
    Цветом выделены мастхэв-клавиши для спектрума, ненужные строки можно исключить целиком (в целом это означает, что если у клавиатуры больше 26 линий, то не используя некоторые можно ее заюзать с той же атмегой, где их <=26).

    Тайна клавиатуры раскрыта.
    Если есть идеи, как автоматизировать поиск столбцовых линий - кидайте идеи, я не смог придумать.

    Мапить эту клавиатуру в регистр клавиш в CPLD буду немного позже. Но тоже скоро.

    Эти 3 пользователя(ей) поблагодарили valerium за это полезное сообщение:

    ALS(07.01.2021), CLR(04.01.2021), zebest(04.01.2021)

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Переделать клавиатуру AT >> XT
    от artice в разделе Устройства ввода
    Ответов: 28
    Последнее: 02.07.2024, 17:15
  2. Ответов: 7
    Последнее: 02.06.2018, 20:56
  3. Как можно восстановить клавиатуру?
    от IMPguitar в разделе Устройства ввода
    Ответов: 1
    Последнее: 31.01.2017, 19:17
  4. как переделать CAS в WAV
    от marsNRG в разделе Atari
    Ответов: 9
    Последнее: 09.01.2016, 18:45

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •