Компьютеры Windows Интернет

Схема разъема ps 2 клавиатуры компьютера. Исходный код прошивки

Вторник, 04 Февраля 2014 г. 11:33 + в цитатник

Итак произошел отказ мышки PS/2. Дефекты причём могут быть разными, например мышка начала при одном нажатии на клавишу выдавать два нажатия. Почему в качестве примера я привёл этот дефект? Потому, что в этом случае сложно свалить на неисправность кнопки. И в мастерскую такую мышку не понесёшь, так как ремонт мышки обойдётся как минимум вдвое дороже чем покупка новой. Так, что можно выбрасывать мышку? Совсем необязательно если у вас есть некоторые навыки в ремонте (например умение аккуратно провести пайку) или если у вас есть знакомый обладающий этими навыками и ему не жалко десяти минут для вас.

Распайка разъёма мыши PS/2

№ п/п

Сигнал

1 Data
2 не задействован
3 Ground
4 +5V
5 Clock
6 не задействован

Ремонт компьютерной мышки PS/2

Основная причина всех встречающихся дефектов мышки это ухудшение проводимости провода. Дефект очень легко вычисляется с помощью омметра. На исправной жиле провода омметр будет показывать 1-10 Ом, а если жила неисправна от 150 Ом и выше.

Теперь как ремонтировать. Сам разъём PS/2 не разборной, но как выяснилось он нам и не нужен. Как выяснилось неисправность кроется на участке провода от внутреннего разъёма мыши и до выхода провода из мыши. (Почему-то все производителе с относительно недавнего времени решили, что в этом месте должен быть переход с внутренней проводки на внешнюю + именно в месте выхода провода из мышки бывает самая большая нагрузка на провод). В общем выкусываем этот участок провода, (можно пойти двумя путями просто откусить край провода со стороны мышки и запаять его снова в мышку или выкусить участок и спаять провод (я предпочитаю второй вариант (всё равно стык будет внутри мышки))) зачищаем и залуживаем жилы кабеля, и восстанавливаем целостность провода. (Кстати сразу после выкусывания проверяем целостность жил провода)

Компьютерная техника не стоит на месте, она постоянно усовершенствуется, и зачастую на смену стационарным компьютерам приходят ноутбуки. А для ноутбука тоже нужна мышка, и куда девать старую мышку с круглым разъёмом? И тем более, если она прекрасно работает и по эргономике очень хорошо подходит к вашей руке... Выкидывать?

Нет, зачем же, выход есть - её надо переделать под разъём USB.

Есть 2 варианта: можно просто сделать переходник, или убрать старый кабель на мышке и подключить новый - с штекером USB. Схема распайки как видите довольно проста - всего 4 провода. Достаточно взять какой-нибудь старый кабель с USB-штекером, от фотоаппарата или мобильного телефона например, или можно купить такой кабель на барахолке и заменить его на мышке.

А назначение проводов USB-разъёма, ориентируясь по цвету и номерам, следующее:

1. красный - питание, 5 Вольт,
2. белый (серый) (D-) - передает данные от компьютера к мышке,
3. зеленый - передает данные с мышки на компьютер (D+),
4. черный - заземление (корпус).

Ориентируясь по цветам проводов можно быстро перепаять кабель, но, я вам все же советую перед тем как отпаять старый кабель - прозвоните тестером и лишний раз убедитесь, что цвета проводов соответствуют номерам на разъёме. Как показывает практика, человеческий фактор всё же присутствует и ошибки тоже бывают.

Используя данную схему распайки можно и клавиатуру с круглым PS/2 разъёмом переделать под разъём USB. Всё так же, подключив нужные провода к нужным контактам... Думаю, эта статья поможет с пользой утилизировать (приспособить) устаревшие, но ещё вполне хорошие и работоспособные детали от старых ПК.

Со временем возникает вопрос, как вводить данные в микроконтроллер ? Классическое решение, которое приходит большинство нам — использовать кнопки … протравить на плате дорожки и контактные площадки для кнопок , далее их припаять , решить как отслеживать нажатие кнопки — по прерыванию или через опрос состояния кнопок по циклу . Если кнопок много , они будут занимать значительное количество pin-ов микроконтроллера. Путь тернистый.

Я предлагаю использовать, то что у нас под рукой — простую PS/2 компьютерную клавиатуру . Из плюсов:

  • вещь не дорогая;
  • продается в любом компьютерном магазине
  • нам доступно 101 клавиша
  • займет клавиатура всего 2-pin микроконтроллера для синхросигнала и данных.



В качестве микроконтроллера я буду использовать ATmega328P или Arduino UNO .

Немного теории

