Ở 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
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
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ự
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:
Với trường Keypress fields giá trị từ 0x00 – 0x65 tương ứng với kí tự nào được nhấn
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
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.
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é!
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
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.
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
Anh ơi khi nào có bài mới vậy, hóng quá.
Anh viết thêm esp32 nên stm32 hơi pending 1 chút xíu hehe, thông cảm nhé