# 材料清单
- ESP32S3(任何支持作为USB键盘的开发板)
- 跳线若干
- 定位版 * 1
- 磁轴 * 2(匹配按键数)
- 键帽 * 2(同上)
- 49E霍尔传感器 * 2(同上)
- 面包板(可选,用于原型)
# 连线
49E正面(有字的一面)朝上,依次连接正极(3.3V)、负极(接地)、信号线。
# 固件
采用Arduino,其中一个键的示例如下:
#include <Arduino.h>
#include <USBHIDKeyboard.h>
#include <USB.h>
#define LED1 GPIO_NUM_10
#define KEY1 GPIO_NUM_16
// 初始化键盘
USBHIDKeyboard keyboard;
void setup() {
pinMode(LED1, OUTPUT);
keyboard.begin();
USB.begin();
}
void loop() {
// 读取霍尔传感器数值
auto hal = analogRead(KEY1);
if (hal < 1800) {
digitalWrite(LED1, HIGH);
// 按下按键
keyboard.press('z');
} else {
digitalWrite(LED1, LOW);
// 释放按键
keyboard.releaseAll();
}
}
加一些抽象:
#include <Arduino.h>
#include <USBHIDKeyboard.h>
#include <USB.h>
#define LED1 GPIO_NUM_10
#define KEY1 GPIO_NUM_16
#define KEY2 GPIO_NUM_8
USBHIDKeyboard keyboard;
class Key {
public:
char key;
int pin;
int borderline;
Key(int pin, char key, int borderline) : key(key), borderline(borderline), pin(pin) {};
bool pressed = false;
void run() {
auto hal = analogRead(pin);
Serial.printf("%c: %d\n", key, hal);
if (!pressed && hal < borderline) {
digitalWrite(LED1, HIGH);
keyboard.press(key);
pressed = true;
} else if (pressed && hal >= borderline) {
digitalWrite(LED1, LOW);
keyboard.release(key);
pressed = false;
}
}
};
auto key1 = Key(KEY1, 'z', 1900);
auto key2 = Key(KEY2, 'x', 1900);
void setup() {
Serial.begin(115200);
pinMode(LED1, OUTPUT);
keyboard.begin();
USB.begin();
}
void loop() {
key1.run();
key2.run();
}
# 成品