Если вы вскроете оплетку кабеля для клавиатуры, то вы обнаружите 4-е провода :

  • провод питания (5 В)
  • провод земли
  • провод синхросигнала (CLK)
  • провод данных (DATA )

Каждая клавиша на клавиатуре имеет свой 8-и битный код , называемый скан-кодом и записывается в шестнадцатеричном виде (HEX), смотри ниже.


Когда вы нажимаете на клавишу , по SLK передаются прямоугольные импульсы а по DATA 11-и битный код:


Биты данных считываются компьютером при переходе CLK с высокого уровня на низкий.

Первый бит всегда равен 0 — это стартовый бит , далее идет 8-емь бит скан-кода , после чего бит контроля четности и в конце стоповый бит , который всегда равен 1 .

Как подключить PS/2 клавиатуру к микроконтроллеру?

На самом деле порт PS/2 компьютерный клавиатуры это разновидность разъема Mini-DIN, её 6-и пиновый вариант.
В клавиатуре установлен min-din 6 pin штекер (папа), мы все его видели на конце кабеля клавиатуры.

Гнездо min-din 6 pin (мама) находится на материнской плате, для подключения к микроконтроллеру нам придется его выпаивать из старой клавиатуры, что не удобно.

Я советую приобрести нормальное гнездо min-din 6 pin для кабеля, например на ebay.ru он стоит ~ 1$ . Выглядит он следующим образом:


(слева в собранном виде, справа в разобранном)

В качестве примера я буду подключать клавиатуру к Arduino UNO (контроллер ATmega328P ), от нас требуется подключить проводки по следующей распиновки.

Помощь паяльника не понадобится, провода обжимаются пассатижами в металлические зажимы, в результате у меня получился следующий переходник.


В вашем случае концы проводков вы можете припаять к плате микроконтроллера , я буду использовать pin-ы Arduino UNO .

  • GND подключаем к GND Arduino UNO
  • Vcc подключим к 5V Arduino UNO
  • DATA подключим 2-pin Arduino UNO
  • CLK подключим к 3-pin Arduino UNO


Исходный код прошивки

В интернете для работы с PS/2 клавиатурой в больше половины случаев используют библиотеку ps2keyboard, где через цикл проверяют состояние «переменной — буфера» обмена с клавиатурой. Я не сторонник проверять что-то через цикл, прошивка будет занята только работой с клавиатурой. А если нам нужно производить расчеты или работать с каким-нибудь медленным оборудованием? Тут будет что-то страдать или наши расчеты или скорость реакции на клавиатуру.

Я предлагаю использовать прерывание…

PIN контроллера принимающий CLK (синхроимпульсы) от клавиатуры нужно настроить как внешнее прерывание при переходе из высокого состояние в низкий и в обработчике считывать бит данных с DATA. Алгоритм обработчика прерывания должен побитно накапливат ь посылаемый скан-код с клавиатуры .

Код для Arduino, подключаем DATA к 2-ому пину, CLK подключим к 3-ему пину.

const int DataPin = 2; // канал DATA клавиатуры const int IRQpin = 3; // канал CLK клавиатуры int count=1; // счетчик текущего бита 11-битного кода от клавиатуры int m=0; // счетчик текущего бита скан-кода uint8_t scan_code=0; // скан-код нажатой клавиши void ps2interrupt(void) { /* обработчик прерывания от CLK клавиатуры */ /* считываем скан-код с клавиатуры по битно в переменную scan_code */ if ((count>1) and (count<11)) { /* вырезаем из 11-и битного кадра, 8-и битные скан код */ scan_code |=(digitalRead(2)<11) { Serial.print(scan_code,HEX); /* ВЫВОДИМ */ Serial.println(); m=0; count=1; scan_code=0; } } void setup() { delay(1000); Serial.begin(9600); pinMode(DataPin, INPUT); pinMode(IRQpin, INPUT); attachInterrupt(1, ps2interrupt, FALLING); //посадим на прерывание от 3 pin (канал клавиатуры CLK) обработчик ps2interrupt Serial.begin(9600); } void loop() { delay(1000); }

const int DataPin = 2 ; // канал DATA клавиатуры

const int IRQpin = 3 ; // канал CLK клавиатуры

int count = 1 ; // счетчик текущего бита 11-битного кода от клавиатуры

int m = 0 ; // счетчик текущего бита скан-кода

uint8_t = 0 ; // скан-код нажатой клавиши

void ps2interrupt (void ) { /* обработчик прерывания от CLK клавиатуры */

/* считываем скан-код с клавиатуры по битно в переменную scan_code */

if ((count > 1 ) and (count < 11 ) ) { /* вырезаем из 11-и битного кадра, 8-и битные скан код */

|= (digitalRead (2 ) << m ) ;