PDA

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



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

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

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

Устройство состоит из двух плат. Одна плата включает EPM3064 и разъём, который вставляется непосредственно в клавиатурный разъём Ленинграда.
Вторая плата содержит разъём PS/2 и ATTiny25. Она размещается в любом удобном месте внутри корпуса спека.
Разводкой платы занимаюсь.
Часть, которая цепляется в клавиатурный разъём Ленинграда должна выглядеть примерно так:
https://pic.maxiol.com/thumbs2/1681335103.781442624.kbspecpcb.png (https://pic.maxiol.com/?v=1681335103.781442624.kbspecpcb.png&dp=2)
Соединены платы четырьмя проводами - по двум передаются данные, питание +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) выбрал раскладку, показанную на картинке ниже. Если клавиша в пустом кружке или прямоугольнике, её значение соответствует надписям на ней.
С удовольствием выслушаю критику и рекомендации.
https://pic.maxiol.com/thumbs2/1681334601.781442624.kbspeckeys.png (https://pic.maxiol.com/?v=1681334601.781442624.kbspeckeys.png&dp=2)

Фьюзы для ATTiny
https://pic.maxiol.com/images2/1750005202.1823833793.at2xtfuses071020.png

Rio444
01.08.2023, 14:05
В итоге получилось как-то так.
3D модели в Кикаде:
https://pic.maxiol.com/images2/1690886815.781440061.1.png

https://pic.maxiol.com/images2/1690886898.781440061.2.png

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

https://pic.maxiol.com/images2/1690886967.781440061.3.jpg

https://pic.maxiol.com/images2/1690886995.781440061.4.jpg

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

https://pic.maxiol.com/thumbs2/1690887016.781440061.7.jpg (https://pic.maxiol.com/images2/1690887016.781440061.7.jpg)



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

https://pic.maxiol.com/images2/1690887111.781440061.5.jpg

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

https://pic.maxiol.com/images2/1690887198.781440061.6.jpg

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

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

Герберы: 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, 17:57
Сделал в корпусе отверстия, закрепил разъём PS/2 хомутом, сделанным из заглушки задней стенки PC-шного корпуса:

https://pic.maxiol.com/images2/1690901298.781440061.21.jpg

https://pic.maxiol.com/images2/1690901333.781440061.22.jpg

https://pic.maxiol.com/images2/1690901738.781440061.225.jpg

https://pic.maxiol.com/images2/1690901351.781440061.23.jpg

https://pic.maxiol.com/images2/1690901385.781440061.24.jpg

https://pic.maxiol.com/images2/1690901410.781440061.25.jpg