อ่านค่า Optical Sensor จากเม้าส์ด้วย Mbed
บทความสอนวิธีการอ่านค่าจากเซนเซอร์ Optical mouse ด้วย Blue pill ใน mbed
10 December, 2019 by
อ่านค่า Optical Sensor จากเม้าส์ด้วย Mbed
Liew Wuttipat
| No comments yet

        สวัสดีครับ วันนี้ผมจะมาสอนวิธีการอ่านค่าจากเม้าส์เซนเซอร์ที่เป็น Optical ผ่าน PS/2 Protocol ด้วยบอร์ด STM32F103 (Blue pill) mbed กัน

        เพื่อนๆอาจจะเคยวัด ความเร็ว หรือระยะทางการเคลื่อนที่ด้วยเซนเซอร์เอ็นโค้ดเดอร์ แต่วันนี้เราจะมาลองวัดความเร็ว หรือระยะทางที่เคลื่อนที่ ด้วยเซนเซอร์ Optical ที่ใช้กันในเม้าส์เลเซอร์ทั่วไป ซึ่งความละเอียดของเซนเซอร์พวกนี้ จะขึ้นอยู่กับ DPI ซึ่งหากเป็น 1000dpi ก็จะละเอียดมากถึง ~0.03 mm และสามารถวัดได้ 2 แกน ทั้ง X-Y

        การเลือกเม้าส์มาใช้ทำเซนเซอร์นี้เราจะต้องเลือกที่รองรับ PS/2 ซึ่งเม้าส์รุ่นเก่าๆ ที่เป็นช่องเสียบสีเขียวๆนั้นจะรองรับอยู่แล้ว หรือหากเป็น USB เราก็ต้องดูว่ารองรับหรือไม่ ที่เลือกใช้ PS/2 Protocol ก็เนื่องจากทำความเข้าใจได้ง่าย เพื่อนๆสามารถเข้าไปศึกษาได้ที่ การเชื่อมต่อเม้าส์ PS/2 Mouse Interface


        สิ่งที่ต้องทำก่อนอื่นเลยก็คือ ไปหาเม้าส์มาแล้วแกะมันออก จากนั้นมองหาช่องที่เชื่อมต่อกับสายไฟ PS/2 หรือ USB ช่องที่เราต้องการนั้นจะมีอยู่ 4 ขา คือ

* Vcc : ส่วนใหญ่จะเป็นสายสีแดง (USB pin 1)
* Data : ส่วนใหญ่จะเป็นสายสีเขียว (USB pin 2)
* Clock : ส่วนใหญ่จะเป็นสายสีขาว (USB pin 3)
* Gnd :  ส่วนใหญ่จะเป็นสายสีดำ (USB pin 4)

ซึ่งช่องทั้งหมดที่ต้องการนั้นเราอาจจะต้องใช้ทักษะในการหามัน ถ้าไม่มั่นใจให้ลองเปิด Datasheet ของ IC ที่อยู่บนเม้าส์แล้วเอามัลติมิเตอร์เช็คดู ว่าเชื่อมต่ออยู่กับขาไหน

เมื่อหาเจอครบแล้วต่อไปเราก็จะมาต่อเข้ากับบอร์ด Bluepill โดยเชื่อมต่อตามนี้

* Mouse Vcc เชื่อมต่อกับ Bluepill 5V
* Mouse Data เชื่อมต่อกับ Bluepill PA_5
* Mouse Clock เชื่อมต่อกับ Bluepill PA_6
* Mouse Gnd เชื่อมต่อกับ Bluepill Gnd

จากนั้นให้ไปดาวน์โหลด Library ที่ PS/2 Mouse Library Mbed
แล้วอัพโหลดโค้ดตัวอย่างลงไปยังบอร์ด Bluepill

#include <mbed.h>
#include "PS2Mouse.h"

#define LED_BUILTIN PC_13

#define SERIAL2_TX PA_2
#define SERIAL2_RX PA_3

Serial serial(SERIAL2_TX, SERIAL2_RX, 9600);
DigitalOut led(LED_BUILTIN);
PS2Mouse ps2ms(PA_6, PA_5); //Clock pin, Data pin

int main()
{
led = 1;
wait_ms(2000);

serial.printf("STM32 bluepill mbed test.\n");
led = 0;

if (!ps2ms.begin())
{
serial.printf("Cannot connect to PS/2 Mouse\n");
return 0;
}

while (true)
{
ps2ms.update();

printf("%d\t", ps2ms.info.btnLeft);
printf("%d\t", ps2ms.info.btnCenter);
printf("%d\t", ps2ms.info.btnRight);
printf("%d\t", ps2ms.info.moveX);
printf("%d\n", ps2ms.info.moveY);

wait_ms(50);
}
}


        โค้ดนี้จะแสดงค่าการกดปุ่มเม้าส์ ซ้าย-กลาง-ขวา และความเร็วการเคลื่อนที่ของเม้าส์ในแกน X-Y ค่าความเร็วที่อ่านได้นั้นสามารถนำไปเปลี่ยนเป็นระยะทางได้โดยการอินทริเกรต

        สำหรับบทความนี้หากสงสัยหรือติดปัญหาอะไรสามารถคอมเม้นท์ถามไว้ใต้บทความได้นะครับ ในบทความต่อๆไปผมจะมาเขียนเกี่ยวกับการนำเอาเซนเซอร์เม้าส์นี้ไปประยุกต์ใช้กับแอพลิเคชันต่างๆ



Sign in to leave a comment