Bài 18: Lập trình SMT32 USB HID Keyboard bàn phím máy tính

stm32 usb hid keyboard

Ở bài trước chúng ta đã làm quen với USB HID để tạo 1 con chuột máy tính, ở bài này chúng ta sẽ sử dụng STM32 USB HID Keyboard để chế tạo 1 chiếc bàn phím đơn giản, giao tiếp với máy tính nhé.

Bài 18 trong Serie Lập trình STM32 từ A tới Z

Bàn phím máy tính hoạt động như thế nào?

Lý thuyết quét phím ma trận

Về mặt phần cứng Bàn phím (Keyboard) là tập hợp các nút nhấn được thiết kế theo dạng ma trận phím. Nghĩa là chúng sẽ được nối chung hàng và cột. Vi điều khiển sẽ quét hàng hoặc cột theo một chu kì cố định để tìm kiếm sự thay đổi về trạng thái nút. Sau đó gửi lên máy tính thông qua chuẩn USB HID

quét phím
quét phím ma trận 4×3

Ví dụ: Trong hình trên chúng ta có 1 ma trận phím 4×3.

Để đọc được giá trị nhấn vi điều khiển sẽ lần lượt ghi mức 1 vào các chân 2 7 6 4 (Quét Hàng). Sau đó sẽ đọc giá trị từ 3 chân 3 1 5.
Nếu khi quét pin 2 mà pin3 có tín hiệu  => nút 1 được nhấn.

Tương tự với các nút còn lại.

Khi vi điều khiển biết được nút nào được nhấn. Nó sẽ gửi 1 gói tin sang vi điều khiển tương ứng với nút đó trên bàn phím, để máy tính hiểu rằng, phím đã được nhấn.

Để hiểu rõ hơn về bàn phím các bạn đọc bài viết: Lập trình STM32 giao tiếp ma trận bàn phím 3×4

Bàn phím thực tế

Trong thực tế bàn phím máy tính có rất nhiều nút nhấn. Bao gồm 2 loại chính:

  • Các nút kí tự: A-Z, số, các kí tự đặc biệt …
  • Các nút lệnh: Shift, Alt, ……

Tất cả các phím được sắp xếp theo tiêu chuẩn nhất định. Mặc dù các loại bàn phím khác nhau sẽ có thêm hoặc bớt các phím, thế nhưng cấu trúc của bàn phím hầu như không đổi

k200 media keyboard refresh b2b b2c

Report Descriptor USB HID của bàn phím máy tính

Phân tích Report Descriptor Keyboard

Để máy tính hiểu được dữ liệu chúng ta gửi lên thì Keyboard sẽ phải gửi 1 Report Descriptor, sau đó dữ liệu gửi lên phải đúng fomat của RD đó. Bạn có thể google search: Report Descriptor Keyboard chúng ta sẽ có ngay kết quả

Sử dụng công cụ kiểm tra Report Descriptor ở bài trước phân tích như sau:

0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
0x09, 0x06,        // Usage (Keyboard)
0xA1, 0x01,        // Collection (Application)
0x05, 0x07,        //   Usage Page (Kbrd/Keypad)
0x19, 0xE0,        //   Usage Minimum (0xE0)
0x29, 0xE7,        //   Usage Maximum (0xE7)
0x15, 0x00,        //   Logical Minimum (0)
0x25, 0x01,        //   Logical Maximum (1)
0x75, 0x01,        //   Report Size (1)
0x95, 0x08,        //   Report Count (8)
0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x01,        //   Report Count (1)
0x75, 0x08,        //   Report Size (8)
0x81, 0x03,        //   Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x05,        //   Report Count (5)
0x75, 0x01,        //   Report Size (1)
0x05, 0x08,        //   Usage Page (LEDs)
0x19, 0x01,        //   Usage Minimum (Num Lock)
0x29, 0x05,        //   Usage Maximum (Kana)
0x91, 0x02,        //   Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x95, 0x01,        //   Report Count (1)
0x75, 0x03,        //   Report Size (3)
0x91, 0x03,        //   Output (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x95, 0x06,        //   Report Count (6)
0x75, 0x08,        //   Report Size (8)
0x15, 0x00,        //   Logical Minimum (0)
0x25, 0x65,        //   Logical Maximum (101)
0x05, 0x07,        //   Usage Page (Kbrd/Keypad)
0x19, 0x00,        //   Usage Minimum (0x00)
0x29, 0x65,        //   Usage Maximum (0x65)
0x81, 0x00,        //   Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0,              // End Collection

// 63 bytes

Như vậy khi 1 phím được nhấn, bàn phím sẽ phải gửi 63 byte ( với chuột máy tính là 74 byte) để báo cho máy tính biết rằng nút nào được nhấn. Các data được gửi qua lại USB HID với Input sẽ là các nút được nhấn và Output sẽ dùng để điều khiển các đèn Led trên bàn phím (Numlock, Caplock …)

Cấu trúc dữ liệu khi gửi của HID KeyBoard

Nhìn vào Report Descriptor của Keyboard chúng ta cũng dễ dàng phân tích được dữ liệu sẽ truyền lên máy tính như thế nào.

