হ্যাঁ, আমি আরডুইনো.সি. ফোরাম এবং এখানে অনুসন্ধান করেছি। হ্যাঁ, আমি পিএস 2 দেব গ্রন্থাগার সম্পর্কিত নিবন্ধগুলি পেয়েছি। হ্যাঁ, আমি এই ওয়েবসাইটটিতে চূড়ান্ত পিএস / 2 ইন্টারফেস নিবন্ধটি পড়েছি (ঠিক আছে, কেউ কেউ স্কিমেড করেছি) । হ্যাঁ, আমার এই কাজ হচ্ছে, দয়ালু। পুরোপুরি কাজ করার জন্য লিপ তৈরি করার জন্য আমার কিছু ধারণা দরকার। :)
না, আমি কেবল একটি ইউএসবি এইচডি কীবোর্ড অনুকরণ করতে পারি না এবং এটিকে রেখে দিতে পারি - এটি পিএস / 2 কীবোর্ড অনুকরণ হওয়া দরকার। হ্যাঁ, আমি যথাযথ মেক এবং ব্রেক সিগন্যাল প্রেরণ করছি - এটি এমনকি খুব জটিল কীস্ট্রোক সমন্বয় পরিচালনা করে। এখনই যেমন দাঁড়িয়ে আছে, আমার আর্দুইনোর জন্য নীচে পোস্ট করা কোড রয়েছে (প্রযুক্তিগতভাবে একটি ফ্রিডিনো 1.22), এবং আমি সিরিয়াল মনিটর বা পুটিটিওয়াই টার্মিনালের মাধ্যমে কীস্ট্রোকগুলি পাঠিয়েছি, পাশাপাশি হ্যান্ড পাইথন মোড়ক / ড্রাইভার সহ যা প্রকৃত প্রেরণ করে পিএস / 2 স্ক্যানকোড তথ্য - এবং সাধারণত আমার জীবনকে আরও সহজ করে তোলে - এছাড়াও আরডুইনো থেকে কিছুটা লোড নিয়ে।
এই মুহুর্তে, আমারে আরডুইনোতে একটি স্কেচ চলছে যা একটি PS / 2 কীবোর্ড অনুকরণ করে। স্বাভাবিকভাবেই, আমাকে আমার "টার্গেট" মেশিনটি বুট করতে হবে (মেশিন যে PS / 2 প্লাগটি যায়) এবং আমি "হ্যান্ডশেক" করতে দেখি। উইনডোজ থেকে বুট করুন, নোটপ্যাড খুলুন এবং আমার পাইথন "ড্রাইভার" ব্যবহার করে স্ক্রিনে (সফলভাবে) কীস্ট্রোক চালনা করুন drive (ড্রাইভারটি কেবল সিরিয়াল মনিটর / পিটিটিওয়াই টার্মিনালের জায়গা নেয় এবং পাইসারিয়াল নামক মডিউলটি ব্যবহার করে সিরিয়াল পোর্টে পড়ে / লেখেন)) এটি ASUS মাদারবোর্ডের "টার্গেট" এর একটি এএমডিতে করা হয়।
এখন, লক্ষ্যটি হ'ল এটি আমার ইন্টেলের সাথে ইনটেল মাদারবোর্ড ভিত্তিক "টার্গেট" ভিত্তিতে কাজ করবে, আমি এটি প্লাগ ইন করব, বুট করব এবং কোনও ডাইস নেই। সুতরাং, আমি আমার ছোট্ট আর্ডি বন্ধুর উপর আসলে কী চলছে তার একটি চেষ্টা করে দেখার জন্য আমি স্কেচটি কিছুটা সংশোধন করেছি। মোডগুলির পরে সংস্করণটি নীচে প্রদর্শিত হবে। যেহেতু আমি এটি বুঝতে পেরেছি (কোডটি অন্য আরডুইনো.সি.সি ফোরাম পোস্ট থেকে "ধার করা" হয়েছিল ) এখানে পিএস / 2 এর মাধ্যমে "টার্গেট" এর সাথে প্রথমে একটি সংযোগ স্থাপনের চেষ্টা করবে এবং অন বোর্ডের নেতৃত্বে .5 সেকেন্ড সময়কালে এলইডি জ্বলজ্বল করবে সংযোগ স্থাপন করা হয়। ইন্টেল লক্ষ্যটি .5 সেকেন্ড পিরিয়ড ব্লিঙ্কগুলি অতিক্রম করে না এবং সিরিয়াল সংযোগটি "হোস্ট" দিয়ে কখনই প্রতিষ্ঠিত হয় না।
আমার প্রশ্নটি হ'ল পিএস / ২ কিবোর্ডগুলি তাদের টার্গেট মেশিনের সাথে যোগাযোগ স্থাপনের ক্ষেত্রে একটি বড় পার্থক্য রয়েছে? এটি কি আসলেই কোনও ডিজাইনের পার্থক্য বা আমার এখানে আরও সমস্যাযুক্ত আরও কিছু মৌলিক বিষয় সন্ধান করা উচিত? আমি ডেটা / ঘড়ির ইনপুটগুলিতে পুল-আপ রেজিস্টারগুলির প্রয়োজন সম্পর্কে কিছু শুনেছি, তবে কোডটিতে এটি হ্যান্ডেল করা উচিত, বিশেষত কারণ এটি অন্য লক্ষ্য নিয়ে কাজ করছে, কেবল এটির কাজ করা আমার প্রয়োজন নয়।
কোন ধারনা? আমি এই কাজটি ASAP পেতে চাই - আমি ডিবাগ করা চালিয়ে যাচ্ছি, যে কোনও পয়েন্টার বা পরামর্শগুলি প্রশংসিত হবে। তাদের সবার পূর্ণ বিবেচনা করা হবে কারণ আমার এই বিষয়ে কিছুটা নতুন চোখের প্রয়োজন। সম্ভবত PS2dev গ্রন্থাগারের আরও ভাল বাস্তবায়ন প্রয়োজন?
#include "ps2dev.h" // to emulate a PS/2 device
// Orange = 2
// Blue = 3
// Red = 5V (3 in)
// Black = GND (4 in)
// EXT Power, USB for COM only
PS2dev keyboard(3,2); // PS2dev object (2:data, 3:clock)
int enabled = 0; // pseudo variable for state of "keyboard"
boolean serialConnected = false;
int incomingByte = 0;
void ack() {
//acknowledge commands
while(keyboard.write(0xFA));
}
int kbdCmd(int command) {
unsigned char val;
switch (command) {
case 0xFF: //reset
ack();
//the while loop lets us wait for the host to be ready
while(keyboard.write(0xAA)!=0);
break;
case 0xFE: //resend
ack();
break;
case 0xF6: //set defaults
//enter stream mode
ack();
break;
case 0xF5: //disable data reporting
//FM
enabled = 0;
ack();
break;
case 0xF4: //enable data reporting
//FM
enabled = 1;
ack();
break;
case 0xF3: //set typematic rate
ack();
keyboard.read(&val); //do nothing with the rate
ack();
break;
case 0xF2: //get device id
ack();
keyboard.write(0xAB);
keyboard.write(0x83);
break;
case 0xF0: //set scan code set
ack();
keyboard.read(&val); //do nothing with the rate
ack();
break;
case 0xEE: //echo
//ack();
keyboard.write(0xEE);
break;
case 0xED: //set/reset LEDs
ack();
keyboard.read(&val); //do nothing with the rate
ack();
break;
}
}
void connectHost() {
while (Serial.available() <= 0) {
Serial.print('A'); // send a capital A
delay(300);
}
}
void setup() {
pinMode(13, OUTPUT);
//establish serial connection with host
Serial.begin(9600);
// establish ps/2 connection with target
while(keyboard.write(0xAA)!=0){
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
}
delay(100);
connectHost();
Serial.println("\nSerial Host Connected");
Serial.flush();
}
void loop() {
unsigned char c;
if( (digitalRead(3)==LOW) || (digitalRead(2) == LOW)) {
if(digitalRead(3)==LOW){
Serial.println("pin 3 is LOW");
} else {
Serial.println("pin 2 is LOW");
}
while(keyboard.read(&c));
kbdCmd(c);
Serial.print("Target: 0x");
Serial.println(c, HEX);
}
else {//if host device wants to send a command:
//echo ASCII code from terminal and write to ps/2
if(Serial.available() > 0) {
incomingByte = Serial.read();
keyboard.write(incomingByte);
Serial.print("Host: 0x");
Serial.print(incomingByte, HEX);
Serial.print(" ");
Serial.print(incomingByte);
Serial.print(" ");
Serial.println(incomingByte, BIN);
}
}
}