User Tag List

Показано с 1 по 3 из 3

Тема: Вариация безвейтового контроллера PS/2 клавиатуры для Spectrum - компактный вариант

  1. #1

    Регистрация
    23.11.2015
    Адрес
    г. Ростов-на-Дону
    Сообщений
    707
    Спасибо Благодарностей отдано 
    264
    Спасибо Благодарностей получено 
    215
    Поблагодарили
    152 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Вариация безвейтового контроллера PS/2 клавиатуры для Spectrum - компактный вариант

    Как и большинство начинающих спектрумистов подошел к моменту, когда захотелось подключить к своему Ленинграду PS/2 клавиатуру.
    Родной клавиатуре особенно не помогли ни замена пружин, ни подгибание контактов. Всё равно дребезг и периодические пропуски нажатий.

    Мне очень нравится конструкция от Xrust https://zx-pk.ru/threads/33211-unive...viaturami.html
    Уже был готов её собирать (тем более, что почти все детали были в наличии, оставалось купить печатную плату и MT8816), как подумалось: каким образом я буду размещать эту конструкцию?
    В моем корпусе она не поместится (он очень компактный, чем мне и нравится). Тянуть наружу 15-жильный шлейф - тоже не кажется хорошим вариантом.

    Постепенно пришел к конструкции из Altera Max EPM3064 (корпус tqfp-44) и ATTiny25 (корпус SOP-8).
    Чипа ATTiny25 вполне хватает для взаимодействия с клавиатурой, но не хватает ног, чтобы передавать данные в MT8816.
    Altera EPM3064 имеет большой недостаток по сравнению с MT8816 - её нужно прошивать.
    Зато она компактнее и позволяет организовать последовательный интерфейс по двум проводам, что очень подходит ATTiny25.
    Получилась такая схема:


    Устройство состоит из двух плат. Одна плата включает EPM3064 и разъём, который вставляется непосредственно в клавиатурный разъём Ленинграда.
    Вторая плата содержит разъём PS/2 и ATTiny25. Она размещается в любом удобном месте внутри корпуса спека.
    Разводкой платы занимаюсь.
    Часть, которая цепляется в клавиатурный разъём Ленинграда должна выглядеть примерно так:

    Соединены платы четырьмя проводами - по двум передаются данные, питание +5V и GND. ATTiny25 прошивается через клавиатурный разъём. Заменить прошивку можно не открывая корпус спека.
    Текущая прошивка CPLD позволяет эмулировать 40-клавишную клавиатуру (выходы на Data с открытым коллектором), плюс имеет 5 дополнительных выходов произвольного назначения (на выходе логические уровни TTL).
    Код Altera Max очень простой:
    Код:
    //	Алгоритм работы:
    //	C помощью Clk и D заносим в регистр Buffer сначала номер группы клавиш, 3 бита (номер от 0 до 7, по 5 клавиш в группе)
    //	потом значения клавиш в группе (1 - нажатая клавиша) - 5 бит. От старшего бита к младшему,
    //      и в конце - признак, что занесенные данные относятся к клавиатуре (=0) или к пяти дополнительным выходам (=1)
    //      !!!Важно. Изменения D производить только при низком Clk.
    //	После того, как Buffer заполнен данными, поднимаем Clk, опускаем и поднимаем D,
    //      при этом значения из буффера копируются в ранее заданную группу клавиш.
    //------------------------------------------------------------------------------------------------------------------
    //	Для взаимодействия с клавиатурой используется ATtiny13 или ATtiny25. 2 пина на клавиатуру и 2 пина на Altera.
    //	Также на разъём клавиатуры выносится Reset и дополнительно MISO/MOSI, для прошивки через этот разъём.
    //     Итого Int0 (SCK), MOSI, MISO, Reset.
    
    module Spec_KB	(
    	input [15:8] Addr,	//От Спека
    	input D, Clk,	//Интерфейс с AVR
    	output reg [4:0] Data,	//В Спек
    	output reg [4:0] Ext_Data		//Дополнительные выходы
    	);
    
    reg [4:0] Key_Data [7:0];	//Массив состояний клавиш, 8 груп по 5 клавиш
    reg [8:0] Buffer;	//Входной буффер, переносится в массив состояний клавиш по положительному перепаду D, если Clk высокий
    wire [2:0] Row;	assign Row[2:0] = Buffer[8:6];	//Номер группы клавиш (строки)
    wire Ext_data_sign;   assign Ext_data_sign = Buffer[0];		//Признак, что в буфере данные для дополнительных выходов
    
    wire [4:0] Data_internal;  //Промежуточная переменная
    assign Data_internal[4:0] = (~Key_Data[0] | {5{Addr[8]}}) 
    		& (~Key_Data[1] | {5{Addr[9]}})
    		& (~Key_Data[2] | {5{Addr[10]}})
    		& (~Key_Data[3] | {5{Addr[11]}})
    		& (~Key_Data[4] | {5{Addr[12]}})
    		& (~Key_Data[5] | {5{Addr[13]}})
    		& (~Key_Data[6] | {5{Addr[14]}})
    		& (~Key_Data[7] | {5{Addr[15]}});
    
    integer i;
    always @(Data_internal)		//В зависимости от значения Data_internal[i], опускаем на 0 или отключаем выходной буффер Data[i] - аналог ОК
    	for(i=0; i<5; i=i+1)	Data[i] <= Data_internal[i]? 1'bZ : 1'b0;
    
    always @(posedge Clk)		//Заталкиваем D в сдвиговый регистр Buffer по положительному перепаду Clk
    	Buffer[8:0] <= {Buffer[7:0], D};
    
    always @(posedge D)						
    		if(Clk)	begin
    			if(Ext_data_sign) Ext_Data <= Buffer[5:1];
    			else  Key_Data[Row] <= Buffer[5:1];	
    		end
    endmodule
    Весь проект во вложении.
    Код для ATTiny посложнее. Проект тоже во вложении. Использование дополнительных выходов в этой прошивке не реализовано.
    Реализована передача сочетаний клавиш по нажатию на одну клавишу PS/2 клавиатуры.

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


    Фьюзы для ATTiny
    Вложения Вложения
    Последний раз редактировалось Rio444; 15.06.2025 в 19:35.

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

    Alex_NEMO(23.01.2024), ALS(13.04.2023), creator(13.04.2023), Froggy(03.08.2023), SERGEY256(13.04.2023), Shofer(13.04.2023), turlipuki(13.04.2023), valerium(13.04.2023)

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    23.11.2015
    Адрес
    г. Ростов-на-Дону
    Сообщений
    707
    Спасибо Благодарностей отдано 
    264
    Спасибо Благодарностей получено 
    215
    Поблагодарили
    152 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    В итоге получилось как-то так.
    3D модели в Кикаде:




    Сделано в виде одной печатной платы, чтобы сэкономить на заказе плат у китайцев. После получения платы разделены:





    Кликабельно:





    В качестве клавиатурного разъёма обычная DIP-панелька с шагом 2.54:



    В оригинальной схеме Ленинграда два верхних контакта по правому краю разъёма ни к чему не подключены. На них надо подать +5 и GND для питания устройства.
    После установки:



    Осталось сделать отверстие в корпусе под клавиатурный разъём и закрепить разъём хомутом.

    - - - Добавлено - - -

    Герберы: https://disk.yandex.ru/d/Cvrxgqm91TyjwA
    Проект в Kikad 5.1.9: https://disk.yandex.ru/d/BI01CRrIwjrOJg
    Диод D2 можно исключить. Он нужен, чтобы можно было изменять прошивку ATTiny25 не раскрывая корпус Спека. Чтобы питание от программатора на ATTiny25 не шло на весь Спек.
    Либо оставить и использовать любой диод шоттки в корпусе SMA/DO-214.
    Их очень много на материнских платах первой половины 2000-х, уровня s478, s775, s462.
    По факту стоит SK24, падение напряжения на нём во время работы менее 0,25V.
    Толщина текстолита 1,2 мм.

    P.S. Схему в первом сообщении заменил, там были небольшие неточности.
    Последний раз редактировалось Rio444; 01.08.2023 в 19:50.

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

    Alex_NEMO(23.01.2024), i8088(03.08.2023), UncleDim(01.08.2023), valerium(01.08.2023)

  4. #3

    Регистрация
    23.11.2015
    Адрес
    г. Ростов-на-Дону
    Сообщений
    707
    Спасибо Благодарностей отдано 
    264
    Спасибо Благодарностей получено 
    215
    Поблагодарили
    152 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Сделал в корпусе отверстия, закрепил разъём PS/2 хомутом, сделанным из заглушки задней стенки PC-шного корпуса:











    Этот пользователь поблагодарил Rio444 за это полезное сообщение:

    Alex_NEMO(23.01.2024)

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

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

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

Похожие темы

  1. Ответов: 247
    Последнее: 17.11.2024, 07:55
  2. Ответов: 30
    Последнее: 08.01.2017, 18:24
  3. Вариант контроллера PS/2 для БК
    от kisser81 в разделе БК-0010/0011
    Ответов: 15
    Последнее: 21.11.2016, 10:31
  4. Ответов: 0
    Последнее: 09.09.2011, 21:42
  5. Ответов: 1
    Последнее: 19.09.2010, 18:15

Ваши права

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