Khi Keyboard truyền lên máy tính thì sẽ gồm tất cả Input trong Usage Page (Kbrd/Keypad)

Tống sẽ là 1 Byte + 1 Byte + 6 Byte.

Trong đó:

  • Byte đầu tiên sẽ là Modifier keys status có giá trị từ 0xE0 – 0xE7: Chứa các giá trị của các phím lệnh
  • Byte thứ 2 là Byte đặc tả của HID, chúng ta ko cần quan tâm
  • 6 Byte còn lại là Keypress fields có giá trị từ 0x00 – 0x65 hay từ 0 – 101 theo hệ thập phân: Chứa các giá trị của phím kí tự

STM32 USB HID Keyboard

Chi tiết tham khảo tài liệu về USB HID Keyboard: https://wiki.osdev.org/USB_Human_Interface_Devices

Vậy làm thế nào chúng ta biết được mỗi phím tương ứng với giá trị nào. Hãy cùng tham khảo bảng sau:

Với trường Modifier keys status các giá trị từ E0-E7 tương ứng với nút nào được nhấn:

STM32 USB HID Keyboard 2

Với trường Keypress fields giá trị từ 0x00 – 0x65 tương ứng với kí tự nào được nhấn

STM32 USB HID Keyboard 3

Chi tiết tham khảo tài liệu Tài liệu bảng mã kí tự trên USB HID Keyboard: https://d1.amobbs.com/bbs_upload782111/files_47/ourdev_692986N5FAHU.pdf

Lập trình STM32 USB HID Keyboard bàn phím máy tính

Cấu hình STM32 USB HID Keyboard trên CubeMX

Cấu hình SYS – Debug -Serial Wire. RCC – HSE – Crystal.

Cấu hình GPIO Input – Pull Up. Cấu hình tương tự Bài STM32 với Keyboard

Screenshot 2 1
Cấu hình GPIO
USB HID KEYBOARD 1
USB chế độ Device
USB HID KEYBOARD 2
Middware chọn HID Class
USB HID KEYBOARD 3
Dao động USB chọn 48Mhz
USB HID KEYBOARD 4
Gen code và Open Project

Lập trình STM32 USB HID Keyboard trên Keil C

Sau khi mở project. Chúng ta phải cấu hình lại cho HID, bởi vì mặc đinh CubeMx Gen ra là chuột máy tính. Đầu tiên sửa interfaceprotocol.

HID Keilc 1
Chỉnh Protocol thành 0x01
HID Keilc 2
Chỉnh Report Descriptor
HID Keilc 3
Tìm tới nơi define kích thước Report
HID Keilc 4
Chỉnh lại kích thước RD là 63

Nhấn F7 Build và F8 nạp chương trình vào KIT. Sau đó cắm cổng Micro USB vào máy tính. Vào Manager trên Computer để xem thiết bị đã chuyển thanh Keyboard chưa. Các bạn nếu chưa biết làm thì đọc lại bài STM32 HID Chuột máy tính nhé!

usb hid

Ok, vậy là đã config xong HID. Chúng ta bắt đầu lập trình cho Keypad có thể gửi được dữ liệu lên máy tính

Phần Keypad các bạn down thư viện và add vào theo hướng dẫn: STM32 Keypad 3×4

Trong Main, chúng ta Include Keypad và USBD_HID vào.

Khới tạo các biến cho USB và Keypad

Screenshot 3 1
Thêm thư viện và khai báo các biến

Phần KEYMAP thay vì các kí tự từ 1 – 9, chúng ta sẽ đối chiếu với tài liệu bên trên, sau đó thay vào các giá trị Hex của bàn phím tương ứng với Key 1 – 9. Key # mình sẽ thay bằng Enter.

Screenshot 4 1

Trước While chúng ta khởi tạo Keypad. Sau đó đọc dữ liêu từ bàn phím.

Nếu phím được nhấn, copy dữ liệu vào report[2] (Keycode 1), sau đó gửi dữ liệu đi

Tiếp đến xóa dữ liệu và dừng gửi dữ liệu bằng cách send report trống.

Lưu ý: Nếu bạn không gửi report trống lên, USB HID sẽ liên tục gửi dữ liệu lên máy tính

Build và nạp vào KIT.

Kết nối phần cứng

PA0,1,2,3  theo thứ tự nối với các chân 2,7,6,4

PA4,5,6 theo thứ tự nối với các chân 3,1,5

Kết quả

Kết

STM32 USB HID Keyboard khá giống với HID Mouse hay tất cả các kiểu thiết bị khác sử dụng chuẩn HID, với kiến thức ở bài này, bạn có thể dễ dàng tự làm cho mình 1 chiếc bàn phím máy tính mà không cần mua ở ngoài cửa hàng.
Nếu thấy bài viết này có ích hãy chia sẻ cho bạn bè và cùng vào Group Nghiện Lập Trình để kết nối với những anh em thích lập trình nhé !!!
Link Code mẫu: Hướng dẫn download tài liệu lập trình stm32

 

2 thoughts on “Bài 18: Lập trình SMT32 USB HID Keyboard bàn phím máy tính

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *