2018.11.16 19:29
이베이에서 중고 부품들을 구입해서 386 PC 를 조립했다.
386에는 PS2 포트가 없어서 시리얼 볼 마우스도 함께 구입했는데.
커서 움직임 감도가 영 안좋아서 광마우스를 사용하기 위한 PS2 To Serial 젠더를 구입했는데
물려서 시도해본 결과 인식되지 않았다.
검색해보니 PS2 마우스와 Serial 마우스의 프로토콜 자체가 달라서 젠더로는 해결할 수 없는 문제였다.
구입한 젠더는 마우스를 위한 용도가 아니었다.
인터넷을 검색해서 PS2 마우스를 Serial 마우스로 에뮬레이션 해주는 장치의 설계도와 소스코드를 찾았다.
아두이노를 이용한 장치인데 설계가 심플해서 시도해볼만 하다고 생각했다.
설계도대로 제작하고 펌웨어를 컴파일 업로드한 결과 386에서 광마우스를 인식시키는데 성공했다.
그런데 KVM에 물리니 동작하지 않았다.
인터넷에서 PS2 인터페이스와 프로토콜에 대한 문서를 찾아서 연구했다.
원인은 KVM에서는 원래 소스코드에서 사용한 마우스 이벤트를 가져오는 프로토콜을 지원하지 않았던 것.
소스코드를 여러번 갈아엎는 험난한 작업끝에 KVM에서 동작하게 하는데 성공!
완성된 PS2 Serial Mouse Converter
386 PC에서 KVM을 통해 Serial Converter와 광마우스가 동작하고 있다.
처음 설계도와 소스코드를 만들어준 외국분께 너무 고맙다. 그리고 지금 너무 행복하다.
설계도를 다운받은 사이트
https://github.com/Lameguy64/ps2serial
PS2 인터페이스
http://www.isdaman.com/alsos/hardware/mouse/ps2interface.htm
2018.11.19 17:48
2018.11.19 18:48
감사합니다.
2018.12.29 19:46
수정하신 소스코드 올려주실 수 있으신가요??
2018.12.31 13:12
PS2Mouse 라이브러리에 있는 report() 함수 대신 아래 멤버함수 read_ps2_data()를 추가해 사용하세요.
int16_t * PS2Mouse::read_ps2_data(int16_t data[], int16_t timeout) {
int8_t d = RETURN_TIMEMOUT;
while(1)
{
d = read_byte_timeout(timeout);
if(d == RETURN_TIMEMOUT)
{
data[1] = 0;
data[2] = 0;
return data;
}
if(d&0x08 && !(d&0x80))
{
break;
}
}
data[0] = d;
data[1] = read_byte();
data[2] = read_byte();
return data;
}
int8_t PS2Mouse::read_byte_timeout(int16_t timeout) {
int8_t data = 0;
pull_high(_clock_pin);
pull_high(_data_pin);
delayMicroseconds(50);
int16_t c=0;
while (digitalRead(_clock_pin)) { if(c>timeout) { pull_high(_clock_pin); return RETURN_TIMEMOUT;} c++;}
delayMicroseconds(5); // not sure why.
while (!digitalRead(_clock_pin)) {}
for (int i = 0; i < 8; i++) {
bitWrite(data, i, read_bit());
}
read_bit(); // Partiy Bit
read_bit(); // Stop bit should be 1
pull_low(_clock_pin);
return data;
}
제가 사용하는 KVM에서는 report 프로토콜 0xeb를 지원하지 않아서 수정한것입니다.
KVM을 사용하지 않는다면 원래 소스에서도 문제없이 동작합니다.
2019.07.17 02:20
2019.07.17 09:59
timeout파라메터에 5000을 넣어주세요.
2019.07.17 10:02
그리고 원 소스에서는 핀 define이 잘못 되어있을겁니다. 저의경우 아래처럼 수정했습니다.
아마 어떤종류의 아두이노를 사용하느냐에 따라 달라지는것 같습니다.
#define PS2_MOUSE_CLOCK 2 /* Must connect to Pin 5 (clock) of PS/2 mouse */
#define PS2_MOUSE_DATA 5 /* Must connect to Pin 1 (data) of PS/2 mouse */
#define RTS_PROBE 3 /* Must connect to Pin 7 (RTS) of PC serial port */
/* (NOTE: must go through a 5v regulator and */
/* 200ohm resistor first or you'll blow the pin) */
2019.07.17 13:35
나머지는 전부 해결했는데.. RETURN_TIMEMOUT을 어떻게 초기화해야 하는지도 알고 싶습니다
라이브러리 포함한 전체 소스를 압축해서 올려주시면 안될까요 ㅜㅜ
2019.07.17 20:36
RETURN_TIMEMOUT은 아무값이나 자유롭게 define 해주시면 됩니다.
PS2Mouse.h 저의 경우 처음부분에 아래와같이 해주었습니다.
#define RETURN_TIMEMOUT -108
제가 풀소스를 올리지 않아서 고생하셨나보네요. 여기까지가 제가 수정한것 전부에요
직접 시도하시는분이 많지 않을것 같아서 그랬습니다.
2019.07.17 21:17
와 -108까지 하고나니 제 KVM에서도 잘 됩니다
글이 작성된지 좀 되었는데 빠르게 피드백 해주셔서 정말 감사드립니다
2019.07.18 11:55
축하드려요 ㅎㅎㅎ
2020.12.08 22:01
프로그램 문외한입니다만 올드컴 개조하다가 보고 질문드립니다. ㅜㅜ
혹시 소스 공유해 주시면 안될까요? 보고 따라하다가 안되서 포기하고 질문 드려 봅니다. ㅜㅜ
감사합니다!
2020.12.09 15:29
소스 업로드 했습니다. PS2S.zip 입니다. 성공하시면 좋겠네요.
2020.12.10 20:01
감사합니다!
정말 잘 쓰겠습니다!!!