หลังจากที่ผมได้อ่านตามเว็บต่างๆ พบมีการใช้ไมโครคอนโทรลเลอร์มารับค่าจาก keyboard แบบ PS/2 ที่ใช้ในคอมพิวเตอร์รุ่นเก่าๆ จึงอยากลองเขียนดูบ้าง ตัว keyboard ได้ของเก่าจากห้องเก็บของซึ่งก็เก่ามากยี่ห้อ Sony แต่ยังใช้งานได้ดีอยู่เลย
ในการทดลองผมได้ทำตัวแปลงหัวพอร์ตของ Keyboard เป็นขาแบบ SIP จำนวน 6 ขา เพื่อความสะดวกในการต่อกับบอร์ด Arduino โดยออกแบบวงจรอย่างง่ายด้วยโปรแกรม Protel99se
บอร์ด Arduino ที่ใช้คือ Arudino Mega 2560 แต่ก็สามารถใช้ Arduino รุ่นอื่นได้เนื่องจาก Code ที่เขียนมีขนาดเล็ก
จอแสดงผลผมใช้จอของ SILA รุ่น TLCD-164 เป็นบอร์ด Graphic LCD แบบสำเร็จรูปสามารถที่จะแสดงผลภาษาไทย อังกฤษ และรูปภาพต่างๆ ได้ โดยมี interface 3 แบบ คือ TTL Serial, RS-232 Serial, SPI ในการทดลองนี้ได้เลือกใช้ interface แบบ TTL Serial เนื่องจากสามารถต่อกับ Arduino ได้ตรงๆ และง่าย ในการทดลองนี้ได้ใช้งาน 4 คำสั่ง คือ
หลักการรับค่าจาก Keyboard จะทำโดยผ่านทางสายสัญญาณ 2 เส้น และไฟเลี้ยง 2 เส้น ดังนี้
ขาแต่ละขาของพอร์ต PS/2 มีหน้าที่ดังนี้
บัสของ Keyboard จะเป็นมาตรฐาน TTL 5V โหมดของบัส PS/2 มี 3 โหมด ดังนี้
โหมดหลักๆ ที่เราใช้จะเป็นโหมดที่ 3 เพื่อที่จะรอรับค่าที่ Keyboard ส่งมาหา Arduino เมื่อมีการกดปุ่มใดๆ โดย ทั้งสัญญาณ Data และ Clock จะถูกควบควบคุมโดย Keyboard ทั้งหมด เราทำแค่อ่านค่าบิตข้อมูลทุกๆ ขอบขาลงของสัญญาณ Clock เมื่อมีการกดปุ่มที่ Keyboard บัสของระบบจากที่อยู่สถานะ Idle จะเปลี่ยนเป็นสถานะ Host-Request-to_Send โดย Keyboard จะให้สัญญาณ Data เป็น LOW บ่งบอกถึงการเริ่มการส่งข้อมูล รูปแบบของข้อมูลที่ Keyboard ส่งไปจะมีขนาด 11 บิต ดังรูปที่ 7
ข้อมูลทั้ง 11 บิต ประกอบด้วย
เมื่อ Data = 0 เป็นการเริ่มการส่งข้อมูล ให้รอจน Clock = 0 ต่อไปก็ให้รอขอบขาลงของ Clock ลูกถัดไป แล้วทำการอ่านค่าสัญญาณของ Data เก้บไว้ในตัวแปร เก็บจนครบ 8 บิตข้อมูล 2 บิตสุดท้ายคือ Parity และ Stop bit ไม่ต้องสนใจก็ได้ ข้อมูลที่ได้จะเป็นค่า Scan code ของแต่ละปุ่มซึ่งต้องนำมาแปลค่าอีกที
จากรูปที่ 8 เราค่าที่ส่งมาคือ 0x15 เมื่อเปิดตารางแปลจะมีความหมายเป็นตัว Q ส่วนค่าประจำตัวของตัวอื่นๆ สามารถดูได้จากลิงค์ต่อไปนี้ เมื่อมีการกดปุ่มจะมีค่าส่งออกมา 2 แบบ คือ ค่าเมื่อกดปุ่มลงไป เช่น ตัว Q คือ 0x15 อีกค่าที่ออกมาจะออกเมื่อปล่อยปุ่ม Q คือ 0xF0 0x15 ทำให้เราสามารถรู้ได้ว่าผู้ใช้ที่กดปุ่มได้ปล่อยปุ่มหรือยัง ตัวค่าที่ออกมาเมื่อปล่อยปุ่มส่วนใหญ่มีขนาด 2 byte โดย byte แรกจะเป็นค่า 0xF0 ตัวถัดมาเป็นค่าประจำตำแหน่งของปุ่มนั้นๆ ในส่วนของ Sourcecode เขียนด้วย Arduino version 1.0 โดยต่อขา Data เข้ากับขา Digital 2, Clock เข้ากับขา Digital 3 ของ Arduino มีการแสดงผลออก 2 ทาง คือ จอแอลซีดี และทาง Serial Port รองรับการพิมพ์อักษรภาษาอังกฤษทั้งพิมฑ์เล็ก พิมพ์ใหญ่ อักขระพิเศษ ปุ่ม Tab, Caps lock, Shift
Source code File ครับ หวังบทความนี้คงพอช่วยให้ท่านสนุกกับการเล่นนะครับ แหล่งข้อมูล
http://en.wikipedia.org/wiki/PS/2_connector |