一个简单的磁轴键盘

2025-04-07 14:15:36

# 材料清单

keyboard-pic

# 连线

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();
}

# 成品